commit 2c1b49b450a6d91d891d48206766eedb2a85d0fe
Author: Juergen Spitzmueller <[email protected]>
Date: Fri Feb 21 11:00:57 2025 +0100
Add dedicated ColorsCombo, subclassed from CategorizedCombo
We will need this sort of combo in several places, provide it with
colors filled and all
---
src/frontends/qt/CategorizedCombo.cpp | 60 ++++---------
src/frontends/qt/CategorizedCombo.h | 10 ++-
src/frontends/qt/ColorsCombo.cpp | 156 ++++++++++++++++++++++++++++++++++
src/frontends/qt/ColorsCombo.h | 65 ++++++++++++++
src/frontends/qt/GuiCharacter.cpp | 57 +++----------
src/frontends/qt/GuiCharacter.h | 4 +-
src/frontends/qt/Makefile.am | 2 +
src/frontends/qt/ui/CharacterUi.ui | 6 +-
8 files changed, 264 insertions(+), 96 deletions(-)
diff --git a/src/frontends/qt/CategorizedCombo.cpp
b/src/frontends/qt/CategorizedCombo.cpp
index 106c901d94..4200ddafab 100644
--- a/src/frontends/qt/CategorizedCombo.cpp
+++ b/src/frontends/qt/CategorizedCombo.cpp
@@ -91,13 +91,11 @@ struct CategorizedCombo::Private
// 2nd: raw names
// 3rd: category
// 4th: availability (bool)
- // 5th: color
- model_(new QStandardItemModel(0, 5, p)),
+ model_(new QStandardItemModel(0, 4, p)),
filterModel_(new CCFilterModel(p)),
lastSel_(-1),
CCItemDelegate_(new CCItemDelegate(parent)),
- visibleCategories_(0), inShowPopup_(false),
- has_colors_(false)
+ visibleCategories_(0), inShowPopup_(false)
{
filterModel_->setSourceModel(model_);
}
@@ -115,7 +113,6 @@ struct CategorizedCombo::Private
* 2nd column: raw item name,
* 3rd column: category,
* 4th column: availability
- * 5th column: color
**/
QStandardItemModel * model_;
/// the proxy model filtering \c model_
@@ -130,8 +127,6 @@ struct CategorizedCombo::Private
unsigned visibleCategories_;
///
bool inShowPopup_;
- ///
- bool has_colors_;
};
@@ -141,12 +136,6 @@ static QString categoryCC(QAbstractItemModel const &
model, int row)
}
-static QString colorCC(QAbstractItemModel const & model, int row)
-{
- return model.data(model.index(row, 4), Qt::DisplayRole).toString();
-}
-
-
static int headerHeightCC(QStyleOptionViewItem const & opt)
{
return opt.fontMetrics.height();
@@ -162,7 +151,6 @@ void CCItemDelegate::paint(QPainter * painter,
QStyleOptionViewItem const & opti
painter->fillRect(opt.rect, opt.palette.color(QPalette::Base));
QString cat = categoryCC(*index.model(), index.row());
- QString col = colorCC(*index.model(), index.row());
// not the same as in the previous line?
if (cc_->d->visibleCategories_ > 0
@@ -211,8 +199,8 @@ void CCItemDelegate::drawDisplay(QPainter * painter,
QStyleOptionViewItem const
QTextFrameFormat fmt = doc.rootFrame()->frameFormat();
fmt.setMargin(0);
- if (cc_->d->has_colors_)
- fmt.setLeftMargin (34);
+ if (cc_->left_margin_ != -1)
+ fmt.setLeftMargin(cc_->left_margin_);
doc.rootFrame()->setFrameFormat(fmt);
@@ -474,7 +462,7 @@ bool CategorizedCombo::set(QString const & item, bool const
report_missing)
QList<QStandardItem *> r = d->model_->findItems(item, Qt::MatchExactly,
1);
if (r.empty()) {
if (report_missing)
- LYXERR0("Trying to select non existent layout type " <<
item);
+ LYXERR0("Trying to select non existent entry " << item);
return false;
}
@@ -483,27 +471,10 @@ bool CategorizedCombo::set(QString const & item, bool
const report_missing)
}
-void CategorizedCombo::setColorIcon(int const i, QString const color)
-{
- if (color.isEmpty())
- return;
-
- QPixmap pixmap(32, 20);
- QColor col(color);
- pixmap.fill(col);
- QPainter painter(&pixmap);
- QRect pixmapRect = QRect(0, 0, 31, 19);
- painter.drawPixmap(pixmapRect.x(), pixmapRect.y(), pixmap);
- painter.drawRect(pixmapRect);
-
- setItemIcon(i, QIcon(pixmap));
-}
-
-
void CategorizedCombo::addItemSort(QString const & item, QString const &
guiname,
QString const & category, QString const &
tooltip,
bool sorted, bool sortedByCat, bool sortCats,
- bool available, bool nocategories, QString
const color)
+ bool available, bool nocategories)
{
QString titem = available ? guiname
: toqstr(bformat(_("Unavailable: %1$s"),
@@ -519,16 +490,11 @@ void CategorizedCombo::addItemSort(QString const & item,
QString const & guiname
row.append(new QStandardItem(item));
row.append(new QStandardItem(qcat));
row.append(new QStandardItem(available));
- if (!color.isEmpty()) {
- row.append(new QStandardItem(color));
- d->has_colors_ = true;
- }
// the first entry is easy
int const end = d->model_->rowCount();
if (end == 0) {
d->model_->appendRow(row);
- setColorIcon(0, color);
return;
}
@@ -553,7 +519,6 @@ void CategorizedCombo::addItemSort(QString const & item,
QString const & guiname
d->model_->insertRow(i, row);
} else
d->model_->appendRow(row);
- setColorIcon(i, color);
return;
}
@@ -569,7 +534,6 @@ void CategorizedCombo::addItemSort(QString const & item,
QString const & guiname
}
d->model_->insertRow(i, row);
- setColorIcon(i, color);
}
@@ -592,6 +556,12 @@ void CategorizedCombo::resetFilter()
}
+void CategorizedCombo::setLeftMargin(int const i)
+{
+ left_margin_ = i;
+}
+
+
void CategorizedCombo::updateCombo()
{
d->countCategories();
@@ -608,6 +578,12 @@ QString const & CategorizedCombo::filter() const
return d->filter_;
}
+
+QStandardItemModel * CategorizedCombo::model()
+{
+ return d->model_;
+}
+
} // namespace frontend
} // namespace lyx
diff --git a/src/frontends/qt/CategorizedCombo.h
b/src/frontends/qt/CategorizedCombo.h
index 93d5c45242..a03ea03eb3 100644
--- a/src/frontends/qt/CategorizedCombo.h
+++ b/src/frontends/qt/CategorizedCombo.h
@@ -18,6 +18,7 @@
#define LYX_CATEGORIZEDCOMBO_H
#include <QComboBox>
+#include <QStandardItemModel>
namespace lyx {
@@ -47,8 +48,7 @@ public:
void addItemSort(QString const & item, QString const & guiname,
QString const & category, QString const & tooltip,
bool sorted, bool sortedByCat, bool sortCats,
- bool available, bool nocategories = false,
- QString color = QString());
+ bool available, bool nocategories = false);
///
QString getData(int row) const;
///
@@ -63,7 +63,9 @@ public:
///
QString const & filter() const;
///
- void setColorIcon(int const i, QString const color);
+ QStandardItemModel * model();
+ ///
+ void setLeftMargin(int const);
private Q_SLOTS:
///
@@ -77,6 +79,8 @@ private:
Private * const d;
///
int lastCurrentIndex_;
+ ///
+ int left_margin_ = -1;
};
diff --git a/src/frontends/qt/ColorsCombo.cpp b/src/frontends/qt/ColorsCombo.cpp
new file mode 100644
index 0000000000..6517f58500
--- /dev/null
+++ b/src/frontends/qt/ColorsCombo.cpp
@@ -0,0 +1,156 @@
+/**
+ * \file qt/ColorsCombo.cpp
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Jürgen Spitzmüller
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#include <config.h>
+
+#include "ColorsCombo.h"
+#include "LaTeXColors.h"
+
+#include "support/gettext.h"
+#include "qt_helpers.h"
+
+#include "support/qstring_helpers.h"
+
+#include <QPainter>
+
+using namespace lyx::support;
+
+namespace lyx {
+namespace frontend {
+
+
+ColorsCombo::ColorsCombo(QWidget * parent)
+ : CategorizedCombo(parent),
+ params_(BufferParams()),
+ has_ignore_(false), has_inherit_(false)
+{
+ setLeftMargin(32);
+ fillComboColor();
+}
+
+
+ColorsCombo::~ColorsCombo()
+{}
+
+
+void ColorsCombo::setColorIcon(int const i, QString const color)
+{
+ if (color.isEmpty())
+ return;
+
+ QPixmap pixmap(32, 20);
+ QColor col(color);
+ pixmap.fill(col);
+ QPainter painter(&pixmap);
+ QRect pixmapRect = QRect(0, 0, 31, 19);
+ painter.drawPixmap(pixmapRect.x(), pixmapRect.y(), pixmap);
+ painter.drawRect(pixmapRect);
+
+ setItemIcon(i, QIcon(pixmap));
+}
+
+
+void ColorsCombo::addItemSort(QString const & item, QString const & guiname,
+ QString const & category, QString const color)
+{
+ QString titem = guiname;
+ bool const uncategorized = category.isEmpty();
+
+ QList<QStandardItem *> row;
+ QStandardItem * gui = new QStandardItem(titem);
+ row.append(gui);
+ row.append(new QStandardItem(item));
+ row.append(new QStandardItem(category));
+ row.append(new QStandardItem(true));
+ if (!color.isEmpty())
+ row.append(new QStandardItem(color));
+
+ // the first entry is easy
+ int const end = model()->rowCount();
+ if (end == 0) {
+ model()->appendRow(row);
+ setColorIcon(0, color);
+ return;
+ }
+
+ // find category
+ int i = 0;
+ // Sort categories alphabetically, uncategorized at the end.
+ while (i < end && model()->item(i, 2)->text() != category
+ && ((!uncategorized && model()->item(i,
2)->text().localeAwareCompare(category) < 0
+ && model()->item(i, 2)->text() != qt_("Uncategorized"))
+ || (uncategorized && model()->item(i, 2)->text() !=
qt_("Uncategorized"))))
+ ++i;
+
+ // find row to insert the item, after the separator if it exists
+ if (i < end) {
+ // find alphabetic position, unavailable at the end
+ while (i != end
+ && (model()->item(i,
0)->text().localeAwareCompare(titem) < 0)
+ && (model()->item(i, 2)->text() == category))
+ ++i;
+ }
+
+ model()->insertRow(i, row);
+ setColorIcon(i, color);
+}
+
+
+void ColorsCombo::setBufferParams(BufferParams const params)
+{
+ params_ = params;
+ fillComboColor();
+}
+
+
+void ColorsCombo::fillComboColor()
+{
+ reset();
+ // at first add the general values as required
+ if (has_ignore_)
+ addItemSort(QString("ignore"), qt_("No change"),
+ QString());
+ addItemSort(QString("none"), qt_("Default"),
+ QString());
+ if (has_inherit_)
+ addItemSort(QString("inherit"), qt_("(Without)[[color]]"),
+ QString());
+ // now custom colors
+ for (auto const & lc : params_.custom_colors) {
+ QString const lyxname = toqstr(lc.first);
+ QString const guiname = toqstr(lc.first);
+ QString const category = qt_("Custom Colors");
+ QString const plaincategory = toqstr("custom");
+ QString const color = toqstr(lc.second);
+ addItemSort(lyxname,
+ guiname,
+ category,
+ color);
+ }
+ // then real colors
+ for (auto const & lc : theLaTeXColors().getLaTeXColors()) {
+ QString const lyxname = toqstr(lc.first);
+ QString const guiname =
toqstr(translateIfPossible(lc.second.guiname()));
+ QString const category =
toqstr(translateIfPossible(lc.second.category()));
+ QString const plaincategory = toqstr(lc.second.category());
+ QString const color = toqstr(lc.second.hexname());
+ addItemSort(lyxname,
+ guiname,
+ category,
+ color);
+ }
+}
+
+
+} // namespace frontend
+} // namespace lyx
+
+
+#include "moc_ColorsCombo.cpp"
diff --git a/src/frontends/qt/ColorsCombo.h b/src/frontends/qt/ColorsCombo.h
new file mode 100644
index 0000000000..6f7d443d9e
--- /dev/null
+++ b/src/frontends/qt/ColorsCombo.h
@@ -0,0 +1,65 @@
+// -*- C++ -*-
+/**
+ * \file ColorsCombo.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Jürgen Spitzmüller
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#ifndef LYX_COLORSCOMBO_H
+#define LYX_COLORSCOMBO_H
+
+#include "CategorizedCombo.h"
+#include "BufferParams.h"
+
+#include <QComboBox>
+
+
+namespace lyx {
+namespace frontend {
+
+class CCItemDelegate;
+
+/**
+ * A combo box with categorization
+ */
+class ColorsCombo : public CategorizedCombo
+{
+ Q_OBJECT
+public:
+ ColorsCombo(QWidget * parent);
+ ~ColorsCombo();
+
+ /// Update combobox.
+ void updateCombo();
+ /// Add item to combo with optional color icon
+ void addItemSort(QString const & item, QString const & guiname,
+ QString const & category, QString color = QString());
+ /// Set BufferParams to access custom colors
+ void setBufferParams(BufferParams const params);
+ /// Add "ignore" color entry?
+ void hasIgnore(bool const b) { has_ignore_ = b; }
+ /// Add "inherit" color entry?
+ void hasInherit(bool const b) { has_inherit_ = b; }
+
+private:
+ ///
+ void setColorIcon(int const i, QString const color);
+ ///
+ void fillComboColor();
+ ///
+ BufferParams params_;
+ ///
+ bool has_ignore_;
+ ///
+ bool has_inherit_;
+};
+
+
+} // namespace frontend
+} // namespace lyx
+
+#endif // LYX_CATEGORIZEDCOMBO_H
diff --git a/src/frontends/qt/GuiCharacter.cpp
b/src/frontends/qt/GuiCharacter.cpp
index 22313d4419..980f852083 100644
--- a/src/frontends/qt/GuiCharacter.cpp
+++ b/src/frontends/qt/GuiCharacter.cpp
@@ -15,7 +15,7 @@
#include "GuiCharacter.h"
-#include "CategorizedCombo.h"
+#include "ColorsCombo.h"
#include "GuiApplication.h"
#include "qt_helpers.h"
@@ -29,8 +29,6 @@
#include "Language.h"
#include "Paragraph.h"
-#include "support/gettext.h"
-
#include <QAbstractItemModel>
#include <QPushButton>
#include <QComboBox>
@@ -200,8 +198,11 @@ GuiCharacter::GuiCharacter(GuiView & lv)
fillCombo(shapeCO, shape);
fillCombo(ulineCO, bar);
fillCombo(strikeCO, strike);
- fillComboColor();
fillCombo(langCO, language);
+ colorCO->hasIgnore(true);
+ colorCO->hasInherit(true);
+ colorCO->setBufferParams(buffer().masterParams());
+ custom_colors_cache_ = buffer().masterParams().custom_colors;
colorCO->setToolTip(qt_("You can also directly type on the list to
filter on color names."));
@@ -394,48 +395,6 @@ void GuiCharacter::change_adaptor()
}
-void GuiCharacter::fillComboColor()
-{
- // at first add the 2 colors "No change" and "No color"
- colorCO->addItemSort(QString("ignore"), qt_("No change"),
- QString(), QString(),
- false, false, false, true, true);
- colorCO->addItemSort(QString("none"), qt_("Default"),
- QString(), QString(),
- false, false, false, true, true);
- colorCO->addItemSort(QString("inherit"), qt_("(Without)[[color]]"),
- QString(), QString(),
- false, false, false, true, true);
- // custom colors
- for (auto const & lc : buffer().masterParams().custom_colors) {
- QString const lyxname = toqstr(lc.first);
- QString const guiname = toqstr(lc.first);
- QString const category = qt_("Custom Colors");
- QString const plaincategory = toqstr("custom");
- QString const color = toqstr(lc.second);
- colorCO->addItemSort(lyxname,
- guiname,
- category,
- QString(),
- false, true, false, true, false,
- color);
- }
- // now add the real colors
- for (auto const & lc : theLaTeXColors().getLaTeXColors()) {
- QString const lyxname = toqstr(lc.first);
- QString const guiname =
toqstr(translateIfPossible(lc.second.guiname()));
- QString const category =
toqstr(translateIfPossible(lc.second.category()));
- QString const plaincategory = toqstr(lc.second.category());
- QString const color = toqstr(lc.second.hexname());
- colorCO->addItemSort(lyxname,
- guiname,
- category,
- QString(),
- false, true, false, true, false,
- color);
- }
-}
-
void GuiCharacter::checkRestoreDefaults()
{
@@ -528,6 +487,12 @@ void GuiCharacter::updateContents()
if (font_.language() == buffer().params().language)
font_.setLanguage(reset_language);
+ // Update custom colors if needed
+ if (custom_colors_cache_ != buffer().masterParams().custom_colors) {
+ colorCO->setBufferParams(buffer().masterParams());
+ custom_colors_cache_ = buffer().masterParams().custom_colors;
+ }
+
paramsToDialog(font_);
checkRestoreDefaults();
diff --git a/src/frontends/qt/GuiCharacter.h b/src/frontends/qt/GuiCharacter.h
index bfecc6a848..e968f7f381 100644
--- a/src/frontends/qt/GuiCharacter.h
+++ b/src/frontends/qt/GuiCharacter.h
@@ -92,8 +92,6 @@ private:
void setBar(FontInfo & fi, FontDeco val);
///
void setStrike(FontInfo & fi, FontDeco val);
- ///
- void fillComboColor();
QList<FamilyPair> family;
QList<SeriesPair> series;
@@ -111,6 +109,8 @@ private:
bool noun_;
///
bool nospellcheck_;
+ ///
+ std::map<std::string, std::string> custom_colors_cache_;
///
QAction * resetdefault_ = new QAction(this);
diff --git a/src/frontends/qt/Makefile.am b/src/frontends/qt/Makefile.am
index 19c72c4b1e..3587bb0855 100644
--- a/src/frontends/qt/Makefile.am
+++ b/src/frontends/qt/Makefile.am
@@ -48,6 +48,7 @@ SOURCEFILES = \
BulletsModule.cpp \
ButtonController.cpp \
CategorizedCombo.cpp \
+ ColorsCombo.cpp \
ColorCache.cpp \
CustomizedWidgets.cpp \
DialogView.cpp \
@@ -172,6 +173,7 @@ MOCHEADER = \
Action.h \
BulletsModule.h \
CategorizedCombo.h \
+ ColorsCombo.h \
CustomizedWidgets.h \
DialogView.h \
DockView.h \
diff --git a/src/frontends/qt/ui/CharacterUi.ui
b/src/frontends/qt/ui/CharacterUi.ui
index 3733edb8a0..1fe115cc8a 100644
--- a/src/frontends/qt/ui/CharacterUi.ui
+++ b/src/frontends/qt/ui/CharacterUi.ui
@@ -190,7 +190,7 @@
</widget>
</item>
<item row="0" column="1">
- <widget class="lyx::frontend::CategorizedCombo" name="colorCO">
+ <widget class="lyx::frontend::ColorsCombo" name="colorCO">
<property name="inputMethodHints">
<set>Qt::InputMethodHint::ImhDigitsOnly|Qt::InputMethodHint::ImhLatinOnly</set>
</property>
@@ -386,9 +386,9 @@
</widget>
<customwidgets>
<customwidget>
- <class>lyx::frontend::CategorizedCombo</class>
+ <class>lyx::frontend::ColorsCombo</class>
<extends>QComboBox</extends>
- <header>CategorizedCombo.h</header>
+ <header>ColorsCombo.h</header>
</customwidget>
</customwidgets>
<tabstops>
--
lyx-cvs mailing list
[email protected]
https://lists.lyx.org/mailman/listinfo/lyx-cvs