Simplify MenuBackend and menubar interactions.

* GuiMenubar: freed from GuiView and QMenuBar, renamed to 'Menus'
* GuiView: just use the standard QMenuBar.



git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@22308 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Abdelrazak Younes 2007-12-26 10:55:43 +00:00
parent cfb1d4027b
commit 722329490b
6 changed files with 48 additions and 71 deletions

View File

@ -738,7 +738,6 @@ src_frontends_qt4_header_files = Split('''
GuiLog.h
GuiMath.h
GuiMathMatrix.h
GuiMenubar.h
GuiNomencl.h
GuiNote.h
GuiPainter.h
@ -771,6 +770,7 @@ src_frontends_qt4_header_files = Split('''
LaTeXHighlighter.h
LengthCombo.h
LyXFileDialog.h
Menus.h
PanelStack.h
TocModel.h
TocWidget.h
@ -826,7 +826,6 @@ src_frontends_qt4_files = Split('''
GuiLog.cpp
GuiMath.cpp
GuiMathMatrix.cpp
GuiMenubar.cpp
GuiNomencl.cpp
GuiNote.cpp
GuiPainter.cpp
@ -859,6 +858,7 @@ src_frontends_qt4_files = Split('''
LengthCombo.cpp
LaTeXHighlighter.cpp
LyXFileDialog.cpp
Menus.h
PanelStack.cpp
TocModel.cpp
TocWidget.cpp

View File

@ -17,11 +17,10 @@
#include "GuiFontLoader.h"
#include "GuiClipboard.h"
#include "GuiSelection.h"
#include "Menus.h"
#include "frontends/Application.h"
#include "MenuBackend.h"
#include <QObject>
#include <QApplication>
#include <QTranslator>
@ -64,8 +63,8 @@ public:
virtual Clipboard & clipboard();
virtual Selection & selection();
virtual FontLoader & fontLoader() { return font_loader_; }
MenuBackend const & menuBackend() const { return menu_backend_; }
MenuBackend & menuBackend() { return menu_backend_; }
MenuBackend const & menuBackend() const { return menus_; }
MenuBackend & menuBackend() { return menus_; }
virtual int exec();
virtual void exit(int status);
virtual bool event(QEvent * e);
@ -76,6 +75,8 @@ public:
void unregisterSocketCallback(int fd);
//@}
Menus const & menus() const { return menus_; }
Menus & menus() { return menus_; }
/// Methods inherited from \c QApplication class
//@{
bool notify(QObject * receiver, QEvent * event);
@ -140,7 +141,7 @@ private:
///
std::map<int, SocketNotifier *> socket_notifiers_;
///
MenuBackend menu_backend_;
Menus menus_;
#ifdef Q_WS_X11
public:

View File

@ -20,9 +20,9 @@
#include "GuiApplication.h"
#include "GuiWorkArea.h"
#include "GuiKeySymbol.h"
#include "GuiMenubar.h"
#include "GuiToolbar.h"
#include "GuiToolbars.h"
#include "Menus.h"
#include "qt_helpers.h"
@ -165,7 +165,6 @@ struct GuiView::GuiViewPrivate
delete splitter_;
delete bg_widget_;
delete stack_widget_;
delete menubar_;
delete toolbars_;
}
@ -242,8 +241,6 @@ public:
QSplitter * splitter_;
QStackedWidget * stack_widget_;
BackgroundWidget * bg_widget_;
/// view's menubar
GuiMenubar * menubar_;
/// view's toolbars
GuiToolbars * toolbars_;
/// The main layout box.
@ -280,9 +277,11 @@ public:
GuiView::GuiView(int id)
: d(*new GuiViewPrivate), id_(id)
{
// GuiToolbars *must* be initialised before GuiMenubar.
// GuiToolbars *must* be initialised before the menu bar.
d.toolbars_ = new GuiToolbars(*this);
d.menubar_ = new GuiMenubar(this);
// Fill up the menu bar.
guiApp->menus().fillMenuBar(this);
setCentralWidget(d.stack_widget_);
@ -1366,7 +1365,7 @@ bool GuiView::dispatch(FuncRequest const & cmd)
break;
case LFUN_MENU_OPEN:
d.menubar_->openByName(toqstr(cmd.argument()));
guiApp->menus().openByName(toqstr(cmd.argument()));
break;
case LFUN_FILE_INSERT:
@ -1596,7 +1595,7 @@ void GuiView::resetDialogs()
// Make sure that no LFUN uses any LyXView.
theLyXFunc().setLyXView(0);
d.toolbars_->init();
d.menubar_->init();
guiApp->menus().fillMenuBar(this);
if (d.layout_)
d.layout_->updateContents(true);
// Now update controls with current buffer.

View File

@ -94,7 +94,6 @@ SOURCEFILES = \
GuiLog.cpp \
GuiMath.cpp \
GuiMathMatrix.cpp \
GuiMenubar.cpp \
GuiNomencl.cpp \
GuiNote.cpp \
GuiPainter.cpp \
@ -127,6 +126,7 @@ SOURCEFILES = \
LengthCombo.cpp \
LyXFileDialog.cpp \
LaTeXHighlighter.cpp \
Menus.cpp \
PanelStack.cpp \
qt_helpers.cpp \
TocModel.cpp \
@ -181,7 +181,6 @@ MOCHEADER = \
GuiListings.h \
GuiLog.h \
GuiMathMatrix.h \
GuiMenubar.h \
GuiNomencl.h \
GuiNote.h \
GuiParagraph.h \
@ -212,6 +211,7 @@ MOCHEADER = \
LengthCombo.h \
LyXFileDialog.h \
LaTeXHighlighter.h \
Menus.h \
PanelStack.h \
qlkey.h \
TocModel.h \

View File

@ -1,5 +1,5 @@
/**
* \file qt4/GuiMenubar.cpp
* \file qt4/Menus.cpp
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
@ -10,7 +10,7 @@
#include <config.h>
#include "GuiMenubar.h"
#include "Menus.h"
#include "Action.h"
#include "GuiApplication.h"
@ -19,8 +19,6 @@
#include "qt_helpers.h"
#include "MenuBackend.h"
#include "support/debug.h"
#include <QCursor>
@ -32,40 +30,30 @@ namespace frontend {
// MacOSX specific stuff is at the end.
GuiMenubar::GuiMenubar(GuiView * view)
: owner_(view)
{
init();
}
void GuiMenubar::init()
void Menus::fillMenuBar(GuiView * view)
{
// Clear all menubar contents before filling it.
owner_->menuBar()->clear();
view->menuBar()->clear();
#ifdef Q_WS_MACX
// setup special mac specific menu item
macxMenuBarInit();
#endif
/// menu controller
MenuBackend & menu_backend = guiApp->menuBackend();
LYXERR(Debug::GUI, "populating menu bar" << to_utf8(menu_backend.getMenubar().name()));
LYXERR(Debug::GUI, "populating menu bar" << to_utf8(getMenubar().name()));
if (menu_backend.getMenubar().size() == 0) {
if (getMenubar().size() == 0) {
LYXERR(Debug::GUI, "\tERROR: empty menu bar"
<< to_utf8(menu_backend.getMenubar().name()));
<< to_utf8(getMenubar().name()));
return;
// continue;
}
else {
LYXERR(Debug::GUI, "menu bar entries "
<< menu_backend.getMenubar().size());
<< getMenubar().size());
}
Menu menu;
menu_backend.expand(menu_backend.getMenubar(), menu, owner_->buffer());
expand(getMenubar(), menu, view->buffer());
Menu::const_iterator m = menu.begin();
Menu::const_iterator end = menu.end();
@ -81,26 +69,24 @@ void GuiMenubar::init()
<< " is a submenu named " << to_utf8(m->submenuname()));
docstring name = m->submenuname();
if (!menu_backend.hasMenu(name)) {
if (!hasMenu(name)) {
LYXERR(Debug::GUI, "\tERROR: " << to_utf8(name)
<< " submenu has no menu!");
continue;
}
Menu menu;
menu_backend.expand(menu_backend.getMenubar(), menu, owner_->buffer());
expand(getMenubar(), menu, view->buffer());
GuiPopupMenu * qMenu = new GuiPopupMenu(owner_, *m, true);
owner_->menuBar()->addMenu(qMenu);
GuiPopupMenu * qMenu = new GuiPopupMenu(view, *m, true);
view->menuBar()->addMenu(qMenu);
name_map_[toqstr(name)] = qMenu;
}
}
GuiMenubar::~GuiMenubar() {}
void GuiMenubar::openByName(QString const & name)
void Menus::openByName(QString const & name)
{
if (QMenu * menu = name_map_.value(name))
menu->exec(QCursor::pos());
@ -131,7 +117,7 @@ void GuiMenubar::openByName(QString const & name)
focus. (JMarc)
*/
void GuiMenubar::macxMenuBarInit()
void Menus::macxMenuBarInit(GuiView * view)
{
/* Since Qt 4.2, the qt/mac menu code has special code for
specifying the role of a menu entry. However, it does not
@ -174,20 +160,19 @@ void GuiMenubar::macxMenuBarInit()
from_utf8(entries[i].label),
func));
}
MenuBackend & menu_backend = guiApp->menuBackend();
menu_backend.specialMenu(special);
specialMenu(special);
// add the entries to a QMenu that will eventually be empty
// and therefore invisible.
QMenu * qMenu = owner_->menuBar()->addMenu("special");
QMenu * qMenu = view->menuBar()->addMenu("special");
// we do not use 'special' because it is a temporary variable,
// whereas MenuBackend::specialMenu points to a persistent
// copy.
Menu::const_iterator cit = menu_backend.specialMenu().begin();
Menu::const_iterator end = menu_backend.specialMenu().end();
Menu::const_iterator cit = specialMenu().begin();
Menu::const_iterator end = specialMenu().end();
for (size_t i = 0 ; cit != end ; ++cit, ++i) {
Action * action = new Action(*owner_, QIcon(),
Action * action = new Action(*view, QIcon(),
toqstr(cit->label()),
cit->func(), QString());
action->setMenuRole(entries[i].role);
@ -199,4 +184,4 @@ void GuiMenubar::macxMenuBarInit()
} // namespace frontend
} // namespace lyx
#include "GuiMenubar_moc.cpp"
#include "Menus_moc.cpp"

View File

@ -1,6 +1,6 @@
// -*- C++ -*-
/**
* \file GuiMenubar.h
* \file Menus.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
@ -10,14 +10,14 @@
* Full author contact details are available in file CREDITS.
*/
#ifndef GUIMENUBAR_H
#define GUIMENUBAR_H
#ifndef MENUS_H
#define MENUS_H
#include "MenuBackend.h"
#include <QObject>
#include <QHash>
class QMenuBar;
namespace lyx {
namespace frontend {
@ -25,32 +25,24 @@ class GuiView;
class GuiPopupMenu;
class GuiView;
class GuiMenubar : public QObject
class Menus : public QObject, public MenuBackend
{
Q_OBJECT
public:
GuiMenubar(GuiView *);
~GuiMenubar();
Menus() {}
///
void init();
void fillMenuBar(GuiView * view);
/// opens a top-level submenu given its name
void openByName(QString const & name);
/// return the owning view
GuiView * view() { return owner_; }
/// update the state of the menuitems - not needed
void updateView();
private:
/// Initialize specific MACOS X menubar
void macxMenuBarInit();
/// owning view
GuiView * owner_;
void macxMenuBarInit(GuiView * view);
typedef QHash<QString, GuiPopupMenu *> NameMap;
@ -61,4 +53,4 @@ private:
} // namespace frontend
} // namespace lyx
#endif // GUIMENUBAR_H
#endif // MENUS_H