[LyX/master] PrefColors dialog shows transparent swatches correctly
Koji Yokota <[email protected]> Tue, 02 Jun 2026 04:51:31 +0000
| Newsgroups | gmane.editors.lyx.cvs |
|---|---|
| Message-ID | <[email protected]> |
commit 5d497f745bdc64d6858fba4e585df33f6a65d786 Author: Koji Yokota <[email protected]> Date: Thu May 14 19:19:51 2026 +0900 PrefColors dialog shows transparent swatches correctly --- src/frontends/qt/GuiPrefs.cpp | 35 +++++++++++++++++++++++++++++++++-- src/frontends/qt/GuiPrefs.h | 3 +++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/frontends/qt/GuiPrefs.cpp b/src/frontends/qt/GuiPrefs.cpp index 8b89f7ec34..4cbce38a0b 100644 --- a/src/frontends/qt/GuiPrefs.cpp +++ b/src/frontends/qt/GuiPrefs.cpp @@ -4720,6 +4720,26 @@ ColorSwatchDelegate::ColorSwatchDelegate(QObject *parent) : QStyledItemDelegate(parent), button_(new QPushButton) { pane_ = static_cast<PrefColors*>(parent); + + // construct the background image of swatches + bg_pixmap_ = new QPixmap(pane_->swatch_width_, pane_->swatch_height_); + bg_pixmap_->fill(Qt::white); + QPainter painter(bg_pixmap_); + painter.setRenderHint(QPainter::Antialiasing); + QPolygon polygon; + polygon << QPoint(pane_->swatch_width_, 0) + << QPoint(0, pane_->swatch_height_) + << QPoint(pane_->swatch_width_, pane_->swatch_height_); + painter.setPen(QColor(Qt::black)); + painter.setBrush(QColor(Qt::black)); + painter.drawPolygon(polygon); + painter.end(); +} + + +ColorSwatchDelegate::~ColorSwatchDelegate() +{ + delete bg_pixmap_; } @@ -4743,9 +4763,10 @@ void ColorSwatchDelegate::paint(QPainter *painter, QColor color = pane_->colorsTV_model_.data(index, Qt::DecorationRole). value<QColor>(); - if (index.flags().testFlag(Qt::ItemIsEnabled)) + if (index.flags().testFlag(Qt::ItemIsEnabled)) { pixmap.fill(color); - else + pixmap = mergePixmaps(&pixmap, bg_pixmap_); + } else pixmap.fill(Qt::transparent); style->drawItemPixmap(painter, opt.rect, Qt::AlignCenter, pixmap); } else { @@ -4755,6 +4776,16 @@ void ColorSwatchDelegate::paint(QPainter *painter, } +QPixmap ColorSwatchDelegate::mergePixmaps(QPixmap const *fg, QPixmap const *bg) const +{ + // make a copy to leave bg untouched + QPixmap merged(*bg); + QPainter painter(&merged); + painter.drawPixmap(0, 0, *bg); + painter.drawPixmap(0, 0, *fg); + return merged; +} + } // namespace frontend } // namespace lyx diff --git a/src/frontends/qt/GuiPrefs.h b/src/frontends/qt/GuiPrefs.h index ab67f69ebc..441adc81c3 100644 --- a/src/frontends/qt/GuiPrefs.h +++ b/src/frontends/qt/GuiPrefs.h @@ -735,12 +735,15 @@ class ColorSwatchDelegate : public QStyledItemDelegate public: ColorSwatchDelegate(QObject *parent = nullptr); + ~ColorSwatchDelegate(); void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; private: + QPixmap mergePixmaps(QPixmap const * fg, QPixmap const * bg) const; PrefColors* pane_; + QPixmap* bg_pixmap_; QFont font_; // To give impression that a button is pressed, flip the direction of -- lyx-cvs mailing list [email protected] https://lists.lyx.org/mailman/listinfo/lyx-cvs