HAL
searchbar.cpp
Go to the documentation of this file.
2 
6 
7 #include <QHBoxLayout>
8 #include <QIcon>
9 #include <QLabel>
10 #include <QLineEdit>
11 #include <QPixmap>
12 #include <QPushButton>
13 #include <QStyle>
14 #include <QToolButton>
15 #include <QDebug>
17 
18 namespace hal
19 {
21  : QFrame(parent), mLayout(new QHBoxLayout()), mSearchIconLabel(new QLabel()), mLineEdit(new QLineEdit()), mClearIconLabel(new QLabel()), mDownButton(new QToolButton()),
22  mUpButton(new QToolButton()), mSearchOptionsButton(new QToolButton()), mClearButton(new QToolButton())
23  {
24  setLayout(mLayout);
25 
26  mLayout->setContentsMargins(0, 0, 0, 0);
27  mLayout->setSpacing(0);
28 
30 
31  mCurrentOptions = new SearchOptions(8);//exact match and search in all columns is on
32  mIncrementalSearch = true;
33  mSearchIconLabel->setPixmap(gui_utility::getStyledSvgIcon(mSearchIconStyle, mSearchIcon).pixmap(QSize(16, 16)));
34  mSearchIconLabel->installEventFilter(this);
35  mLineEdit->setPlaceholderText("Search");
36 
37  mClearIconLabel->setPixmap(gui_utility::getStyledSvgIcon(mClearIconStyle, mClearIcon).pixmap(QSize(10, 10)));
38 
39  //Placeholder icons get better ones
40  mDownButton->setIcon(QIcon(":/icons/arrow-down"));
41  mUpButton->setIcon(QIcon(":/icons/arrow-up"));
42  mSearchOptionsButton->setIcon(gui_utility::getStyledSvgIcon(mOptionDialogIconStyle,mOptionDialogIcon));
43 
46 
47  mLayout->addWidget(mSearchIconLabel);
48  mLayout->addWidget(mLineEdit);
49 
50  mClearButton->setIcon(gui_utility::getStyledSvgIcon(mClearIconStyle, mClearIcon));
51  mClearButton->setIconSize(QSize(10, 10));
52  mClearButton->setFixedWidth(32);
54  mClearButton->setToolTip("Clear");
55  mLayout->addWidget(mClearButton);
56 
58  mSearchOptionsButton->setCheckable(true);
59  mSearchOptionsButton->setToolTip("Search Options");
60  mLayout->addWidget(mSearchOptionsButton);
61 
63 
67 
70 
71  setFocusProxy(mLineEdit);
72  }
73 
75  {
76  if (!mCurrentOptions) return SearchOptions();
77  return *mCurrentOptions;
78  }
79 
81  {
82  return mSearchIcon;
83  }
84 
86  {
87  return mSearchIconStyle;
88  }
89 
91  {
92  return mClearIcon;
93  }
94 
96  {
97  return mClearIconStyle;
98  }
99 
101  {
102  return mOptionDialogIcon;
103  }
104 
106  {
107  return mOptionDialogIconStyle;
108  }
109 
111  {
112  mSearchIcon = icon;
113  }
114 
116  {
117  mSearchIconStyle = style;
118  }
119 
121  {
122  mClearIcon = icon;
123  }
124 
126  {
127  mClearIconStyle = style;
128  }
129 
131  {
132  mColumnNames = list;
133  }
134 
136  {
137  mOptionDialogIcon = icon;
138  }
139 
141  {
142  mOptionDialogIconStyle = style;
143  }
144 
146  {
147  mLineEdit->setPlaceholderText(text);
148  }
149 
151  {
152  mLineEdit->clear();
153  handleTextEdited(); // TODO : check use cases . Must reset proxy filter when search string emptied.
154  }
155 
157  {
159  }
160 
162  {
163  // ???
164  }
165 
167  {
168  return mLineEdit->text();
169  }
170 
172  {
173  return addFlags(mLineEdit->text());
174  }
175 
177  {
178  QString textWithFlags;
179 
180  textWithFlags.append(mCurrentOptions->isCaseSensitive() ? "(?-i)" : "(?i)");
181  if (mCurrentOptions->isExactMatch())
182  {
183  textWithFlags.append("^");
184  textWithFlags.append(text);
185  textWithFlags.append("$");
186  }
187  else
188  textWithFlags.append(text);
189 
190  return textWithFlags;
191  }
192 
194  {
195  QStyle* s = style();
196 
197  s->unpolish(this);
198  s->polish(this);
199 
200  s->unpolish(mSearchIconLabel);
201  s->polish(mSearchIconLabel);
202 
203  s->unpolish(mLineEdit);
204  s->polish(mLineEdit);
205  }
206 
208  {
209  repolish();
210  //if the line is empty then start a search with default searchOptions - no filtering
211  if(mLineEdit->text().isEmpty()){
212  Q_EMIT triggerNewSearch(mLineEdit->text(), SearchOptions().toInt());
213  }
214  else if(mIncrementalSearch && mLineEdit->text().length() >= mMinCharsToStartIncSearch)
215  {
216  Q_EMIT triggerNewSearch(mLineEdit->text(), mCurrentOptions->toInt());
217  }
218  }
219 
221  {
222  //if the line is empty then start a search with default searchOptions - no filtering
223  if(mLineEdit->text().isEmpty()){
224  Q_EMIT triggerNewSearch(mLineEdit->text(), SearchOptions().toInt());
225  }
226  else{
227  Q_EMIT triggerNewSearch(mLineEdit->text(), mCurrentOptions->toInt());
228  }
229  }
230 
232  {
233  clear();
234  }
235 
236  void Searchbar::setEmitTextWithFlags(bool emitTextWithFlags)
237  {
238  mEmitTextWithFlags = emitTextWithFlags;
239  }
240 
242  {
243  return mEmitTextWithFlags;
244  }
245 
246  bool Searchbar::eventFilter(QObject *object, QEvent *event)
247  {
248  if(object == mSearchIconLabel && event->type() == QEvent::MouseButtonPress)
249  {
250  QMouseEvent* ev = static_cast<QMouseEvent*>(event);
251  if(ev->button() == Qt::MouseButton::LeftButton)
253 
254  return true;
255  }
256  return QWidget::eventFilter(object, event);
257  }
258 
260  {
261  return !getCurrentText().isEmpty() || mCurrentOptions->isExactMatch() || mCurrentOptions->isCaseSensitive();
262  }
263 
265  {
266  //TODO discuss if previous options should be passed back to the dialog to build dialog from them.
267  // otherwise the use has to enter the same options again
269  sd.setSearchHistory(mSearchHistory);
270  sd.setOptions(mCurrentOptions, mLineEdit->text(),mColumnNames, mIncrementalSearch, mMinCharsToStartIncSearch);
271  if (sd.exec() == QDialog::Accepted)
272  {
273  mCurrentOptions = sd.getOptions();
274 
275  QString txt = sd.getText();
276  mIncrementalSearch = sd.getIncrementalSearch();
277  mMinCharsToStartIncSearch = sd.getMinIncSearchValue();
278  mLineEdit->setText(txt);
279 
280  // updateSearchHistory(txt);
281 
282 
283  qInfo() << "Searchbar starts search with: " << txt << " " << mCurrentOptions->toInt() << " inc search: " << mIncrementalSearch << " " << mMinCharsToStartIncSearch;
284  Q_EMIT triggerNewSearch(txt, mCurrentOptions->toInt());
285  updateSearchHistory(txt);
286  }
287  if(mCurrentOptions->toInt() != SearchOptions().toInt())
288  mSearchOptionsButton->setChecked(true);
289  else
290  mSearchOptionsButton->setChecked(false);
291  }
292 
294 
295  const int MAX_ENTRIES = 10;
296  const int MIN_LENGTH = 3;
297 
298  if(entry.length() >= MIN_LENGTH && !mSearchHistory.contains(entry))
299  {
300  if(!mSearchHistory.empty() && (entry.startsWith(mSearchHistory[0])))
301  mSearchHistory[0] = entry;
302  else
303  {
304  if(!mSearchHistory.empty() && mSearchHistory[0].startsWith(entry))
305  return;
306 
307  if (mSearchHistory.length() >= MAX_ENTRIES) mSearchHistory.removeLast();
308  mSearchHistory.prepend(entry);
309  }
310 
311  }
312  }
313 }
void setOptions(SearchOptions *opts, QString searchString, QList< QString > columnNames, bool incSearch, int minIncSearch)
void setSearchHistory(const QStringList &history)
SearchOptions * getOptions() const
bool isExactMatch() const
bool isCaseSensitive() const
QString getCurrentTextWithFlags()
Definition: searchbar.cpp:171
bool filterApplied()
Definition: searchbar.cpp:259
QString searchIcon
Definition: searchbar.h:50
void setClearIcon(const QString &icon)
Definition: searchbar.cpp:120
void setPlaceholderText(const QString &text)
Definition: searchbar.cpp:145
void handleTextEdited()
Definition: searchbar.cpp:207
void setOptionDialogIconStyle(const QString &style)
Definition: searchbar.cpp:140
QString optionDialogIcon
Definition: searchbar.h:54
void hideEvent(QHideEvent *) override
Definition: searchbar.cpp:156
QString optionDialogIconStyle
Definition: searchbar.h:55
bool eventFilter(QObject *object, QEvent *event) override
Definition: searchbar.cpp:246
void setSearchIcon(const QString &icon)
Definition: searchbar.cpp:110
void setSearchIconStyle(const QString &style)
Definition: searchbar.cpp:115
SearchOptions getSearchOptions() const
Definition: searchbar.cpp:74
void handleReturnPressed()
Definition: searchbar.cpp:220
void updateSearchHistory(QString entry)
Definition: searchbar.cpp:293
Searchbar(QWidget *parent=nullptr)
Definition: searchbar.cpp:20
void setClearIconStyle(const QString &style)
Definition: searchbar.cpp:125
void handleSearchOptionsDialog()
Definition: searchbar.cpp:264
bool getEmitTextWithFlags()
Definition: searchbar.cpp:241
void setColumnNames(QList< QString > list)
Definition: searchbar.cpp:130
void setOptionDialogIcon(const QString &icon)
Definition: searchbar.cpp:135
void setEmitTextWithFlags(bool)
Definition: searchbar.cpp:236
QString searchIconStyle
Definition: searchbar.h:51
QString addFlags(const QString &text)
Definition: searchbar.cpp:176
void searchIconClicked()
QString clearIconStyle
Definition: searchbar.h:53
void handleClearClicked()
Definition: searchbar.cpp:231
QString getCurrentText()
Definition: searchbar.cpp:166
void triggerNewSearch(const QString &text, int searchOptions)
void showEvent(QShowEvent *) override
Definition: searchbar.cpp:161
QString clearIcon
Definition: searchbar.h:52
QIcon getStyledSvgIcon(const QString &from_to_colors_enabled, const QString &svg_path, QString from_to_colors_disabled=QString())
Definition: graphics.cpp:60
void setCheckable(bool)
void setChecked(bool)
void clicked(bool checked)
void setIcon(const QIcon &icon)
void setIconSize(const QSize &size)
void addWidget(QWidget *widget, int stretch, Qt::Alignment alignment)
void setSpacing(int spacing)
virtual int exec()
MouseButtonPress
virtual bool event(QEvent *e) override
void setFrameStyle(int style)
void setPixmap(const QPixmap &)
void setContentsMargins(int left, int top, int right, int bottom)
void clear()
void setPlaceholderText(const QString &)
void returnPressed()
void textEdited(const QString &text)
bool empty() const const
int length() const const
void prepend(const T &value)
void removeLast()
bool startsWith(const T &value) const const
Qt::MouseButton button() const const
Q_EMITQ_EMIT
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
virtual bool eventFilter(QObject *watched, QEvent *event)
void installEventFilter(QObject *filterObj)
QString & append(QChar ch)
bool isEmpty() const const
int length() const const
bool startsWith(const QString &s, Qt::CaseSensitivity cs) const const
bool contains(const QString &str, Qt::CaseSensitivity cs) const const
virtual void polish(QWidget *widget)
virtual void unpolish(QWidget *widget)
void ensurePolished() const const
void setFixedWidth(int w)
void setFocusProxy(QWidget *w)
void setLayout(QLayout *layout)
void setSizePolicy(QSizePolicy)
QStyle * style() const const
void setToolTip(const QString &)