Mercurial > minori
diff src/gui/widgets/sidebar.cc @ 81:9b2b41f83a5e
boring: mass rename to cc
because this is a very unix-y project, it makes more sense to use the
'cc' extension
author | Paper <mrpapersonic@gmail.com> |
---|---|
date | Mon, 23 Oct 2023 12:07:27 -0400 |
parents | src/gui/widgets/sidebar.cpp@6f7385bd334c |
children | 80f49f623d30 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/gui/widgets/sidebar.cc Mon Oct 23 12:07:27 2023 -0400 @@ -0,0 +1,101 @@ +#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)); +} + +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"