From 051a50439dd3c6e71771cbc72d5f5addefc41e64 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=BCrgen=20Spitzm=C3=BCller?= Date: Sat, 18 Apr 2009 10:44:44 +0000 Subject: [PATCH] remember the last selection on the view/update popup button. This introduces a new "sticky" popup button. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@29309 a592a061-630c-0410-9148-cb99ea01b6c8 --- lib/ui/stdtoolbars.inc | 4 +- src/frontends/qt4/GuiToolbar.cpp | 95 +++++++++++++++++--------------- src/frontends/qt4/GuiToolbar.h | 26 +++++++++ src/frontends/qt4/Toolbars.cpp | 11 ++++ src/frontends/qt4/Toolbars.h | 4 +- 5 files changed, 93 insertions(+), 47 deletions(-) diff --git a/lib/ui/stdtoolbars.inc b/lib/ui/stdtoolbars.inc index 8432b30e22..8a50201f04 100644 --- a/lib/ui/stdtoolbars.inc +++ b/lib/ui/stdtoolbars.inc @@ -208,8 +208,8 @@ ToolbarSet Item "View Master Document" "master-buffer-view" Item "Update Master Document" "master-buffer-update" Separator - PopupMenu "view-others" "View Other Formats" - PopupMenu "update-others" "Update Other Formats" + StickyPopupMenu "view-others" "View Other Formats" + StickyPopupMenu "update-others" "Update Other Formats" End Toolbar "view-others" "View Other Formats" diff --git a/src/frontends/qt4/GuiToolbar.cpp b/src/frontends/qt4/GuiToolbar.cpp index 762cf6909e..2f9a98953e 100644 --- a/src/frontends/qt4/GuiToolbar.cpp +++ b/src/frontends/qt4/GuiToolbar.cpp @@ -790,56 +790,59 @@ public: } }; -class MenuButton : public QToolButton +} + + +MenuButton::MenuButton(GuiToolbar * bar, ToolbarItem const & item, bool const sticky) + : QToolButton(bar), bar_(bar), tbitem_(item), initialized_(false) { -private: - GuiToolbar * bar_; - ToolbarItem const & tbitem_; - bool initialized_; -public: - MenuButton(GuiToolbar * bar, ToolbarItem const & item) - : QToolButton(bar), bar_(bar), tbitem_(item), initialized_(false) - { - setPopupMode(QToolButton::InstantPopup); - QString const label = qt_(to_ascii(tbitem_.label_)); - setToolTip(label); - setStatusTip(label); - setText(label); - setIcon(QIcon(getPixmap("images/math/", toqstr(tbitem_.name_), "png"))); - connect(bar, SIGNAL(iconSizeChanged(QSize)), - this, SLOT(setIconSize(QSize))); + setPopupMode(QToolButton::InstantPopup); + QString const label = qt_(to_ascii(tbitem_.label_)); + setToolTip(label); + setStatusTip(label); + setText(label); + setIcon(QIcon(getPixmap("images/math/", toqstr(tbitem_.name_), "png"))); + if (sticky) + connect(this, SIGNAL(triggered(QAction *)), + this, SLOT(actionTriggered(QAction *))); + connect(bar, SIGNAL(iconSizeChanged(QSize)), + this, SLOT(setIconSize(QSize))); +} + +void MenuButton::mousePressEvent(QMouseEvent * e) +{ + if (initialized_) { + QToolButton::mousePressEvent(e); + return; } - void mousePressEvent(QMouseEvent * e) - { - if (initialized_) { - QToolButton::mousePressEvent(e); - return; - } + initialized_ = true; - initialized_ = true; + QString const label = qt_(to_ascii(tbitem_.label_)); + ButtonMenu * m = new ButtonMenu(label, this); + m->setWindowTitle(label); + m->setTearOffEnabled(true); + connect(bar_, SIGNAL(updated()), m, SLOT(updateParent())); + ToolbarInfo const * tbinfo = guiApp->toolbars().info(tbitem_.name_); + if (!tbinfo) { + LYXERR0("Unknown toolbar " << tbitem_.name_); + return; + } + ToolbarInfo::item_iterator it = tbinfo->items.begin(); + ToolbarInfo::item_iterator const end = tbinfo->items.end(); + for (; it != end; ++it) + if (!getStatus(it->func_).unknown()) + m->add(bar_->addItem(*it)); + setMenu(m); - QString const label = qt_(to_ascii(tbitem_.label_)); - ButtonMenu * m = new ButtonMenu(label, this); - m->setWindowTitle(label); - m->setTearOffEnabled(true); - connect(bar_, SIGNAL(updated()), m, SLOT(updateParent())); - ToolbarInfo const * tbinfo = guiApp->toolbars().info(tbitem_.name_); - if (!tbinfo) { - LYXERR0("Unknown toolbar " << tbitem_.name_); - return; - } - ToolbarInfo::item_iterator it = tbinfo->items.begin(); - ToolbarInfo::item_iterator const end = tbinfo->items.end(); - for (; it != end; ++it) - if (!getStatus(it->func_).unknown()) - m->add(bar_->addItem(*it)); - setMenu(m); + QToolButton::mousePressEvent(e); +} - QToolButton::mousePressEvent(e); - } -}; +void MenuButton::actionTriggered(QAction * action) +{ + QToolButton::setDefaultAction(action); + setPopupMode(QToolButton::DelayedPopup); } @@ -879,7 +882,11 @@ void GuiToolbar::add(ToolbarItem const & item) break; case ToolbarItem::POPUPMENU: { - addWidget(new MenuButton(this, item)); + addWidget(new MenuButton(this, item, false)); + break; + } + case ToolbarItem::STICKYPOPUPMENU: { + addWidget(new MenuButton(this, item, true)); break; } case ToolbarItem::COMMAND: { diff --git a/src/frontends/qt4/GuiToolbar.h b/src/frontends/qt4/GuiToolbar.h index 5e6c338ced..5c0ea4196e 100644 --- a/src/frontends/qt4/GuiToolbar.h +++ b/src/frontends/qt4/GuiToolbar.h @@ -22,6 +22,7 @@ #include #include #include +#include class QSortFilterProxyModel; class QStandardItemModel; @@ -108,6 +109,31 @@ private: }; +class MenuButton : public QToolButton +{ + Q_OBJECT +public: + /// + MenuButton(GuiToolbar * bar, ToolbarItem const & item, + bool const sticky = false); + /// + void mousePressEvent(QMouseEvent * e); + +private: + /// + GuiToolbar * bar_; + /// + ToolbarItem const & tbitem_; + /// + bool initialized_; + +private Q_SLOTS: + /// + void actionTriggered(QAction * action); +}; + + + class GuiToolbar : public QToolBar { Q_OBJECT diff --git a/src/frontends/qt4/Toolbars.cpp b/src/frontends/qt4/Toolbars.cpp index f83b570557..834c9ab394 100644 --- a/src/frontends/qt4/Toolbars.cpp +++ b/src/frontends/qt4/Toolbars.cpp @@ -71,6 +71,7 @@ ToolbarInfo & ToolbarInfo::read(Lexer & lex) TO_MINIBUFFER, TO_TABLEINSERT, TO_POPUPMENU, + TO_STICKYPOPUPMENU, TO_ICONPALETTE, }; @@ -82,6 +83,7 @@ ToolbarInfo & ToolbarInfo::read(Lexer & lex) { "minibuffer", TO_MINIBUFFER }, { "popupmenu", TO_POPUPMENU }, { "separator", TO_SEPARATOR }, + { "stickypopupmenu", TO_STICKYPOPUPMENU }, { "tableinsert", TO_TABLEINSERT } }; @@ -145,6 +147,15 @@ ToolbarInfo & ToolbarInfo::read(Lexer & lex) add(ToolbarItem(ToolbarItem::POPUPMENU, name, label)); } break; + + case TO_STICKYPOPUPMENU: + if (lex.next(true)) { + string const name = lex.getString(); + lex.next(true); + docstring const label = lex.getDocString(); + add(ToolbarItem(ToolbarItem::STICKYPOPUPMENU, name, label)); + } + break; case TO_ICONPALETTE: if (lex.next(true)) { diff --git a/src/frontends/qt4/Toolbars.h b/src/frontends/qt4/Toolbars.h index 48ca1c223c..e10587683a 100644 --- a/src/frontends/qt4/Toolbars.h +++ b/src/frontends/qt4/Toolbars.h @@ -38,8 +38,10 @@ public: LAYOUTS, /// a special widget to insert tabulars TABLEINSERT, - /// + /// a button that expands a menu POPUPMENU, + /// a button that expands a menu but remembers the last choice + STICKYPOPUPMENU, /// ICONPALETTE }; -- 2.39.2