From 69354c91a25a42904791903f9678189a2a2f167d Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Sat, 5 Apr 2014 13:48:26 +0200 Subject: [PATCH] Saving toolbars... --- src/definitions/definitions.h.in | 2 +- src/gui/basetoolbar.h | 2 + src/gui/formsettings.cpp | 3 ++ src/gui/messagestoolbar.cpp | 75 +++++++++++++++++++------------- src/gui/messagestoolbar.h | 5 ++- src/gui/toolbareditor.cpp | 35 +++++++++++++-- src/gui/toolbareditor.ui | 23 ++++------ 7 files changed, 94 insertions(+), 51 deletions(-) diff --git a/src/definitions/definitions.h.in b/src/definitions/definitions.h.in index bcc2f0320..98a1696ce 100644 --- a/src/definitions/definitions.h.in +++ b/src/definitions/definitions.h.in @@ -64,8 +64,8 @@ #define STARTUP_UPDATE_DELAY 1500 #define TIMEZONE_OFFSET_LIMIT 6 #define CHANGE_EVENT_DELAY 250 -#define SPACER_OBJECT_NAME "spacer" #define FILTER_OBJECT_NAME "filter" +#define SPACER_ACTION_NAME "spacer" #define SEPARATOR_ACTION_NAME "separator" #define FILTER_WIDTH 150 #define FILTER_RIGHT_MARGIN 5 diff --git a/src/gui/basetoolbar.h b/src/gui/basetoolbar.h index 0d43e20d3..705e101ee 100644 --- a/src/gui/basetoolbar.h +++ b/src/gui/basetoolbar.h @@ -12,8 +12,10 @@ class BaseToolBar : public QToolBar { explicit BaseToolBar(const QString &title, QWidget *parent = 0); virtual ~BaseToolBar(); + virtual QList availableActions() const = 0; virtual QList changeableActions() const = 0; virtual void saveChangeableActions() const = 0; + virtual void saveChangeableActions(const QStringList &actions) = 0; virtual void loadChangeableActions() = 0; signals: diff --git a/src/gui/formsettings.cpp b/src/gui/formsettings.cpp index 43c5e7e63..8b7f24c54 100755 --- a/src/gui/formsettings.cpp +++ b/src/gui/formsettings.cpp @@ -833,6 +833,9 @@ void FormSettings::saveInterface() { settings->setValue(APP_CFG_GUI, "hide_tabbar_one_tab", m_ui->m_hideTabBarIfOneTabVisible->isChecked()); + + m_ui->widget->saveToolBar(); + FormMain::instance()->tabWidget()->checkTabBarVisibility(); FormMain::instance()->tabWidget()->feedMessageViewer()->refreshVisualProperties(); } diff --git a/src/gui/messagestoolbar.cpp b/src/gui/messagestoolbar.cpp index 6e6fb1a3e..4501cb490 100644 --- a/src/gui/messagestoolbar.cpp +++ b/src/gui/messagestoolbar.cpp @@ -10,11 +10,13 @@ MessagesToolBar::MessagesToolBar(const QString &title, QWidget *parent) : BaseToolBar(title, parent), - m_spacer(new QWidget(this)), m_txtFilter(new BaseLineEdit(this)) { - m_spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); m_txtFilter->setFixedWidth(FILTER_WIDTH); m_txtFilter->setPlaceholderText(tr("Filter messages")); + m_actionFilter = new QWidgetAction(this); + m_actionFilter->setDefaultWidget(m_txtFilter); + m_actionFilter->setProperty("type", FILTER_OBJECT_NAME); + m_actionFilter->setProperty("name", tr("message filter")); // Update right margin of filter textbox. QMargins margins = contentsMargins(); @@ -25,24 +27,14 @@ MessagesToolBar::MessagesToolBar(const QString &title, QWidget *parent) MessagesToolBar::~MessagesToolBar() { } +QList MessagesToolBar::availableActions() const { + QList available_actions = FormMain::instance()->allActions().values(); + available_actions.append(m_actionFilter); + return available_actions; +} + 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; + return actions(); } void MessagesToolBar::saveChangeableActions() const { @@ -51,38 +43,59 @@ void MessagesToolBar::saveChangeableActions() const { // 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()); - } - else if (action->isSeparator()) { + if (action->isSeparator()) { + // This action is separator, add its "name" to settings. action_names.append(SEPARATOR_ACTION_NAME); } + else if (action->property("type").isValid()) { + // This action is extra widget or spacer. + action_names.append(action->property("type").toString()); + } + else { + // This action is normal action. + action_names.append(action->objectName()); + } } Settings::instance()->setValue(APP_CFG_GUI, "messages_toolbar", action_names.join(",")); } +void MessagesToolBar::saveChangeableActions(const QStringList& actions) { + Settings::instance()->setValue(APP_CFG_GUI, "messages_toolbar", actions.join(",")); + loadChangeableActions(); +} + void MessagesToolBar::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); + "m_actionMarkSelectedMessagesAsRead,m_actionMarkSelectedMessagesAsUnread,m_actionSwitchImportanceOfSelectedMessages,spacer,filter").toString().split(',', + QString::SkipEmptyParts); - actions().clear(); + clear(); // Iterate action names and add respectable actions into the toolbar. foreach (const QString &action_name, action_names) { if (available_actions.contains(action_name)) { + // Add existing standard action. addAction(available_actions.value(action_name)); } else if (action_name == SEPARATOR_ACTION_NAME) { + // Add new separator. addSeparator(); } - } + else if (action_name == FILTER_OBJECT_NAME) { + // Add filter. + addAction(m_actionFilter); + } + else if (action_name == SPACER_ACTION_NAME) { + // Add new spacer. + QWidget *spacer = new QWidget(this); + spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - addWidget(m_spacer)->setObjectName(SPACER_OBJECT_NAME); - addWidget(m_txtFilter)->setObjectName(FILTER_OBJECT_NAME); + QAction *action = addWidget(spacer); + action->setProperty("type", SPACER_ACTION_NAME); + action->setProperty("name", tr("spacer")); + } + } } diff --git a/src/gui/messagestoolbar.h b/src/gui/messagestoolbar.h index 741f2c678..27e2b997d 100644 --- a/src/gui/messagestoolbar.h +++ b/src/gui/messagestoolbar.h @@ -5,6 +5,7 @@ class BaseLineEdit; +class QWidgetAction; class MessagesToolBar : public BaseToolBar { Q_OBJECT @@ -15,8 +16,10 @@ class MessagesToolBar : public BaseToolBar { virtual ~MessagesToolBar(); // Operations with changeable actions. + QList availableActions() const; QList changeableActions() const; void saveChangeableActions() const; + void saveChangeableActions(const QStringList &actions); void loadChangeableActions(); signals: @@ -24,7 +27,7 @@ class MessagesToolBar : public BaseToolBar { public slots: private: - QWidget *m_spacer; + QWidgetAction *m_actionFilter; BaseLineEdit *m_txtFilter; }; diff --git a/src/gui/toolbareditor.cpp b/src/gui/toolbareditor.cpp index efd185b84..8f4b2649b 100644 --- a/src/gui/toolbareditor.cpp +++ b/src/gui/toolbareditor.cpp @@ -19,13 +19,24 @@ void ToolBarEditor::loadFromToolBar(BaseToolBar* tool_bar) { m_toolBar = tool_bar; QList activated_actions = m_toolBar->changeableActions(); - QList available_actions = FormMain::instance()->allActions().values(); + QList available_actions = m_toolBar->availableActions(); foreach (QAction *action, activated_actions) { QListWidgetItem *action_item = new QListWidgetItem(action->icon(), action->text().replace('&', ""), m_ui->m_listActivatedActions); - action_item->setData(Qt::UserRole, QVariant::fromValue((intptr_t) action)); + + if (action->isSeparator()) { + action_item->setData(Qt::UserRole, SEPARATOR_ACTION_NAME); + action_item->setText(tr("separator")); + } + else if (action->property("type").isValid()) { + action_item->setData(Qt::UserRole, action->property("type").toString()); + action_item->setText(action->property("name").toString()); + } + else { + action_item->setData(Qt::UserRole, action->objectName()); + } } foreach (QAction *action, available_actions) { @@ -33,7 +44,18 @@ void ToolBarEditor::loadFromToolBar(BaseToolBar* tool_bar) { QListWidgetItem *action_item = new QListWidgetItem(action->icon(), action->text().replace('&', ""), m_ui->m_listAvailableActions); - action_item->setData(Qt::UserRole, QVariant::fromValue((intptr_t) action)); + + if (action->isSeparator()) { + action_item->setData(Qt::UserRole, SEPARATOR_ACTION_NAME); + action_item->setText(tr("separator")); + } + else if (action->property("type").isValid()) { + action_item->setData(Qt::UserRole, action->property("type").toString()); + action_item->setText(action->property("name").toString()); + } + else { + action_item->setData(Qt::UserRole, action->objectName()); + } } } } @@ -41,4 +63,11 @@ void ToolBarEditor::loadFromToolBar(BaseToolBar* tool_bar) { void ToolBarEditor::saveToolBar() { // TODO: ulozit actiony nastaveny v tomdl // e nastavovacim dialogu do prirazenyho toolbaru + QStringList action_names; + + for (int i = 0; i < m_ui->m_listActivatedActions->count(); i++) { + action_names.append(m_ui->m_listActivatedActions->item(i)->data(Qt::UserRole).toString()); + } + + m_toolBar->saveChangeableActions(action_names); } diff --git a/src/gui/toolbareditor.ui b/src/gui/toolbareditor.ui index 87fa4a745..79a8a3990 100644 --- a/src/gui/toolbareditor.ui +++ b/src/gui/toolbareditor.ui @@ -91,27 +91,20 @@ - - - - PushButton - - - - - - PushButton - - - - - + Insert separator + + + + Insert spacer + + +