HAL
searchoptions_dialog.cpp
Go to the documentation of this file.
3 #include <QDebug>
4 #include <QListWidget>
5 
6 namespace hal
7 {
9  {
10  setWindowTitle("Search");
11  //TODO fix layout size to prevent overlapping
12  mLayout = new QGridLayout(this);
13  mLayout->setRowMinimumHeight(0,35);
14 
15  //Searchstring inputbox
16  mInputBox = new QComboBox(this);
17  mInputBox->setEditable(true);
18  mLineEdit = mInputBox->lineEdit();
19 
20  //Incremental search widgets
21  mIncrementalSearchBox = new QCheckBox("Incremental search", this);
22  mIncrementalSearchBox->setChecked(true);
23  mSpinBoxLabel = new QLabel("start at: ", this);
24  mSpinBox = new QSpinBox(this);
25  mSpinBox->setMinimum(1);
26  mSpinBox->setMaximum(50);
27  mSpinBox->setValue(3);
28  mSpinBox->setSuffix(" chars");
29 
30  //Exact match widget
31  mExactMatchBox = new QCheckBox("Exact match", this);
32 
33  //Case sensitive widget
34  mCaseSensitiveBox = new QCheckBox("Case sensitive", this);
35 
36  //RegEx widget
37  mRegExBox = new QCheckBox("Regular expression", this);
38 
39  //Column label
40  mSearchInLabel = new QLabel("Search in:", this);
41 
42  //Pushbuttons
43  mSearchBtn = new QPushButton("Search", this);
44  mCloseBtn = new QPushButton("Close", this);
45 
46  mSelectColumnsBtn = new QPushButton("...", this);
47 
48  //Connect widgets with layout
49  mLayout->addWidget(mInputBox, 0, 0, 0, 2, Qt::AlignTop);
50  //mLayout->addWidget(mColumnLabel, 1, 2);
51  mLayout->addWidget(mIncrementalSearchBox, 1, 0, 1, 2);
52  //mLayout->addWidget(mListWidget, 2, 2, 5, Qt::AlignLeft);
53  mLayout->addWidget(mSpinBoxLabel, 2, 0, Qt::AlignRight);
54  mLayout->addWidget(mSpinBox, 2, 1);
55  mLayout->addWidget(mExactMatchBox, 3, 0, 1, 2);
56  mLayout->addWidget(mCaseSensitiveBox, 4, 0, 1, 2);
57  mLayout->addWidget(mRegExBox, 5, 0, 1, 2);
58  mLayout->addWidget(mSearchInLabel, 6, 0, Qt::AlignRight);
59  mLayout->addWidget(mSelectColumnsBtn, 6, 1);
60  mLayout->addWidget(mSearchBtn, 7, 0);
61  mLayout->addWidget(mCloseBtn, 7, 1);
62  mLayout->setHorizontalSpacing(20);
63 
64 
69  //connect(mListWidget, &QListWidget::itemSelectionChanged, this, &SearchOptionsDialog::testWidget);
70 
71  //TODO maybe delete this because edit triggers also the mSearchBtn signal as if it was clicked. Currently the emit search is emited twice while pressing Enter
72  // discuss with Joern
74 
75 
76  // de-/ activate spinBox widgets based on IncCheckBox
77  this->incrementalSearchToggled(mIncrementalSearchBox->isChecked());
78  }
79 
81  {
82  qInfo() << "emitStartSearch from searchOptionsDialog";
83  emitOptions();
84  }
85 
86 
88  {
89  mSearchText = mInputBox->currentText();
90  int options = SearchOptions::toInt(mExactMatchBox->isChecked(), mCaseSensitiveBox->isChecked(), mRegExBox->isChecked(), mSelectedColumns); //TO-DO: fill the columns
91  qInfo() << "Emit search with string: " << mSearchText << " and options: " << options;
92 
93  Q_EMIT emitOptions(mSearchText, options);
94  Q_EMIT accept();
95  }
96 
98  {
99  SearchOptions* retval = new SearchOptions();
100 
101  retval->setOptions(mExactMatchBox->isChecked(), mCaseSensitiveBox->isChecked(), mRegExBox->isChecked(), mSelectedColumns); //TO-DO: fill the columns
102  return retval;
103  }
104 
105  void SearchOptionsDialog::setOptions(SearchOptions* opts, QString searchString, QList<QString> columnNames, bool incSearch, int minIncSearch)
106  {
107  //set the parameters of the Dialog to previous ones or do default
108  mLineEdit->setText(searchString);
109 
110  QStringList a = {};
111  mExactMatchBox->setChecked(opts->isExactMatch());
112  mCaseSensitiveBox->setChecked(opts->isCaseSensitive());
113  mRegExBox->setChecked(opts->isRegularExpression());
114  mIncrementalSearchBox->setChecked(incSearch);
115  mSpinBox->setValue(minIncSearch);
116  mSelectedColumns = opts->getColumns();
117 
118  if(!columnNames.isEmpty())
119  {
120  for(QString name : columnNames)
121  mColumnNames.append(name);
122  }else{
123  mSearchInLabel->hide();
124  mSelectColumnsBtn->hide();
125  }
126  if(!columnNames.isEmpty())
127  mSelectColumnsBtn->setText(formatColumnButtonText(buildColumnButtonText()));
128  //TODO resize button after it updates its text
129 
130  }
131 
133  {
134  return mSearchText;
135  }
136 
137 
139  {
140  return mSpinBox->value();
141  }
142 
144  {
145  return mIncrementalSearchBox->isChecked();
146  }
147 
149  {
150  mSpinBoxLabel->setDisabled(!state);
151  mSpinBox->setDisabled(!state);
152  }
153 
155  {
156 
157  hal::SearchColumnDialog scd(mColumnNames, mSelectedColumns);
158  if (scd.exec() == QDialog::Accepted)
159  {
160 
161  mSelectColumnsBtn->setText(formatColumnButtonText(scd.selectedColumnNames()));
162  mSelectedColumns = scd.selectedColumns();
163  }
164  this->adjustSize();
165  }
166 
167  QString SearchOptionsDialog::formatColumnButtonText(QString text)
168  {
169  //if text is longer than MAX_LENGTH then replace following entries with [...]
170  const int MAX_LENGTH = 20;
171  const QString placeholder = "[...]";
172 
173 
174  if(text.length() <= MAX_LENGTH){
175  return text;
176  }
177  else{
178  // text is too long so
179  QString result = "";
180  auto list = text.split(",");
181  for(int i = 0; i < list.length(); ++i){
182  if(result.length() > MAX_LENGTH){
183  result.append(placeholder);
184  break;
185  }
186  result += list[i];
187  if(i < list.length() - 1)
188  result += ",";
189  }
190  return result;
191  }
192  }
193 
194  QString SearchOptionsDialog::buildColumnButtonText()
195  {
196  if(mSelectedColumns.length() < 1)
197  return "All columns";
198 
199  //get selected column names and concat them seperated by ","
200  QString result = "";
201  for(int i = 0; i < mSelectedColumns.length(); ++i){
202  result += mColumnNames[mSelectedColumns[i]];
203  if(i < mSelectedColumns.length() - 1)
204  result += ",";
205  }
206  return result;
207  }
208 
210  mInputBox->addItems(history);
211  }
212 }
QString selectedColumnNames() const
QList< int > selectedColumns() const
void setOptions(SearchOptions *opts, QString searchString, QList< QString > columnNames, bool incSearch, int minIncSearch)
void setSearchHistory(const QStringList &history)
SearchOptionsDialog(QWidget *parent=nullptr)
SearchOptions * getOptions() const
const QList< int > & getColumns() const
bool isExactMatch() const
bool isCaseSensitive() const
bool isRegularExpression() const
void setOptions(bool exactMatch, bool caseSensitive, bool regEx, QList< int > columns)
std::string name
void setChecked(bool)
void clicked(bool checked)
void setText(const QString &text)
void stateChanged(int state)
void addItems(const QStringList &texts)
void setEditable(bool editable)
QLineEdit * lineEdit() const const
virtual void accept()
virtual int exec()
int result() const const
void addWidget(QWidget *widget, int row, int column, Qt::Alignment alignment)
void setHorizontalSpacing(int spacing)
void setRowMinimumHeight(int row, int minSize)
void returnPressed()
void setText(const QString &)
void append(const T &value)
bool isEmpty() const const
int length() const const
Q_EMITQ_EMIT
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
void setMaximum(int max)
void setMinimum(int min)
void setSuffix(const QString &suffix)
void setValue(int val)
QStringList split(const QString &sep, QString::SplitBehavior behavior, Qt::CaseSensitivity cs) const const
int length() const const
AlignTop
void adjustSize()
bool close()
void hide()
void setDisabled(bool disable)
void setWindowTitle(const QString &)