Mercurial > minori
view src/gui/widgets/sidebar.cc @ 198:bc1ae1810855
dep/animia: switch from using classes to global functions
the old idea was ok, but sort of hackish; this method doesn't use classes
at all, and this way (especially important!) we can do wayland stuff AND x11
at the same time, which wasn't really possible without stupid workarounds in
the other method
author | Paper <mrpapersonic@gmail.com> |
---|---|
date | Sun, 24 Dec 2023 02:59:42 -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"