view src/gui/widgets/sidebar.cc @ 252:a0eeb2cc7e6d

*: resolve make distcheck failures
author Paper <paper@paper.us.eu.org>
date Tue, 06 Feb 2024 02:24:49 -0500
parents c130f47f6f48
children 862d0d8619f6
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 separators = 0, items = 0;

	for (; items <= index; ) {
		if (IndexIsSeparator(indexFromItem(item(items + separators)))) {
			separators++;
		} else {
			items++;
		}
	}

	return index + separators;
}

int SideBar::RemoveSeparatorsFromIndex(int index) {
	int i = 0, items = 0;
	for (; i < index; i++) {
		if (!IndexIsSeparator(indexFromItem(item(i))))
			items++;
	}
	return items;
}

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);
}