From ba3fa9bd039799f25e67bee7c6c0c6ff4bdf35de Mon Sep 17 00:00:00 2001 From: Abdelrazak Younes Date: Tue, 20 Nov 2007 22:03:56 +0000 Subject: [PATCH] - Cleanup and simplify the layout list GUI handling. - Transfer toolbar, statusbar and layoutlist handling to the frontend. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@21684 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/LyXFunc.cpp | 17 --------- src/frontends/LyXView.h | 18 --------- src/frontends/qt4/GuiToolbar.cpp | 62 ++++++++++++++++++++----------- src/frontends/qt4/GuiToolbar.h | 5 ++- src/frontends/qt4/GuiToolbars.cpp | 48 +----------------------- src/frontends/qt4/GuiToolbars.h | 23 ------------ src/frontends/qt4/GuiView.cpp | 57 +++++++++++++++------------- src/frontends/qt4/GuiView.h | 11 +++++- src/frontends/qt4/GuiWorkArea.cpp | 10 +++-- 9 files changed, 93 insertions(+), 158 deletions(-) diff --git a/src/LyXFunc.cpp b/src/LyXFunc.cpp index 8960b10254..32d643ab16 100644 --- a/src/LyXFunc.cpp +++ b/src/LyXFunc.cpp @@ -487,17 +487,7 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const //lyxerr << "LyXFunc::getStatus: cmd: " << cmd << endl; FuncStatus flag; - /* In LyX/Mac, when a dialog is open, the menus of the - application can still be accessed without giving focus to - the main window. In this case, we want to disable the menu - entries that are buffer-related. - - Note that this code is not perfect, as bug 1941 attests: - http://bugzilla.lyx.org/show_bug.cgi?id=1941#c4 - */ Buffer * buf = lyx_view_? lyx_view_->buffer() : 0; - if (lyx_view_ && cmd.origin == FuncRequest::MENU && !lyx_view_->hasFocus()) - buf = 0; if (cmd.action == LFUN_NOACTION) { flag.message(from_utf8(N_("Nothing to do"))); @@ -1888,9 +1878,6 @@ void LyXFunc::dispatch(FuncRequest const & cmd) actOnUpdatedPrefs(lyxrc_orig, lyxrc); - if (lyx_view_ && lyx_view_->buffer()) - lyx_view_->updateLayoutChoice(true); - /// We force the redraw in any case because there might be /// some screen font changes. /// FIXME: only the current view will be updated. the Gui @@ -1940,7 +1927,6 @@ void LyXFunc::dispatch(FuncRequest const & cmd) // (at least partially) visible top-level paragraphs. // We will redraw the screen only if needed. view()->processUpdateFlags(updateFlags); - lyx_view_->updateStatusBar(); // if we executed a mutating lfun, mark the buffer as dirty if (flag.enabled() @@ -1952,12 +1938,10 @@ void LyXFunc::dispatch(FuncRequest const & cmd) theSelection().haveSelection(view()->cursor().selection()); if (view()->cursor().inTexted()) { - lyx_view_->updateLayoutChoice(false); } } } if (!quitting && lyx_view_) { - lyx_view_->updateToolbars(); // Some messages may already be translated, so we cannot use _() sendDispatchMessage(translateIfPossible(getMessage()), cmd); } @@ -2070,7 +2054,6 @@ Buffer * LyXFunc::loadAndViewFile(FileName const & filename, bool tolastfiles) if (!newBuffer) { lyx_view_->message(_("Document not loaded.")); - lyx_view_->updateStatusBar(); lyx_view_->setBusy(false); return 0; } diff --git a/src/frontends/LyXView.h b/src/frontends/LyXView.h index 1cf209bdf6..91f564971b 100644 --- a/src/frontends/LyXView.h +++ b/src/frontends/LyXView.h @@ -70,12 +70,6 @@ public: //@} - /// updates the possible layouts selectable - virtual void updateLayoutChoice(bool force) = 0; - /// update the toolbar - virtual void updateToolbars() = 0; - /// update the status bar - virtual void updateStatusBar() = 0; /// display a message in the view virtual void message(docstring const &) = 0; @@ -84,14 +78,6 @@ public: /// dispatch to current BufferView virtual void dispatch(FuncRequest const & cmd) = 0; - /** redraw \c inset in all the BufferViews in which it is currently - * visible. If successful return a pointer to the owning Buffer. - */ - virtual Buffer const * updateInset(Inset const *) = 0; - - /// returns true if this view has the focus. - virtual bool hasFocus() const = 0; - /// virtual void restartCursor() = 0; @@ -100,14 +86,10 @@ public: // virtual void errors(std::string const &) = 0; - // // This View's Dialogs // - /// Hide all visible dialogs - virtual void hideAll() const = 0; - /** \param name == "bibtex", "citation" etc; an identifier used to launch a particular dialog. \param data is a string representation of the Inset contents. diff --git a/src/frontends/qt4/GuiToolbar.cpp b/src/frontends/qt4/GuiToolbar.cpp index a7e1301a64..0d3b92771a 100644 --- a/src/frontends/qt4/GuiToolbar.cpp +++ b/src/frontends/qt4/GuiToolbar.cpp @@ -16,6 +16,8 @@ #include "Buffer.h" #include "BufferParams.h" +#include "BufferView.h" +#include "Cursor.h" #include "debug.h" #include "FuncRequest.h" #include "FuncStatus.h" @@ -23,6 +25,7 @@ #include "IconPalette.h" #include "Layout.h" #include "LyXFunc.h" +#include "Paragraph.h" #include "TextClass.h" #include "ToolbarBackend.h" @@ -227,12 +230,6 @@ static QIcon getIcon(FuncRequest const & f, bool unknown) } -static TextClass const & textClass(LyXView const & lv) -{ - return lv.buffer()->params().getTextClass(); -} - - ///////////////////////////////////////////////////////////////////// // // GuiLayoutBox @@ -249,22 +246,23 @@ GuiLayoutBox::GuiLayoutBox(GuiView & owner) QObject::connect(this, SIGNAL(activated(QString)), this, SLOT(selected(QString))); + owner_.setLayoutDialog(this); } void GuiLayoutBox::set(docstring const & layout) { - TextClass const & tc = textClass(owner_); + if (!text_class_) + return; - QString const & name = toqstr(translateIfPossible(tc[layout]->name())); + QString const & name = toqstr(translateIfPossible( + (*text_class_)[layout]->name())); - int i = 0; - for (; i < count(); ++i) { - if (name == itemText(i)) - break; - } + if (name == currentText()) + return; - if (i == count()) { + int i = findText(name); + if (i == -1) { lyxerr << "Trying to select non existent layout type " << fromqstr(name) << endl; return; @@ -297,15 +295,30 @@ void GuiLayoutBox::addItemSort(QString const & item, bool sorted) } -void GuiLayoutBox::updateContents() +void GuiLayoutBox::updateContents(bool reset) { - TextClass const & tc = textClass(owner_); + Buffer const * buffer = owner_.buffer(); + if (!buffer) { + clear(); + setEnabled(false); + text_class_ = 0; + return; + } + + setEnabled(true); + TextClass const * text_class = &buffer->params().getTextClass(); + if (!reset && text_class_ == text_class) { + set(owner_.view()->cursor().innerParagraph().layout()->name()); + return; + } + + text_class_ = text_class; setUpdatesEnabled(false); clear(); - TextClass::const_iterator it = tc.begin(); - TextClass::const_iterator const end = tc.end(); + TextClass::const_iterator it = text_class_->begin(); + TextClass::const_iterator const end = text_class_->end(); for (; it != end; ++it) { // ignore obsolete entries addItemSort(toqstr(translateIfPossible((*it)->name())), lyxrc.sort_layouts); @@ -316,6 +329,7 @@ void GuiLayoutBox::updateContents() // needed to recalculate size hint hide(); setMinimumWidth(sizeHint().width()); + set(owner_.view()->cursor().innerParagraph().layout()->name()); show(); setUpdatesEnabled(true); @@ -325,10 +339,13 @@ void GuiLayoutBox::updateContents() void GuiLayoutBox::selected(const QString & str) { owner_.setFocus(); - TextClass const & tc = owner_.buffer()->params().getTextClass(); + updateContents(false); + if (!text_class_) + return; + docstring const name = qstring_to_ucs4(str); - TextClass::const_iterator it = tc.begin(); - TextClass::const_iterator const end = tc.end(); + TextClass::const_iterator it = text_class_->begin(); + TextClass::const_iterator const end = text_class_->end(); for (; it != end; ++it) { docstring const & itname = (*it)->name(); if (translateIfPossible(itname) == name) { @@ -517,6 +534,9 @@ void GuiToolbar::updateContents() for (int i = 0; i < actions_.size(); ++i) actions_[i]->update(); + if (layout_) + layout_->setEnabled(lyx::getStatus(FuncRequest(LFUN_LAYOUT)).enabled()); + // emit signal updated(); } diff --git a/src/frontends/qt4/GuiToolbar.h b/src/frontends/qt4/GuiToolbar.h index ee5476b9c0..0d0dceffba 100644 --- a/src/frontends/qt4/GuiToolbar.h +++ b/src/frontends/qt4/GuiToolbar.h @@ -24,6 +24,7 @@ namespace lyx { +class TextClass; class ToolbarItem; namespace frontend { @@ -42,7 +43,7 @@ public: /// select the right layout in the combobox. void set(docstring const & layout); /// Populate the layout combobox. - void updateContents(); + void updateContents(bool reset); /// Add Item to Layout box according to sorting settings from preferences void addItemSort(QString const & item, bool sorted); @@ -51,6 +52,7 @@ private Q_SLOTS: private: GuiView & owner_; + TextClass const * text_class_; }; @@ -68,7 +70,6 @@ public: void saveInfo(ToolbarSection::ToolbarInfo & info); /// Refresh the contents of the bar. void updateContents(); - GuiLayoutBox * layout() const { return layout_; } /// GuiCommandBuffer * commandBuffer() { return command_buffer_; } diff --git a/src/frontends/qt4/GuiToolbars.cpp b/src/frontends/qt4/GuiToolbars.cpp index fbd189e42c..a7a6a60346 100644 --- a/src/frontends/qt4/GuiToolbars.cpp +++ b/src/frontends/qt4/GuiToolbars.cpp @@ -41,9 +41,7 @@ namespace frontend { #define TurnOffFlag(x) flags &= ~ToolbarInfo::x GuiToolbars::GuiToolbars(GuiView & owner) - : owner_(owner), - layout_(0), - last_textclass_(TextClassPtr()) + : owner_(owner) { init(); } @@ -288,41 +286,6 @@ void GuiToolbars::saveToolbarInfo() } -void GuiToolbars::setLayout(docstring const & layout) -{ - if (layout_) - layout_->set(layout); -} - - -bool GuiToolbars::updateLayoutList(TextClassPtr textclass, bool force) -{ - // update the layout display - if (last_textclass_ != textclass || force) { - if (layout_) - layout_->updateContents(); - last_textclass_ = textclass; - return true; - } else - return false; -} - - -void GuiToolbars::openLayoutList() -{ - if (layout_) - layout_->showPopup(); -} - - -void GuiToolbars::clearLayoutList() -{ - last_textclass_ = TextClassPtr(); - if (layout_) - layout_->clear(); -} - - void GuiToolbars::add(ToolbarInfo const & tbinfo, bool newline) { GuiToolbar * tb_ptr = owner_.makeToolbar(tbinfo, newline); @@ -332,9 +295,6 @@ void GuiToolbars::add(ToolbarInfo const & tbinfo, bool newline) tb_ptr->show(); else tb_ptr->hide(); - - if (tb_ptr->layout()) - layout_ = tb_ptr->layout(); } @@ -360,12 +320,6 @@ void GuiToolbars::updateIcons() ToolbarsMap::const_iterator const end = toolbars_.end(); for (; it != end; ++it) it->second->updateContents(); - - bool const enable = - lyx::getStatus(FuncRequest(LFUN_LAYOUT)).enabled(); - - if (layout_) - layout_->setEnabled(enable); } diff --git a/src/frontends/qt4/GuiToolbars.h b/src/frontends/qt4/GuiToolbars.h index d7fc02fdc8..c7ffc66eaa 100644 --- a/src/frontends/qt4/GuiToolbars.h +++ b/src/frontends/qt4/GuiToolbars.h @@ -26,7 +26,6 @@ class ToolbarInfo; namespace frontend { -class GuiLayoutBox; class GuiToolbar; class GuiView; @@ -59,19 +58,6 @@ public: /// save toolbar information void saveToolbarInfo(); - /// Select the right layout in the combox. - void setLayout(docstring const & layout); - - /** Populate the layout combox - returns whether we did a full - * update or not - */ - bool updateLayoutList(TextClassPtr textclass, bool force); - - /// Drop down the layout list. - void openLayoutList(); - /// Erase the layout list. - void clearLayoutList(); - /// Show or hide the command buffer. void showCommandBuffer(bool show_it); @@ -92,15 +78,6 @@ private: /// The parent window. GuiView & owner_; - /** The layout box is actually owned by whichever toolbar - * contains it. All the Toolbars class needs is a means of - * accessing it. - * - * We don't need to use boost::weak_ptr here because the toolbars - * are also stored here. There are, therefore, no lifetime issues. - */ - GuiLayoutBox * layout_; - /// Toolbar store providing access to individual toolbars by name. typedef std::map ToolbarsMap; ToolbarsMap toolbars_; diff --git a/src/frontends/qt4/GuiView.cpp b/src/frontends/qt4/GuiView.cpp index c8d403eaa4..f312b6c2de 100644 --- a/src/frontends/qt4/GuiView.cpp +++ b/src/frontends/qt4/GuiView.cpp @@ -155,7 +155,7 @@ typedef boost::shared_ptr DialogPtr; struct GuiView::GuiViewPrivate { GuiViewPrivate() - : current_work_area_(0), posx_offset(0), posy_offset(0), + : current_work_area_(0), layout_(0), autosave_timeout_(new Timeout(5000)), quitting_by_menu_(false), in_show_(false) { @@ -263,9 +263,6 @@ public: string cur_title; GuiWorkArea * current_work_area_; - int posx_offset; - int posy_offset; - QSplitter * splitter_; QStackedWidget * stack_widget_; BackgroundWidget * bg_widget_; @@ -273,8 +270,16 @@ public: GuiMenubar * menubar_; /// view's toolbars GuiToolbars * toolbars_; - /// - docstring current_layout; + /// The main layout box. + /** + * \warning Don't Delete! The layout box is actually owned by + * whichever toolbar contains it. All the GuiView class needs is a + * means of accessing it. + * + * FIXME: replace that with a proper model so that we are not limited + * to only one dialog. + */ + GuiLayoutBox * layout_; /// std::map open_insets_; @@ -538,7 +543,7 @@ void GuiView::on_currentWorkAreaChanged(GuiWorkArea * wa) // require bv_->text. updateBufferDependent(true); updateToolbars(); - updateLayoutChoice(false); + updateLayoutList(); updateStatusBar(); } @@ -787,26 +792,16 @@ void GuiView::removeWorkArea(GuiWorkArea * work_area) } -void GuiView::updateLayoutChoice(bool force) +void GuiView::setLayoutDialog(GuiLayoutBox * layout) { - // Don't show any layouts without a buffer - if (!buffer()) { - d.toolbars_->clearLayoutList(); - return; - } - - // Update the layout display - if (d.toolbars_->updateLayoutList(buffer()->params().getTextClassPtr(), force)) { - d.current_layout = buffer()->params().getTextClass().defaultLayoutName(); - } + d.layout_ = layout; +} - docstring const & layout = d.current_work_area_->bufferView().cursor(). - innerParagraph().layout()->name(); - if (layout != d.current_layout) { - d.toolbars_->setLayout(layout); - d.current_layout = layout; - } +void GuiView::updateLayoutList() +{ + if (d.layout_) + d.layout_->updateContents(false); } @@ -956,6 +951,17 @@ FuncStatus GuiView::getStatus(FuncRequest const & cmd) bool enable = true; Buffer * buf = buffer(); + /* In LyX/Mac, when a dialog is open, the menus of the + application can still be accessed without giving focus to + the main window. In this case, we want to disable the menu + entries that are buffer-related. + + Note that this code is not perfect, as bug 1941 attests: + http://bugzilla.lyx.org/show_bug.cgi?id=1941#c4 + */ + if (cmd.origin == FuncRequest::MENU && !hasFocus()) + buf = 0; + switch(cmd.action) { case LFUN_TOOLBAR_TOGGLE: flag.setOnOff(d.toolbars_->visible(cmd.getArg(0))); @@ -1030,7 +1036,8 @@ void GuiView::dispatch(FuncRequest const & cmd) break; } case LFUN_DROP_LAYOUTS_CHOICE: - d.toolbars_->openLayoutList(); + if (d.layout_) + d.layout_->showPopup(); break; case LFUN_MENU_OPEN: diff --git a/src/frontends/qt4/GuiView.h b/src/frontends/qt4/GuiView.h index 2479dba84f..abbd915838 100644 --- a/src/frontends/qt4/GuiView.h +++ b/src/frontends/qt4/GuiView.h @@ -36,6 +36,7 @@ class ToolbarInfo; namespace frontend { class Dialog; +class GuiLayoutBox; class GuiToolbar; class GuiWorkArea; @@ -63,18 +64,24 @@ public: void close(); void setFocus(); void setBusy(bool); + /// returns true if this view has the focus. + bool hasFocus() const; /// add toolbar, if newline==true, add a toolbar break before the toolbar GuiToolbar * makeToolbar(ToolbarInfo const & tbinfo, bool newline); virtual void updateStatusBar(); virtual void message(docstring const & str); - virtual bool hasFocus() const; - void updateLayoutChoice(bool force); + + /// updates the possible layouts selectable + void updateLayoutList(); void updateToolbars(); QMenu * createPopupMenu(); FuncStatus getStatus(FuncRequest const & cmd); void dispatch(FuncRequest const & cmd); + /// + void setLayoutDialog(GuiLayoutBox *); + /// \return the buffer currently shown in this window Buffer * buffer(); Buffer const * buffer() const; diff --git a/src/frontends/qt4/GuiWorkArea.cpp b/src/frontends/qt4/GuiWorkArea.cpp index 73d31fb888..200cb2dd5e 100644 --- a/src/frontends/qt4/GuiWorkArea.cpp +++ b/src/frontends/qt4/GuiWorkArea.cpp @@ -323,6 +323,8 @@ void GuiWorkArea::redraw() updateScreen(); update(0, 0, viewport()->width(), viewport()->height()); + lyx_view_->updateStatusBar(); + if (lyxerr.debugging(Debug::WORKAREA)) buffer_view_->coordCache().dump(); } @@ -336,6 +338,8 @@ void GuiWorkArea::processKeySym(KeySymbol const & key, KeyModifier mod) theLyXFunc().setLyXView(lyx_view_); theLyXFunc().processKeySym(key, mod); + lyx_view_->updateLayoutList(); + lyx_view_->updateToolbars(); } @@ -372,7 +376,7 @@ void GuiWorkArea::dispatch(FuncRequest const & cmd0, KeyModifier mod) // Skip these when selecting if (cmd.action != LFUN_MOUSE_MOTION) { - lyx_view_->updateLayoutChoice(false); + lyx_view_->updateLayoutList(); lyx_view_->updateToolbars(); } @@ -396,7 +400,7 @@ void GuiWorkArea::resizeBufferView() // We are already inside a paint event. lyx_view_->setBusy(true); buffer_view_->resize(viewport()->width(), viewport()->height()); - lyx_view_->updateLayoutChoice(false); + lyx_view_->updateLayoutList(); lyx_view_->setBusy(false); need_resize_ = false; } @@ -502,7 +506,7 @@ void GuiWorkArea::adjustViewWithScrollBar(int action) if (lyxrc.cursor_follows_scrollbar) { buffer_view_->setCursorFromScrollbar(); - lyx_view_->updateLayoutChoice(false); + lyx_view_->updateLayoutList(); } // Show the cursor immediately after any operation. startBlinkingCursor(); -- 2.39.2