From 8d181e53c573639d8a4a7e66e89bc01791b0572b Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Wed, 30 Mar 2022 20:02:03 +0300 Subject: [PATCH] Added ability to set text color of action menu item via QAction. --- ui/widgets/menu/menu_action.cpp | 16 +++++++++++++++- ui/widgets/menu/menu_action.h | 1 + ui/widgets/menu/menu_common.cpp | 5 ++++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/ui/widgets/menu/menu_action.cpp b/ui/widgets/menu/menu_action.cpp index a37bfbe..d20e734 100644 --- a/ui/widgets/menu/menu_action.cpp +++ b/ui/widgets/menu/menu_action.cpp @@ -105,7 +105,13 @@ void Action::paint(Painter &p) { if (const auto icon = (selected ? _iconOver : _icon)) { icon->paint(p, _st.itemIconPosition, width()); } - p.setPen(selected ? _st.itemFgOver : (enabled ? _st.itemFg : _st.itemFgDisabled)); + p.setPen(_fgOverride + ? QPen(*_fgOverride) + : selected + ? _st.itemFgOver + : enabled + ? _st.itemFg + : _st.itemFgDisabled); paintText(p); if (hasSubmenu()) { const auto left = width() - _st.itemPadding.right() - _st.arrow.width(); @@ -168,6 +174,14 @@ void Action::processAction() { _shortcut = actionShortcut; setMinWidth(w); update(); + + // TODO better way. + if (const auto variant = _action->data(); variant.isValid()) { + const auto overrideColor = variant.value(); + if (overrideColor.isValid()) { + _fgOverride = overrideColor; + } + } } bool Action::isEnabled() const { diff --git a/ui/widgets/menu/menu_action.h b/ui/widgets/menu/menu_action.h index f1b852a..23d28d6 100644 --- a/ui/widgets/menu/menu_action.h +++ b/ui/widgets/menu/menu_action.h @@ -54,6 +54,7 @@ private: const style::icon *_iconOver; // std::unique_ptr _toggle; int _textWidth = 0; + std::optional _fgOverride; const int _height; }; diff --git a/ui/widgets/menu/menu_common.cpp b/ui/widgets/menu/menu_common.cpp index badc14c..2aa6ffb 100644 --- a/ui/widgets/menu/menu_common.cpp +++ b/ui/widgets/menu/menu_common.cpp @@ -6,6 +6,8 @@ // #include "ui/widgets/menu/menu_common.h" +#include "ui/ui_utility.h" + #include namespace Ui::Menu { @@ -14,7 +16,8 @@ not_null CreateAction( QWidget *parent, const QString &text, Fn &&callback) { - const auto action = new QAction(text, parent); + const auto action = Ui::CreateChild(parent); + action->setText(text); parent->connect( action, &QAction::triggered,