Work on changeable toolbars.

This commit is contained in:
Martin Rotter 2014-04-02 07:31:53 +02:00
parent 4daf095371
commit b1b9471200
8 changed files with 108 additions and 66 deletions

View File

@ -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<QString, QAction*> 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));
}
}
}

View File

@ -13,9 +13,8 @@ class BaseToolBar : public QToolBar {
virtual ~BaseToolBar();
virtual QList<QAction*> changeableActions() const = 0;
virtual void setChangeableActions(const QList<QAction*> actions) = 0;
virtual void saveChangeableActions() const = 0;
virtual void loadChangeableActions() = 0;
virtual void loadChangeableActions();
signals:

View File

@ -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<QAction*> FormMain::allActions() {
QList<QAction*> actions;
QHash<QString, QAction*> FormMain::allActions() {
QHash<QString, QAction*> 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;
}

View File

@ -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<QAction*> allActions();
QHash<QString, QAction *> allActions();
// Singleton accessor.
static FormMain *instance();

View File

@ -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() {

View File

@ -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<QAction*> 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<QAction*> 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);

View File

@ -14,24 +14,9 @@ class MessagesToolBar : public BaseToolBar {
explicit MessagesToolBar(const QString &title, QWidget *parent = 0);
virtual ~MessagesToolBar();
QList<QAction*> 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<QAction*>();
}
void setChangeableActions(const QList<QAction *> 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<QAction*> changeableActions() const;
void saveChangeableActions() const;
void loadChangeableActions();
signals:

View File

@ -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",