commit 7ac700920f0de8165b834010e211517098afbe14
Author: Jean-Marc Lasgouttes <lasgout...@lyx.org>
Date:   Sat Apr 18 19:10:33 2015 +0200

    Auto feature for minibuffer toolbar
    
    Now the minibuffer toolbar is "auto" by default. It is opened by
    command-execute (M-x) and closed when the command is executed without error.
    
    * make lyx::dispatch return a DispatchResult struct
    
    * there is a new MINIBUFFER type of toolbar, that can be used for this use.
    
    * remove special handling of M-x in minnibuffer; Escape can be used 
instead. Fix focus in this case.
    
    * when minibuffer toolbar is "auto", make the toolbar close itself after
      - a command has been executed without error
      - an empty command has been executed
      - the Escape key has been used
    
    [this is actually commit fdcff02a, which was later reverted at dd61d8cf]

diff --git a/lib/ui/default.ui b/lib/ui/default.ui
index fa20f1d..34f5651 100644
--- a/lib/ui/default.ui
+++ b/lib/ui/default.ui
@@ -56,5 +56,5 @@ Toolbars
        "math" "auto,math,bottom"
        "mathmacrotemplate" "auto,mathmacrotemplate,bottom"
        "ipa" "auto,ipa,bottom"
-       "minibuffer" "off,bottom"
+       "minibuffer" "auto,minibuffer,bottom"
 End
diff --git a/src/LyX.cpp b/src/LyX.cpp
index c3d84b2..b4c0216 100644
--- a/src/LyX.cpp
+++ b/src/LyX.cpp
@@ -1386,7 +1386,7 @@ FuncStatus getStatus(FuncRequest const & action)
 }
 
 
