From 79d116d07c50446c66263d8908b764c381d12cb5 Mon Sep 17 00:00:00 2001 From: David Rosca Date: Sat, 3 Feb 2018 16:08:03 +0100 Subject: [PATCH] TabTreeDelegate: Make it stylable on which items to show close button --- src/plugins/VerticalTabs/tabtreedelegate.cpp | 75 +++++++++++++++++--- src/plugins/VerticalTabs/tabtreedelegate.h | 32 ++++++++- 2 files changed, 97 insertions(+), 10 deletions(-) diff --git a/src/plugins/VerticalTabs/tabtreedelegate.cpp b/src/plugins/VerticalTabs/tabtreedelegate.cpp index 9b06eacc9..5c2f1d3d8 100644 --- a/src/plugins/VerticalTabs/tabtreedelegate.cpp +++ b/src/plugins/VerticalTabs/tabtreedelegate.cpp @@ -27,6 +27,65 @@ #include #include +// TabTreeCloseButton +TabTreeCloseButton::TabTreeCloseButton(QWidget *parent) + : QAbstractButton(parent) +{ + setObjectName(QSL("treeview_close_button")); + + int width = style()->pixelMetric(QStyle::PM_TabCloseIndicatorWidth, nullptr, this); + int height = style()->pixelMetric(QStyle::PM_TabCloseIndicatorHeight, nullptr, this); + resize(width, height); +} + +int TabTreeCloseButton::showOnNormal() const +{ + return m_showOnNormal; +} + +void TabTreeCloseButton::setShowOnNormal(int show) +{ + m_showOnNormal = show; +} + +int TabTreeCloseButton::showOnHovered() const +{ + return m_showOnHovered; +} + +void TabTreeCloseButton::setShowOnHovered(int show) +{ + m_showOnHovered = show; +} + +int TabTreeCloseButton::showOnSelected() const +{ + return m_showOnSelected; +} + +void TabTreeCloseButton::setShowOnSelected(int show) +{ + m_showOnSelected = show; +} + +bool TabTreeCloseButton::isVisible(bool hovered, bool selected) const +{ + if (hovered && selected) { + return m_showOnHovered || m_showOnSelected; + } else if (selected) { + return m_showOnSelected; + } else if (hovered) { + return m_showOnHovered; + } else { + return m_showOnNormal; + } +} + +void TabTreeCloseButton::paintEvent(QPaintEvent *) +{ +} + +// TabTreeDelegate TabTreeDelegate::TabTreeDelegate(TabTreeView *view) : QStyledItemDelegate() , m_view(view) @@ -44,13 +103,8 @@ TabTreeDelegate::TabTreeDelegate(TabTreeView *view) tabBar->setObjectName(QSL("treeview_tabbar")); tabBar->lower(); - m_closeButton = new QPushButton(tabBar); - m_closeButton->setObjectName(QSL("treeview_close_button")); + m_closeButton = new TabTreeCloseButton(tabBar); m_closeButton->lower(); - - int width = m_closeButton->style()->pixelMetric(QStyle::PM_TabCloseIndicatorWidth, nullptr, m_closeButton); - int height = m_closeButton->style()->pixelMetric(QStyle::PM_TabCloseIndicatorHeight, nullptr, m_closeButton); - m_closeButton->resize(width, height); } static int indexDepth(QModelIndex index) @@ -125,6 +179,9 @@ void TabTreeDelegate::paint(QPainter *painter, const QStyleOptionViewItem &optio QPalette textPalette = opt.palette; textPalette.setCurrentColorGroup(cg); + const bool hovered = opt.state.testFlag(QStyle::State_MouseOver); + const bool selected = opt.state.testFlag(QStyle::State_Selected); + // Draw background style->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter, w); @@ -151,7 +208,7 @@ void TabTreeDelegate::paint(QPainter *painter, const QStyleOptionViewItem &optio leftPosition += iconRect.width() + m_padding; // Draw close button - if (opt.state.testFlag(QStyle::State_MouseOver) || opt.state.testFlag(QStyle::State_Selected)) { + if (m_closeButton->isVisible(hovered, selected)) { QStyleOptionButton o; o.init(m_closeButton); @@ -183,9 +240,9 @@ void TabTreeDelegate::paint(QPainter *painter, const QStyleOptionViewItem &optio QRect titleRect(leftPosition, center - opt.fontMetrics.height() / 2, opt.rect.width(), opt.fontMetrics.height()); titleRect.setRight(rightPosition - m_padding); QString title = opt.fontMetrics.elidedText(index.data().toString(), Qt::ElideRight, titleRect.width()); - if (opt.state.testFlag(QStyle::State_Selected) && m_view->selectedColor().isValid()) { + if (selected && m_view->selectedColor().isValid()) { textPalette.setColor(cg, colorRole, m_view->selectedColor()); - } else if (opt.state.testFlag(QStyle::State_MouseOver) && m_view->hoverColor().isValid()) { + } else if (hovered && m_view->hoverColor().isValid()) { textPalette.setColor(cg, colorRole, m_view->hoverColor()); } style->drawItemText(painter, titleRect, Qt::AlignLeft, textPalette, true, title, colorRole); diff --git a/src/plugins/VerticalTabs/tabtreedelegate.h b/src/plugins/VerticalTabs/tabtreedelegate.h index a12d558c8..b12834365 100644 --- a/src/plugins/VerticalTabs/tabtreedelegate.h +++ b/src/plugins/VerticalTabs/tabtreedelegate.h @@ -17,6 +17,7 @@ * ============================================================ */ #pragma once +#include #include class QPushButton; @@ -24,6 +25,35 @@ class QPushButton; class TabTreeView; class LoadingAnimator; +class TabTreeCloseButton : public QAbstractButton +{ + Q_OBJECT + Q_PROPERTY(int showOnNormal READ showOnNormal WRITE setShowOnNormal) + Q_PROPERTY(int showOnHovered READ showOnHovered WRITE setShowOnHovered) + Q_PROPERTY(int showOnSelected READ showOnSelected WRITE setShowOnSelected) + +public: + explicit TabTreeCloseButton(QWidget *parent = nullptr); + + int showOnNormal() const; + void setShowOnNormal(int show); + + int showOnHovered() const; + void setShowOnHovered(int show); + + int showOnSelected() const; + void setShowOnSelected(int show); + + bool isVisible(bool hovered, bool selected) const; + +private: + void paintEvent(QPaintEvent *event) override; + + int m_showOnNormal = 0; + int m_showOnHovered = 1; + int m_showOnSelected = 1; +}; + class TabTreeDelegate : public QStyledItemDelegate { public: @@ -39,7 +69,7 @@ public: private: TabTreeView *m_view; LoadingAnimator *m_loadingAnimator; - QPushButton *m_closeButton; + TabTreeCloseButton *m_closeButton; int m_padding; int m_indentation; };