1 // For license of this file, see <project-root-folder>/LICENSE.md.
2
3 #include "gui/toolbars/feedstoolbar.h"
4
5 #include "gui/reusable/baselineedit.h"
6 #include "miscellaneous/application.h"
7 #include "miscellaneous/iconfactory.h"
8 #include "miscellaneous/settings.h"
9
10 #include <QWidgetAction>
11
FeedsToolBar(const QString & title,QWidget * parent)12 FeedsToolBar::FeedsToolBar(const QString& title, QWidget* parent) : BaseToolBar(title, parent) {
13 // Update right margin of filter textbox.
14 QMargins margins = contentsMargins();
15
16 margins.setRight(margins.right() + FILTER_RIGHT_MARGIN);
17 setContentsMargins(margins);
18
19 initializeSearchBox();
20 }
21
availableActions() const22 QList<QAction*> FeedsToolBar::availableActions() const {
23 QList<QAction*> available_actions = qApp->userActions();
24
25 available_actions.append(m_actionSearchMessages);
26
27 return available_actions;
28 }
29
activatedActions() const30 QList<QAction*> FeedsToolBar::activatedActions() const {
31 return actions();
32 }
33
saveAndSetActions(const QStringList & actions)34 void FeedsToolBar::saveAndSetActions(const QStringList& actions) {
35 qApp->settings()->setValue(GROUP(GUI), GUI::FeedsToolbarActions, actions.join(QSL(",")));
36 loadSpecificActions(convertActions(actions));
37
38 // If user hidden search messages box, then remove the filter.
39 if (!activatedActions().contains(m_actionSearchMessages)) {
40 m_txtSearchMessages->clear();
41 }
42 }
43
convertActions(const QStringList & actions)44 QList<QAction*> FeedsToolBar::convertActions(const QStringList& actions) {
45 QList<QAction*> available_actions = availableActions();
46 QList<QAction*> spec_actions;
47
48 // Iterate action names and add respectable actions into the toolbar.
49 for (const QString& action_name : actions) {
50 QAction* matching_action = findMatchingAction(action_name, available_actions);
51
52 if (matching_action != nullptr) {
53 // Add existing standard action.
54 spec_actions.append(matching_action);
55 }
56 else if (action_name == QSL(SEPARATOR_ACTION_NAME)) {
57 // Add new separator.
58 auto* act = new QAction(this);
59
60 act->setSeparator(true);
61 spec_actions.append(act);
62 }
63 else if (action_name == QSL(SEARCH_BOX_ACTION_NAME)) {
64 // Add search box.
65 spec_actions.append(m_actionSearchMessages);
66 }
67 else if (action_name == QSL(SPACER_ACTION_NAME)) {
68 // Add new spacer.
69 auto* spacer = new QWidget(this);
70
71 spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
72 auto* action = new QWidgetAction(this);
73
74 action->setDefaultWidget(spacer);
75 action->setIcon(qApp->icons()->fromTheme(QSL("system-search")));
76 action->setProperty("type", SPACER_ACTION_NAME);
77 action->setProperty("name", tr("Toolbar spacer"));
78 spec_actions.append(action);
79 }
80 }
81
82 return spec_actions;
83 }
84
loadSpecificActions(const QList<QAction * > & actions,bool initial_load)85 void FeedsToolBar::loadSpecificActions(const QList<QAction*>& actions, bool initial_load) {
86 Q_UNUSED(initial_load)
87
88 clear();
89
90 for (QAction* act : actions) {
91 addAction(act);
92 }
93 }
94
defaultActions() const95 QStringList FeedsToolBar::defaultActions() const {
96 return QString(GUI::FeedsToolbarActionsDef).split(',',
97 #if QT_VERSION >= 0x050F00 // Qt >= 5.15.0
98 Qt::SplitBehaviorFlags::SkipEmptyParts);
99 #else
100 QString::SplitBehavior::SkipEmptyParts);
101 #endif
102 }
103
savedActions() const104 QStringList FeedsToolBar::savedActions() const {
105 return qApp->settings()->value(GROUP(GUI),
106 SETTING(GUI::FeedsToolbarActions)).toString().split(',',
107 #if QT_VERSION >= 0x050F00 // Qt >= 5.15.0
108 Qt::SplitBehaviorFlags::SkipEmptyParts);
109 #else
110 QString::SplitBehavior::SkipEmptyParts);
111 #endif
112 }
113
initializeSearchBox()114 void FeedsToolBar::initializeSearchBox() {
115 m_txtSearchMessages = new BaseLineEdit(this);
116 m_txtSearchMessages->setSizePolicy(QSizePolicy::Policy::Expanding, m_txtSearchMessages->sizePolicy().verticalPolicy());
117 m_txtSearchMessages->setPlaceholderText(tr("Search feeds"));
118
119 // Setup wrapping action for search box.
120 m_actionSearchMessages = new QWidgetAction(this);
121
122 m_actionSearchMessages->setDefaultWidget(m_txtSearchMessages);
123 m_actionSearchMessages->setIcon(qApp->icons()->fromTheme(QSL("system-search")));
124 m_actionSearchMessages->setProperty("type", SEARCH_BOX_ACTION_NAME);
125 m_actionSearchMessages->setProperty("name", tr("Feeds search box"));
126
127 connect(m_txtSearchMessages, &BaseLineEdit::textChanged, this, &FeedsToolBar::feedsFilterPatternChanged);
128 }
129