While investigating bug 4607 (that Abdel solved in the meantime), I came up with this patch to handle LyXView::getStatus.
I post it here to insist on how things are supposed to work. LyXView::getStatus has been changed to return true if it has something to say, and false otherwise. This is how different getStatus function (but the main one) work, and I'd like it to stay that way. For some reason BufferView::getStatus has been changed to another model... Now, there is no knowledge in LyXFunc class of what LFUNs are handled at LyXView level. I think it is how it should be. Abdel, does the patch make sense to you? I'd rather have a nod before applying because it has potential for strange bugs... JMarc
svndiff src/frontends/LyXView.h src/frontends/qt4/GuiView.h src/frontends/qt4/GuiView.cpp src/LyXFunc.cpp Index: src/frontends/LyXView.h =================================================================== --- src/frontends/LyXView.h (revision 24872) +++ src/frontends/LyXView.h (working copy) @@ -82,7 +82,7 @@ public: virtual void message(docstring const &) = 0; /// - virtual FuncStatus getStatus(FuncRequest const & cmd) = 0; + virtual bool getStatus(FuncRequest const & cmd, FuncStatus & flag) = 0; /// dispatch command. /// \return true if the \c FuncRequest has been dispatched. virtual bool dispatch(FuncRequest const & cmd) = 0; Index: src/frontends/qt4/GuiView.h =================================================================== --- src/frontends/qt4/GuiView.h (revision 24872) +++ src/frontends/qt4/GuiView.h (working copy) @@ -78,7 +78,7 @@ public: void updateLayoutList(); void updateToolbars(); QMenu * createPopupMenu(); - FuncStatus getStatus(FuncRequest const & cmd); + bool getStatus(FuncRequest const & cmd, FuncStatus & flag); bool dispatch(FuncRequest const & cmd); /// Index: src/frontends/qt4/GuiView.cpp =================================================================== --- src/frontends/qt4/GuiView.cpp (revision 24872) +++ src/frontends/qt4/GuiView.cpp (working copy) @@ -985,9 +985,8 @@ void GuiView::resetAutosaveTimers() } -FuncStatus GuiView::getStatus(FuncRequest const & cmd) +bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag) { - FuncStatus flag; bool enable = true; Buffer * buf = buffer(); @@ -1077,10 +1076,6 @@ FuncStatus GuiView::getStatus(FuncReques } case LFUN_INSET_APPLY: { - if (!buf) { - enable = false; - break; - } string const name = cmd.getArg(0); Inset * inset = getOpenInset(name); if (inset) { @@ -1093,7 +1088,7 @@ FuncStatus GuiView::getStatus(FuncReques flag |= fs; } else { FuncRequest fr(LFUN_INSET_INSERT, cmd.argument()); - flag |= getStatus(fr); + flag |= lyx::getStatus(fr); } enable = flag.enabled(); break; @@ -1118,16 +1113,13 @@ FuncStatus GuiView::getStatus(FuncReques break; default: - if (!view()) { - enable = false; - break; - } + return false; } if (!enable) flag.enabled(false); - return flag; + return true; } Index: src/LyXFunc.cpp =================================================================== --- src/LyXFunc.cpp (revision 24872) +++ src/LyXFunc.cpp (working copy) @@ -440,19 +440,6 @@ FuncStatus LyXFunc::getStatus(FuncReques enable = false; break; - // FIXME: these cases should be hidden in GuiView::getStatus(). - case LFUN_DIALOG_TOGGLE: - case LFUN_DIALOG_SHOW: - case LFUN_UI_TOGGLE: - case LFUN_DIALOG_UPDATE: - // FIXME: add special handling for about and prefs dialogs here - // which do not depend on GuiView. - if (lyx_view_) - return lyx_view_->getStatus(cmd); - else - enable = false; - break; - // FIXME optimally this should be in Text::getStatus. In such a case the flags // are not passed when using context menu. This way it works. case LFUN_SET_GRAPHICS_GROUP: { @@ -467,20 +454,6 @@ FuncStatus LyXFunc::getStatus(FuncReques break; } - case LFUN_TOOLBAR_TOGGLE: - case LFUN_INSET_APPLY: - case LFUN_BUFFER_WRITE: - case LFUN_BUFFER_WRITE_AS: - case LFUN_SPLIT_VIEW: - case LFUN_CLOSE_TAB_GROUP: - case LFUN_COMPLETION_POPUP: - case LFUN_COMPLETION_INLINE: - case LFUN_COMPLETION_COMPLETE: - if (lyx_view_) - return lyx_view_->getStatus(cmd); - enable = false; - break; - case LFUN_BUFFER_TOGGLE_READ_ONLY: flag.setOnOff(buf->isReadonly()); break; @@ -653,6 +626,16 @@ FuncStatus LyXFunc::getStatus(FuncReques break; default: + // Does the view know something? + if (!lyx_view_) { + enable = false; + break; + } + if (lyx_view_->getStatus(cmd, flag)) + break; + + // If we have a BufferView, try cursor position and + // then the BufferView. if (!view()) { enable = false; break;