Added inline completer for line edit in search bar widget. Fixed some "this" bugs
[mdictionary] / trunk / src / base / gui / SearchBarWidget.cpp
1 /*******************************************************************************
2
3     This file is part of mDictionary.
4
5     mDictionary is free software: you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation, either version 3 of the License, or
8     (at your option) any later version.
9
10     mDictionary is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14
15     You should have received a copy of the GNU General Public License
16     along with mDictionary.  If not, see <http://www.gnu.org/licenses/>.
17
18     Copyright 2010 Comarch S.A.
19
20 *******************************************************************************/
21
22 //Created by Mateusz Półrola
23
24
25 #include "SearchBarWidget.h"
26 #include <QDebug>
27 #include "../../includes/DictDialog.h"
28 #include "HistoryListDialog.h"
29
30
31 SearchBarWidget::SearchBarWidget(QWidget *parent) :
32     QWidget(parent) {
33
34     initializeUI();
35
36
37     _isSearching = false;
38
39     connect(searchPushButton, SIGNAL(clicked()),
40             this, SLOT(searchPushButtonClicked()));
41
42     connect(searchWordLineEdit, SIGNAL(returnPressed()),
43             this, SLOT(searchPushButtonClicked()));
44
45     connect(historyNextToolButton, SIGNAL(clicked()),
46             this, SIGNAL(historyNext()));
47
48     connect(historyPrevToolButton, SIGNAL(clicked()),
49             this, SIGNAL(historyPrev()));
50
51     connect(historyShowToolButton, SIGNAL(clicked()),
52             this, SIGNAL(historyShow()));
53
54     connect(clearSearchWordToolButton, SIGNAL(clicked()),
55             this, SLOT(clearSearchWordToolButtonClicked()));
56
57
58     connect(&delayTimer, SIGNAL(timeout()),
59             this, SLOT(delaySearchTimeout()));
60
61
62     searchWordLineEdit->setFocus();
63
64     historyPrevToolButton->setEnabled(false);
65     historyNextToolButton->setEnabled(false);
66     historyShowToolButton->setEnabled(false);
67     setEnabled(true);
68 }
69
70 SearchBarWidget::~SearchBarWidget() {
71
72 }
73
74 QIcon SearchBarWidget::generateIcon(QIcon oryginal, qreal rotation) {
75     QPixmap p = oryginal.pixmap(64);
76
77     if(rotation != 0) {
78         QMatrix m;
79         m.rotate(rotation);
80
81         p = p.transformed(m);
82     }
83
84     QIcon newIcon;
85     newIcon.addPixmap(p);
86
87
88     #ifdef Q_WS_MAEMO_5
89         QPainter painter(&p);
90         painter.fillRect(p.rect(), QColor(0,0,0,192));
91
92         newIcon.addPixmap(p, QIcon::Disabled, QIcon::Off);
93     #endif
94
95     return newIcon;
96 }
97
98
99 void SearchBarWidget::initializeUI() {
100
101     #ifdef Q_WS_MAEMO_5
102         setMaximumHeight(150);
103     #else
104         setMaximumHeight(100);
105     #endif
106
107
108     horizontalLayout = new QHBoxLayout;
109     verticalLayout = new QVBoxLayout;
110
111
112     searchPushButton = new QPushButton(tr("Search"));
113     searchPushButton->setMinimumWidth(125);
114
115
116     searchWordLineEdit = new QLineEdit;
117     searchWordLineEdit->setMinimumWidth(250);
118
119
120
121     completerModel = new QStringListModel;
122
123
124     lineEditCompleter = new QCompleter(searchWordLineEdit);
125     lineEditCompleter->setModel(completerModel);
126     lineEditCompleter->setCaseSensitivity(Qt::CaseInsensitive);
127     lineEditCompleter->setCompletionMode(QCompleter::InlineCompletion);
128     searchWordLineEdit->setCompleter(lineEditCompleter);
129
130
131     #ifndef Q_WS_MAEMO_5
132         searchWordLineEdit->setMinimumHeight(
133                 searchWordLineEdit->sizeHint().height()*3/2);
134     #endif
135
136
137     //create layout for lineEdit to have clear button on it
138     QHBoxLayout* lineEditLayout = new QHBoxLayout;
139     searchWordLineEdit->setLayout(lineEditLayout);
140
141
142     clearSearchWordToolButton = new QToolButton;
143     #ifdef Q_WS_MAEMO_5
144         clearSearchWordToolButton->setIcon(QIcon::fromTheme("general_stop"));
145         //tool buttons will have size 2 times smaller
146         clearSearchWordToolButton->setMaximumSize(
147                 clearSearchWordToolButton->sizeHint().height()/2,
148                 clearSearchWordToolButton->sizeHint().height()/2);
149         lineEditLayout->setContentsMargins(0,0,10,0);
150     #else
151         clearSearchWordToolButton->setIcon(QIcon::fromTheme("edit-clear"));
152         clearSearchWordToolButton->setMinimumSize(
153                 searchWordLineEdit->sizeHint().height()*1.2,
154                 searchWordLineEdit->sizeHint().height()*1.2);
155         lineEditLayout->setContentsMargins(0,0,5,0);
156     #endif
157
158
159     historyNextToolButton = new QToolButton;
160     #ifdef Q_WS_MAEMO_5
161         historyNextToolButton->setIcon(
162                 generateIcon(QIcon::fromTheme("general_forward")));
163     #else
164         historyNextToolButton->setIcon(
165                 generateIcon(QIcon::fromTheme("go-next")));
166     #endif
167
168
169
170     historyPrevToolButton = new QToolButton;
171     #ifdef Q_WS_MAEMO_5
172         historyPrevToolButton->setIcon(
173                 generateIcon(QIcon::fromTheme("general_back")));
174     #else
175         historyPrevToolButton->setIcon(
176                 generateIcon(QIcon::fromTheme("go-previous")));
177     #endif
178
179
180
181     historyShowToolButton = new QToolButton;
182     #ifdef Q_WS_MAEMO_5
183         historyShowToolButton->setIcon(
184                 generateIcon(QIcon::fromTheme("general_back"), 90));
185     #else
186         historyShowToolButton->setIcon(
187                 generateIcon(QIcon::fromTheme("go-up")));
188     #endif
189
190     searchingProgressBar = new QProgressBar;
191     //progress bar have minimum and maximum values set to 0, which will effect
192     //with "I'm alive" bar
193     searchingProgressBar->setMinimum(0);
194     searchingProgressBar->setMaximum(0);
195     #ifdef Q_WS_MAEMO_5
196         searchingProgressBar->setMaximumHeight(50);
197     #endif
198     searchingProgressBar->hide();
199
200
201     setLayout(verticalLayout);
202
203     verticalLayout->addWidget(searchingProgressBar);
204
205     //adding widgets to layout
206     horizontalLayout->addWidget(searchWordLineEdit);
207     horizontalLayout->addWidget(searchPushButton);
208     horizontalLayout->addWidget(historyPrevToolButton);
209     horizontalLayout->addWidget(historyShowToolButton);
210     horizontalLayout->addWidget(historyNextToolButton);
211
212     //adding clear toolButton to textEdit with right alignment
213     lineEditLayout->addWidget(clearSearchWordToolButton, 0, Qt::AlignRight);
214
215
216     verticalLayout->addLayout(horizontalLayout);
217 }
218
219
220 void SearchBarWidget::searchPushButtonClicked() {
221     if(_isSearching) {
222         Q_EMIT stopSearching();
223     }
224     else {
225         search(searchWordLineEdit->text());
226     }
227 }
228
229
230 void SearchBarWidget::search(QString word) {
231     if(!_isSearching && !word.isEmpty()) {
232         completerModel->insertRow(completerModel->rowCount());
233         QModelIndex index =
234                 completerModel->index(completerModel->rowCount() -1);
235
236         completerModel->setData(index, word);
237
238
239         searchWordLineEdit->setText(word);
240         Q_EMIT searchForTranslations(word);
241     }
242 }
243
244 void SearchBarWidget::searchDelay(QString word) {
245     if(!_isSearching && !word.isEmpty()) {
246         searchWordLineEdit->setText(word);
247
248
249         if(delayTimer.isActive()) {
250             delayTimer.stop();
251         }
252
253         delayString = word;
254         delayTimer.start(500);
255     }
256 }
257
258 void SearchBarWidget::delaySearchTimeout() {
259     delayTimer.stop();
260     if(!_isSearching) {
261         Q_EMIT searchForTranslations(delayString);
262     }
263 }
264
265 void SearchBarWidget::setEnabled(bool enabled) {
266     searchWordLineEdit->setEnabled(enabled);
267
268     if(!enabled) {
269         historyPrevToolButton->setEnabled(false);
270         historyNextToolButton->setEnabled(false);
271         historyShowToolButton->setEnabled(false);
272     }
273 }
274
275 void SearchBarWidget::setBusy() {
276     if(_isSearching) return;
277     searchingProgressBar->show();
278     searchPushButton->setText(tr("Stop"));
279     setEnabled(false);
280     _isSearching = true;
281 }
282
283 void SearchBarWidget::setIdle() {
284     if(!_isSearching) return;
285     searchingProgressBar->hide();
286     searchPushButton->setText(tr("Search"));
287     setEnabled(true);
288     _isSearching = false;
289     Q_EMIT refreshHistoryButtons();
290 }
291
292
293 void SearchBarWidget::clearSearchWordToolButtonClicked() {
294     searchWordLineEdit->clear();
295 }
296
297
298
299 void SearchBarWidget::updateHistoryButtons(bool prev, bool next, bool list) {
300     if(!_isSearching) {
301         historyPrevToolButton->setEnabled(prev);
302         historyNextToolButton->setEnabled(next);
303         historyShowToolButton->setEnabled(list);
304     }
305 }