From 12685b2df6c447acd89c44305bd36322dcdb0391 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Sun, 6 Apr 2014 18:06:34 +0200 Subject: [PATCH] Good progress for changeable toolbars. --- .../icons/mini-kfaenza/application-search.png | Bin 0 -> 310 bytes .../icons/mini-kfaenza/view-separator.png | Bin 0 -> 1871 bytes .../icons/mini-kfaenza/view-spacer.png | Bin 0 -> 1819 bytes src/definitions/definitions.h.in | 2 +- src/gui/basetoolbar.cpp | 2 + src/gui/basetoolbar.h | 17 ++-- src/gui/messagestoolbar.cpp | 78 ++++++++---------- src/gui/messagestoolbar.h | 14 ++-- src/gui/toolbareditor.cpp | 42 +++++++++- src/gui/toolbareditor.h | 4 + 10 files changed, 98 insertions(+), 61 deletions(-) create mode 100644 resources/graphics/icons/mini-kfaenza/application-search.png create mode 100644 resources/graphics/icons/mini-kfaenza/view-separator.png create mode 100644 resources/graphics/icons/mini-kfaenza/view-spacer.png diff --git a/resources/graphics/icons/mini-kfaenza/application-search.png b/resources/graphics/icons/mini-kfaenza/application-search.png new file mode 100644 index 0000000000000000000000000000000000000000..e81df17f1ead679b1e8f039b6eb2cc340ea74414 GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5M?jcysy3fAQ1FGP zi(`nz>7|o4<}w@dxXy3rNlfQcuYSU{GCe=LZ*%q6oRaDz^OV2Il?ZAI=&P;@X;p0Z zcJpw(RW1;nc)f3pege15vm&i#FKa!IUf#o(UkT0McW5y~`h&$fIj_F-KAnH<+>f0_ zt+^-rm4xI!I!aIO;MvdM#1R?V-Y2Y{z%EmzaIV^(Y5JuS#$l6BIHGp00i_>zopr E04)l6k^lez literal 0 HcmV?d00001 diff --git a/resources/graphics/icons/mini-kfaenza/view-separator.png b/resources/graphics/icons/mini-kfaenza/view-separator.png new file mode 100644 index 0000000000000000000000000000000000000000..7c915ed7a1008b4b21d13d01c535430b5ed5098c GIT binary patch literal 1871 zcmV-V2e9~wP)#R3xd)Lmod41Bzo}I_e|Ih!Je`Xfg!sZ4kP)3dNLUq;ygps&Yp%Zac0D?x6^3+*R z5C9l}l#w)Rp`Ew@fEoaMD5XD8N`IS-usd$x&q2ek~efjd`ZG|cxjT_&ijKLb%_W1GR)i?labom+L~U!e*MR(Q>VVfawzToH=vg?Afyi-Bf0b<=tXSBoe5vuiyFL!Gm9~U%&qR;>C;qz_MxS1kSnFSCPV9o8@w|@$U!^b5_Qk=%*hY|D)KN!FmLnf0!JRYYlEiL<_(dh53t*!fEQ`It! zU=GT1gQhO}k&?+I2qD|9UcGvvySw|x+S=M3=6LOOJtD6JPyp0zhki+bHEEiLg@pyu z*x0!D$&)8-r%#_gXfmJ_8(`3uvnOcx0J9qAkFvdOrU}Y|Za_F=(z%~4qfMha>r%#_Q zbaZqKkB^T}LO<4C0=(E0rJV8;JtG`uogQBmm?_FPC-v>99&!0bk zI1~!)UD1gUn4g~)_wL<$*VWZEtg7mJ=;FSFJeQh)vQ;1lb|dIEHpl>QMLYn7b1v*+ zno6ZGG&Gb5hr=(1hll^gvXRRa>#$4)U1nU0q$T9zA+wH*%h*FCLH6>FMcgK9k9K3G0bdW(R;K0N(*P>~%mzP;>0q zu|tD{gNt)>bJNJ<+B~2Zz$ehp7fd7oOhdm2Sq#qs^a2U8Ptb}j6|g+i&&w&@uuQPfmiLwz#TrB#Bt_gb*T05-6pF5Mup>BuT^otZgWz*|sJj#$kux zoM-bw2nZnrV=SBJoD1{UI2g@oW2tNY@>D9t)9Lhf&Urt8R|c(VAlD))073v70UQGG z74*;O*3vD{QosPrLy!Oa0lWY(2|Y^935Qkan+gIthh75s80&wnzyZ96PTN}mGcbq; zoc(?f`mW1%RA#@R639T`j9Gwf*Qk)SuY!*or4@wv?Xcq(+<(E@06IYOvPu8|002ov JPDHLkV1f;>XXyX{ literal 0 HcmV?d00001 diff --git a/resources/graphics/icons/mini-kfaenza/view-spacer.png b/resources/graphics/icons/mini-kfaenza/view-spacer.png new file mode 100644 index 0000000000000000000000000000000000000000..3207a0d78fb70f5f75d0529dad31e1835040241e GIT binary patch literal 1819 zcmV+$2juvPP)o(`hKl%y=%ot<8S8BHb9uG&Pls_}Zyatv42TvtJUONG_03S#xe`}11XkAui z_AI275h>+wwALBi6|f8#>D61f0_YGzoM<%W0kqZ#Ax;1txV&26T6(;jD9~n%36&pW z@557vgRC0(6#)qE!JgOoDq!QPzJOH$_`hYj9u0;fK7$Mk_KyHW@Fs}8?(|fHA|Cg{ zj8{Zc0D<3)aPX-HMSM0_fOqw!vL6Iebj)w6zz!0!E6`j4WhxsT6&;~{D}d%MP-lcr zo;-OJH^x{i!roZha#XK(@I$t@x3?w|iQh>n?Xzdk{+U1ka*K%GzkmO%*4jCL{`~W~ zxw$Osgt)hYdhP=D<;$0UnoK4?@9F6|Ix{n)Y8-Ecu9=w`)zi~+G?`3(J}@xQLv0gR z_gz57VzIX2;o(2rxN+mxKqQ~fqm-(F#$qU?$mjC_k()Pfel|Qj{Kr@<*2dOUxUR?H zP=9}a_r%1+7hPRl$FkY1a2yA}_-$$|1jo!~v!bi3>)6D^#25Yj{oT~4#=bNT04IRB zl=4g!QDI?OR`k)MN1vTLcdm13X-OJmiW(FO1;@7STJ;|Q$8o~paJa|_3L!Xf;DCPq z{P}+_UcC51DV4*`0<8-vC0grIU>x`cSPTl_6Ce)!Y6E&geSLi&4-O8V357x}-qPGL zL?RKEmzS5WUAs2=?AfzvN>X2CFor9DuPGydUjV zZEbD(>C>lQU%h(uuRyLs^S=Rq#}mM2^v42PM@B|eM@NV1?Cg}5Wo_8$eLyM2t5>ho zix)2x?qoW+3DFHvx&lsnWxcj7KmoHzY z@7}%pWh#~W4tLfUsoq0eBLKnXJV6a)0VkD8<*r}9KG)mZ`;!Y7E_`(O@L@{`fl|r< zbGYf~TF|1DGLGY5jN$Fux9Z80C$EQwhQ0#+hs*e8w%a0JOO4=WJVC?i8y9M5Xec*1 zIr;9=rAwclI(4co;0f013$!SuSX^8rnM^J`eE4wc&6_u~tj_voUCtsNeKQ^gJ^+3U ze7MO04X#=gGMP+vWMt%>lrj>DM6A)#(Qj~tR12cKiJ*x1~?d-wjCPN%;GGPo;i zEBo+wzzpyXaC~XB0$sR1z|U(SHiWyQw8vtxgPBZb23HMgL3=C~JD$m87QC?*+1S~s zgn!`r0{;TCrADyUv%xa%(sVMJOqPu;a#dqyGMVpjXFN~sN8zI6=ytpep>c^VP@i-A zB3obX8zQ(16iKEIsMmSef6uR8DB`sl6x}H*b_<#-V5g|qEm$J}DH~TN<#=nVKuJa8 zPX8*_eM?LLi1i{54S)b|&Frv`H3HZNMzFaJ2GLZ3z(eDakT zpjl@dG`PWxWvzAIw(W*n1-5Mqt+gM+T=UJ)GH$3lt(3B((WtR)TPmf{TAQF+_*-dk zxA6DZ;4{BZ(5)!f$A<}IQGzKq|FPD3O?|mO!DNh2yO+Vzxm?c1jU+F4Jg*2K?+M`F zTI&yUx!lQcIJ^{%Mx_wKl2Rgs5K>Ak%M!tRA%w6j3n`@#LIkf^mL)t8>?5UI>FYD1 zwMJ`gwAL&4UUtbSrB?2>*2cdorGjmZ)|x + BaseToolBar::BaseToolBar(const QString &title, QWidget *parent) : QToolBar(title, parent) { diff --git a/src/gui/basetoolbar.h b/src/gui/basetoolbar.h index 705e101ee..b49f7f6f2 100644 --- a/src/gui/basetoolbar.h +++ b/src/gui/basetoolbar.h @@ -12,16 +12,19 @@ class BaseToolBar : public QToolBar { explicit BaseToolBar(const QString &title, QWidget *parent = 0); virtual ~BaseToolBar(); - virtual QList availableActions() const = 0; + // Returns all actions which can be added to the toolbar. + virtual QHash availableActions() const = 0; + + // Returns all changeable actions which are currently included + // in the toolbar. virtual QList changeableActions() const = 0; - virtual void saveChangeableActions() const = 0; + + // Sets new "actions" to the toolbar and perhaps saves the toolbar + // state into the settings. virtual void saveChangeableActions(const QStringList &actions) = 0; + + // Loads the toolbar state from settings. virtual void loadChangeableActions() = 0; - - signals: - - public slots: - }; #endif // TOOLBAR_H diff --git a/src/gui/messagestoolbar.cpp b/src/gui/messagestoolbar.cpp index 4501cb490..1398a7de8 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/iconfactory.h" #include "miscellaneous/settings.h" #include @@ -10,13 +11,17 @@ MessagesToolBar::MessagesToolBar(const QString &title, QWidget *parent) : BaseToolBar(title, parent), - m_txtFilter(new BaseLineEdit(this)) { - 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")); + m_txtSearchMessages(new BaseLineEdit(this)) { + + m_txtSearchMessages->setFixedWidth(FILTER_WIDTH); + m_txtSearchMessages->setPlaceholderText(tr("Filter messages")); + + // Setup wrapping action for search box. + m_actionSearchMessages = new QWidgetAction(this); + m_actionSearchMessages->setDefaultWidget(m_txtSearchMessages); + m_actionSearchMessages->setIcon(IconFactory::instance()->fromTheme("view-spacer")); + m_actionSearchMessages->setProperty("type", SEACRH_MESSAGES_ACTION_NAME); + m_actionSearchMessages->setProperty("name", tr("Message search box")); // Update right margin of filter textbox. QMargins margins = contentsMargins(); @@ -27,9 +32,9 @@ 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); +QHash MessagesToolBar::availableActions() const { + QHash available_actions = FormMain::instance()->allActions(); + available_actions.insert(SEACRH_MESSAGES_ACTION_NAME, m_actionSearchMessages); return available_actions; } @@ -37,45 +42,18 @@ QList MessagesToolBar::changeableActions() const { return 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()) { - 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(); + loadChangeableActions(actions); } -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,spacer,filter").toString().split(',', - QString::SkipEmptyParts); +void MessagesToolBar::loadChangeableActions(const QStringList& actions) { + QHash available_actions = availableActions(); clear(); // Iterate action names and add respectable actions into the toolbar. - foreach (const QString &action_name, action_names) { + foreach (const QString &action_name, actions) { if (available_actions.contains(action_name)) { // Add existing standard action. addAction(available_actions.value(action_name)); @@ -84,9 +62,9 @@ void MessagesToolBar::loadChangeableActions() { // Add new separator. addSeparator(); } - else if (action_name == FILTER_OBJECT_NAME) { - // Add filter. - addAction(m_actionFilter); + else if (action_name == SEACRH_MESSAGES_ACTION_NAME) { + // Add search box. + addAction(m_actionSearchMessages); } else if (action_name == SPACER_ACTION_NAME) { // Add new spacer. @@ -94,8 +72,18 @@ void MessagesToolBar::loadChangeableActions() { spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); QAction *action = addWidget(spacer); + action->setIcon(IconFactory::instance()->fromTheme("application-search")); action->setProperty("type", SPACER_ACTION_NAME); - action->setProperty("name", tr("spacer")); + action->setProperty("name", tr("Toolbar spacer")); } } } + +void MessagesToolBar::loadChangeableActions() { + QStringList action_names = Settings::instance()->value(APP_CFG_GUI, + "messages_toolbar", + "m_actionMarkSelectedMessagesAsRead,m_actionMarkSelectedMessagesAsUnread,m_actionSwitchImportanceOfSelectedMessages,spacer,filter").toString().split(',', + QString::SkipEmptyParts); + + loadChangeableActions(action_names); +} diff --git a/src/gui/messagestoolbar.h b/src/gui/messagestoolbar.h index 27e2b997d..406f84100 100644 --- a/src/gui/messagestoolbar.h +++ b/src/gui/messagestoolbar.h @@ -15,20 +15,24 @@ class MessagesToolBar : public BaseToolBar { explicit MessagesToolBar(const QString &title, QWidget *parent = 0); virtual ~MessagesToolBar(); - // Operations with changeable actions. - QList availableActions() const; + // Implementation of BaseToolBar interface. + QHash availableActions() const; QList changeableActions() const; - void saveChangeableActions() const; void saveChangeableActions(const QStringList &actions); void loadChangeableActions(); + // Loads actions as specified by external actions list. + // NOTE: This is used primarily for reloading actions + // when they are changed from settings. + void loadChangeableActions(const QStringList &actions); + signals: public slots: private: - QWidgetAction *m_actionFilter; - BaseLineEdit *m_txtFilter; + QWidgetAction *m_actionSearchMessages; + BaseLineEdit *m_txtSearchMessages; }; #endif // NEWSTOOLBAR_H diff --git a/src/gui/toolbareditor.cpp b/src/gui/toolbareditor.cpp index 8f4b2649b..3bb0ddf3a 100644 --- a/src/gui/toolbareditor.cpp +++ b/src/gui/toolbareditor.cpp @@ -9,6 +9,10 @@ ToolBarEditor::ToolBarEditor(QWidget *parent) : QWidget(parent), m_ui(new Ui::ToolBarEditor) { m_ui->setupUi(this); + + // Create connections. + connect(m_ui->m_btnInsertSeparator, SIGNAL(clicked()), this, SLOT(insertSeparator())); + connect(m_ui->m_btnInsertSpacer, SIGNAL(clicked()), this, SLOT(insertSpacer())); } ToolBarEditor::~ToolBarEditor() { @@ -19,7 +23,7 @@ void ToolBarEditor::loadFromToolBar(BaseToolBar* tool_bar) { m_toolBar = tool_bar; QList activated_actions = m_toolBar->changeableActions(); - QList available_actions = m_toolBar->availableActions(); + QList available_actions = m_toolBar->availableActions().values(); foreach (QAction *action, activated_actions) { QListWidgetItem *action_item = new QListWidgetItem(action->icon(), @@ -28,7 +32,8 @@ void ToolBarEditor::loadFromToolBar(BaseToolBar* tool_bar) { if (action->isSeparator()) { action_item->setData(Qt::UserRole, SEPARATOR_ACTION_NAME); - action_item->setText(tr("separator")); + action_item->setIcon(IconFactory::instance()->fromTheme("view-separator")); + action_item->setText(tr("Separator")); } else if (action->property("type").isValid()) { action_item->setData(Qt::UserRole, action->property("type").toString()); @@ -47,7 +52,8 @@ void ToolBarEditor::loadFromToolBar(BaseToolBar* tool_bar) { if (action->isSeparator()) { action_item->setData(Qt::UserRole, SEPARATOR_ACTION_NAME); - action_item->setText(tr("separator")); + action_item->setText(tr("Separator")); + action_item->setIcon(IconFactory::instance()->fromTheme("view-separator")); } else if (action->property("type").isValid()) { action_item->setData(Qt::UserRole, action->property("type").toString()); @@ -71,3 +77,33 @@ void ToolBarEditor::saveToolBar() { m_toolBar->saveChangeableActions(action_names); } + +void ToolBarEditor::insertSpacer() { + int current_row = m_ui->m_listActivatedActions->currentRow(); + + QListWidgetItem *item = new QListWidgetItem(tr("Toolbar spacer")); + item->setIcon(IconFactory::instance()->fromTheme("application-search")); + item->setData(Qt::UserRole, SPACER_ACTION_NAME); + + if (current_row >= 0) { + m_ui->m_listActivatedActions->insertItem(current_row + 1, item); + } + else { + m_ui->m_listActivatedActions->addItem(item); + } +} + +void ToolBarEditor::insertSeparator() { + int current_row = m_ui->m_listActivatedActions->currentRow(); + + QListWidgetItem *item = new QListWidgetItem(tr("Separator")); + item->setData(Qt::UserRole, SEPARATOR_ACTION_NAME); + item->setIcon(IconFactory::instance()->fromTheme("view-separator")); + + if (current_row >= 0) { + m_ui->m_listActivatedActions->insertItem(current_row + 1, item); + } + else { + m_ui->m_listActivatedActions->addItem(item); + } +} diff --git a/src/gui/toolbareditor.h b/src/gui/toolbareditor.h index 52b6af796..9d63d5c8e 100644 --- a/src/gui/toolbareditor.h +++ b/src/gui/toolbareditor.h @@ -25,6 +25,10 @@ class ToolBarEditor : public QWidget { void loadFromToolBar(BaseToolBar *tool_bar); void saveToolBar(); + private slots: + void insertSpacer(); + void insertSeparator(); + private: Ui::ToolBarEditor *m_ui; BaseToolBar *m_toolBar;