qTox  Version: nightly | Commit: bc751c8e1cac455f9690654fcfe0f560d2d7dfdd
searchform.cpp
Go to the documentation of this file.
1 /*
2  Copyright © 2015-2019 by The qTox Project Contributors
3 
4  This file is part of qTox, a Qt-based graphical interface for Tox.
5 
6  qTox is libre software: you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  qTox is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with qTox. If not, see <http://www.gnu.org/licenses/>.
18 */
19 
20 #include "searchform.h"
22 #include "src/widget/gui.h"
23 #include "src/widget/style.h"
24 
25 #include <QVBoxLayout>
26 #include <QHBoxLayout>
27 #include <QPushButton>
28 #include <QLabel>
29 #include <QKeyEvent>
30 
31 #include <array>
32 
33 static std::array<QString, 3> STATE_NAME = {
34  QString{},
35  QStringLiteral("green"),
36  QStringLiteral("red"),
37 };
38 
39 SearchForm::SearchForm(QWidget* parent) : QWidget(parent)
40 {
41  QVBoxLayout* layout = new QVBoxLayout();
42  QHBoxLayout* layoutNavigation = new QHBoxLayout();
43  QHBoxLayout* layoutMessage = new QHBoxLayout();
44  QSpacerItem *lSpacer = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Ignored);
45  QSpacerItem *rSpacer = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Ignored);
46  searchLine = new LineEdit();
48  messageLabel = new QLabel();
49 
50  settings->setVisible(false);
51  messageLabel->setProperty("state", QStringLiteral("red"));
52  messageLabel->setStyleSheet(Style::getStylesheet(QStringLiteral("chatForm/labels.css")));
53  messageLabel->setText(tr("The text could not be found."));
54  messageLabel->setVisible(false);
55 
56  settingsButton = createButton("searchSettingsButton", "green");
57  upButton = createButton("searchUpButton", "green");
58  downButton = createButton("searchDownButton", "green");
59  hideButton = createButton("searchHideButton", "red");
60  startButton = createButton("startButton", "green");
61  startButton->setText(tr("Start"));
62 
63  layoutNavigation->setMargin(0);
64  layoutNavigation->addWidget(settingsButton);
65  layoutNavigation->addWidget(searchLine);
66  layoutNavigation->addWidget(startButton);
67  layoutNavigation->addWidget(upButton);
68  layoutNavigation->addWidget(downButton);
69  layoutNavigation->addWidget(hideButton);
70 
71  layout->addLayout(layoutNavigation);
72  layout->addWidget(settings);
73 
74  layoutMessage->addSpacerItem(lSpacer);
75  layoutMessage->addWidget(messageLabel);
76  layoutMessage->addSpacerItem(rSpacer);
77  layout->addLayout(layoutMessage);
78 
79  startButton->setHidden(true);
80 
81  setLayout(layout);
82 
83  connect(searchLine, &LineEdit::textChanged, this, &SearchForm::changedSearchPhrase);
87 
88  connect(upButton, &QPushButton::clicked, this, &SearchForm::clickedUp);
89  connect(downButton, &QPushButton::clicked, this, &SearchForm::clickedDown);
90  connect(hideButton, &QPushButton::clicked, this, &SearchForm::clickedHide);
91  connect(startButton, &QPushButton::clicked, this, &SearchForm::clickedStart);
92  connect(settingsButton, &QPushButton::clicked, this, &SearchForm::clickedSearch);
93 
95 
97 }
98 
100 {
101  searchLine->setText("");
102 }
103 
105 {
106  return searchPhrase;
107 }
108 
110 {
111  return parameter;
112 }
113 
115 {
116  searchLine->setFocus();
117 }
118 
119 void SearchForm::insertEditor(const QString &text)
120 {
121  searchLine->insert(text);
122 }
123 
125 {
126  settingsButton->setStyleSheet(Style::getStylesheet(QStringLiteral("chatForm/buttons.css")));
127  upButton->setStyleSheet(Style::getStylesheet(QStringLiteral("chatForm/buttons.css")));
128  downButton->setStyleSheet(Style::getStylesheet(QStringLiteral("chatForm/buttons.css")));
129  hideButton->setStyleSheet(Style::getStylesheet(QStringLiteral("chatForm/buttons.css")));
130  startButton->setStyleSheet(Style::getStylesheet(QStringLiteral("chatForm/buttons.css")));
131 
133 }
134 
135 void SearchForm::showEvent(QShowEvent* event)
136 {
137  QWidget::showEvent(event);
138  emit visibleChanged();
139 }
140 
141 QPushButton *SearchForm::createButton(const QString& name, const QString& state)
142 {
143  QPushButton* btn = new QPushButton();
144  btn->setAttribute(Qt::WA_LayoutUsesWidgetRect);
145  btn->setObjectName(name);
146  btn->setProperty("state", state);
147  btn->setStyleSheet(Style::getStylesheet(QStringLiteral("chatForm/buttons.css")));
148 
149  return btn;
150 }
151 
153 {
154  if (isActiveSettings) {
155  auto sendParam = settings->getParameterSearch();
156  if (!isChangedPhrase && !sendParam.isUpdate) {
157  sendParam.period = PeriodSearch::None;
158  }
159 
160  isChangedPhrase = false;
161  parameter = sendParam;
162 
163  return sendParam;
164  }
165 
166  return ParameterSearch();
167 }
168 
169 void SearchForm::setStateName(QPushButton *btn, ToolButtonState state)
170 {
171  const auto index = static_cast<unsigned long>(state);
172  btn->setProperty("state", STATE_NAME[index]);
173  btn->setStyleSheet(Style::getStylesheet(QStringLiteral("chatForm/buttons.css")));
174  btn->setEnabled(index != 0);
175 }
176 
178 {
181  messageLabel->setVisible(false);
182  isPrevSearch = false;
183 }
184 
185 void SearchForm::changedSearchPhrase(const QString& text)
186 {
187  useBeginState();
188 
189  if (searchPhrase == text) {
190  return;
191  }
192 
193  QString l = text.right(1);
194  if (!l.isEmpty() && l != " " && l[0].isSpace()) {
195  searchLine->setText(searchPhrase);
196  return;
197  }
198 
199  searchPhrase = text;
200  isChangedPhrase = true;
201  if (isActiveSettings) {
202  if (startButton->isHidden()) {
203  changedState(true);
204  }
205  } else {
206  isSearchInBegin = true;
208  }
209 }
210 
212 {
213  if (downButton->isEnabled()) {
214  isPrevSearch = false;
215  } else {
216  isPrevSearch = true;
218  messageLabel->setVisible(false);
219  }
220 
221  if (startButton->isHidden()) {
222  isSearchInBegin = false;
224  } else {
225  clickedStart();
226  }
227 }
228 
230 {
231  if (upButton->isEnabled()) {
232  isPrevSearch = false;
233  } else {
234  isPrevSearch = true;
236  messageLabel->setVisible(false);
237  }
238 
239  if (startButton->isHidden()) {
240  isSearchInBegin = false;
242  } else {
243  clickedStart();
244  }
245 }
246 
248 {
249  hide();
250  emit visibleChanged();
251 }
252 
254 {
255  changedState(false);
256  isSearchInBegin = true;
258 }
259 
261 {
263  settings->setVisible(isActiveSettings);
264  useBeginState();
265 
266  if (isActiveSettings) {
268  } else {
270  changedState(false);
271  }
272 }
273 
274 void SearchForm::changedState(bool isUpdate)
275 {
276  if (isUpdate) {
277  startButton->setHidden(false);
278  upButton->setHidden(true);
279  downButton->setHidden(true);
280  } else {
281  startButton->setHidden(true);
282  upButton->setHidden(false);
283  downButton->setHidden(false);
284  }
285 
286  useBeginState();
287 }
288 
290 {
291  if (isSearchInBegin) {
294  } else if (parameter.period == PeriodSearch::BeforeDate) {
296  } else {
299  }
300  } else if (isPrevSearch) {
303  } else if (direction == SearchDirection::Up) {
305  } else {
307  }
308  messageLabel->setVisible(true);
309 }
310 
311 LineEdit::LineEdit(QWidget* parent) : QLineEdit(parent)
312 {
313 }
314 
315 void LineEdit::keyPressEvent(QKeyEvent* event)
316 {
317  int key = event->key();
318 
319  if ((key == Qt::Key_Enter || key == Qt::Key_Return)) {
320  if ((event->modifiers() & Qt::ShiftModifier)) {
321  emit clickShiftEnter();
322  } else {
323  emit clickEnter();
324  }
325  } else if (key == Qt::Key_Escape) {
326  emit clickEsc();
327  }
328 
329  QLineEdit::keyPressEvent(event);
330 }
331 
332 
SearchForm::getAndCheckParametrSearch
ParameterSearch getAndCheckParametrSearch()
Definition: searchform.cpp:152
SearchForm::changedSearchPhrase
void changedSearchPhrase(const QString &text)
Definition: searchform.cpp:185
SearchForm::clickedHide
void clickedHide()
Definition: searchform.cpp:247
SearchForm::setStateName
void setStateName(QPushButton *btn, ToolButtonState state)
Definition: searchform.cpp:169
style.h
SearchForm::hideButton
QPushButton * hideButton
Definition: searchform.h:61
SearchForm::removeSearchPhrase
void removeSearchPhrase()
Definition: searchform.cpp:99
SearchForm::clickedUp
void clickedUp()
Definition: searchform.cpp:211
SearchForm::insertEditor
void insertEditor(const QString &text)
Definition: searchform.cpp:119
SearchDirection
SearchDirection
Definition: searchtypes.h:42
SearchForm::startButton
QPushButton * startButton
Definition: searchform.h:62
SearchForm::createButton
QPushButton * createButton(const QString &name, const QString &state)
Definition: searchform.cpp:141
SearchForm::messageLabel
QLabel * messageLabel
Definition: searchform.h:65
SearchForm::clickedSearch
void clickedSearch()
Definition: searchform.cpp:260
PeriodSearch::AfterDate
@ AfterDate
PeriodSearch::BeforeDate
@ BeforeDate
SearchDirection::Up
@ Up
SearchForm::useBeginState
void useBeginState()
Definition: searchform.cpp:177
ParameterSearch
Definition: searchtypes.h:47
SearchForm::reloadTheme
void reloadTheme()
Definition: searchform.cpp:124
SearchForm::isActiveSettings
bool isActiveSettings
Definition: searchform.h:70
SearchForm::searchInBegin
void searchInBegin(const QString &phrase, const ParameterSearch &parameter)
SearchForm::SearchForm
SearchForm(QWidget *parent=nullptr)
Definition: searchform.cpp:39
LineEdit::LineEdit
LineEdit(QWidget *parent=nullptr)
Definition: searchform.cpp:311
SearchForm::isChangedPhrase
bool isChangedPhrase
Definition: searchform.h:71
SearchForm::isSearchInBegin
bool isSearchInBegin
Definition: searchform.h:72
SearchForm::downButton
QPushButton * downButton
Definition: searchform.h:60
SearchForm::getSearchPhrase
QString getSearchPhrase() const
Definition: searchform.cpp:104
SearchForm::parameter
ParameterSearch parameter
Definition: searchform.h:68
SearchForm::searchDown
void searchDown(const QString &phrase, const ParameterSearch &parameter)
SearchSettingsForm::reloadTheme
void reloadTheme()
Definition: searchsettingsform.cpp:100
searchsettingsform.h
SearchForm::clickedDown
void clickedDown()
Definition: searchform.cpp:229
SearchForm::showMessageNotFound
void showMessageNotFound(SearchDirection direction)
Definition: searchform.cpp:289
SearchForm::changedState
void changedState(bool isUpdate)
Definition: searchform.cpp:274
GUI::getInstance
static GUI & getInstance()
Returns the singleton instance.
Definition: gui.cpp:56
LineEdit::keyPressEvent
void keyPressEvent(QKeyEvent *event) final
Definition: searchform.cpp:315
SearchForm::upButton
QPushButton * upButton
Definition: searchform.h:59
SearchForm::isPrevSearch
bool isPrevSearch
Definition: searchform.h:73
PeriodSearch::None
@ None
SearchSettingsForm::getParameterSearch
ParameterSearch getParameterSearch()
Definition: searchsettingsform.cpp:57
ParameterSearch::period
PeriodSearch period
Definition: searchtypes.h:49
SearchForm::ToolButtonState::Active
@ Active
SearchForm::searchLine
LineEdit * searchLine
Definition: searchform.h:63
SearchForm::ToolButtonState::Disabled
@ Disabled
SearchForm::getParameterSearch
ParameterSearch getParameterSearch()
Definition: searchform.cpp:109
SearchForm::searchUp
void searchUp(const QString &phrase, const ParameterSearch &parameter)
LineEdit::clickEnter
void clickEnter()
GUI::themeReload
void themeReload()
SearchForm::visibleChanged
void visibleChanged()
Style::getStylesheet
static const QString getStylesheet(const QString &filename, const QFont &baseFont=QFont())
Definition: style.cpp:165
SearchForm::setFocusEditor
void setFocusEditor()
Definition: searchform.cpp:114
SearchForm::ToolButtonState::Common
@ Common
SearchSettingsForm
Definition: searchsettingsform.h:29
SearchForm::settingsButton
QPushButton * settingsButton
Definition: searchform.h:58
SearchForm::showEvent
void showEvent(QShowEvent *event) final
Definition: searchform.cpp:135
gui.h
SearchForm::searchPhrase
QString searchPhrase
Definition: searchform.h:67
SearchForm::ToolButtonState
ToolButtonState
Definition: searchform.h:35
SearchForm::clickedStart
void clickedStart()
Definition: searchform.cpp:253
SearchForm::settings
SearchSettingsForm * settings
Definition: searchform.h:64
LineEdit::clickEsc
void clickEsc()
LineEdit::clickShiftEnter
void clickShiftEnter()
SearchSettingsForm::updateSettings
void updateSettings(const bool isUpdate)
LineEdit
Definition: searchform.h:95
searchform.h