Mercurial > minori
view src/gui/widgets/sidebar.cc @ 187:9613d72b097e
*: multiple performance improvements
like marking `static const` when it makes sense...
date: change old stupid heap-based method to a structure which should
make copying the thing actually make a copy.
also many performance-based changes, like removing the std::tie
dependency and forward-declaring nlohmann json
*: replace every instance of QString::fromUtf8 to Strings::ToQString.
the main difference is that our function will always convert exactly
what is in the string, while some other times it would only convert
up to the nearest NUL byte
| author | Paper <mrpapersonic@gmail.com> |
|---|---|
| date | Wed, 06 Dec 2023 13:43:54 -0500 |
| parents | 80f49f623d30 |
| children | 4d461ef7d424 |
line wrap: on
line source
#include "gui/widgets/sidebar.h" #include <QFrame> #include <QListWidget> #include <QListWidgetItem> #include <QMouseEvent> SideBar::SideBar(QWidget* parent) : QListWidget(parent) { setFrameShape(QFrame::NoFrame); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setSelectionMode(QAbstractItemView::SingleSelection); setSelectionBehavior(QAbstractItemView::SelectItems); setMouseTracking(true); /* FIXME: is there an easy way to do this with palettes? */ setStyleSheet("QListWidget::item:disabled { background: transparent }"); SetBackgroundColor(Qt::transparent); connect(this, &QListWidget::currentRowChanged, this, [this](int index) { emit CurrentItemChanged(RemoveSeparatorsFromIndex(index)); }); } void SideBar::SetCurrentItem(int index) { setCurrentRow(AddSeparatorsToIndex(index)); } int SideBar::GetCurrentItem() { return RemoveSeparatorsFromIndex(currentRow()); } void SideBar::SetBackgroundColor(QColor color) { viewport()->setAutoFillBackground(color != Qt::transparent); QPalette pal(palette()); pal.setColor(QPalette::Window, color); setPalette(pal); } QListWidgetItem* SideBar::AddItem(QString name, QIcon icon) { QListWidgetItem* item = new QListWidgetItem(this); item->setText(name); if (!icon.isNull()) item->setIcon(icon); return item; } QIcon SideBar::CreateIcon(const char* file) { QPixmap pixmap(file, "PNG"); QIcon result; result.addPixmap(pixmap, QIcon::Normal); result.addPixmap(pixmap, QIcon::Selected); return result; } QListWidgetItem* SideBar::AddSeparator() { QListWidgetItem* item = new QListWidgetItem(this); QFrame* line = new QFrame(this); line->setFrameShape(QFrame::HLine); line->setFrameShadow(QFrame::Sunken); line->setMouseTracking(true); line->setEnabled(false); setItemWidget(item, line); item->setFlags(Qt::NoItemFlags); item->setBackground(QBrush(Qt::transparent)); return item; } int SideBar::AddSeparatorsToIndex(int index) { int i, j; for (i = 0, j = 0; i < index;) { i++; if (IndexIsSeparator(indexFromItem(item(i)))) j++; } return i + j; } int SideBar::RemoveSeparatorsFromIndex(int index) { int i, j; for (i = 0, j = 0; i < index; i++) { if (!IndexIsSeparator(indexFromItem(item(i)))) j++; } return j; } bool SideBar::IndexIsSeparator(QModelIndex index) const { return !(index.isValid() && index.flags() & Qt::ItemIsEnabled); } QItemSelectionModel::SelectionFlags SideBar::selectionCommand(const QModelIndex& index, const QEvent*) const { if (IndexIsSeparator(index)) return QItemSelectionModel::NoUpdate; return QItemSelectionModel::ClearAndSelect; } void SideBar::mouseMoveEvent(QMouseEvent* event) { if (!IndexIsSeparator(indexAt(event->pos()))) setCursor(Qt::PointingHandCursor); else unsetCursor(); QListView::mouseMoveEvent(event); } #include "gui/widgets/moc_sidebar.cpp"
