diff --git a/src/core/messagesmodel.h b/src/core/messagesmodel.h index e16e13ede..327fc34a5 100644 --- a/src/core/messagesmodel.h +++ b/src/core/messagesmodel.h @@ -48,6 +48,14 @@ class MessagesModel : public QSqlTableModel { Q_OBJECT public: + // Enum which describes basic filtering schemes + // for messages. + enum DisplayFilter { + DisplayAll = 100, + DisplayUnread = 101, + DisplayImportant = 102 + }; + // Constructors and destructors. explicit MessagesModel(QObject *parent = 0); virtual ~MessagesModel(); @@ -128,4 +136,6 @@ class MessagesModel : public QSqlTableModel { QIcon m_unreadIcon; }; +Q_DECLARE_METATYPE(MessagesModel::DisplayFilter) + #endif // MESSAGESMODEL_H diff --git a/src/definitions/definitions.h.in b/src/definitions/definitions.h.in index e5f88a4bd..71ccea281 100644 --- a/src/definitions/definitions.h.in +++ b/src/definitions/definitions.h.in @@ -64,7 +64,8 @@ #define STARTUP_UPDATE_DELAY 1500 #define TIMEZONE_OFFSET_LIMIT 6 #define CHANGE_EVENT_DELAY 250 -#define SEACRH_MESSAGES_ACTION_NAME "filter" +#define SEACRH_MESSAGES_ACTION_NAME "search" +#define FILTER_ACTION_NAME "filter" #define SPACER_ACTION_NAME "spacer" #define SEPARATOR_ACTION_NAME "separator" #define FILTER_WIDTH 150 diff --git a/src/gui/messagestoolbar.cpp b/src/gui/messagestoolbar.cpp index f6ce58b42..74cd8beb8 100644 --- a/src/gui/messagestoolbar.cpp +++ b/src/gui/messagestoolbar.cpp @@ -7,6 +7,8 @@ #include "miscellaneous/settings.h" #include +#include +#include MessagesToolBar::MessagesToolBar(const QString &title, QWidget *parent) @@ -23,6 +25,25 @@ MessagesToolBar::MessagesToolBar(const QString &title, QWidget *parent) m_actionSearchMessages->setProperty("type", SEACRH_MESSAGES_ACTION_NAME); m_actionSearchMessages->setProperty("name", tr("Message search box")); + m_menuFilterMessages = new QMenu(tr("Menu for filtering messages"), this); + m_menuFilterMessages->addAction(IconFactory::instance()->fromTheme("mail-mark-read"), + tr("Display all messages"))->setData(QVariant::fromValue(MessagesModel::DisplayAll)); + m_menuFilterMessages->addAction(IconFactory::instance()->fromTheme("mail-mark-unread"), + tr("Display unread messages"))->setData(QVariant::fromValue(MessagesModel::DisplayUnread)); + m_menuFilterMessages->addAction(IconFactory::instance()->fromTheme("mail-mark-favorite"), + tr("Display important messages"))->setData(QVariant::fromValue(MessagesModel::DisplayImportant)); + + m_btnFilterMessages = new QToolButton(this); + m_btnFilterMessages->setToolTip(tr("Display all messages")); + m_btnFilterMessages->setMenu(m_menuFilterMessages); + m_btnFilterMessages->setPopupMode(QToolButton::MenuButtonPopup); + m_btnFilterMessages->setIcon(IconFactory::instance()->fromTheme("mail-mark-read")); + + m_actionFilterMessages = new QWidgetAction(this); + m_actionFilterMessages->setDefaultWidget(m_btnFilterMessages); + m_actionFilterMessages->setProperty("type", FILTER_ACTION_NAME); + m_actionFilterMessages->setProperty("name", tr("Message filter")); + // Update right margin of filter textbox. QMargins margins = contentsMargins(); margins.setRight(margins.right() + FILTER_RIGHT_MARGIN); @@ -30,6 +51,8 @@ MessagesToolBar::MessagesToolBar(const QString &title, QWidget *parent) connect(m_txtSearchMessages, SIGNAL(textChanged(QString)), this, SIGNAL(messageSearchPatternChanged(QString))); + connect(m_menuFilterMessages, SIGNAL(triggered(QAction*)), + this, SLOT(handleMessageFilterChange(QAction*))); } MessagesToolBar::~MessagesToolBar() { @@ -38,6 +61,7 @@ MessagesToolBar::~MessagesToolBar() { QHash MessagesToolBar::availableActions() const { QHash available_actions = FormMain::instance()->allActions(); available_actions.insert(SEACRH_MESSAGES_ACTION_NAME, m_actionSearchMessages); + available_actions.insert(FILTER_ACTION_NAME, m_actionFilterMessages); return available_actions; } @@ -74,6 +98,10 @@ void MessagesToolBar::loadChangeableActions(const QStringList& actions) { // Add search box. addAction(m_actionSearchMessages); } + else if (action_name == FILTER_ACTION_NAME) { + // Add filter button. + addAction(m_actionFilterMessages); + } else if (action_name == SPACER_ACTION_NAME) { // Add new spacer. QWidget *spacer = new QWidget(this); @@ -87,10 +115,17 @@ void MessagesToolBar::loadChangeableActions(const QStringList& actions) { } } +void MessagesToolBar::handleMessageFilterChange(QAction *action) { + m_btnFilterMessages->setIcon(action->icon()); + m_btnFilterMessages->setToolTip(action->text()); + + emit messageFilterChanged(action->data().value()); +} + void MessagesToolBar::loadChangeableActions() { QStringList action_names = Settings::instance()->value(APP_CFG_GUI, "messages_toolbar", - "m_actionMarkSelectedMessagesAsRead,m_actionMarkSelectedMessagesAsUnread,m_actionSwitchImportanceOfSelectedMessages,spacer,filter").toString().split(',', + "m_actionMarkSelectedMessagesAsRead,m_actionMarkSelectedMessagesAsUnread,m_actionSwitchImportanceOfSelectedMessages,spacer,search").toString().split(',', QString::SkipEmptyParts); loadChangeableActions(action_names); diff --git a/src/gui/messagestoolbar.h b/src/gui/messagestoolbar.h index e206f7950..3dc8dfd8c 100644 --- a/src/gui/messagestoolbar.h +++ b/src/gui/messagestoolbar.h @@ -3,9 +3,13 @@ #include "gui/basetoolbar.h" +#include "core/messagesmodel.h" + class BaseLineEdit; class QWidgetAction; +class QToolButton; +class QMenu; class MessagesToolBar : public BaseToolBar { Q_OBJECT @@ -35,9 +39,17 @@ class MessagesToolBar : public BaseToolBar { // na tuto udalost se navaze filtrovani void messageSearchPatternChanged(const QString &pattern); - public slots: + // Emitted if message filter is changed. + void messageFilterChanged(MessagesModel::DisplayFilter filter); + + private slots: + void handleMessageFilterChange(QAction *action); private: + QWidgetAction *m_actionFilterMessages; + QToolButton *m_btnFilterMessages; + QMenu *m_menuFilterMessages; + QWidgetAction *m_actionSearchMessages; BaseLineEdit *m_txtSearchMessages; };