Work on changeable toolbars.
This commit is contained in:
parent
4daf095371
commit
b1b9471200
8 changed files with 108 additions and 66 deletions
|
|
@ -1,9 +1,31 @@
|
||||||
#include "gui/basetoolbar.h"
|
#include "gui/basetoolbar.h"
|
||||||
|
|
||||||
|
#include "definitions/definitions.h"
|
||||||
|
#include "gui/formmain.h"
|
||||||
|
#include "miscellaneous/settings.h"
|
||||||
|
|
||||||
|
|
||||||
BaseToolBar::BaseToolBar(const QString &title, QWidget *parent)
|
BaseToolBar::BaseToolBar(const QString &title, QWidget *parent)
|
||||||
: QToolBar(title, parent) {
|
: QToolBar(title, parent) {
|
||||||
}
|
}
|
||||||
|
|
||||||
BaseToolBar::~BaseToolBar() {
|
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));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,9 +13,8 @@ class BaseToolBar : public QToolBar {
|
||||||
virtual ~BaseToolBar();
|
virtual ~BaseToolBar();
|
||||||
|
|
||||||
virtual QList<QAction*> changeableActions() const = 0;
|
virtual QList<QAction*> changeableActions() const = 0;
|
||||||
virtual void setChangeableActions(const QList<QAction*> actions) = 0;
|
|
||||||
virtual void saveChangeableActions() const = 0;
|
virtual void saveChangeableActions() const = 0;
|
||||||
virtual void loadChangeableActions() = 0;
|
virtual void loadChangeableActions();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@ FormMain::FormMain(QWidget *parent, Qt::WindowFlags f)
|
||||||
// Add these actions to the list of actions of the main window.
|
// Add these actions to the list of actions of the main window.
|
||||||
// This allows to use actions via shortcuts
|
// This allows to use actions via shortcuts
|
||||||
// even if main menu is not visible.
|
// even if main menu is not visible.
|
||||||
addActions(allActions());
|
addActions(allActions().values());
|
||||||
|
|
||||||
// Prepare tabs.
|
// Prepare tabs.
|
||||||
m_ui->m_tabWidget->initializeTabs();
|
m_ui->m_tabWidget->initializeTabs();
|
||||||
|
|
@ -85,44 +85,50 @@ FormMain *FormMain::instance() {
|
||||||
return s_instance;
|
return s_instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<QAction*> FormMain::allActions() {
|
QHash<QString, QAction*> FormMain::allActions() {
|
||||||
QList<QAction*> actions;
|
QHash<QString, QAction*> actions;
|
||||||
|
|
||||||
// Add basic actions.
|
// Add basic actions.
|
||||||
actions << m_ui->m_actionSettings << m_ui->m_actionQuit <<
|
actions.insert(m_ui->m_actionSettings->objectName(), m_ui->m_actionSettings);
|
||||||
m_ui->m_actionFullscreen << m_ui->m_actionAboutGuard <<
|
actions.insert(m_ui->m_actionSettings->objectName(), m_ui->m_actionSettings);
|
||||||
m_ui->m_actionSwitchFeedsList << m_ui->m_actionSwitchMainWindow <<
|
actions.insert(m_ui->m_actionQuit->objectName(), m_ui->m_actionQuit);
|
||||||
m_ui->m_actionSwitchMainMenu << m_ui->m_actionSwitchToolBars <<
|
actions.insert(m_ui->m_actionFullscreen->objectName(), m_ui->m_actionFullscreen);
|
||||||
m_ui->m_actionSwitchListHeaders;
|
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
|
// Add web browser actions
|
||||||
actions << m_ui->m_actionAddBrowser << m_ui->m_actionCloseCurrentTab <<
|
actions.insert(m_ui->m_actionAddBrowser->objectName(), m_ui->m_actionAddBrowser);
|
||||||
m_ui->m_actionCloseAllTabs;
|
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.
|
// Add feeds/messages actions.
|
||||||
actions << m_ui->m_actionOpenSelectedSourceArticlesExternally <<
|
actions.insert(m_ui->m_actionOpenSelectedSourceArticlesExternally->objectName(), m_ui->m_actionOpenSelectedSourceArticlesExternally);
|
||||||
m_ui->m_actionOpenSelectedSourceArticlesInternally <<
|
actions.insert(m_ui->m_actionOpenSelectedSourceArticlesInternally->objectName(), m_ui->m_actionOpenSelectedSourceArticlesInternally);
|
||||||
m_ui->m_actionOpenSelectedMessagesInternally <<
|
actions.insert(m_ui->m_actionOpenSelectedMessagesInternally->objectName(), m_ui->m_actionOpenSelectedMessagesInternally);
|
||||||
m_ui->m_actionMarkAllFeedsRead <<
|
actions.insert(m_ui->m_actionMarkAllFeedsRead->objectName(), m_ui->m_actionMarkAllFeedsRead);
|
||||||
m_ui->m_actionMarkSelectedFeedsAsRead <<
|
actions.insert(m_ui->m_actionMarkSelectedFeedsAsRead->objectName(), m_ui->m_actionMarkSelectedFeedsAsRead);
|
||||||
m_ui->m_actionMarkSelectedFeedsAsUnread <<
|
actions.insert(m_ui->m_actionMarkSelectedFeedsAsUnread->objectName(), m_ui->m_actionMarkSelectedFeedsAsUnread);
|
||||||
m_ui->m_actionClearSelectedFeeds <<
|
actions.insert(m_ui->m_actionClearSelectedFeeds->objectName(), m_ui->m_actionClearSelectedFeeds);
|
||||||
m_ui->m_actionMarkSelectedMessagesAsRead <<
|
actions.insert(m_ui->m_actionMarkSelectedMessagesAsRead->objectName(), m_ui->m_actionMarkSelectedMessagesAsRead);
|
||||||
m_ui->m_actionMarkSelectedMessagesAsUnread <<
|
actions.insert(m_ui->m_actionMarkSelectedMessagesAsUnread->objectName(), m_ui->m_actionMarkSelectedMessagesAsUnread);
|
||||||
m_ui->m_actionSwitchImportanceOfSelectedMessages <<
|
actions.insert(m_ui->m_actionSwitchImportanceOfSelectedMessages->objectName(), m_ui->m_actionSwitchImportanceOfSelectedMessages);
|
||||||
m_ui->m_actionDeleteSelectedMessages <<
|
actions.insert(m_ui->m_actionDeleteSelectedMessages->objectName(), m_ui->m_actionDeleteSelectedMessages);
|
||||||
m_ui->m_actionUpdateAllFeeds <<
|
actions.insert(m_ui->m_actionUpdateAllFeeds->objectName(), m_ui->m_actionUpdateAllFeeds);
|
||||||
m_ui->m_actionUpdateSelectedFeedsCategories <<
|
actions.insert(m_ui->m_actionUpdateSelectedFeedsCategories->objectName(), m_ui->m_actionUpdateSelectedFeedsCategories);
|
||||||
m_ui->m_actionEditSelectedFeedCategory <<
|
actions.insert(m_ui->m_actionEditSelectedFeedCategory->objectName(), m_ui->m_actionEditSelectedFeedCategory);
|
||||||
m_ui->m_actionDeleteSelectedFeedCategory <<
|
actions.insert(m_ui->m_actionDeleteSelectedFeedCategory->objectName(), m_ui->m_actionDeleteSelectedFeedCategory);
|
||||||
m_ui->m_actionViewSelectedItemsNewspaperMode <<
|
actions.insert(m_ui->m_actionViewSelectedItemsNewspaperMode->objectName(), m_ui->m_actionViewSelectedItemsNewspaperMode);
|
||||||
m_ui->m_actionAddCategory <<
|
actions.insert(m_ui->m_actionAddCategory->objectName(), m_ui->m_actionAddCategory);
|
||||||
m_ui->m_actionAddFeed <<
|
actions.insert(m_ui->m_actionAddFeed->objectName(), m_ui->m_actionAddFeed);
|
||||||
m_ui->m_actionSelectNextFeedCategory <<
|
actions.insert(m_ui->m_actionSelectNextFeedCategory->objectName(), m_ui->m_actionSelectNextFeedCategory);
|
||||||
m_ui->m_actionSelectPreviousFeedCategory <<
|
actions.insert(m_ui->m_actionSelectPreviousFeedCategory->objectName(), m_ui->m_actionSelectPreviousFeedCategory);
|
||||||
m_ui->m_actionSelectNextMessage <<
|
actions.insert(m_ui->m_actionSelectNextMessage->objectName(), m_ui->m_actionSelectNextMessage);
|
||||||
m_ui->m_actionSelectPreviousMessage <<
|
actions.insert(m_ui->m_actionSelectPreviousMessage->objectName(), m_ui->m_actionSelectPreviousMessage);
|
||||||
m_ui->m_actionDefragmentDatabase;
|
actions.insert(m_ui->m_actionDefragmentDatabase->objectName(), m_ui->m_actionDefragmentDatabase);
|
||||||
|
|
||||||
return actions;
|
return actions;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ class FormMain : public QMainWindow {
|
||||||
// Returns list of all globally available actions.
|
// Returns list of all globally available actions.
|
||||||
// NOTE: This is used for setting dynamic shortcuts
|
// NOTE: This is used for setting dynamic shortcuts
|
||||||
// for given actions.
|
// for given actions.
|
||||||
QList<QAction*> allActions();
|
QHash<QString, QAction *> allActions();
|
||||||
|
|
||||||
// Singleton accessor.
|
// Singleton accessor.
|
||||||
static FormMain *instance();
|
static FormMain *instance();
|
||||||
|
|
|
||||||
|
|
@ -486,7 +486,7 @@ void FormSettings::saveLanguage() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void FormSettings::loadShortcuts() {
|
void FormSettings::loadShortcuts() {
|
||||||
m_ui->m_shortcuts->populate(FormMain::instance()->allActions());
|
m_ui->m_shortcuts->populate(FormMain::instance()->allActions().values());
|
||||||
}
|
}
|
||||||
|
|
||||||
void FormSettings::saveShortcuts() {
|
void FormSettings::saveShortcuts() {
|
||||||
|
|
@ -494,7 +494,7 @@ void FormSettings::saveShortcuts() {
|
||||||
m_ui->m_shortcuts->updateShortcuts();
|
m_ui->m_shortcuts->updateShortcuts();
|
||||||
|
|
||||||
// Save new shortcuts to the settings.
|
// Save new shortcuts to the settings.
|
||||||
DynamicShortcuts::save(FormMain::instance()->allActions());
|
DynamicShortcuts::save(FormMain::instance()->allActions().values());
|
||||||
}
|
}
|
||||||
|
|
||||||
void FormSettings::loadDataStorage() {
|
void FormSettings::loadDataStorage() {
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
#include "definitions/definitions.h"
|
#include "definitions/definitions.h"
|
||||||
#include "gui/baselineedit.h"
|
#include "gui/baselineedit.h"
|
||||||
#include "gui/formmain.h"
|
#include "gui/formmain.h"
|
||||||
|
#include "miscellaneous/settings.h"
|
||||||
|
|
||||||
|
|
||||||
MessagesToolBar::MessagesToolBar(const QString &title, QWidget *parent)
|
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->setFixedWidth(FILTER_WIDTH);
|
||||||
m_txtFilter->setPlaceholderText(tr("Filter messages"));
|
m_txtFilter->setPlaceholderText(tr("Filter messages"));
|
||||||
|
|
||||||
|
// Update right margin of filter textbox.
|
||||||
QMargins margins = contentsMargins();
|
QMargins margins = contentsMargins();
|
||||||
margins.setRight(margins.right() + FILTER_RIGHT_MARGIN);
|
margins.setRight(margins.right() + FILTER_RIGHT_MARGIN);
|
||||||
setContentsMargins(margins);
|
setContentsMargins(margins);
|
||||||
|
|
@ -23,16 +25,44 @@ MessagesToolBar::MessagesToolBar(const QString &title, QWidget *parent)
|
||||||
MessagesToolBar::~MessagesToolBar() {
|
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() {
|
void MessagesToolBar::loadChangeableActions() {
|
||||||
|
BaseToolBar::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);
|
|
||||||
|
|
||||||
addWidget(m_spacer);
|
addWidget(m_spacer);
|
||||||
addWidget(m_txtFilter);
|
addWidget(m_txtFilter);
|
||||||
|
|
|
||||||
|
|
@ -14,24 +14,9 @@ class MessagesToolBar : public BaseToolBar {
|
||||||
explicit MessagesToolBar(const QString &title, QWidget *parent = 0);
|
explicit MessagesToolBar(const QString &title, QWidget *parent = 0);
|
||||||
virtual ~MessagesToolBar();
|
virtual ~MessagesToolBar();
|
||||||
|
|
||||||
QList<QAction*> changeableActions() const {
|
// Operations with changeable actions.
|
||||||
// TODO: Vracet akce, ktere muze uzivatel upravovat v tomto toolbaru.
|
QList<QAction*> changeableActions() const;
|
||||||
// nebudou se tedy vracet spacer widgety nebo lineedity a tak podobně,
|
void saveChangeableActions() const;
|
||||||
// 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 {
|
|
||||||
}
|
|
||||||
|
|
||||||
void loadChangeableActions();
|
void loadChangeableActions();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|
|
||||||
|
|
@ -101,7 +101,7 @@ int main(int argc, char *argv[]) {
|
||||||
main_window.setWindowTitle(APP_LONG_NAME);
|
main_window.setWindowTitle(APP_LONG_NAME);
|
||||||
|
|
||||||
// Now is a good time to initialize dynamic keyboard shortcuts.
|
// Now is a good time to initialize dynamic keyboard shortcuts.
|
||||||
DynamicShortcuts::load(main_window.allActions());
|
DynamicShortcuts::load(main_window.allActions().values());
|
||||||
|
|
||||||
// Display main window.
|
// Display main window.
|
||||||
if (Settings::instance()->value(APP_CFG_GUI, "start_hidden",
|
if (Settings::instance()->value(APP_CFG_GUI, "start_hidden",
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue