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"