]> git.lyx.org Git - features.git/commitdiff
Auto feature for minibuffer toolbar
authorJean-Marc Lasgouttes <lasgouttes@lyx.org>
Sat, 18 Apr 2015 17:10:33 +0000 (19:10 +0200)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Mon, 29 Jun 2015 07:21:15 +0000 (09:21 +0200)
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

15 files changed:
lib/ui/default.ui
src/LyX.cpp
src/LyX.h
src/frontends/Application.h
src/frontends/qt4/GuiApplication.cpp
src/frontends/qt4/GuiApplication.h
src/frontends/qt4/GuiCommandBuffer.cpp
src/frontends/qt4/GuiCommandBuffer.h
src/frontends/qt4/GuiCommandEdit.cpp
src/frontends/qt4/GuiCommandEdit.h
src/frontends/qt4/GuiToolbar.cpp
src/frontends/qt4/GuiView.cpp
src/frontends/qt4/GuiView.h
src/frontends/qt4/Toolbars.cpp
src/frontends/qt4/Toolbars.h

index fa20f1d39e35fb7d99cb8aea2a214098c5d6beb0..34f56510aaedd37579ab8c25374307e5b3290049 100644 (file)
@@ -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
index c3d84b22f614d2c636cd18a1990313d679e15386..b4c02168c8ed36f1d539d1030863eb6398245058 100644 (file)
@@ -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);
 }
 
 
index ccce7a31549bf1f1099a9db0944f8bc1d4ea87f9..9980ab5eef47d55a909b84b2a79b6535565cfd5c 100644 (file)
--- 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);
index ca5ea4493ad774dce66e94d4bb6a2b20c46649c9..df0be95493e4cbe5ff2bcbdf71434ec5c7413e66 100644 (file)
@@ -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;
index 8bd22c8c0385134b495e7ca234e05871047199e2..fa668716bb88405bfb6297dd87a63913c2883d01 100644 (file)
@@ -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_;
 }
 
 
index bfc242ccde8713ebd0d314f9c64fdd4699084d23..344a8620dab421e8435cf03c65b768dd777af6ce 100644 (file)
@@ -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();
index c9ddf4a49ea539d5aab70582facda99737a5c1fe..9880e2b996a37a6f60929ef61281b139ff85a936 100644 (file)
@@ -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
index 07370875f31cea00c653f266247bae721cb49a2e..8225ec71a720c8b1c42cfbda55da12d3030c4c59 100644 (file)
@@ -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_;
index 6dbec414a0a005447dd93091ebdbb36836f542ac..22dd9c8f033a4476cfa762e75a729b5367058435 100644 (file)
@@ -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;
index 5968b6fbd06e06c1059a7795bebfed616b63afe6..76833115cd255fe97ef20de814989f17280887e3 100644 (file)
@@ -35,8 +35,6 @@ Q_SIGNALS:
        void downPressed();
        /// complete
        void tabPressed();
-       /// leave and hide command buffer
-       void hidePressed();
 
 protected:
        ///
index 11413a680633247e898ff9424429cc3b31869d84..77471c98af384e380cf2d720943aab5d65e901cc 100644 (file)
@@ -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())
index 9a8664d39367dedb37321ef47b93dbb2e6269f5b..ed7835fcca2d419ebcf98da81f18b24c723d16e7 100644 (file)
@@ -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:
index 43b9b988a5db8b6f288c62660a196d1c4704467a..74aad81f83d0fd24f11567381b25e9cd699a6add 100644 (file)
@@ -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
index c9610252f3ca3c1b2ad6b43abc60c64fbdd7e0b4..20eee931bc9eeeea80b9df8b2b4a7156273b4441 100644 (file)
@@ -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"))
index 3e6ac570318af3a9cc9ba3ce90659c2b0605663f..02d0ebe5a4da275f7079da88d74936ed1bd4025d 100644 (file)
@@ -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;