From 1a3ea722783f0cf55bbf090a831993ff0d8950b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Mon, 28 May 2018 00:17:16 +0200 Subject: [PATCH 1/4] Draw background for library cover art and peview coloumn, fixing LP1773709 --- src/library/coverartdelegate.cpp | 28 +++++++++++++++++++++++++++- src/library/coverartdelegate.h | 2 ++ src/library/previewbuttondelegate.cpp | 27 ++++++++++++++++++++++++--- 3 files changed, 53 insertions(+), 4 deletions(-) diff --git a/src/library/coverartdelegate.cpp b/src/library/coverartdelegate.cpp index 548e9d5a8f..c500217421 100644 --- a/src/library/coverartdelegate.cpp +++ b/src/library/coverartdelegate.cpp @@ -7,6 +7,7 @@ CoverArtDelegate::CoverArtDelegate(QObject *parent) : QStyledItemDelegate(parent), + m_pTableView(qobject_cast(parent)), m_bOnlyCachedCover(false), m_iCoverColumn(-1), m_iCoverSourceColumn(-1), @@ -84,14 +85,37 @@ void CoverArtDelegate::slotCoverFound(const QObject* pRequestor, void CoverArtDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { + + painter->save(); + painter->setClipRect(option.rect); + + if (m_pTableView != NULL) { + QStyle* style = m_pTableView->style(); + if (style != NULL) { + style->drawControl(QStyle::CE_ItemViewItem, &option, painter, + m_pTableView); + } + } + + // Set the palette appropriately based on whether the row is selected or + // not. We also have to check if it is inactive or not and use the + // appropriate ColorGroup. + QPalette::ColorGroup cg = option.state & QStyle::State_Enabled + ? QPalette::Normal : QPalette::Disabled; + if (cg == QPalette::Normal && !(option.state & QStyle::State_Active)) + cg = QPalette::Inactive; + if (option.state & QStyle::State_Selected) { - painter->fillRect(option.rect, option.palette.highlight()); + painter->setBrush(option.palette.color(cg, QPalette::HighlightedText)); + } else { + painter->setBrush(option.palette.color(cg, QPalette::Text)); } CoverArtCache* pCache = CoverArtCache::instance(); if (pCache == NULL || m_iIdColumn == -1 || m_iCoverSourceColumn == -1 || m_iCoverTypeColumn == -1 || m_iCoverLocationColumn == -1 || m_iCoverHashColumn == -1) { + painter->restore(); return; } @@ -101,6 +125,7 @@ void CoverArtDelegate::paint(QPainter *painter, // We don't support types other than METADATA or FILE currently. if (info.type != CoverInfo::METADATA && info.type != CoverInfo::FILE) { + painter->restore(); return; } @@ -131,4 +156,5 @@ void CoverArtDelegate::paint(QPainter *painter, // we can request an update. m_cacheMissRows.append(index.row()); } + painter->restore(); } diff --git a/src/library/coverartdelegate.h b/src/library/coverartdelegate.h index d510c1d006..7908121b84 100644 --- a/src/library/coverartdelegate.h +++ b/src/library/coverartdelegate.h @@ -6,6 +6,7 @@ #include #include #include +#include #include "library/trackmodel.h" @@ -40,6 +41,7 @@ class CoverArtDelegate : public QStyledItemDelegate { QPixmap pixmap, bool fromCache); private: + QTableView* m_pTableView; bool m_bOnlyCachedCover; int m_iCoverColumn; int m_iCoverSourceColumn; diff --git a/src/library/previewbuttondelegate.cpp b/src/library/previewbuttondelegate.cpp index 6c09f59429..77d9068872 100644 --- a/src/library/previewbuttondelegate.cpp +++ b/src/library/previewbuttondelegate.cpp @@ -90,11 +90,32 @@ void PreviewButtonDelegate::paint(QPainter *painter, // it's playing. m_pButton->setChecked(index.data().toBool() && playing); - if (option.state == QStyle::State_Selected) { - painter->fillRect(option.rect, option.palette.base()); + painter->save(); + + painter->setClipRect(option.rect); + + if (m_pTableView != NULL) { + QStyle* style = m_pTableView->style(); + if (style != NULL) { + style->drawControl(QStyle::CE_ItemViewItem, &option, painter, + m_pTableView); + } + } + + // Set the palette appropriately based on whether the row is selected or + // not. We also have to check if it is inactive or not and use the + // appropriate ColorGroup. + QPalette::ColorGroup cg = option.state & QStyle::State_Enabled + ? QPalette::Normal : QPalette::Disabled; + if (cg == QPalette::Normal && !(option.state & QStyle::State_Active)) + cg = QPalette::Inactive; + + if (option.state & QStyle::State_Selected) { + painter->setBrush(option.palette.color(cg, QPalette::HighlightedText)); + } else { + painter->setBrush(option.palette.color(cg, QPalette::Text)); } - painter->save(); // Render button at the desired position painter->translate(option.rect.topLeft()); m_pButton->render(painter); From 67353bf2b195b38cb8ca083f08970003e5b6dfac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Tue, 29 May 2018 22:34:41 +0200 Subject: [PATCH 2/4] Added a TableItemDelegate base class to hold the background painting --- build/depends.py | 1 + src/library/basesqltablemodel.cpp | 12 ++++--- src/library/bpmdelegate.cpp | 57 +++++++++++++++++++++++++++++--- src/library/bpmdelegate.h | 15 ++++----- src/library/browse/browsetablemodel.cpp | 5 ++- src/library/coverartdelegate.cpp | 9 ++--- src/library/coverartdelegate.h | 15 ++++----- src/library/previewbuttondelegate.cpp | 58 ++++++++++++++++----------------- src/library/previewbuttondelegate.h | 29 ++++++++--------- src/library/stardelegate.cpp | 11 ++++--- src/library/stardelegate.h | 9 +++-- src/library/starrating.cpp | 2 ++ src/library/starrating.h | 6 ++-- src/library/tableitemdelegate.cpp | 18 ++++++++++ src/library/tableitemdelegate.h | 25 ++++++++++++++ 15 files changed, 184 insertions(+), 88 deletions(-) create mode 100644 src/library/tableitemdelegate.cpp create mode 100644 src/library/tableitemdelegate.h diff --git a/build/depends.py b/build/depends.py index fc4196099f..f548b89062 100644 --- a/build/depends.py +++ b/build/depends.py @@ -1059,6 +1059,7 @@ def sources(self, build): "library/bpmdelegate.cpp", "library/previewbuttondelegate.cpp", "library/coverartdelegate.cpp", + "library/tableitemdelegate.cpp", "library/treeitemmodel.cpp", "library/treeitem.cpp", diff --git a/src/library/basesqltablemodel.cpp b/src/library/basesqltablemodel.cpp index 3b79392348..6502d82180 100644 --- a/src/library/basesqltablemodel.cpp +++ b/src/library/basesqltablemodel.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include "library/basesqltablemodel.h" @@ -1049,14 +1050,17 @@ QMimeData* BaseSqlTableModel::mimeData(const QModelIndexList &indexes) const { } QAbstractItemDelegate* BaseSqlTableModel::delegateForColumn(const int i, QObject* pParent) { + QTableView* pTableView = qobject_cast(pParent); + DEBUG_ASSERT(pTableView); + if (i == fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_RATING)) { - return new StarDelegate(pParent); + return new StarDelegate(pTableView); } else if (i == fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_BPM)) { - return new BPMDelegate(pParent); + return new BPMDelegate(pTableView); } else if (PlayerManager::numPreviewDecks() > 0 && i == fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_PREVIEW)) { - return new PreviewButtonDelegate(pParent, i); + return new PreviewButtonDelegate(pTableView, i); } else if (i == fieldIndex(ColumnCache::COLUMN_LIBRARYTABLE_COVERART)) { - CoverArtDelegate* pCoverDelegate = new CoverArtDelegate(pParent); + CoverArtDelegate* pCoverDelegate = new CoverArtDelegate(pTableView); connect(pCoverDelegate, SIGNAL(coverReadyForCell(int, int)), this, SLOT(refreshCell(int, int))); return pCoverDelegate; diff --git a/src/library/bpmdelegate.cpp b/src/library/bpmdelegate.cpp index 53dd545da8..793c0f9c2f 100644 --- a/src/library/bpmdelegate.cpp +++ b/src/library/bpmdelegate.cpp @@ -3,6 +3,8 @@ #include #include #include +#include +#include #include "library/bpmdelegate.h" #include "library/trackmodel.h" @@ -30,9 +32,9 @@ class BpmEditorCreator : public QItemEditorCreatorBase { } }; -BPMDelegate::BPMDelegate(QObject* parent) - : QStyledItemDelegate(parent), - m_pTableView(qobject_cast(parent)), +BPMDelegate::BPMDelegate(QTableView* pTableView) + : TableItemDelegate(pTableView), + m_pTableView(pTableView), m_pCheckBox(new QCheckBox(m_pTableView)) { m_pCheckBox->setObjectName("LibraryBPMButton"); // NOTE(rryan): Without ensurePolished the first render of the QTableView @@ -51,8 +53,8 @@ BPMDelegate::~BPMDelegate() { delete m_pFactory; } -void BPMDelegate::paint(QPainter* painter,const QStyleOptionViewItem &option, - const QModelIndex &index) const { +void BPMDelegate::paintItem(QPainter* painter,const QStyleOptionViewItem &option, + const QModelIndex& index) const { // NOTE(rryan): Qt has a built-in limitation that we cannot style multiple // CheckState indicators in the same QAbstractItemView. The CSS rule // QTableView::indicator:checked applies to all columns with a @@ -75,6 +77,21 @@ void BPMDelegate::paint(QPainter* painter,const QStyleOptionViewItem &option, QStyleOptionViewItemV4 opt = option; initStyleOption(&opt, index); + // Set the palette appropriately based on whether the row is selected or + // not. We also have to check if it is inactive or not and use the + // appropriate ColorGroup. + QPalette::ColorGroup cg = option.state & QStyle::State_Enabled + ? QPalette::Normal : QPalette::Disabled; + if (cg == QPalette::Normal && !(option.state & QStyle::State_Active)) + cg = QPalette::Inactive; + + if (option.state & QStyle::State_Selected) { + painter->setBrush(option.palette.color(cg, QPalette::HighlightedText)); + } else { + painter->setBrush(option.palette.color(cg, QPalette::Text)); + } + + if (m_pTableView != NULL) { QStyle* style = m_pTableView->style(); if (style != NULL) { @@ -82,4 +99,34 @@ void BPMDelegate::paint(QPainter* painter,const QStyleOptionViewItem &option, m_pCheckBox); } } + + + /* + + painter->save(); + painter->setClipRect(option.rect); + + if (m_pTableView != NULL) { + QStyle* style = m_pTableView->style(); + if (style != NULL) { + style->drawControl(QStyle::CE_ItemViewItem, &option, painter, + m_pTableView); + } + } + + // Set the palette appropriately based on whether the row is selected or + // not. We also have to check if it is inactive or not and use the + // appropriate ColorGroup. + QPalette::ColorGroup cg = option.state & QStyle::State_Enabled + ? QPalette::Normal : QPalette::Disabled; + if (cg == QPalette::Normal && !(option.state & QStyle::State_Active)) + cg = QPalette::Inactive; + + if (option.state & QStyle::State_Selected) { + painter->setBrush(option.palette.color(cg, QPalette::HighlightedText)); + } else { + painter->setBrush(option.palette.color(cg, QPalette::Text)); + } + */ + } diff --git a/src/library/bpmdelegate.h b/src/library/bpmdelegate.h index a2fc678bd6..58f8adef27 100644 --- a/src/library/bpmdelegate.h +++ b/src/library/bpmdelegate.h @@ -3,20 +3,19 @@ #include #include -#include -#include #include -#include -#include -class BPMDelegate : public QStyledItemDelegate { +#include "library/tableitemdelegate.h" + + +class BPMDelegate : public TableItemDelegate { Q_OBJECT public: - explicit BPMDelegate(QObject* parent); + explicit BPMDelegate(QTableView* pTableView); virtual ~BPMDelegate(); - void paint(QPainter *painter, const QStyleOptionViewItem &option, - const QModelIndex &index) const; + void paintItem(QPainter* painter, const QStyleOptionViewItem& option, + const QModelIndex& index) const; private: QTableView* m_pTableView; diff --git a/src/library/browse/browsetablemodel.cpp b/src/library/browse/browsetablemodel.cpp index e1a590edc5..5279a3fcb9 100644 --- a/src/library/browse/browsetablemodel.cpp +++ b/src/library/browse/browsetablemodel.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include "library/browse/browsetablemodel.h" #include "library/browse/browsethread.h" @@ -364,8 +365,10 @@ bool BrowseTableModel::isColumnSortable(int column) { } QAbstractItemDelegate* BrowseTableModel::delegateForColumn(const int i, QObject* pParent) { + QTableView* pTableView = qobject_cast(pParent); + DEBUG_ASSERT(pTableView); if (PlayerManager::numPreviewDecks() > 0 && i == COLUMN_PREVIEW) { - return new PreviewButtonDelegate(pParent, i); + return new PreviewButtonDelegate(pTableView, i); } return NULL; } diff --git a/src/library/coverartdelegate.cpp b/src/library/coverartdelegate.cpp index c500217421..fea6276eb1 100644 --- a/src/library/coverartdelegate.cpp +++ b/src/library/coverartdelegate.cpp @@ -1,13 +1,14 @@ #include +#include #include "library/coverartdelegate.h" #include "library/coverartcache.h" #include "library/dao/trackschema.h" #include "util/math.h" -CoverArtDelegate::CoverArtDelegate(QObject *parent) - : QStyledItemDelegate(parent), - m_pTableView(qobject_cast(parent)), +CoverArtDelegate::CoverArtDelegate(QTableView* parent) + : TableItemDelegate(parent), + m_pTableView(parent), m_bOnlyCachedCover(false), m_iCoverColumn(-1), m_iCoverSourceColumn(-1), @@ -82,7 +83,7 @@ void CoverArtDelegate::slotCoverFound(const QObject* pRequestor, } } -void CoverArtDelegate::paint(QPainter *painter, +void CoverArtDelegate::paintItem(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { diff --git a/src/library/coverartdelegate.h b/src/library/coverartdelegate.h index 7908121b84..ff8fef5412 100644 --- a/src/library/coverartdelegate.h +++ b/src/library/coverartdelegate.h @@ -1,24 +1,21 @@ #ifndef COVERARTDELEGATE_H #define COVERARTDELEGATE_H -#include -#include -#include #include #include -#include +#include "library/tableitemdelegate.h" #include "library/trackmodel.h" -class CoverArtDelegate : public QStyledItemDelegate { +class CoverArtDelegate : public TableItemDelegate { Q_OBJECT public: - explicit CoverArtDelegate(QObject* parent = NULL); + explicit CoverArtDelegate(QTableView* pTableView); virtual ~CoverArtDelegate(); - void paint(QPainter *painter, - const QStyleOptionViewItem &option, - const QModelIndex &index) const; + void paintItem(QPainter* painter, + const QStyleOptionViewItem& option, + const QModelIndex& index) const; signals: void coverReadyForCell(int row, int column); diff --git a/src/library/previewbuttondelegate.cpp b/src/library/previewbuttondelegate.cpp index 77d9068872..be63482b71 100644 --- a/src/library/previewbuttondelegate.cpp +++ b/src/library/previewbuttondelegate.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "library/previewbuttondelegate.h" #include "library/trackmodel.h" @@ -8,9 +9,9 @@ #include "track/track.h" #include "control/controlproxy.h" -PreviewButtonDelegate::PreviewButtonDelegate(QObject *parent, int column) - : QStyledItemDelegate(parent), - m_pTableView(NULL), +PreviewButtonDelegate::PreviewButtonDelegate(QTableView* parent, int column) + : TableItemDelegate(parent), + m_pTableView(parent), m_pButton(NULL), m_isOneCellInEditMode(false), m_column(column) { @@ -25,24 +26,21 @@ PreviewButtonDelegate::PreviewButtonDelegate(QObject *parent, int column) connect(this, SIGNAL(loadTrackToPlayer(TrackPointer, QString, bool)), parent, SIGNAL(loadTrackToPlayer(TrackPointer, QString, bool))); - if (QTableView *tableView = qobject_cast(parent)) { - m_pTableView = tableView; - m_pButton = new QPushButton("", m_pTableView); - m_pButton->setObjectName("LibraryPreviewButton"); - m_pButton->setCheckable(true); - m_pButton->setChecked(false); - m_pButton->hide(); - connect(m_pTableView, SIGNAL(entered(QModelIndex)), - this, SLOT(cellEntered(QModelIndex))); - } + m_pButton = new QPushButton("", m_pTableView); + m_pButton->setObjectName("LibraryPreviewButton"); + m_pButton->setCheckable(true); + m_pButton->setChecked(false); + m_pButton->hide(); + connect(m_pTableView, SIGNAL(entered(QModelIndex)), + this, SLOT(cellEntered(QModelIndex))); } PreviewButtonDelegate::~PreviewButtonDelegate() { } -QWidget* PreviewButtonDelegate::createEditor(QWidget *parent, - const QStyleOptionViewItem &option, - const QModelIndex &index) const { +QWidget* PreviewButtonDelegate::createEditor(QWidget* parent, + const QStyleOptionViewItem& option, + const QModelIndex& index) const { Q_UNUSED(option); QPushButton* btn = new QPushButton(parent); btn->setObjectName("LibraryPreviewButton"); @@ -58,23 +56,23 @@ QWidget* PreviewButtonDelegate::createEditor(QWidget *parent, return btn; } -void PreviewButtonDelegate::setEditorData(QWidget *editor, - const QModelIndex &index) const { +void PreviewButtonDelegate::setEditorData(QWidget* editor, + const QModelIndex& index) const { Q_UNUSED(editor); Q_UNUSED(index); } -void PreviewButtonDelegate::setModelData(QWidget *editor, - QAbstractItemModel *model, - const QModelIndex &index) const { +void PreviewButtonDelegate::setModelData(QWidget* editor, + QAbstractItemModel* model, + const QModelIndex& index) const { Q_UNUSED(editor); Q_UNUSED(model); Q_UNUSED(index); } -void PreviewButtonDelegate::paint(QPainter *painter, - const QStyleOptionViewItem &option, - const QModelIndex &index) const { +void PreviewButtonDelegate::paintItem(QPainter* painter, + const QStyleOptionViewItem& option, + const QModelIndex& index) const { // Let the editor paint in this case if (index == m_currentEditedCellIndex) { return; @@ -122,15 +120,15 @@ void PreviewButtonDelegate::paint(QPainter *painter, painter->restore(); } -void PreviewButtonDelegate::updateEditorGeometry(QWidget *editor, - const QStyleOptionViewItem &option, - const QModelIndex &index) const { +void PreviewButtonDelegate::updateEditorGeometry(QWidget* editor, + const QStyleOptionViewItem& option, + const QModelIndex& index) const { Q_UNUSED(index); editor->setGeometry(option.rect); } -QSize PreviewButtonDelegate::sizeHint(const QStyleOptionViewItem &option, - const QModelIndex &index) const { +QSize PreviewButtonDelegate::sizeHint(const QStyleOptionViewItem& option, + const QModelIndex& index) const { Q_UNUSED(option); Q_UNUSED(index); if (!m_pButton) { @@ -139,7 +137,7 @@ QSize PreviewButtonDelegate::sizeHint(const QStyleOptionViewItem &option, return m_pButton->sizeHint(); } -void PreviewButtonDelegate::cellEntered(const QModelIndex &index) { +void PreviewButtonDelegate::cellEntered(const QModelIndex& index) { if (!m_pTableView) { return; } diff --git a/src/library/previewbuttondelegate.h b/src/library/previewbuttondelegate.h index d9d5f8bfa1..27bcaf87eb 100644 --- a/src/library/previewbuttondelegate.h +++ b/src/library/previewbuttondelegate.h @@ -1,41 +1,40 @@ #ifndef PREVIEWBUTTONDELEGATE_H #define PREVIEWBUTTONDELEGATE_H -#include #include -#include +#include "library/tableitemdelegate.h" #include "track/track.h" class ControlProxy; -class PreviewButtonDelegate : public QStyledItemDelegate { +class PreviewButtonDelegate : public TableItemDelegate { Q_OBJECT public: - explicit PreviewButtonDelegate(QObject* parent = NULL, int column = 0); + explicit PreviewButtonDelegate(QTableView* parent, int column); virtual ~PreviewButtonDelegate(); - QWidget* createEditor(QWidget *parent, - const QStyleOptionViewItem &option, - const QModelIndex &index) const; + QWidget* createEditor(QWidget* parent, + const QStyleOptionViewItem& option, + const QModelIndex& index) const; - void setEditorData(QWidget *editor, const QModelIndex &index) const; - void setModelData(QWidget *editor, QAbstractItemModel *model, + void setEditorData(QWidget* editor, const QModelIndex& index) const; + void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex &index) const; - void paint(QPainter *painter, const QStyleOptionViewItem &option, - const QModelIndex &index) const; + void paintItem(QPainter* painter, const QStyleOptionViewItem& option, + const QModelIndex& index) const; QSize sizeHint(const QStyleOptionViewItem &option, - const QModelIndex &index) const; - void updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option, - const QModelIndex &index) const; + const QModelIndex& index) const; + void updateEditorGeometry(QWidget* editor,const QStyleOptionViewItem& option, + const QModelIndex& index) const; signals: void loadTrackToPlayer(TrackPointer Track, QString group, bool play); void buttonSetChecked(bool); public slots: - void cellEntered(const QModelIndex &index); + void cellEntered(const QModelIndex& index); void buttonClicked(); void previewDeckPlayChanged(double v); diff --git a/src/library/stardelegate.cpp b/src/library/stardelegate.cpp index 374ea82531..90daa60f5b 100644 --- a/src/library/stardelegate.cpp +++ b/src/library/stardelegate.cpp @@ -18,19 +18,20 @@ #include +#include "library/tableitemdelegate.h" #include "library/stardelegate.h" #include "library/stareditor.h" #include "library/starrating.h" -StarDelegate::StarDelegate(QObject* pParent) - : QStyledItemDelegate(pParent), - m_pTableView(qobject_cast(pParent)), +StarDelegate::StarDelegate(QTableView* pTableView) + : TableItemDelegate(pTableView), + m_pTableView(pTableView), m_isOneCellInEditMode(false) { - connect(pParent, SIGNAL(entered(QModelIndex)), + connect(pTableView, SIGNAL(entered(QModelIndex)), this, SLOT(cellEntered(QModelIndex))); } -void StarDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, +void StarDelegate::paintItem(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { // let the editor do the painting if this cell is currently being edited if (index == m_currentEditedCellIndex) { diff --git a/src/library/stardelegate.h b/src/library/stardelegate.h index a223cc4c97..999c65e2ff 100644 --- a/src/library/stardelegate.h +++ b/src/library/stardelegate.h @@ -19,17 +19,16 @@ #ifndef STARDELEGATE_H #define STARDELEGATE_H -#include -#include +#include "library/tableitemdelegate.h" -class StarDelegate : public QStyledItemDelegate { +class StarDelegate : public TableItemDelegate { Q_OBJECT public: - StarDelegate(QObject* pParent = 0); + StarDelegate(QTableView* pTrackTable); // reimplemented from QItemDelegate and is called whenever the view needs to // repaint an item - void paint(QPainter* painter, const QStyleOptionViewItem& option, + void paintItem(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; // returns an item's preferred size diff --git a/src/library/starrating.cpp b/src/library/starrating.cpp index c514e7b3f8..04f9c9023f 100644 --- a/src/library/starrating.cpp +++ b/src/library/starrating.cpp @@ -15,6 +15,8 @@ * * ***************************************************************************/ +#include + #include "library/starrating.h" #include "util/math.h" diff --git a/src/library/starrating.h b/src/library/starrating.h index e8cd31aaa0..3ee79f46b1 100644 --- a/src/library/starrating.h +++ b/src/library/starrating.h @@ -22,8 +22,10 @@ #include #include #include -#include -#include +#include + +class QPainter; + /* * The StarRating class represents a rating as a number of stars. diff --git a/src/library/tableitemdelegate.cpp b/src/library/tableitemdelegate.cpp new file mode 100644 index 0000000000..c1097e6f99 --- /dev/null +++ b/src/library/tableitemdelegate.cpp @@ -0,0 +1,18 @@ + +#include + +#include "library/tableitemdelegate.h" + + +TableItemDelegate::TableItemDelegate(QTableView* pTableView) + : QStyledItemDelegate(pTableView), + m_pTableView(pTableView) { +} + +TableItemDelegate::~TableItemDelegate() { +} + +void TableItemDelegate::paint(QPainter* painter,const QStyleOptionViewItem& option, + const QModelIndex& index) const { + paintItem(painter, option, index); +} diff --git a/src/library/tableitemdelegate.h b/src/library/tableitemdelegate.h new file mode 100644 index 0000000000..a39071aac3 --- /dev/null +++ b/src/library/tableitemdelegate.h @@ -0,0 +1,25 @@ +#ifndef TABLEITEMDELEGATE_H +#define TABLEITEMDELEGATE_H + +#include + +class QTableView; +class QStyleOptionViewItem; + +class TableItemDelegate : public QStyledItemDelegate { + Q_OBJECT + public: + explicit TableItemDelegate(QTableView* pTableView); + virtual ~TableItemDelegate(); + + void paint(QPainter *painter, const QStyleOptionViewItem &option, + const QModelIndex &index) const; + + virtual void paintItem(QPainter *painter, const QStyleOptionViewItem &option, + const QModelIndex &index) const = 0; + + private: + QTableView* m_pTableView; +}; + +#endif // TABLEITEMDELEGATE_H From f9bdf3e4897fc1670e8ac7a6309ad784d5f52f16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Wed, 30 May 2018 23:59:35 +0200 Subject: [PATCH 3/4] de-duplicated Code --- src/library/bpmdelegate.cpp | 30 ------------------------------ src/library/coverartdelegate.cpp | 29 ----------------------------- src/library/previewbuttondelegate.cpp | 27 --------------------------- src/library/stardelegate.cpp | 11 ++++++++++- src/library/stardelegate.h | 3 +++ src/library/starrating.cpp | 2 -- src/library/tableitemdelegate.cpp | 30 ++++++++++++++++++++++++++++++ 7 files changed, 43 insertions(+), 89 deletions(-) diff --git a/src/library/bpmdelegate.cpp b/src/library/bpmdelegate.cpp index 793c0f9c2f..a8295b358d 100644 --- a/src/library/bpmdelegate.cpp +++ b/src/library/bpmdelegate.cpp @@ -99,34 +99,4 @@ void BPMDelegate::paintItem(QPainter* painter,const QStyleOptionViewItem &option m_pCheckBox); } } - - - /* - - painter->save(); - painter->setClipRect(option.rect); - - if (m_pTableView != NULL) { - QStyle* style = m_pTableView->style(); - if (style != NULL) { - style->drawControl(QStyle::CE_ItemViewItem, &option, painter, - m_pTableView); - } - } - - // Set the palette appropriately based on whether the row is selected or - // not. We also have to check if it is inactive or not and use the - // appropriate ColorGroup. - QPalette::ColorGroup cg = option.state & QStyle::State_Enabled - ? QPalette::Normal : QPalette::Disabled; - if (cg == QPalette::Normal && !(option.state & QStyle::State_Active)) - cg = QPalette::Inactive; - - if (option.state & QStyle::State_Selected) { - painter->setBrush(option.palette.color(cg, QPalette::HighlightedText)); - } else { - painter->setBrush(option.palette.color(cg, QPalette::Text)); - } - */ - } diff --git a/src/library/coverartdelegate.cpp b/src/library/coverartdelegate.cpp index fea6276eb1..871807d2e8 100644 --- a/src/library/coverartdelegate.cpp +++ b/src/library/coverartdelegate.cpp @@ -86,37 +86,10 @@ void CoverArtDelegate::slotCoverFound(const QObject* pRequestor, void CoverArtDelegate::paintItem(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { - - painter->save(); - painter->setClipRect(option.rect); - - if (m_pTableView != NULL) { - QStyle* style = m_pTableView->style(); - if (style != NULL) { - style->drawControl(QStyle::CE_ItemViewItem, &option, painter, - m_pTableView); - } - } - - // Set the palette appropriately based on whether the row is selected or - // not. We also have to check if it is inactive or not and use the - // appropriate ColorGroup. - QPalette::ColorGroup cg = option.state & QStyle::State_Enabled - ? QPalette::Normal : QPalette::Disabled; - if (cg == QPalette::Normal && !(option.state & QStyle::State_Active)) - cg = QPalette::Inactive; - - if (option.state & QStyle::State_Selected) { - painter->setBrush(option.palette.color(cg, QPalette::HighlightedText)); - } else { - painter->setBrush(option.palette.color(cg, QPalette::Text)); - } - CoverArtCache* pCache = CoverArtCache::instance(); if (pCache == NULL || m_iIdColumn == -1 || m_iCoverSourceColumn == -1 || m_iCoverTypeColumn == -1 || m_iCoverLocationColumn == -1 || m_iCoverHashColumn == -1) { - painter->restore(); return; } @@ -126,7 +99,6 @@ void CoverArtDelegate::paintItem(QPainter *painter, // We don't support types other than METADATA or FILE currently. if (info.type != CoverInfo::METADATA && info.type != CoverInfo::FILE) { - painter->restore(); return; } @@ -157,5 +129,4 @@ void CoverArtDelegate::paintItem(QPainter *painter, // we can request an update. m_cacheMissRows.append(index.row()); } - painter->restore(); } diff --git a/src/library/previewbuttondelegate.cpp b/src/library/previewbuttondelegate.cpp index be63482b71..5c916bd841 100644 --- a/src/library/previewbuttondelegate.cpp +++ b/src/library/previewbuttondelegate.cpp @@ -88,36 +88,9 @@ void PreviewButtonDelegate::paintItem(QPainter* painter, // it's playing. m_pButton->setChecked(index.data().toBool() && playing); - painter->save(); - - painter->setClipRect(option.rect); - - if (m_pTableView != NULL) { - QStyle* style = m_pTableView->style(); - if (style != NULL) { - style->drawControl(QStyle::CE_ItemViewItem, &option, painter, - m_pTableView); - } - } - - // Set the palette appropriately based on whether the row is selected or - // not. We also have to check if it is inactive or not and use the - // appropriate ColorGroup. - QPalette::ColorGroup cg = option.state & QStyle::State_Enabled - ? QPalette::Normal : QPalette::Disabled; - if (cg == QPalette::Normal && !(option.state & QStyle::State_Active)) - cg = QPalette::Inactive; - - if (option.state & QStyle::State_Selected) { - painter->setBrush(option.palette.color(cg, QPalette::HighlightedText)); - } else { - painter->setBrush(option.palette.color(cg, QPalette::Text)); - } - // Render button at the desired position painter->translate(option.rect.topLeft()); m_pButton->render(painter); - painter->restore(); } void PreviewButtonDelegate::updateEditorGeometry(QWidget* editor, diff --git a/src/library/stardelegate.cpp b/src/library/stardelegate.cpp index 90daa60f5b..c861d93d8c 100644 --- a/src/library/stardelegate.cpp +++ b/src/library/stardelegate.cpp @@ -31,6 +31,15 @@ StarDelegate::StarDelegate(QTableView* pTableView) this, SLOT(cellEntered(QModelIndex))); } +void StarDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, + const QModelIndex& index) const { + // let the editor do the painting if this cell is currently being edited + if (index == m_currentEditedCellIndex) { + return; + } + TableItemDelegate::paint(painter, option, index); +} + void StarDelegate::paintItem(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { // let the editor do the painting if this cell is currently being edited @@ -43,7 +52,7 @@ void StarDelegate::paintItem(QPainter* painter, const QStyleOptionViewItem& opti initStyleOption(&newOption, index); StarRating starRating = qVariantValue(index.data()); - StarEditor::renderHelper(painter, m_pTableView, option, &starRating); + starRating.paint(painter, option.rect); } QSize StarDelegate::sizeHint(const QStyleOptionViewItem& option, diff --git a/src/library/stardelegate.h b/src/library/stardelegate.h index 999c65e2ff..2b35fc61bb 100644 --- a/src/library/stardelegate.h +++ b/src/library/stardelegate.h @@ -28,6 +28,9 @@ class StarDelegate : public TableItemDelegate { // reimplemented from QItemDelegate and is called whenever the view needs to // repaint an item + void paint(QPainter* painter, const QStyleOptionViewItem& option, + const QModelIndex& index) const; + void paintItem(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; diff --git a/src/library/starrating.cpp b/src/library/starrating.cpp index 04f9c9023f..8e7bb37e7e 100644 --- a/src/library/starrating.cpp +++ b/src/library/starrating.cpp @@ -37,7 +37,6 @@ QSize StarRating::sizeHint() const { void StarRating::paint(QPainter *painter, const QRect &rect) const { // Assume the painter is configured with the right brush. - painter->save(); painter->setRenderHint(QPainter::Antialiasing, true); painter->setPen(Qt::NoPen); @@ -56,5 +55,4 @@ void StarRating::paint(QPainter *painter, const QRect &rect) const { } painter->translate(1.0, 0.0); } - painter->restore(); } diff --git a/src/library/tableitemdelegate.cpp b/src/library/tableitemdelegate.cpp index c1097e6f99..8f0575e105 100644 --- a/src/library/tableitemdelegate.cpp +++ b/src/library/tableitemdelegate.cpp @@ -1,5 +1,6 @@ #include +#include #include "library/tableitemdelegate.h" @@ -14,5 +15,34 @@ TableItemDelegate::~TableItemDelegate() { void TableItemDelegate::paint(QPainter* painter,const QStyleOptionViewItem& option, const QModelIndex& index) const { + + painter->save(); + + painter->setClipRect(option.rect); + + // Set the palette appropriately based on whether the row is selected or + // not. We also have to check if it is inactive or not and use the + // appropriate ColorGroup. + QPalette::ColorGroup cg = option.state & QStyle::State_Enabled + ? QPalette::Normal : QPalette::Disabled; + if (cg == QPalette::Normal && !(option.state & QStyle::State_Active)) + cg = QPalette::Inactive; + + if (option.state & QStyle::State_Selected) { + painter->setBrush(option.palette.color(cg, QPalette::HighlightedText)); + } else { + painter->setBrush(option.palette.color(cg, QPalette::Text)); + } + + if (m_pTableView) { + QStyle* style = m_pTableView->style(); + if (style) { + style->drawControl(QStyle::CE_ItemViewItem, &option, painter, + m_pTableView); + } + } + paintItem(painter, option, index); + + painter->restore(); } From 196994ea61ac415203b4356761eed7d023578249 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Wed, 6 Jun 2018 00:51:59 +0200 Subject: [PATCH 4/4] Remove redundant code --- src/library/bpmdelegate.cpp | 15 --------------- src/library/stardelegate.cpp | 4 ---- 2 files changed, 19 deletions(-) diff --git a/src/library/bpmdelegate.cpp b/src/library/bpmdelegate.cpp index a8295b358d..dae91d45dc 100644 --- a/src/library/bpmdelegate.cpp +++ b/src/library/bpmdelegate.cpp @@ -77,21 +77,6 @@ void BPMDelegate::paintItem(QPainter* painter,const QStyleOptionViewItem &option QStyleOptionViewItemV4 opt = option; initStyleOption(&opt, index); - // Set the palette appropriately based on whether the row is selected or - // not. We also have to check if it is inactive or not and use the - // appropriate ColorGroup. - QPalette::ColorGroup cg = option.state & QStyle::State_Enabled - ? QPalette::Normal : QPalette::Disabled; - if (cg == QPalette::Normal && !(option.state & QStyle::State_Active)) - cg = QPalette::Inactive; - - if (option.state & QStyle::State_Selected) { - painter->setBrush(option.palette.color(cg, QPalette::HighlightedText)); - } else { - painter->setBrush(option.palette.color(cg, QPalette::Text)); - } - - if (m_pTableView != NULL) { QStyle* style = m_pTableView->style(); if (style != NULL) { diff --git a/src/library/stardelegate.cpp b/src/library/stardelegate.cpp index c861d93d8c..5b82ff6236 100644 --- a/src/library/stardelegate.cpp +++ b/src/library/stardelegate.cpp @@ -47,10 +47,6 @@ void StarDelegate::paintItem(QPainter* painter, const QStyleOptionViewItem& opti return; } - // Populate the correct colors based on the styling - QStyleOptionViewItemV4 newOption = option; - initStyleOption(&newOption, index); - StarRating starRating = qVariantValue(index.data()); starRating.paint(painter, option.rect); }