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

Reply via email to