From: Jean-Marc Lasgouttes Date: Sat, 18 Apr 2015 17:10:33 +0000 (+0200) Subject: Auto feature for minibuffer toolbar X-Git-Tag: 2.2.0alpha1~443 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=7ac700920f0de8165b834010e211517098afbe14;p=features.git 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 fa20f1d39e..34f56510aa 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 c3d84b22f6..b4c02168c8 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 ccce7a3154..9980ab5eef 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 & 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 ca5ea4493a..df0be95493 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 fc96995968..9d3b3393e5 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 bfc242ccde..344a8620da 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 c9ddf4a49e..9880e2b996 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 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 07370875f3..8225ec71a7 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 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 commands_; diff --git a/src/frontends/qt4/GuiCommandEdit.cpp b/src/frontends/qt4/GuiCommandEdit.cpp index 6dbec414a0..22dd9c8f03 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 5968b6fbd0..76833115cd 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 11413a6806..77471c98af 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 9a8664d393..ed7835fcca 100644 --- a/src/frontends/qt4/GuiView.cpp +++ b/src/frontends/qt4/GuiView.cpp @@ -508,7 +508,8 @@ QSet 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 43b9b988a5..74aad81f83 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 c9610252f3..20eee931bc 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 3e6ac57031..02d0ebe5a4 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 Infos;