-void dispatch(FuncRequest const & action)
+DispatchResult const & dispatch(FuncRequest const & action)
 {
        LAPPERR(theApp());
        return theApp()->dispatch(action);
@@ -1396,7 +1396,7 @@ void dispatch(FuncRequest const & action)
 void dispatch(FuncRequest const & action, DispatchResult & dr)
 {
        LAPPERR(theApp());
-       return theApp()->dispatch(action, dr);
+       theApp()->dispatch(action, dr);
 }
 
 
diff --git a/src/LyX.h b/src/LyX.h
index ccce7a3..9980ab5 100644
--- a/src/LyX.h
+++ b/src/LyX.h
@@ -135,7 +135,7 @@ private:
        bool first_start;
 
        friend FuncStatus getStatus(FuncRequest const & action);
-       friend void dispatch(FuncRequest const & action);
+       friend DispatchResult const & dispatch(FuncRequest const & action);
        friend void dispatch(FuncRequest const & action, DispatchResult & dr);
        friend std::vector<std::string> & theFilesToLoad();
        friend BufferList & theBufferList();
@@ -175,7 +175,7 @@ void execBatchCommands();
 FuncStatus getStatus(FuncRequest const & action);
 
 ///
-void dispatch(FuncRequest const & action);
+DispatchResult const & dispatch(FuncRequest const & action);
 
 ///
 void dispatch(FuncRequest const & action, DispatchResult & dr);
diff --git a/src/frontends/Application.h b/src/frontends/Application.h
index ca5ea44..df0be95 100644
--- a/src/frontends/Application.h
+++ b/src/frontends/Application.h
@@ -177,7 +177,7 @@ public:
        /// Every user command is processed here, either invocated from
        /// keyboard or from the GUI. All GUI objects, including buttons and
        /// menus should use this class and never call kernel functions 
directly.
-       virtual void dispatch(FuncRequest const &) = 0;
+       virtual DispatchResult const & dispatch(FuncRequest const &) = 0;
 
        /// LyX dispatcher: executes lyx actions and returns result.
        virtual void dispatch(FuncRequest const &, DispatchResult & dr) = 0;
diff --git a/src/frontends/qt4/GuiApplication.cpp 
b/src/frontends/qt4/GuiApplication.cpp
index fc96995..9d3b339 100644
--- a/src/frontends/qt4/GuiApplication.cpp
+++ b/src/frontends/qt4/GuiApplication.cpp
@@ -965,6 +965,9 @@ struct GuiApplication::Private
        ///
        KeyModifier meta_fake_bit;
 
+       /// The result of last dispatch action
+       DispatchResult dispatch_result_;
+
        /// Multiple views container.
        /**
        * Warning: This must not be a smart pointer as the destruction of the
@@ -1372,7 +1375,7 @@ static docstring makeDispatchMessage(docstring const & 
msg,
 }
 
 
-void GuiApplication::dispatch(FuncRequest const & cmd)
+DispatchResult const & GuiApplication::dispatch(FuncRequest const & cmd)
 {
        Buffer * buffer = 0;
        if (current_view_ && current_view_->currentBufferView()) {
@@ -1392,6 +1395,9 @@ void GuiApplication::dispatch(FuncRequest const & cmd)
        // the buffer may have been closed by one action
        if (theBufferList().isLoaded(buffer))
                buffer->undo().endUndoGroup();
+
+       d->dispatch_result_ = dr;
+       return d->dispatch_result_;
 }
 
 
diff --git a/src/frontends/qt4/GuiApplication.h 
b/src/frontends/qt4/GuiApplication.h
index bfc242c..344a862 100644
--- a/src/frontends/qt4/GuiApplication.h
+++ b/src/frontends/qt4/GuiApplication.h
@@ -62,7 +62,7 @@ public:
 
        /// \name Methods inherited from Application class
        //@{
-       void dispatch(FuncRequest const &);
+       DispatchResult const & dispatch(FuncRequest const &);
        void dispatch(FuncRequest const &, DispatchResult & dr);
        FuncStatus getStatus(FuncRequest const & cmd) const;
        void restoreGuiSession();
diff --git a/src/frontends/qt4/GuiCommandBuffer.cpp 
b/src/frontends/qt4/GuiCommandBuffer.cpp
index c9ddf4a..9880e2b 100644
--- a/src/frontends/qt4/GuiCommandBuffer.cpp
+++ b/src/frontends/qt4/GuiCommandBuffer.cpp
@@ -108,12 +108,11 @@ GuiCommandBuffer::GuiCommandBuffer(GuiView * view)
        edit_->setMinimumSize(edit_->sizeHint());
        edit_->setFocusPolicy(Qt::ClickFocus);
 
-       connect(edit_, SIGNAL(escapePressed()), this, SLOT(cancel()));
        connect(edit_, SIGNAL(returnPressed()), this, SLOT(dispatch()));
        connect(edit_, SIGNAL(tabPressed()), this, SLOT(complete()));
        connect(edit_, SIGNAL(upPressed()), this, SLOT(up()));
        connect(edit_, SIGNAL(downPressed()), this, SLOT(down()));
-       connect(edit_, SIGNAL(hidePressed()), this, SLOT(hideParent()));
+       connect(edit_, SIGNAL(escapePressed()), this, SLOT(hideParent()));
 
        layout->addWidget(upPB, 0);
        layout->addWidget(downPB, 0);
@@ -138,22 +137,19 @@ GuiCommandBuffer::GuiCommandBuffer(GuiView * view)
 }
 
 
-void GuiCommandBuffer::cancel()
-{
-       view_->setFocus();
-       edit_->setText(QString());
-}
-
-
 void GuiCommandBuffer::dispatch()
 {
-       QString const cmd = edit_->text();
-       view_->setFocus();
-       edit_->setText(QString());
-       edit_->clearFocus();
-       std::string const cmd_ = fromqstr(cmd);
-       theSession().lastCommands().add(cmd_);
-       dispatch(cmd_);
+       std::string const cmd = fromqstr(edit_->text());
+       if (!cmd.empty())
+               theSession().lastCommands().add(cmd);
+       DispatchResult const & dr = dispatch(cmd);
+       if (!dr.error()) {
+               view_->setFocus();
+               edit_->setText(QString());
+               edit_->clearFocus();
+               // If the toolbar was "auto", it is not needed anymore
+               view_->resetCommandExecute();
+       }
 }
 
 
@@ -257,9 +253,9 @@ void GuiCommandBuffer::down()
 void GuiCommandBuffer::hideParent()
 {
        view_->setFocus();
+       view_->resetCommandExecute();
        edit_->setText(QString());
        edit_->clearFocus();
-       hide();
 }
 
 
@@ -301,13 +297,6 @@ docstring const GuiCommandBuffer::getCurrentState() const
 }
 
 
-void GuiCommandBuffer::hide() const
-{
-       FuncRequest cmd(LFUN_COMMAND_EXECUTE, "off");
-       lyx::dispatch(cmd);
-}
-
-
 vector<string> const
 GuiCommandBuffer::completions(string const & prefix, string & new_prefix)
 {
@@ -347,10 +336,12 @@ GuiCommandBuffer::completions(string const & prefix, 
string & new_prefix)
 }
 
 
-void GuiCommandBuffer::dispatch(string const & str)
+DispatchResult const & GuiCommandBuffer::dispatch(string const & str)
 {
-       if (str.empty())
-               return;
+       if (str.empty()) {
+               static DispatchResult empty_dr;
+               return empty_dr;
+       }
 
        history_.push_back(trim(str));
        history_pos_ = history_.end();
@@ -358,7 +349,7 @@ void GuiCommandBuffer::dispatch(string const & str)
        downPB->setEnabled(history_pos_ != history_.end());
        FuncRequest func = lyxaction.lookupFunc(str);
        func.setOrigin(FuncRequest::COMMANDBUFFER);
-       lyx::dispatch(func);
+       return lyx::dispatch(func);
 }
 
 } // namespace frontend
diff --git a/src/frontends/qt4/GuiCommandBuffer.h 
b/src/frontends/qt4/GuiCommandBuffer.h
index 0737087..8225ec7 100644
--- a/src/frontends/qt4/GuiCommandBuffer.h
+++ b/src/frontends/qt4/GuiCommandBuffer.h
@@ -24,6 +24,9 @@
 class QListWidgetItem;
 
 namespace lyx {
+
+class DispatchResult;
+
 namespace frontend {
 
 class GuiView;
@@ -37,8 +40,6 @@ public:
        GuiCommandBuffer(GuiView * view);
 
 public Q_SLOTS:
-       /// cancel command compose
-       void cancel();
        /// dispatch a command
        void dispatch();
        /// tab-complete
@@ -67,9 +68,6 @@ private:
        /// return the font and depth in the active BufferView as a message.
        docstring const getCurrentState() const;
 
-       /// hide the command buffer.
-       void hide() const;
-
        /// open a listbox and show the contents of the list. When reversed
        /// is true, the contents of the list is filled bottom-up.
        void showList(std::vector<std::string> const & list, 
@@ -80,7 +78,7 @@ private:
                                              std::string & new_prefix);
 
        /// dispatch a command
-       void dispatch(std::string const & str);
+       DispatchResult const & dispatch(std::string const & str);
 
        /// available command names
        std::vector<std::string> commands_;
diff --git a/src/frontends/qt4/GuiCommandEdit.cpp 
b/src/frontends/qt4/GuiCommandEdit.cpp
index 6dbec41..22dd9c8 100644
--- a/src/frontends/qt4/GuiCommandEdit.cpp
+++ b/src/frontends/qt4/GuiCommandEdit.cpp
@@ -45,14 +45,6 @@ void GuiCommandEdit::keyPressEvent(QKeyEvent * e)
                downPressed();
                break;
 
-       case Qt::Key_X:
-               if (e->modifiers() == Qt::AltModifier
-                  || e->modifiers() == Qt::MetaModifier) {
-                       // emit signal
-                       hidePressed();
-                       break;
-               }
-
        default:
                QLineEdit::keyPressEvent(e);
                break;
diff --git a/src/frontends/qt4/GuiCommandEdit.h 
b/src/frontends/qt4/GuiCommandEdit.h
index 5968b6f..7683311 100644
--- a/src/frontends/qt4/GuiCommandEdit.h
+++ b/src/frontends/qt4/GuiCommandEdit.h
@@ -35,8 +35,6 @@ Q_SIGNALS:
        void downPressed();
        /// complete
        void tabPressed();
-       /// leave and hide command buffer
-       void hidePressed();
 
 protected:
        ///
diff --git a/src/frontends/qt4/GuiToolbar.cpp b/src/frontends/qt4/GuiToolbar.cpp
index 11413a6..77471c9 100644
--- a/src/frontends/qt4/GuiToolbar.cpp
+++ b/src/frontends/qt4/GuiToolbar.cpp
@@ -323,8 +323,12 @@ void GuiToolbar::add(ToolbarItem const & item)
 
 void GuiToolbar::update(int context)
 {
-       if (visibility_ & Toolbars::AUTO)
+       if (visibility_ & Toolbars::AUTO) {
+               bool const was_visible = isVisible();
                setVisible(visibility_ & context & Toolbars::ALLOWAUTO);
+               if (isVisible() && !was_visible && commandBuffer())
+                       commandBuffer()->setFocus();
+       }
 
        // update visible toolbars only
        if (!isVisible())
diff --git a/src/frontends/qt4/GuiView.cpp b/src/frontends/qt4/GuiView.cpp
index 9a8664d..ed7835f 100644
--- a/src/frontends/qt4/GuiView.cpp
+++ b/src/frontends/qt4/GuiView.cpp
@@ -508,7 +508,8 @@ QSet<Buffer const *> GuiView::GuiViewPrivate::busyBuffers;
 
 
 GuiView::GuiView(int id)
-       : d(*new GuiViewPrivate(this)), id_(id), closing_(false), busy_(0)
+       : d(*new GuiViewPrivate(this)), id_(id), closing_(false), busy_(0),
+         command_execute_(false)
 {
        // GuiToolbars *must* be initialised before the menu bar.
        normalSizedIcons(); // at least on Mac the default is 32 otherwise, 
which is huge
@@ -1343,6 +1344,13 @@ void GuiView::setBusy(bool busy)
 }
 
 
+void GuiView::resetCommandExecute()
+{
+       command_execute_ = false;
+       updateToolbars();
+}
+
+
 double GuiView::pixelRatio() const
 {
 #if QT_VERSION >= 0x050000
@@ -1547,6 +1555,8 @@ void GuiView::updateToolbars()
                        context |= Toolbars::MATHMACROTEMPLATE;
                if (lyx::getStatus(FuncRequest(LFUN_IN_IPA)).enabled())
                        context |= Toolbars::IPA;
+               if (command_execute_)
+                       context |= Toolbars::MINIBUFFER;
 
                for (ToolbarMap::iterator it = d.toolbars_.begin(); it != end; 
++it)
                        it->second->update(context);
@@ -3624,14 +3634,7 @@ void GuiView::dispatch(FuncRequest const & cmd, 
DispatchResult & dr)
                        break;
 
                case LFUN_COMMAND_EXECUTE: {
-                       bool const show_it = cmd.argument() != "off";
-                       // FIXME: this is a hack, "minibuffer" should not be
-                       // hardcoded.
-                       if (GuiToolbar * t = toolbar("minibuffer")) {
-                               t->setVisible(show_it);
-                               if (show_it && t->commandBuffer())
-                                       t->commandBuffer()->setFocus();
-                       }
+                       command_execute_ = true;
                        break;
                }
                case LFUN_DROP_LAYOUTS_CHOICE:
diff --git a/src/frontends/qt4/GuiView.h b/src/frontends/qt4/GuiView.h
index 43b9b98..74aad81 100644
--- a/src/frontends/qt4/GuiView.h
+++ b/src/frontends/qt4/GuiView.h
@@ -84,6 +84,8 @@ public:
        /// are we busy ?
        bool busy() const;
 
+       /// Signal that the any "auto" minibuffer can be closed now.
+       void resetCommandExecute();
 
        /// \name Generic accessor functions
        //@{
@@ -450,6 +452,9 @@ private:
        /// functions that call setBusy;
        int busy_;
 
+       /// Request to open the command toolbar if it is "auto"
+       bool command_execute_;
+
 };
 
 } // namespace frontend
diff --git a/src/frontends/qt4/Toolbars.cpp b/src/frontends/qt4/Toolbars.cpp
index c961025..20eee93 100644
--- a/src/frontends/qt4/Toolbars.cpp
+++ b/src/frontends/qt4/Toolbars.cpp
@@ -348,6 +348,8 @@ void Toolbars::readToolbarSettings(Lexer & lex)
                                flag = MATHMACROTEMPLATE;
                        else if (!compare_ascii_no_case(*cit, "review"))
                                flag = REVIEW;
+                       else if (!compare_ascii_no_case(*cit, "minibuffer"))
+                               flag = MINIBUFFER;
                        else if (!compare_ascii_no_case(*cit, "top"))
                                flag = TOP;
                        else if (!compare_ascii_no_case(*cit, "bottom"))
diff --git a/src/frontends/qt4/Toolbars.h b/src/frontends/qt4/Toolbars.h
index 3e6ac57..02d0ebe 100644
--- a/src/frontends/qt4/Toolbars.h
+++ b/src/frontends/qt4/Toolbars.h
@@ -110,7 +110,8 @@ public:
                MATHMACROTEMPLATE = 1024, //< show in math macro template
                SAMEROW = 2048, //place to the current row, no new line
                IPA = 4096, //< show when in IPA inset
-               ALLOWAUTO = MATH | TABLE | REVIEW | MATHMACROTEMPLATE | IPA
+               MINIBUFFER = 8192, //< show when command-execute has been 
invoked
+               ALLOWAUTO = MATH | TABLE | REVIEW | MATHMACROTEMPLATE | IPA | 
MINIBUFFER
        };
 
        typedef std::vector<ToolbarInfo> Infos;

Reply via email to