diff --git a/src/gui/basetoolbar.cpp b/src/gui/basetoolbar.cpp index a1f189a39..fbacbb904 100644 --- a/src/gui/basetoolbar.cpp +++ b/src/gui/basetoolbar.cpp @@ -1,9 +1,31 @@ #include "gui/basetoolbar.h" +#include "definitions/definitions.h" +#include "gui/formmain.h" +#include "miscellaneous/settings.h" + BaseToolBar::BaseToolBar(const QString &title, QWidget *parent) : QToolBar(title, parent) { } BaseToolBar::~BaseToolBar() { + qDebug("Destroying BaseToolBar instance."); +} + +void BaseToolBar::loadChangeableActions() { + QHash available_actions = FormMain::instance()->allActions(); + QStringList action_names = Settings::instance()->value(APP_CFG_GUI, + "messages_toolbar", + "m_actionMarkSelectedMessagesAsRead,m_actionMarkSelectedMessagesAsUnread,m_actionSwitchImportanceOfSelectedMessages").toString().split(',', + QString::SkipEmptyParts); + + actions().clear(); + + // Iterate action names and add respectable actions into the toolbar. + foreach (const QString &action_name, action_names) { + if (available_actions.contains(action_name)) { + addAction(available_actions.value(action_name)); + } + } } diff --git a/src/gui/basetoolbar.h b/src/gui/basetoolbar.h index 09c4678a5..4b60875be 100644 --- a/src/gui/basetoolbar.h +++ b/src/gui/basetoolbar.h @@ -13,9 +13,8 @@ class BaseToolBar : public QToolBar { virtual ~BaseToolBar(); virtual QList changeableActions() const = 0; - virtual void setChangeableActions(const QList actions) = 0; virtual void saveChangeableActions() const = 0; - virtual void loadChangeableActions() = 0; + virtual void loadChangeableActions(); signals: diff --git a/src/gui/formmain.cpp b/src/gui/formmain.cpp index 2147de623..3f9ab35ac 100755 --- a/src/gui/formmain.cpp +++ b/src/gui/formmain.cpp @@ -64,7 +64,7 @@ FormMain::FormMain(QWidget *parent, Qt::WindowFlags f) // Add these actions to the list of actions of the main window. // This allows to use actions via shortcuts // even if main menu is not visible. - addActions(allActions()); + addActions(allActions().values()); // Prepare tabs. m_ui->m_tabWidget->initializeTabs(); @@ -85,44 +85,50 @@ FormMain *FormMain::instance() { return s_instance; } -QList FormMain::allActions() { - QList actions; +QHash FormMain::allActions() { + QHash actions; // Add basic actions. - actions << m_ui->m_actionSettings << m_ui->m_actionQuit << - m_ui->m_actionFullscreen << m_ui->m_actionAboutGuard << - m_ui->m_actionSwitchFeedsList << m_ui->m_actionSwitchMainWindow << - m_ui->m_actionSwitchMainMenu << m_ui->m_actionSwitchToolBars << - m_ui->m_actionSwitchListHeaders; + actions.insert(m_ui->m_actionSettings->objectName(), m_ui->m_actionSettings); + actions.insert(m_ui->m_actionSettings->objectName(), m_ui->m_actionSettings); + actions.insert(m_ui->m_actionQuit->objectName(), m_ui->m_actionQuit); + actions.insert(m_ui->m_actionFullscreen->objectName(), m_ui->m_actionFullscreen); + actions.insert(m_ui->m_actionAboutGuard->objectName(), m_ui->m_actionAboutGuard); + actions.insert(m_ui->m_actionSwitchFeedsList->objectName(), m_ui->m_actionSwitchFeedsList); + actions.insert(m_ui->m_actionSwitchMainWindow->objectName(), m_ui->m_actionSwitchMainWindow); + actions.insert(m_ui->m_actionSwitchMainMenu->objectName(), m_ui->m_actionSwitchMainMenu); + actions.insert(m_ui->m_actionSwitchToolBars->objectName(), m_ui->m_actionSwitchToolBars); + actions.insert(m_ui->m_actionSwitchListHeaders->objectName(), m_ui->m_actionSwitchListHeaders); // Add web browser actions - actions << m_ui->m_actionAddBrowser << m_ui->m_actionCloseCurrentTab << - m_ui->m_actionCloseAllTabs; + actions.insert(m_ui->m_actionAddBrowser->objectName(), m_ui->m_actionAddBrowser); + actions.insert(m_ui->m_actionCloseCurrentTab->objectName(), m_ui->m_actionCloseCurrentTab); + actions.insert(m_ui->m_actionCloseAllTabs->objectName(), m_ui->m_actionCloseAllTabs); // Add feeds/messages actions. - actions << m_ui->m_actionOpenSelectedSourceArticlesExternally << - m_ui->m_actionOpenSelectedSourceArticlesInternally << - m_ui->m_actionOpenSelectedMessagesInternally << - m_ui->m_actionMarkAllFeedsRead << - m_ui->m_actionMarkSelectedFeedsAsRead << - m_ui->m_actionMarkSelectedFeedsAsUnread << - m_ui->m_actionClearSelectedFeeds << - m_ui->m_actionMarkSelectedMessagesAsRead << - m_ui->m_actionMarkSelectedMessagesAsUnread << - m_ui->m_actionSwitchImportanceOfSelectedMessages << - m_ui->m_actionDeleteSelectedMessages << - m_ui->m_actionUpdateAllFeeds << - m_ui->m_actionUpdateSelectedFeedsCategories << - m_ui->m_actionEditSelectedFeedCategory << - m_ui->m_actionDeleteSelectedFeedCategory << - m_ui->m_actionViewSelectedItemsNewspaperMode << - m_ui->m_actionAddCategory << - m_ui->m_actionAddFeed << - m_ui->m_actionSelectNextFeedCategory << - m_ui->m_actionSelectPreviousFeedCategory << - m_ui->m_actionSelectNextMessage << - m_ui->m_actionSelectPreviousMessage << - m_ui->m_actionDefragmentDatabase; + actions.insert(m_ui->m_actionOpenSelectedSourceArticlesExternally->objectName(), m_ui->m_actionOpenSelectedSourceArticlesExternally); + actions.insert(m_ui->m_actionOpenSelectedSourceArticlesInternally->objectName(), m_ui->m_actionOpenSelectedSourceArticlesInternally); + actions.insert(m_ui->m_actionOpenSelectedMessagesInternally->objectName(), m_ui->m_actionOpenSelectedMessagesInternally); + actions.insert(m_ui->m_actionMarkAllFeedsRead->objectName(), m_ui->m_actionMarkAllFeedsRead); + actions.insert(m_ui->m_actionMarkSelectedFeedsAsRead->objectName(), m_ui->m_actionMarkSelectedFeedsAsRead); + actions.insert(m_ui->m_actionMarkSelectedFeedsAsUnread->objectName(), m_ui->m_actionMarkSelectedFeedsAsUnread); + actions.insert(m_ui->m_actionClearSelectedFeeds->objectName(), m_ui->m_actionClearSelectedFeeds); + actions.insert(m_ui->m_actionMarkSelectedMessagesAsRead->objectName(), m_ui->m_actionMarkSelectedMessagesAsRead); + actions.insert(m_ui->m_actionMarkSelectedMessagesAsUnread->objectName(), m_ui->m_actionMarkSelectedMessagesAsUnread); + actions.insert(m_ui->m_actionSwitchImportanceOfSelectedMessages->objectName(), m_ui->m_actionSwitchImportanceOfSelectedMessages); + actions.insert(m_ui->m_actionDeleteSelectedMessages->objectName(), m_ui->m_actionDeleteSelectedMessages); + actions.insert(m_ui->m_actionUpdateAllFeeds->objectName(), m_ui->m_actionUpdateAllFeeds); + actions.insert(m_ui->m_actionUpdateSelectedFeedsCategories->objectName(), m_ui->m_actionUpdateSelectedFeedsCategories); + actions.insert(m_ui->m_actionEditSelectedFeedCategory->objectName(), m_ui->m_actionEditSelectedFeedCategory); + actions.insert(m_ui->m_actionDeleteSelectedFeedCategory->objectName(), m_ui->m_actionDeleteSelectedFeedCategory); + actions.insert(m_ui->m_actionViewSelectedItemsNewspaperMode->objectName(), m_ui->m_actionViewSelectedItemsNewspaperMode); + actions.insert(m_ui->m_actionAddCategory->objectName(), m_ui->m_actionAddCategory); + actions.insert(m_ui->m_actionAddFeed->objectName(), m_ui->m_actionAddFeed); + actions.insert(m_ui->m_actionSelectNextFeedCategory->objectName(), m_ui->m_actionSelectNextFeedCategory); + actions.insert(m_ui->m_actionSelectPreviousFeedCategory->objectName(), m_ui->m_actionSelectPreviousFeedCategory); + actions.insert(m_ui->m_actionSelectNextMessage->objectName(), m_ui->m_actionSelectNextMessage); + actions.insert(m_ui->m_actionSelectPreviousMessage->objectName(), m_ui->m_actionSelectPreviousMessage); + actions.insert(m_ui->m_actionDefragmentDatabase->objectName(), m_ui->m_actionDefragmentDatabase); return actions; } diff --git a/src/gui/formmain.h b/src/gui/formmain.h index d2e1a427a..90b4579ad 100644 --- a/src/gui/formmain.h +++ b/src/gui/formmain.h @@ -58,7 +58,7 @@ class FormMain : public QMainWindow { // Returns list of all globally available actions. // NOTE: This is used for setting dynamic shortcuts // for given actions. - QList allActions(); + QHash allActions(); // Singleton accessor. static FormMain *instance(); diff --git a/src/gui/formsettings.cpp b/src/gui/formsettings.cpp index 5223a6934..05a761ac9 100755 --- a/src/gui/formsettings.cpp +++ b/src/gui/formsettings.cpp @@ -486,7 +486,7 @@ void FormSettings::saveLanguage() { } void FormSettings::loadShortcuts() { - m_ui->m_shortcuts->populate(FormMain::instance()->allActions()); + m_ui->m_shortcuts->populate(FormMain::instance()->allActions().values()); } void FormSettings::saveShortcuts() { @@ -494,7 +494,7 @@ void FormSettings::saveShortcuts() { m_ui->m_shortcuts->updateShortcuts(); // Save new shortcuts to the settings. - DynamicShortcuts::save(FormMain::instance()->allActions()); + DynamicShortcuts::save(FormMain::instance()->allActions().values()); } void FormSettings::loadDataStorage() { diff --git a/src/gui/messagestoolbar.cpp b/src/gui/messagestoolbar.cpp index 1c96ba435..b2f2fde90 100644 --- a/src/gui/messagestoolbar.cpp +++ b/src/gui/messagestoolbar.cpp @@ -3,6 +3,7 @@ #include "definitions/definitions.h" #include "gui/baselineedit.h" #include "gui/formmain.h" +#include "miscellaneous/settings.h" MessagesToolBar::MessagesToolBar(const QString &title, QWidget *parent) @@ -15,6 +16,7 @@ MessagesToolBar::MessagesToolBar(const QString &title, QWidget *parent) m_txtFilter->setFixedWidth(FILTER_WIDTH); m_txtFilter->setPlaceholderText(tr("Filter messages")); + // Update right margin of filter textbox. QMargins margins = contentsMargins(); margins.setRight(margins.right() + FILTER_RIGHT_MARGIN); setContentsMargins(margins); @@ -23,16 +25,44 @@ MessagesToolBar::MessagesToolBar(const QString &title, QWidget *parent) MessagesToolBar::~MessagesToolBar() { } +QList MessagesToolBar::changeableActions() const { + // TODO: Vracet akce, ktere muze uzivatel upravovat v tomto toolbaru. + // nebudou se tedy vracet spacer widgety nebo lineedity a tak podobnÄ›, + // proste jen akce ktere sou uzivatelsky upravitelne + // http://stackoverflow.com/questions/5364957/in-qt-4-7-how-can-a-pop-up-menu-be-added-to-a-qtoolbar-button + QList changeable_actions; + + // Iterates all actions present in the toolbar and + // returns actions which can be replaced by user. + foreach (QAction *action, actions()) { + QString action_name = action->objectName(); + + if (action_name != FILTER_OBJECT_NAME && action_name != SPACER_OBJECT_NAME) { + changeable_actions.append(action); + } + } + + return changeable_actions; +} + +void MessagesToolBar::saveChangeableActions() const { + QStringList action_names; + + // Iterates all actions present in the toolbar and + // returns actions which can be replaced by user. + foreach (QAction *action, actions()) { + QString action_name = action->objectName(); + + if (action_name != FILTER_OBJECT_NAME && action_name != SPACER_OBJECT_NAME) { + action_names.append(action->objectName()); + } + } + + Settings::instance()->setValue(APP_CFG_GUI, "messages_toolbar", action_names.join(',')); +} + void MessagesToolBar::loadChangeableActions() { - - // TODO: udelat dynamicky, nacitat z nastaveni - // pouzit formmain::allActions treba a ukladat podle "objectname" - // allactions ale nani qhash, tak pouzit treba - // http://qt-project.org/doc/qt-4.8/qobject.html#findChild na hledani podle jmena - - addAction(FormMain::instance()->m_ui->m_actionMarkSelectedMessagesAsRead); - addAction(FormMain::instance()->m_ui->m_actionMarkSelectedMessagesAsUnread); - addAction(FormMain::instance()->m_ui->m_actionSwitchImportanceOfSelectedMessages); + BaseToolBar::loadChangeableActions(); addWidget(m_spacer); addWidget(m_txtFilter); diff --git a/src/gui/messagestoolbar.h b/src/gui/messagestoolbar.h index e91732917..248c737fc 100644 --- a/src/gui/messagestoolbar.h +++ b/src/gui/messagestoolbar.h @@ -14,24 +14,9 @@ class MessagesToolBar : public BaseToolBar { explicit MessagesToolBar(const QString &title, QWidget *parent = 0); virtual ~MessagesToolBar(); - QList changeableActions() const { - // TODO: Vracet akce, ktere muze uzivatel upravovat v tomto toolbaru. - // nebudou se tedy vracet spacer widgety nebo lineedity a tak podobnÄ›, - // proste jen akce ktere sou uzivatelsky upravitelne - // http://stackoverflow.com/questions/5364957/in-qt-4-7-how-can-a-pop-up-menu-be-added-to-a-qtoolbar-button - // http://www.qtcentre.org/threads/23840-how-align-some-buttons-in-QToolbar-from-right-to-left - return QList(); - } - - void setChangeableActions(const QList actions) { - // TODO: ulozit akce, ktere muze uzivatel upravovat do tohoto toolbaru - // todle musi zachovat vsechny widgety na konci - treba filtrovaci - // lineedit zprav - } - - void saveChangeableActions() const { - } - + // Operations with changeable actions. + QList changeableActions() const; + void saveChangeableActions() const; void loadChangeableActions(); signals: diff --git a/src/main.cpp b/src/main.cpp index 7492bd9b1..53d6161b9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -101,7 +101,7 @@ int main(int argc, char *argv[]) { main_window.setWindowTitle(APP_LONG_NAME); // Now is a good time to initialize dynamic keyboard shortcuts. - DynamicShortcuts::load(main_window.allActions()); + DynamicShortcuts::load(main_window.allActions().values()); // Display main window. if (Settings::instance()->value(APP_CFG_GUI, "start_hidden",