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