commit 11f2324d2578283c1d5cc84b9ad8536068ec041b
Author: Guillaume MM <[email protected]>
Date: Sat Jun 6 11:49:45 2026 +0200
Call setIcon only if necessary (#13324)
(cherry picked from commit cefdc6694d05adbb1887ed72ab1a16eaa04db88a)
(cherry picked from commit ede1f9c9d1d1d00fdfac582de16b7363c0f03156)
---
src/frontends/qt/Action.cpp | 34 +++++++++++++++++++++-------------
src/frontends/qt/Action.h | 17 +++++++++--------
src/frontends/qt/GuiToolbar.cpp | 9 +++++----
status.25x | 2 ++
4 files changed, 37 insertions(+), 25 deletions(-)
diff --git a/src/frontends/qt/Action.cpp b/src/frontends/qt/Action.cpp
index d9b8ec547a..80d987a790 100644
--- a/src/frontends/qt/Action.cpp
+++ b/src/frontends/qt/Action.cpp
@@ -28,18 +28,20 @@ namespace lyx {
namespace frontend {
-Action::Action(FuncRequest func, QIcon const & icon, QString const & text,
- QString const & tooltip, QObject * parent)
- : QAction(parent), func_(make_shared<FuncRequest>(std::move(func))),
icon_(icon)
-{
- init(text, tooltip);
-}
+Action::Action(FuncRequest func, QIcon const & ltr_icon, QString const & text,
+ QString const & tooltip, QObject * parent,
+ QIcon const & rtl_icon)
+ : Action(make_shared<FuncRequest>(std::move(func)), ltr_icon, text,
tooltip,
+ parent, rtl_icon)
+{}
Action::Action(shared_ptr<FuncRequest const> const & func,
- QIcon const & icon, QString const & text,
- QString const & tooltip, QObject * parent)
- : QAction(parent), func_(func), icon_(icon)
+ QIcon const & ltr_icon, QString const & text,
+ QString const & tooltip, QObject * parent,
+ QIcon const & rtl_icon)
+ : QAction(parent), func_(func), ltr_icon_(ltr_icon),
+ rtl_icon_(rtl_icon), is_rtl_(false)
{
init(text, tooltip);
}
@@ -52,6 +54,7 @@ void Action::init(QString const & text, QString const &
tooltip)
setText(text);
setToolTip(tooltip);
setStatusTip(tooltip);
+ setIcon(ltr_icon_);
connect(this, SIGNAL(triggered()), this, SLOT(action()));
update();
}
@@ -71,10 +74,15 @@ void Action::update()
setCheckable(false);
}
- if (rtlIcon_.isNull() || !guiApp->rtlContext())
- setIcon(icon_);
- else
- setIcon(rtlIcon_);
+ if (!rtl_icon_.isNull()) {
+ bool become_rtl = guiApp->rtlContext();
+ /* setIcon always triggers an ActionChanged event, regardless
of whether
+ it actually changes, so we need to call it only if needed
(#13324) */
+ if (is_rtl_ != become_rtl) {
+ setIcon(become_rtl ? rtl_icon_ : ltr_icon_);
+ is_rtl_ = become_rtl;
+ }
+ }
setEnabled(status.enabled());
}
diff --git a/src/frontends/qt/Action.h b/src/frontends/qt/Action.h
index 53398a0ec6..36ca700304 100644
--- a/src/frontends/qt/Action.h
+++ b/src/frontends/qt/Action.h
@@ -34,16 +34,16 @@ class Action : public QAction
public:
// Makes a copy of func
- Action(FuncRequest func, QIcon const & icon, QString const & text,
- QString const & tooltip, QObject * parent);
+ Action(FuncRequest func, QIcon const & ltr_icon, QString const & text,
+ QString const & tooltip, QObject * parent,
+ QIcon const & rtl_icon = QIcon());
// Takes shared ownership of func.
// Use for perf-sensitive code such as populating menus.
Action(std::shared_ptr<FuncRequest const> const & func,
- QIcon const & icon, QString const & text,
- QString const & tooltip, QObject * parent);
-
- void setRtlIcon(QIcon const & icon) { rtlIcon_ = icon; }
+ QIcon const & ltr_icon, QString const & text,
+ QString const & tooltip, QObject * parent,
+ QIcon const & rtl_icon = QIcon());
void update();
@@ -57,8 +57,9 @@ private Q_SLOTS:
private:
void init(QString const & text, QString const & tooltip);
std::shared_ptr<FuncRequest const> func_;
- QIcon icon_;
- QIcon rtlIcon_;
+ QIcon ltr_icon_;
+ QIcon rtl_icon_;
+ bool is_rtl_;
};
diff --git a/src/frontends/qt/GuiToolbar.cpp b/src/frontends/qt/GuiToolbar.cpp
index ff8ce5dd38..897150295f 100644
--- a/src/frontends/qt/GuiToolbar.cpp
+++ b/src/frontends/qt/GuiToolbar.cpp
@@ -167,10 +167,11 @@ Action * GuiToolbar::addItem(ToolbarItem const & item,
bool menu)
tooltip += " [" + binding + "]";
}
- Action * act = new Action(item.func, getIcon(*item.func, false), text,
- tooltip, this);
- if (item.type == ToolbarItem::BIDICOMMAND)
- act->setRtlIcon(getIcon(*item.func, false, true));
+ QIcon ltr_icon = getIcon(*item.func, false);
+ QIcon rtl_icon = (item.type == ToolbarItem::BIDICOMMAND) ?
+ getIcon(*item.func, false, true) : QIcon();
+ Action * act = new Action(item.func, ltr_icon, text, tooltip,
+ this, rtl_icon);
actions_.append(act);
return act;
diff --git a/status.25x b/status.25x
index 66f8829fb8..25a042149d 100644
--- a/status.25x
+++ b/status.25x
@@ -39,6 +39,8 @@ What's new
- When a macro is modified, make previews update faster (bug 13342).
+- Improve performance of toolbar update after each action (bug 13324).
+
* DOCUMENTATION AND LOCALIZATION
--
lyx-cvs mailing list
[email protected]
https://lists.lyx.org/mailman/listinfo/lyx-cvs