1 /*******************************************************************************
3 This file is part of mDictionary.
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.
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.
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/>.
18 Copyright 2010 Comarch S.A.
20 *******************************************************************************/
22 /*! \file SearchBarWidget.cpp
23 \brief Displays search bar
25 \author Mateusz Półrola <mateusz.polrola@comarch.pl>
29 #include "SearchBarWidget.h"
31 #include "../../include/DictDialog.h"
32 #include "HistoryListDialog.h"
35 SearchBarWidget::SearchBarWidget(QWidget *parent) : QWidget(parent) {
37 completerModel = new QStringList;
38 lineEditCompleter = new QCompleter(this);
39 lineEditCompleter->setModel(new QStringListModel(*completerModel));
40 lineEditCompleter->setCaseSensitivity(Qt::CaseInsensitive);
41 lineEditCompleter->setCompletionMode(QCompleter::InlineCompletion);
44 this->setMaximumHeight(50);
47 progressBar = new QDeclarativeView();
48 progressBar->setSource(QUrl::fromLocalFile("/usr/share/mdictionary/qml/ProgressBar.qml"));
49 progressBar->setResizeMode(QDeclarativeView::SizeRootObjectToView);
50 progressBar->setAlignment(Qt::AlignCenter);
53 view= new QDeclarativeView();
54 ctxt = view->rootContext();
55 ctxt->setContextProperty("focusss",true);
57 view->setSource(QUrl::fromLocalFile("/usr/share/mdictionary/qml/SearchBarWidget.qml"));
58 view->setResizeMode(QDeclarativeView::SizeRootObjectToView);
59 view->setAlignment(Qt::AlignCenter);
62 mainLayout = new QVBoxLayout;
63 mainLayout->addWidget(progressBar);
64 mainLayout->addWidget(view);
65 setLayout(mainLayout);
67 QGraphicsObject *rootObject = view->rootObject();
68 QGraphicsObject *rootObject2 = progressBar->rootObject();
70 connect(rootObject, SIGNAL(searchButtonClicked(QString)),
71 this, SLOT(searchButtonClicked(QString)));
72 connect(rootObject, SIGNAL(historyNextToolButtonClicked()),
73 this, SIGNAL(historyNext()));
74 connect(rootObject, SIGNAL(historyPrevToolButtonClicked()),
75 this, SIGNAL(historyPrev()));
76 connect(rootObject, SIGNAL(historyShowToolButtonClicked()),
77 this, SLOT(showHistoryButtonClicked()));
78 connect(rootObject, SIGNAL(textChange(QString)),
79 this, SLOT(textChange(QString)));
80 connect(rootObject, SIGNAL(nextCompleter()),
81 this, SLOT(nextCompleter()));
82 connect(rootObject, SIGNAL(prevCompleter()),
83 this, SLOT(prevCompleter()));
84 connect(rootObject, SIGNAL(checkFocus()),
85 this, SLOT(checkFocus()));
86 connect(rootObject, SIGNAL(nextFocus()),
87 this, SLOT(nextFocus()));
89 connect(this, SIGNAL(progresSetMax(QVariant)),
90 rootObject2, SLOT(setMax(QVariant)));
91 connect(this, SIGNAL(progresSetMin(QVariant)),
92 rootObject2, SLOT(setMin(QVariant)));
93 connect(this, SIGNAL(progresSetValue(QVariant)),
94 rootObject2, SLOT(setValue(QVariant)));
95 connect(this, SIGNAL(progresSetValue2(QVariant)),
96 rootObject2, SLOT(setValue2(QVariant)));
98 connect(this, SIGNAL(setEnableHistoryNext(QVariant)),
99 rootObject, SLOT(setEnableHistoryNext(QVariant)));
100 connect(this, SIGNAL(setEnableHistoryShow(QVariant)),
101 rootObject, SLOT(setEnableHistoryShow(QVariant)));
102 connect(this, SIGNAL(setEnableHistoryPrev(QVariant)),
103 rootObject, SLOT(setEnableHistoryPrev(QVariant)));
104 connect(this, SIGNAL(setButtonText(QVariant)),
105 rootObject, SLOT(setButtonText(QVariant)));
106 connect(this, SIGNAL(setLineEditText(QVariant)),
107 rootObject, SLOT(setLineEditText(QVariant)));
108 connect(this, SIGNAL(setLineEditEnables(QVariant)),
109 rootObject, SLOT(setEnableLineEdit(QVariant)));
111 connect(this, SIGNAL(setCompleterText(QVariant)),
112 rootObject, SLOT(setCompleterText(QVariant)));
113 connect(this, SIGNAL(focusOff()),
114 rootObject, SLOT(focusOff()));
116 connect(busyTimer, SIGNAL(timeout()),
117 this, SLOT(updateBusyTimer()));
119 emit setEnableHistoryNext(false);
120 emit setEnableHistoryShow(false);
121 emit setEnableHistoryPrev(false);
123 connect(&delayTimer, SIGNAL(timeout()),
124 this, SLOT(delaySearchTimeout()));
128 connect(searchPushButton, SIGNAL(clicked()),
129 this, SLOT(searchPushButtonClicked()));
130 connect(searchWordLineEdit, SIGNAL(returnPressed()),
131 this, SLOT(searchPushButtonClicked()));
132 connect(historyNextToolButton, SIGNAL(clicked()),
133 this, SIGNAL(historyNext()));
134 connect(historyPrevToolButton, SIGNAL(clicked()),
135 this, SIGNAL(historyPrev()));
136 connect(historyShowToolButton, SIGNAL(clicked()),
137 this, SLOT(showHistoryButtonClicked()));
138 connect(clearSearchWordToolButton, SIGNAL(clicked()),
139 this, SLOT(clearSearchWordToolButtonClicked()));
140 connect(&delayTimer, SIGNAL(timeout()),
141 this, SLOT(delaySearchTimeout()));
143 searchWordLineEdit->setFocus();
148 updateHistoryButtons(false,false,false);
151 SearchBarWidget::~SearchBarWidget() {
155 void SearchBarWidget::checkFocus(){
156 qDebug()<<"focus:"<<QApplication::focusWidget();
157 if(focusWidget()!=QApplication::focusWidget())
161 void SearchBarWidget::nextFocus(){
162 parentWidget()->nextInFocusChain()->setFocus();
165 void SearchBarWidget::textChange(QString text){
170 completerActualList.clear();
172 line.setCompleter(lineEditCompleter);
173 line.completer()->setCompletionPrefix(text);
174 for (int i = 0; lineEditCompleter->setCurrentRow(i); i++)
175 completerActualList.append(lineEditCompleter->currentCompletion());
177 completerActualList.sort();
178 if(completerActualList.contains(preferedCompliter)){
179 tempString = preferedCompliter;
180 toSend = tempString.remove(0,text.size());
181 emit setCompleterText(toSend);
183 else if(completerActualList.size()>0 && text.size()>0){
184 toSend = completerActualList.at(0);
185 preferedCompliter= toSend;
186 toSend=toSend.remove(0,text.size());
188 emit setCompleterText(toSend);
189 else if(completerActualList.size()>1){
190 toSend = completerActualList.at(1);
191 preferedCompliter= toSend;
192 toSend=toSend.remove(0,text.size());
193 emit setCompleterText(toSend);
197 preferedCompliter="";
198 emit setCompleterText(toSend);
202 void SearchBarWidget::prevCompleter(){
204 if(!preferedCompliter.isEmpty()){
205 int index = completerActualList.indexOf(preferedCompliter);
206 qDebug()<<"index"<<index<<"size"<<completerActualList.size()<<"+1";
207 if(index!=-1 && completerActualList.size()>index+1){
208 preferedCompliter = completerActualList.at(index+1);
209 tempString=preferedCompliter;
210 QString toSend = tempString.remove(0,actualString.size());
211 emit setCompleterText(toSend);
216 void SearchBarWidget::nextCompleter(){
218 if(!preferedCompliter.isEmpty()){
219 int index = completerActualList.indexOf(preferedCompliter);
221 preferedCompliter = completerActualList.at(index-1);
222 tempString=preferedCompliter;
223 QString toSend = tempString.remove(0,actualString.size());
224 emit setCompleterText(toSend);
230 QIcon SearchBarWidget::generateIcon(QIcon original, qreal rotation) {
232 QPixmap p = original.pixmap(64);
238 p = p.transformed(m);
242 newIcon.addPixmap(p);
246 QImage img = p.toImage();
248 for(int i=0; i < img.width(); i++) {
249 for(int j=0; j < img.height(); j++) {
250 QColor c = img.pixel(i,j);
251 if(c != QColor(0,0,0,255)) {
253 c.setGreen(c.green()/2);
254 c.setBlue(c.blue()/2);
255 img.setPixel(i, j, c.rgb());
259 p = p.fromImage(img);
261 newIcon.addPixmap(p, QIcon::Disabled, QIcon::Off);
267 void SearchBarWidget::setFocus() {
271 searchWordLineEdit->setFocus();
275 void SearchBarWidget::initializeUI() {
278 setMaximumHeight(150);
280 horizontalLayout = new QHBoxLayout;
281 verticalLayout = new QVBoxLayout;
283 searchPushButton = new QPushButton(tr("Search"));
284 searchPushButton->setMinimumWidth(125);
286 searchWordLineEdit = new QLineEdit;
287 searchWordLineEdit->setMinimumWidth(250);
289 searchWordLineEdit->setCompleter(lineEditCompleter);
292 searchWordLineEdit->setMinimumHeight(
293 searchWordLineEdit->sizeHint().height()*3/2);
296 //create layout for lineEdit to have clear button on it
297 QHBoxLayout* lineEditLayout = new QHBoxLayout;
298 searchWordLineEdit->setLayout(lineEditLayout);
301 clearSearchWordToolButton = new QToolButton;
303 clearSearchWordToolButton->setIcon(QIcon::fromTheme("general_stop"));
304 clearSearchWordToolButton->setMaximumSize(
305 clearSearchWordToolButton->sizeHint().height()/2,
306 clearSearchWordToolButton->sizeHint().height()/2);
307 lineEditLayout->setContentsMargins(0,0,15,0);
309 clearSearchWordToolButton->setIcon(QIcon::fromTheme("edit-clear"));
310 clearSearchWordToolButton->setMinimumSize(
311 searchWordLineEdit->sizeHint().height()*1.2,
312 searchWordLineEdit->sizeHint().height()*1.2);
313 lineEditLayout->setContentsMargins(0,0,5,0);
317 historyNextToolButton = new QToolButton;
319 historyNextToolButton->setIcon(
320 generateIcon(QIcon::fromTheme("general_forward")));
322 historyNextToolButton->setIcon(
323 generateIcon(QIcon::fromTheme("go-next")));
328 historyPrevToolButton = new QToolButton;
330 historyPrevToolButton->setIcon(
331 generateIcon(QIcon::fromTheme("general_back")));
333 historyPrevToolButton->setIcon(
334 generateIcon(QIcon::fromTheme("go-previous")));
339 historyShowToolButton = new QToolButton;
341 historyShowToolButton->setIcon(
342 generateIcon(QIcon::fromTheme("general_back"), 90));
344 historyShowToolButton->setIcon(
345 generateIcon(QIcon::fromTheme("go-up")));
348 searchingProgressBar = new QProgressBar;
349 //progress bar has minimum and maximum values set to 0, which will effect
350 //with "I'm alive" bar
351 searchingProgressBar->setMinimum(0);
352 searchingProgressBar->setMaximum(0);
354 searchingProgressBar->setMaximumHeight(50);
356 searchingProgressBar->hide();
358 setLayout(verticalLayout);
360 verticalLayout->addWidget(searchingProgressBar);
362 //adding widgets to layout
363 horizontalLayout->addWidget(searchWordLineEdit);
364 horizontalLayout->addWidget(searchPushButton);
365 horizontalLayout->addWidget(historyPrevToolButton);
366 horizontalLayout->addWidget(historyShowToolButton);
367 horizontalLayout->addWidget(historyNextToolButton);
369 //adding clear toolButton to textEdit with right alignment
370 lineEditLayout->addWidget(clearSearchWordToolButton, 0, Qt::AlignRight);
372 verticalLayout->addLayout(horizontalLayout);
376 void SearchBarWidget::searchButtonClicked(QString text) {
379 Q_EMIT stopSearching();
384 void SearchBarWidget::searchPushButtonClicked() {
388 Q_EMIT stopSearching();
391 search(searchWordLineEdit->text());
396 void SearchBarWidget::search(QString word) {
397 if(!busy && !word.isEmpty()) {
398 while(word.lastIndexOf(" ")==word.size()-1 && word.size()>0)
399 word=word.remove(word.size()-1,1);
400 if(!completerModel->contains(word))
401 completerModel->append(word);
402 QAbstractItemModel *temp=lineEditCompleter->model();
403 lineEditCompleter->setModel(new QStringListModel(*completerModel));
406 emit setLineEditText(word);
408 searchWordLineEdit->setText(word);
410 Q_EMIT searchForTranslations(word);
414 void SearchBarWidget::searchDelay(QString word) {
416 if(!busy && !word.isEmpty()) {
418 emit setLineEditText(word);
420 searchWordLineEdit->setText(word);
422 if(delayTimer.isActive())
425 delayTimer.start(500);
430 void SearchBarWidget::delaySearchTimeout() {
434 Q_EMIT searchForTranslations(delayString);
438 void SearchBarWidget::setEnabled(bool enabled) {
441 emit setLineEditEnables(enabled);
444 emit setEnableHistoryNext(false);
445 emit setEnableHistoryShow(false);
446 emit setEnableHistoryPrev(false);
449 searchWordLineEdit->setEnabled(enabled);
451 historyPrevToolButton->setEnabled(false);
452 historyNextToolButton->setEnabled(false);
453 historyShowToolButton->setEnabled(false);
459 void SearchBarWidget::setBusy() {
464 busyTimer->start(50);
465 emit setButtonText(tr("Stop"));
466 this->setMaximumHeight(88);
468 emit progresSetMax(100);
469 emit progresSetMin(0);
470 emit progresSetValue(-1);
471 emit progresSetValue2(100);
474 searchingProgressBar->show();
475 searchPushButton->setText(tr("Stop"));
482 void SearchBarWidget::updateBusyTimer(){
484 if(progressMax==true){
485 emit progresSetValue2(0);
489 emit progresSetValue2(100);
492 busyTimer->start(50);
495 void SearchBarWidget::setIdle() {
501 emit progresSetValue2(0);
502 this->setMaximumHeight(50);
503 emit setButtonText(tr("Search"));
505 searchingProgressBar->hide();
506 searchPushButton->setText(tr("Search"));
510 Q_EMIT refreshHistoryButtons();
514 void SearchBarWidget::clearSearchWordToolButtonClicked() {
517 searchWordLineEdit->clear();
523 void SearchBarWidget::updateHistoryButtons(bool prev, bool next, bool list) {
527 emit setEnableHistoryNext(next);
528 emit setEnableHistoryShow(list);
529 emit setEnableHistoryPrev(prev);
531 historyPrevToolButton->setEnabled(prev);
532 historyNextToolButton->setEnabled(next);
533 historyShowToolButton->setEnabled(list);
538 void SearchBarWidget::showHistoryButtonClicked() {
541 QPoint p=view->pos(); // = historyShowToolButton->pos();
543 p.setX(p.x()+view->width());