commit e2f864efe447c0d71eeaefaaeb4d51b8316f3fd1
Author: Daniel Ramöller <[email protected]>
Date:   Thu Nov 24 14:10:03 2016 +0200

    Lock toolbars (#10283)
    
    - LFUNs to (un)lock toolbars positions (both individually and all at once)
    
    - corresponding menu entry to "Lock Toolbars" menu.
---
 lib/ui/stdcontext.inc            |    2 +
 lib/ui/stdmenus.inc              |    2 +
 src/FuncCode.h                   |    1 +
 src/LyXAction.cpp                |   12 +++++++
 src/frontends/qt4/GuiToolbar.cpp |   29 ++++++++++++++++-
 src/frontends/qt4/GuiToolbar.h   |    3 ++
 src/frontends/qt4/GuiView.cpp    |   62 ++++++++++++++++++++++++++++++++++++++
 src/frontends/qt4/GuiView.h      |    5 +++
 8 files changed, 114 insertions(+), 2 deletions(-)

diff --git a/lib/ui/stdcontext.inc b/lib/ui/stdcontext.inc
index 89cf287..54fbc8d 100644
--- a/lib/ui/stdcontext.inc
+++ b/lib/ui/stdcontext.inc
@@ -673,6 +673,8 @@ Menuset
        Menu "context-toolbars"
                Toolbars
                Separator
+               Item "Lock All Toolbars|L" "toolbar-movable *"
+               Separator
                Item "Small-sized Icons" "icon-size small"
                Item "Normal-sized Icons" "icon-size normal"
                Item "Big-sized Icons" "icon-size big"
diff --git a/lib/ui/stdmenus.inc b/lib/ui/stdmenus.inc
index a392ba5..e8d2a29 100644
--- a/lib/ui/stdmenus.inc
+++ b/lib/ui/stdmenus.inc
@@ -353,6 +353,8 @@ Menuset
        Menu "toolbars"
                Toolbars
                Separator
+               Item "Lock All Toolbars|L" "toolbar-movable *"
+               Separator
                Item "Small-sized Icons" "icon-size small"
                Item "Normal-sized Icons" "icon-size normal"
                Item "Big-sized Icons" "icon-size big"
diff --git a/src/FuncCode.h b/src/FuncCode.h
index 9561cbc..c8a46ce 100644
--- a/src/FuncCode.h
+++ b/src/FuncCode.h
@@ -472,6 +472,7 @@ enum FuncCode
        // 365
        LFUN_BUFFER_EXTERNAL_MODIFICATION_CLEAR,// gm, 20170302
        LFUN_BUFFER_ZOOM,               // daniel, 20161028
+       LFUN_TOOLBAR_MOVABLE,           // daniel, 20160712
        LFUN_LASTACTION                 // end of the table
 };
 
