From 4775cbfc0dde54bad2a483a51409f392187a20f3 Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Fri, 17 Oct 2008 19:05:20 +0200 Subject: [PATCH] Action pimping, MainWin cleansing, deuification * Action got a slightly extended interface, QtUi::actionCollection() now supports categories * MainWin lost its .ui, gained proper Action support, and saw some moar cleanups --- src/qtui/chatviewsearchbar.cpp | 9 +- src/qtui/mainwin.cpp | 228 ++++++++++++++++++++------------- src/qtui/mainwin.h | 17 ++- src/qtui/qtui.cpp | 12 +- src/qtui/qtui.h | 12 +- src/uisupport/action.cpp | 12 +- src/uisupport/action.h | 4 +- 7 files changed, 181 insertions(+), 113 deletions(-) diff --git a/src/qtui/chatviewsearchbar.cpp b/src/qtui/chatviewsearchbar.cpp index bfa79e1e..0ea119ec 100644 --- a/src/qtui/chatviewsearchbar.cpp +++ b/src/qtui/chatviewsearchbar.cpp @@ -37,15 +37,12 @@ ChatViewSearchBar::ChatViewSearchBar(QWidget *parent) hide(); - ActionCollection *coll = QtUi::actionCollection(); + ActionCollection *coll = QtUi::actionCollection("General"); - Action *toggleSearchBar = coll->add("toggleSearchBar"); + QAction *toggleSearchBar = coll->action("ToggleSearchBar"); connect(toggleSearchBar, SIGNAL(toggled(bool)), SLOT(setVisible(bool))); - toggleSearchBar->setText(tr("Show Search Bar")); - toggleSearchBar->setShortcut(Qt::CTRL + Qt::Key_F); - toggleSearchBar->setCheckable(true); - Action *hideSearchBar = coll->add("hideSearchBar", toggleSearchBar, SLOT(setChecked(bool))); // always false + Action *hideSearchBar = coll->add("HideSearchBar", toggleSearchBar, SLOT(setChecked(bool))); // always false hideSearchBar->setShortcut(Qt::Key_Escape); connect(ui.hideButton, SIGNAL(clicked()), toggleSearchBar, SLOT(toggle())); diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index 3bf5d811..6d74c01a 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -24,6 +24,7 @@ #include "actioncollection.h" #include "buffermodel.h" #include "bufferviewmanager.h" +#include "bufferwidget.h" #include "channellistdlg.h" #include "chatlinemodel.h" #include "chatmonitorfilter.h" @@ -71,23 +72,18 @@ MainWin::MainWin(QWidget *parent) sslLabel(new QLabel()), msgProcessorStatusWidget(new MsgProcessorStatusWidget()), _titleSetter(this), - _trayIcon(new QSystemTrayIcon(this)), - _actionCollection(new ActionCollection(this)) + _trayIcon(new QSystemTrayIcon(this)) { QtUiSettings uiSettings; QString style = uiSettings.value("Style", QString("")).toString(); if(style != "") { QApplication::setStyle(style); } - ui.setupUi(this); + setWindowTitle("Quassel IRC"); setWindowIconText("Quassel IRC"); updateIcon(); - QtUi::actionCollection()->addAssociatedWidget(this); - - statusBar()->showMessage(tr("Waiting for core...")); - installEventFilter(new JumpKeyHandler(this)); QtUi::registerNotificationBackend(new TaskbarNotificationBackend(this)); @@ -97,8 +93,8 @@ MainWin::MainWin(QWidget *parent) #endif QtUiApplication* app = qobject_cast qApp; - connect(app, SIGNAL(saveStateToSession(const QString&)), this, SLOT(saveStateToSession(const QString&))); - connect(app, SIGNAL(saveStateToSessionSettings(SessionSettings&)), this, SLOT(saveStateToSessionSettings(SessionSettings&))); + connect(app, SIGNAL(saveStateToSession(const QString&)), SLOT(saveStateToSession(const QString&))); + connect(app, SIGNAL(saveStateToSessionSettings(SessionSettings&)), SLOT(saveStateToSessionSettings(SessionSettings&))); } void MainWin::init() { @@ -108,50 +104,41 @@ void MainWin::init() { else resize(QSize(800, 500)); - connect(QApplication::instance(), SIGNAL(aboutToQuit()), this, SLOT(saveLayout())); - - connect(Client::instance(), SIGNAL(networkCreated(NetworkId)), this, SLOT(clientNetworkCreated(NetworkId))); - connect(Client::instance(), SIGNAL(networkRemoved(NetworkId)), this, SLOT(clientNetworkRemoved(NetworkId))); - - show(); - - statusBar()->showMessage(tr("Not connected to core.")); - - // DOCK OPTIONS - setDockNestingEnabled(true); + connect(QApplication::instance(), SIGNAL(aboutToQuit()), SLOT(saveLayout())); + connect(Client::instance(), SIGNAL(networkCreated(NetworkId)), SLOT(clientNetworkCreated(NetworkId))); + connect(Client::instance(), SIGNAL(networkRemoved(NetworkId)), SLOT(clientNetworkRemoved(NetworkId))); - setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea); - setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea); - setCorner(Qt::TopRightCorner, Qt::RightDockWidgetArea); - setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea); - - // setup stuff... + // Order is sometimes important setupActions(); + setupBufferWidget(); setupMenus(); setupViews(); + setupChatMonitor(); setupNickWidget(); setupTopicWidget(); - setupChatMonitor(); setupInputWidget(); setupStatusBar(); setupSystray(); + setupTitleSetter(); + + // Setup Dock Areas + setDockNestingEnabled(true); + setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea); + setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea); + setCorner(Qt::TopRightCorner, Qt::RightDockWidgetArea); + setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea); // restore mainwin state restoreState(s.value("MainWinState").toByteArray()); // restore locked state of docks - ui.actionLockDockPositions->setChecked(s.value("LockDocks", false).toBool()); + QtUi::actionCollection("General")->action("LockDockPositions")->setChecked(s.value("LockDocks", false).toBool()); setDisconnectedState(); // Disable menus and stuff - showCoreConnectionDlg(true); // autoconnect if appropriate - // attach the BufferWidget to the BufferModel and the default selection - ui.bufferWidget->setModel(Client::bufferModel()); - ui.bufferWidget->setSelectionModel(Client::bufferModel()->standardSelectionModel()); - ui.menuViews->addAction(QtUi::actionCollection()->action("toggleSearchBar")); + show(); - _titleSetter.setModel(Client::bufferModel()); - _titleSetter.setSelectionModel(Client::bufferModel()->standardSelectionModel()); + showCoreConnectionDlg(true); // autoconnect if appropriate } MainWin::~MainWin() { @@ -173,26 +160,80 @@ void MainWin::updateIcon() { } void MainWin::setupActions() { - // TODO don't get these from *.ui anymore... we shouldn't need one - ui.actionQuit->setIcon(SmallIcon("application-exit")); - ui.actionSettingsDlg->setIcon(SmallIcon("configure")); - ui.actionManageViews->setIcon(SmallIcon("view-tree")); - ui.actionManageViews2->setIcon(SmallIcon("view-tree")); - ui.actionAboutQt->setIcon(SmallIcon("qt")); - ui.actionAboutQuassel->setIcon(SmallIcon("quassel")); - ui.actionConnectCore->setIcon(SmallIcon("network-connect")); - ui.actionDisconnectCore->setIcon(SmallIcon("network-disconnect")); - ui.actionCoreInfo->setIcon(SmallIcon("help-about")); + ActionCollection *coll = QtUi::actionCollection("General"); + // File + coll->addAction("ConnectCore", new Action(SmallIcon("network-connect"), tr("&Connect to Core..."), coll, + this, SLOT(showCoreConnectionDlg()))); + coll->addAction("DisconnectCore", new Action(SmallIcon("network-disconnect"), tr("&Disconnect from Core"), coll, + Client::instance(), SLOT(disconnectFromCore()))); + coll->addAction("CoreInfo", new Action(SmallIcon("help-about"), tr("Core &Info..."), coll, + this, SLOT(showCoreInfoDlg()))); + coll->addAction("EditNetworks", new Action(SmallIcon("configure"), tr("Edit &Networks..."), coll, + this, SLOT(on_actionEditNetworks_triggered()))); + coll->addAction("Quit", new Action(SmallIcon("application-exit"), tr("&Quit"), coll, + qApp, SLOT(quit()), tr("Ctrl+Q"))); + + // View + coll->addAction("ManageBufferViews", new Action(SmallIcon("view-tree"), tr("&Manage Buffer Views..."), coll, + this, SLOT(on_actionManageViews_triggered()))); + connect(coll->addAction("LockDockPositions", new Action(tr("&Lock Dock Positions"), coll)), SIGNAL(toggled(bool)), + this, SLOT(on_actionLockDockPositions_toggled(bool))); + coll->addAction("ToggleSearchBar", new Action(SmallIcon("edit-find"), tr("Show &Search Bar"), coll, + 0, 0, tr("Ctrl+F")))->setCheckable(true); + coll->addAction("ToggleStatusBar", new Action(tr("Show Status &Bar"), coll, + 0, 0))->setCheckable(true); + + // Settings + coll->addAction("ConfigureQuassel", new Action(SmallIcon("configure"), tr("&Configure Quassel..."), coll, + this, SLOT(showSettingsDlg()), tr("F7"))); + + // Help + coll->addAction("AboutQuassel", new Action(SmallIcon("quassel"), tr("&About Quassel..."), coll, + this, SLOT(showAboutDlg()))); + coll->addAction("AboutQt", new Action(tr("About &Qt..."), coll, + qApp, SLOT(aboutQt()))); + coll->addAction("DebugNetworkModel", new Action(SmallIcon("tools-report-bug"), tr("Debug &NetworkModel"), coll, + this, SLOT(on_actionDebugNetworkModel_triggered()))); } void MainWin::setupMenus() { - connect(ui.actionConnectCore, SIGNAL(triggered()), this, SLOT(showCoreConnectionDlg())); - connect(ui.actionDisconnectCore, SIGNAL(triggered()), Client::instance(), SLOT(disconnectFromCore())); - connect(ui.actionCoreInfo, SIGNAL(triggered()), this, SLOT(showCoreInfoDlg())); - connect(ui.actionQuit, SIGNAL(triggered()), QCoreApplication::instance(), SLOT(quit())); - connect(ui.actionSettingsDlg, SIGNAL(triggered()), this, SLOT(showSettingsDlg())); - connect(ui.actionAboutQuassel, SIGNAL(triggered()), this, SLOT(showAboutDlg())); - connect(ui.actionAboutQt, SIGNAL(triggered()), QApplication::instance(), SLOT(aboutQt())); + ActionCollection *coll = QtUi::actionCollection("General"); + + _fileMenu = menuBar()->addMenu(tr("&File")); + _fileMenu->addAction(coll->action("ConnectCore")); + _fileMenu->addAction(coll->action("DisconnectCore")); + _fileMenu->addAction(coll->action("CoreInfo")); + _fileMenu->addSeparator(); + _networksMenu = _fileMenu->addMenu(tr("&Networks")); + _networksMenu->addAction(coll->action("EditNetworks")); + _networksMenu->addSeparator(); + _fileMenu->addSeparator(); + _fileMenu->addAction(coll->action("Quit")); + + _viewMenu = menuBar()->addMenu(tr("&View")); + _bufferViewsMenu = _viewMenu->addMenu(tr("&Buffer Views")); + _bufferViewsMenu->addAction(coll->action("ManageBufferViews")); + _viewMenu->addSeparator(); + _viewMenu->addAction(coll->action("ToggleSearchBar")); + _viewMenu->addAction(coll->action("ToggleStatusBar")); + _viewMenu->addSeparator(); + + _settingsMenu = menuBar()->addMenu(tr("&Settings")); + _settingsMenu->addAction(coll->action("ConfigureQuassel")); + + _helpMenu = menuBar()->addMenu(tr("&Help")); + _helpMenu->addAction(coll->action("AboutQuassel")); + _helpMenu->addAction(coll->action("AboutQt")); + _helpMenu->addSeparator(); + _helpDebugMenu = _helpMenu->addMenu(SmallIcon("tools-report-bug"), tr("Debug")); + _helpDebugMenu->addAction(coll->action("DebugNetworkModel")); +} + +void MainWin::setupBufferWidget() { + _bufferWidget = new BufferWidget(this); + _bufferWidget->setModel(Client::bufferModel()); + _bufferWidget->setSelectionModel(Client::bufferModel()->standardSelectionModel()); + setCentralWidget(_bufferWidget); } void MainWin::setupViews() { @@ -223,7 +264,7 @@ void MainWin::addBufferView(BufferViewConfig *config) { dock->show(); addDockWidget(Qt::LeftDockWidgetArea, dock); - ui.menuBufferViews->addAction(dock->toggleViewAction()); + _bufferViewsMenu->addAction(dock->toggleViewAction()); _netViews.append(dock); } @@ -231,7 +272,7 @@ void MainWin::addBufferView(BufferViewConfig *config) { void MainWin::removeBufferView(int bufferViewConfigId) { QVariant actionData; BufferViewDock *dock; - foreach(QAction *action, ui.menuBufferViews->actions()) { + foreach(QAction *action, _bufferViewsMenu->actions()) { actionData = action->data(); if(!actionData.isValid()) continue; @@ -268,17 +309,19 @@ void MainWin::setupNickWidget() { nickDock->setObjectName("NickDock"); nickDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); - nickListWidget = new NickListWidget(nickDock); - nickDock->setWidget(nickListWidget); + _nickListWidget = new NickListWidget(nickDock); + nickDock->setWidget(_nickListWidget); addDockWidget(Qt::RightDockWidgetArea, nickDock); - ui.menuViews->addAction(nickDock->toggleViewAction()); + _viewMenu->addAction(nickDock->toggleViewAction()); + nickDock->toggleViewAction()->setText(tr("Show Nick List")); + nickDock->toggleViewAction()->setIcon(SmallIcon("view-sidetree")); // See NickListDock::NickListDock(); // connect(nickDock->toggleViewAction(), SIGNAL(triggered(bool)), nickListWidget, SLOT(showWidget(bool))); // attach the NickListWidget to the BufferModel and the default selection - nickListWidget->setModel(Client::bufferModel()); - nickListWidget->setSelectionModel(Client::bufferModel()->standardSelectionModel()); + _nickListWidget->setModel(Client::bufferModel()); + _nickListWidget->setSelectionModel(Client::bufferModel()->standardSelectionModel()); } void MainWin::setupChatMonitor() { @@ -292,7 +335,8 @@ void MainWin::setupChatMonitor() { dock->show(); addDockWidget(Qt::TopDockWidgetArea, dock, Qt::Vertical); - ui.menuViews->addAction(dock->toggleViewAction()); + _viewMenu->addAction(dock->toggleViewAction()); + dock->toggleViewAction()->setText(tr("Show Chat Monitor")); } void MainWin::setupInputWidget() { @@ -304,12 +348,13 @@ void MainWin::setupInputWidget() { addDockWidget(Qt::BottomDockWidgetArea, dock); - ui.menuViews->addAction(dock->toggleViewAction()); + _viewMenu->addAction(dock->toggleViewAction()); + dock->toggleViewAction()->setText(tr("Show Input Line")); inputWidget->setModel(Client::bufferModel()); inputWidget->setSelectionModel(Client::bufferModel()->standardSelectionModel()); - ui.bufferWidget->setFocusProxy(inputWidget); + _bufferWidget->setFocusProxy(inputWidget); } void MainWin::setupTopicWidget() { @@ -324,7 +369,13 @@ void MainWin::setupTopicWidget() { addDockWidget(Qt::TopDockWidgetArea, dock); - ui.menuViews->addAction(dock->toggleViewAction()); + _viewMenu->addAction(dock->toggleViewAction()); + dock->toggleViewAction()->setText(tr("Show Topic Line")); +} + +void MainWin::setupTitleSetter() { + _titleSetter.setModel(Client::bufferModel()); + _titleSetter.setSelectionModel(Client::bufferModel()->standardSelectionModel()); } void MainWin::setupStatusBar() { @@ -342,9 +393,8 @@ void MainWin::setupStatusBar() { sslLabel->setPixmap(QPixmap()); statusBar()->addPermanentWidget(sslLabel); - ui.menuViews->addSeparator(); - QAction *showStatusbar = ui.menuViews->addAction(tr("Statusbar")); - showStatusbar->setCheckable(true); + _viewMenu->addSeparator(); + QAction *showStatusbar = QtUi::actionCollection("General")->action("ToggleStatusBar"); UiSettings uiSettings; @@ -365,13 +415,14 @@ void MainWin::setupSystray() { connect(Client::messageModel(), SIGNAL(rowsInserted(const QModelIndex &, int, int)), SLOT(messagesInserted(const QModelIndex &, int, int))); + ActionCollection *coll = QtUi::actionCollection("General"); systrayMenu = new QMenu(this); - systrayMenu->addAction(ui.actionAboutQuassel); + systrayMenu->addAction(coll->action("AboutQuassel")); systrayMenu->addSeparator(); - systrayMenu->addAction(ui.actionConnectCore); - systrayMenu->addAction(ui.actionDisconnectCore); + systrayMenu->addAction(coll->action("ConnectCore")); + systrayMenu->addAction(coll->action("DisconnectCore")); systrayMenu->addSeparator(); - systrayMenu->addAction(ui.actionQuit); + systrayMenu->addAction(coll->action("Quit")); systemTrayIcon()->setContextMenu(systrayMenu); @@ -410,12 +461,13 @@ void MainWin::connectedToCore() { } void MainWin::setConnectedState() { + ActionCollection *coll = QtUi::actionCollection("General"); //ui.menuCore->setEnabled(true); - ui.actionConnectCore->setEnabled(false); - ui.actionDisconnectCore->setEnabled(true); - ui.actionCoreInfo->setEnabled(true); - ui.menuViews->setEnabled(true); - ui.bufferWidget->show(); + coll->action("ConnectCore")->setEnabled(false); + coll->action("DisconnectCore")->setEnabled(true); + coll->action("CoreInfo")->setEnabled(true); + _viewMenu->setEnabled(true); + _bufferWidget->show(); statusBar()->showMessage(tr("Connected to core.")); if(sslLabel->width() == 0) sslLabel->setPixmap(SmallIcon("security-low")); @@ -449,7 +501,7 @@ void MainWin::disconnectedFromCore() { saveLayout(); QVariant actionData; BufferViewDock *dock; - foreach(QAction *action, ui.menuBufferViews->actions()) { + foreach(QAction *action, _bufferViewsMenu->actions()) { actionData = action->data(); if(!actionData.isValid()) continue; @@ -466,12 +518,13 @@ void MainWin::disconnectedFromCore() { } void MainWin::setDisconnectedState() { + ActionCollection *coll = QtUi::actionCollection("General"); //ui.menuCore->setEnabled(false); - ui.actionConnectCore->setEnabled(true); - ui.actionDisconnectCore->setEnabled(false); - ui.actionCoreInfo->setEnabled(false); - ui.menuViews->setEnabled(false); - ui.bufferWidget->hide(); + coll->action("ConnectCore")->setEnabled(true); + coll->action("DisconnectCore")->setEnabled(false); + coll->action("CoreInfo")->setEnabled(false); + _viewMenu->setEnabled(false); + _bufferWidget->hide(); statusBar()->showMessage(tr("Not connected to core.")); sslLabel->setPixmap(QPixmap()); updateIcon(); @@ -610,18 +663,15 @@ void MainWin::clientNetworkCreated(NetworkId id) { connect(act, SIGNAL(triggered()), this, SLOT(connectOrDisconnectFromNet())); QAction *beforeAction = 0; - foreach(QAction *action, ui.menuNetworks->actions()) { - if(action->isSeparator()) { - beforeAction = action; - break; - } + foreach(QAction *action, _networksMenu->actions()) { + if(!action->data().isValid()) // ignore stock actions + continue; if(net->networkName().localeAwareCompare(action->text()) < 0) { beforeAction = action; break; } } - Q_CHECK_PTR(beforeAction); - ui.menuNetworks->insertAction(beforeAction, act); + _networksMenu->insertAction(beforeAction, act); } void MainWin::clientNetworkUpdated() { @@ -664,7 +714,7 @@ void MainWin::connectOrDisconnectFromNet() { else net->requestDisconnect(); } -void MainWin::on_actionDebugNetworkModel_triggered(bool) { +void MainWin::on_actionDebugNetworkModel_triggered() { QTreeView *view = new QTreeView; view->setAttribute(Qt::WA_DeleteOnClose); view->setWindowTitle("Debug NetworkModel View"); diff --git a/src/qtui/mainwin.h b/src/qtui/mainwin.h index 29b705f0..1bff138b 100644 --- a/src/qtui/mainwin.h +++ b/src/qtui/mainwin.h @@ -21,20 +21,23 @@ #ifndef MAINWIN_H_ #define MAINWIN_H_ +#include #include -#include "ui_mainwin.h" - #include "qtui.h" #include "sessionsettings.h" #include "titlesetter.h" class ActionCollection; class BufferViewConfig; +class BufferWidget; class MsgProcessorStatusWidget; class NickListWidget; class SystemTrayIcon; +class QMenu; +class QLabel; + //!\brief The main window of Quassel's QtUi. class MainWin : public QMainWindow { Q_OBJECT @@ -79,7 +82,7 @@ class MainWin : public QMainWindow { void on_actionEditNetworks_triggered(); void on_actionManageViews_triggered(); void on_actionLockDockPositions_toggled(bool lock); - void on_actionDebugNetworkModel_triggered(bool); + void on_actionDebugNetworkModel_triggered(); void clientNetworkCreated(NetworkId); void clientNetworkRemoved(NetworkId); @@ -96,7 +99,6 @@ class MainWin : public QMainWindow { void disconnectFromCore(); private: - Ui::MainWin ui; QMenu *systrayMenu; QLabel *coreLagLabel; @@ -106,6 +108,7 @@ class MainWin : public QMainWindow { TitleSetter _titleSetter; void setupActions(); + void setupBufferWidget(); void setupMenus(); void setupViews(); void setupNickWidget(); @@ -114,6 +117,7 @@ class MainWin : public QMainWindow { void setupTopicWidget(); void setupStatusBar(); void setupSystray(); + void setupTitleSetter(); void updateIcon(); void toggleVisibility(); @@ -122,9 +126,10 @@ class MainWin : public QMainWindow { QSystemTrayIcon *_trayIcon; QList _netViews; - NickListWidget *nickListWidget; + BufferWidget *_bufferWidget; + NickListWidget *_nickListWidget; - ActionCollection *_actionCollection; + QMenu *_fileMenu, *_networksMenu, *_viewMenu, *_bufferViewsMenu, *_settingsMenu, *_helpMenu, *_helpDebugMenu; friend class QtUi; }; diff --git a/src/qtui/qtui.cpp b/src/qtui/qtui.cpp index 8cb83471..8ec12ef5 100644 --- a/src/qtui/qtui.cpp +++ b/src/qtui/qtui.cpp @@ -30,7 +30,7 @@ #include "uisettings.h" #include "util.h" -ActionCollection *QtUi::_actionCollection = 0; +QHash QtUi::_actionCollections; MainWin *QtUi::_mainWin = 0; QList QtUi::_notificationBackends; QList QtUi::_notifications; @@ -41,7 +41,6 @@ QtUi::QtUi() : AbstractUi() { qWarning() << "QtUi has been instantiated again!"; return; } - _actionCollection = new ActionCollection(this); UiSettings uiSettings; loadTranslation(uiSettings.value("Locale", QLocale::system()).value()); @@ -63,6 +62,15 @@ void QtUi::init() { _mainWin->init(); } +ActionCollection *QtUi::actionCollection(const QString &category) { + if(_actionCollections.contains(category)) + return _actionCollections.value(category); + ActionCollection *coll = new ActionCollection(mainWindow()); + coll->addAssociatedWidget(mainWindow()); + _actionCollections.insert(category, coll); + return coll; +} + MessageModel *QtUi::createMessageModel(QObject *parent) { return new ChatLineModel(parent); } diff --git a/src/qtui/qtui.h b/src/qtui/qtui.h index 1fe1114c..4baded89 100644 --- a/src/qtui/qtui.h +++ b/src/qtui/qtui.h @@ -48,12 +48,13 @@ public: inline static QtUiStyle *style(); inline static MainWin *mainWindow(); - //! Access the global ActionCollection. - /** This ActionCollection is associated with the main window, i.e. it contains global + //! Access global ActionCollections. + /** These ActionCollections are associated with the main window, i.e. they contain global * actions (and thus, shortcuts). Widgets providing application-wide shortcuts should - * create appropriate Action objects using QtUi::actionCollection()->add\(). + * create appropriate Action objects using QtUi::actionCollection(cat)->add\(). + * @param category The category (default: "General") */ - inline static ActionCollection *actionCollection(); + static ActionCollection *actionCollection(const QString &category = "General"); /* Notifications */ @@ -75,13 +76,12 @@ protected slots: private: static MainWin *_mainWin; - static ActionCollection *_actionCollection; + static QHash _actionCollections; static QtUiStyle *_style; static QList _notificationBackends; static QList _notifications; }; -ActionCollection *QtUi::actionCollection() { return _actionCollection; } QtUiStyle *QtUi::style() { return _style; } MainWin *QtUi::mainWindow() { return _mainWin; } diff --git a/src/uisupport/action.cpp b/src/uisupport/action.cpp index 700cce5a..f160ac4c 100644 --- a/src/uisupport/action.cpp +++ b/src/uisupport/action.cpp @@ -28,15 +28,23 @@ Action::Action(QObject *parent) : QWidgetAction(parent) { init(); } -Action::Action(const QString &text, QObject *parent) : QWidgetAction(parent) { +Action::Action(const QString &text, QObject *parent, const QObject *receiver, const char *slot, const QKeySequence &shortcut) +: QWidgetAction(parent) { init(); setText(text); + setShortcut(shortcut); + if(receiver && slot) + connect(this, SIGNAL(triggered()), receiver, slot); } -Action::Action(const QIcon &icon, const QString &text, QObject *parent) : QWidgetAction(parent) { +Action::Action(const QIcon &icon, const QString &text, QObject *parent, const QObject *receiver, const char *slot, const QKeySequence &shortcut) +: QWidgetAction(parent) { init(); setIcon(icon); setText(text); + setShortcut(shortcut); + if(receiver && slot) + connect(this, SIGNAL(triggered()), receiver, slot); } void Action::init() { diff --git a/src/uisupport/action.h b/src/uisupport/action.h index 378d45da..325beda9 100644 --- a/src/uisupport/action.h +++ b/src/uisupport/action.h @@ -45,8 +45,8 @@ class Action : public QWidgetAction { Q_DECLARE_FLAGS(ShortcutTypes, ShortcutType) explicit Action(QObject *parent); - Action(const QString &text, QObject *parent); - Action(const QIcon &icon, const QString &text, QObject *parent); + Action(const QString &text, QObject *parent, const QObject *receiver = 0, const char *slot = 0, const QKeySequence &shortcut = 0); + Action(const QIcon &icon, const QString &text, QObject *parent, const QObject *receiver = 0, const char *slot = 0, const QKeySequence &shortcut = 0); QKeySequence shortcut(ShortcutTypes types = ActiveShortcut) const; void setShortcut(const QShortcut &shortcut, ShortcutTypes type = ShortcutTypes(ActiveShortcut | DefaultShortcut)); -- 2.20.1