diff --git a/src/LyXAction.cpp b/src/LyXAction.cpp
index d3c1895..c068db9 100644
--- a/src/LyXAction.cpp
+++ b/src/LyXAction.cpp
@@ -3748,6 +3748,18 @@ void LyXAction::init()
                { LFUN_THESAURUS_ENTRY, "thesaurus-entry", ReadOnly, Edit },
 
 /*!
+ * \var lyx::FuncCode lyx::LFUN_TOOLBAR_MOVABLE
+ * \li Action: Toggles movability of a given toolbar between true/false.
+ * \li Syntax: toolbar-movable <NAME>
+ * \li Params: <NAME>: *|standard|extra|table|math|mathmacrotemplate|\n
+                                          
minibuffer|review|view/update|math_panels|vcs|
+                                          view-others|update-others
+* \li Origin: daniel, 12 July 2016
+* \endvar
+*/
+               { LFUN_TOOLBAR_MOVABLE, "toolbar-movable", NoBuffer, Buffer },
+
+/*!
  * \var lyx::FuncCode lyx::LFUN_TOOLBAR_TOGGLE
  * \li Action: Toggles visibility of a given toolbar between on/off/auto.
  * \li Notion: Skipping "auto" when allowauto is false.
diff --git a/src/frontends/qt4/GuiToolbar.cpp b/src/frontends/qt4/GuiToolbar.cpp
index 36a7326..1c38a18 100644
--- a/src/frontends/qt4/GuiToolbar.cpp
+++ b/src/frontends/qt4/GuiToolbar.cpp
@@ -61,8 +61,6 @@ GuiToolbar::GuiToolbar(ToolbarInfo const & tbinfo, GuiView & 
owner)
        connect(&owner, SIGNAL(iconSizeChanged(QSize)), this,
                SLOT(setIconSize(QSize)));
 
-       // Toolbar dragging is allowed.
-       setMovable(true);
        // This is used by QMainWindow::restoreState for proper main window 
state
        // restauration.
        setObjectName(toqstr(tbinfo.name));
@@ -357,6 +355,7 @@ void GuiToolbar::saveSession() const
 {
        QSettings settings;
        settings.setValue(sessionKey() + "/visibility", visibility_);
+       settings.setValue(sessionKey() + "/movability", isMovable());
 }
 
 
@@ -373,6 +372,9 @@ void GuiToolbar::restoreSession()
                        
guiApp->toolbars().defaultVisibility(fromqstr(objectName()));
        }
        setVisibility(visibility);
+
+       int movability = settings.value(sessionKey() + "/movability", 
true).toBool();
+       setMovable(movability);
 }
 
 
@@ -408,6 +410,29 @@ void GuiToolbar::toggle()
                qstring_to_ucs4(windowTitle()), state));
 }
 
+void GuiToolbar::movable(bool silent)
+{
+       // toggle movability
+       setMovable(!isMovable());
+
+       // manual repaint avoids bug in qt that the drag handle is not removed
+       // properly, e.g. in Windows
+       if (isVisible())
+               repaint();
+
+       // silence for toggling of many toolbars for performance
+       if (!silent) {
+               docstring state;
+               if (isMovable()) {
+                       state = _("movable");
+               } else {
+                       state = _("immovable");
+               }
+               owner_.message(bformat(_("Toolbar \"%1$s\" state set to %2$s"),
+                       qstring_to_ucs4(windowTitle()), state));
+       }
+}
+
 } // namespace frontend
 } // namespace lyx
 
diff --git a/src/frontends/qt4/GuiToolbar.h b/src/frontends/qt4/GuiToolbar.h
index caad355..43f6188 100644
--- a/src/frontends/qt4/GuiToolbar.h
+++ b/src/frontends/qt4/GuiToolbar.h
@@ -97,6 +97,9 @@ public:
        ///
        void toggle();
 
+       /// toggles movability
+       void movable(bool silent = false);
+
        ///
        GuiCommandBuffer * commandBuffer() { return command_buffer_; }
 
diff --git a/src/frontends/qt4/GuiView.cpp b/src/frontends/qt4/GuiView.cpp
index f01b94c..030898b 100644
--- a/src/frontends/qt4/GuiView.cpp
+++ b/src/frontends/qt4/GuiView.cpp
@@ -793,6 +793,9 @@ bool GuiView::restoreLayout()
                        initToolbar(cit->name);
        }
 
+       // update lock (all) toolbars positions
+       updateLockToolbars();
+
        updateDialogs();
        return true;
 }
@@ -809,6 +812,17 @@ GuiToolbar * GuiView::toolbar(string const & name)
 }
 
 
+void GuiView::updateLockToolbars()
+{
+       toolbarsMovable = false;
+       for (ToolbarInfo const & info : guiApp->toolbars()) {
+               GuiToolbar * tb = toolbar(info.name);
+               if (tb && tb->isMovable())
+                       toolbarsMovable = true;
+       }
+}
+
+
 void GuiView::constructToolbars()
 {
        ToolbarMap::iterator it = d.toolbars_.begin();
@@ -876,6 +890,8 @@ void GuiView::initToolbar(string const & name)
 
        if (visibility & Toolbars::ON)
                tb->setVisible(true);
+
+       tb->setMovable(true);
 }
 
 
@@ -1895,6 +1911,23 @@ bool GuiView::getStatus(FuncRequest const & cmd, 
FuncStatus & flag)
                break;
        }
 
+       case LFUN_TOOLBAR_MOVABLE: {
+               string const name = cmd.getArg(0);
+               // use negation since locked == !movable
+               if (name == "*") {
+                       // toolbar name * locks all toolbars
+                       flag.setOnOff(!toolbarsMovable);
+               } else if (GuiToolbar * t = toolbar(name)) {
+                       flag.setOnOff(!(t->isMovable()));
+               } else {
+                       enable = false;
+                       docstring const msg =
+                               bformat(_("Unknown toolbar \"%1$s\""), 
from_utf8(name));
+                       flag.message(msg);
+               }
+               break;
+       }
+
        case LFUN_ICON_SIZE:
                flag.setOnOff(d.iconSize(cmd.argument()) == iconSize());
                break;
@@ -3815,6 +3848,35 @@ void GuiView::dispatch(FuncRequest const & cmd, 
DispatchResult & dr)
                        break;
                }
 
+               case LFUN_TOOLBAR_MOVABLE: {
+                       string const name = cmd.getArg(0);
+                       if (name == "*") {
+                               // toggle (all) toolbars movablility
+                               toolbarsMovable = !toolbarsMovable;
+                               Toolbars::Infos::iterator cit = 
guiApp->toolbars().begin();
+                               Toolbars::Infos::iterator end = 
guiApp->toolbars().end();
+                               for (; cit != end; ++cit) {
+                                       GuiToolbar * tb = toolbar(cit->name);
+                                       if (tb && tb->isMovable() != 
toolbarsMovable) {
+                                               // toggle toolbar movablity if 
it does not fit lock (all) toolbars positions state
+                                               // silent = true, since status 
bar notifications are slow
+                                               tb->movable(true);
+                                       }
+                               }
+                               if (toolbarsMovable) {
+                                       dr.setMessage(_("All toolbars 
unlocked."));
+                               } else {
+                                       dr.setMessage(_("All toolbars 
locked."));
+                               }
+                       } else if (GuiToolbar * t = toolbar(name)) {
+                               // toggle current toolbar movablity
+                               t->movable();
+                               // update lock (all) toolbars positions
+                               updateLockToolbars();
+                       }
+                       break;
+               }
+
                case LFUN_ICON_SIZE: {
                        QSize size = d.iconSize(cmd.argument());
                        setIconSize(size);
diff --git a/src/frontends/qt4/GuiView.h b/src/frontends/qt4/GuiView.h
index 4b0429c..297de89 100644
--- a/src/frontends/qt4/GuiView.h
+++ b/src/frontends/qt4/GuiView.h
@@ -210,6 +210,9 @@ public:
        /// Current ratio between physical pixels and device-independent pixels
        double pixelRatio() const;
 
+       // movability flag of all toolbars
+       bool toolbarsMovable;
+
 Q_SIGNALS:
        void closing(int);
        void triggerShowDialog(QString const & qname, QString const & qdata, 
Inset * inset);
@@ -357,6 +360,8 @@ private:
        void initToolbars();
        ///
        void initToolbar(std::string const & name);
+       /// Update lock (all) toolbars position
+       void updateLockToolbars();
        ///
        bool lfunUiToggle(std::string const & ui_component);
        ///

Reply via email to