]> git.sur5r.net Git - minitube/blob - src/searchlineedit.cpp
06d201d7f3e80379c9caa5bccf6712e133089205
[minitube] / src / searchlineedit.cpp
1 #include "searchlineedit.h"
2 #include "autocomplete.h"
3 #include "iconutils.h"
4
5 class SearchButton : public QAbstractButton {
6
7 public:
8     SearchButton(QWidget *parent = 0);
9     QMenu *m_menu;
10
11 protected:
12     void paintEvent(QPaintEvent *e);
13     void mousePressEvent(QMouseEvent *e);
14
15 };
16
17 SearchButton::SearchButton(QWidget *parent)
18     : QAbstractButton(parent),
19     m_menu(0) {
20     setObjectName(QLatin1String("SearchButton"));
21     setCursor(Qt::ArrowCursor);
22     setFocusPolicy(Qt::NoFocus);
23 }
24
25 void SearchButton::mousePressEvent(QMouseEvent *e) {
26     if (m_menu && e->button() == Qt::LeftButton) {
27         QWidget *p = parentWidget();
28         if (p) {
29             QPoint r = p->mapToGlobal(QPoint(0, p->height()));
30             m_menu->exec(QPoint(r.x() + height() / 2, r.y()));
31         }
32         e->accept();
33     }
34     QAbstractButton::mousePressEvent(e);
35 }
36
37 void SearchButton::paintEvent(QPaintEvent *e) {
38     Q_UNUSED(e);
39     QPainter painter(this);
40     const int h = height();
41     int iconSize = 16;
42     if (h > 30) iconSize = 22;
43     QPixmap p = IconUtils::icon("edit-find").pixmap(iconSize, iconSize);
44     int x = (width() - p.width()) / 2;
45     int y = (h - p.height()) / 2;
46     painter.drawPixmap(x, y, p);
47 }
48
49 SearchLineEdit::SearchLineEdit(QWidget *parent) : ExLineEdit(parent), searchButton(new SearchButton(this)) {
50     connect(m_lineEdit, SIGNAL(textChanged(const QString &)), SIGNAL(textChanged(const QString &)));
51     connect(m_lineEdit, SIGNAL(textEdited(const QString &)), SIGNAL(textEdited(const QString &)));
52     connect(m_lineEdit, SIGNAL(returnPressed()), SLOT(returnPressed()));
53
54     setLeftWidget(searchButton);
55     inactiveText = tr("Search");
56
57     QSizePolicy policy = sizePolicy();
58     setSizePolicy(QSizePolicy::Preferred, policy.verticalPolicy());
59
60     // completion
61     autoComplete = new AutoComplete(this, m_lineEdit);
62     connect(autoComplete, SIGNAL(suggestionAccepted(Suggestion*)), SIGNAL(suggestionAccepted(Suggestion*)));
63 }
64
65 void SearchLineEdit::paintEvent(QPaintEvent *e) {
66     ExLineEdit::paintEvent(e);
67     if (m_lineEdit->text().isEmpty() && !hasFocus() && !inactiveText.isEmpty()) {
68         QStyleOptionFrame panel;
69         initStyleOption(&panel);
70         QRect r = style()->subElementRect(QStyle::SE_LineEditContents, &panel, this);
71         QFontMetrics fm = fontMetrics();
72         int horizontalMargin = m_lineEdit->x();
73         QRect lineRect(horizontalMargin + r.x(), r.y() + (r.height() - fm.height() + 1) / 2,
74                        r.width() - 2 * horizontalMargin, fm.height());
75         QPainter painter(this);
76         painter.setPen(palette().brush(QPalette::Disabled, QPalette::Text).color());
77         painter.drawText(lineRect, Qt::AlignLeft | Qt::AlignVCenter, inactiveText);
78     }
79 }
80
81 void SearchLineEdit::resizeEvent(QResizeEvent *e) {
82     updateGeometries();
83     ExLineEdit::resizeEvent(e);
84 }
85
86 void SearchLineEdit::updateGeometries() {
87     int menuHeight = height();
88     int menuWidth = menuHeight + 1;
89     if (!searchButton->m_menu)
90         menuWidth = (menuHeight / 5) * 4;
91     searchButton->resize(QSize(menuWidth, menuHeight));
92 }
93
94 void SearchLineEdit::setInactiveText(const QString &text) {
95     inactiveText = text;
96 }
97
98 void SearchLineEdit::setText(const QString &text) {
99     m_lineEdit->setText(text);
100 }
101
102 AutoComplete *SearchLineEdit::getAutoComplete() {
103     return autoComplete;
104 }
105
106 void SearchLineEdit::setMenu(QMenu *menu) {
107     if (searchButton->m_menu)
108         searchButton->m_menu->deleteLater();
109     searchButton->m_menu = menu;
110     updateGeometries();
111 }
112
113 QMenu *SearchLineEdit::menu() const {
114     if (!searchButton->m_menu) {
115         searchButton->m_menu = new QMenu(searchButton);
116         if (isVisible())
117             (const_cast<SearchLineEdit*>(this))->updateGeometries();
118     }
119     return searchButton->m_menu;
120 }
121
122 void SearchLineEdit::returnPressed() {
123     QString text = m_lineEdit->text().simplified();
124     if (!text.isEmpty()) {
125         autoComplete->preventSuggest();
126         emit search(text);
127     }
128 }
129
130 void SearchLineEdit::enableSuggest() {
131     autoComplete->enableSuggest();
132 }
133
134 void SearchLineEdit::preventSuggest() {
135     autoComplete->preventSuggest();
136 }
137
138 void SearchLineEdit::selectAll() {
139     m_lineEdit->selectAll();
140 }
141
142 void SearchLineEdit::setSuggester(Suggester *suggester) {
143     autoComplete->setSuggester(suggester);
144 }
145
146 void SearchLineEdit::focusInEvent(QFocusEvent *e) {
147     ExLineEdit::focusInEvent(e);
148     enableSuggest();
149 }
150
151 void SearchLineEdit::emitTextChanged(const QString &text) {
152     autoComplete->enableSuggest();
153     emit textEdited(text);
154 }
155
156 QString SearchLineEdit::text() {
157     return m_lineEdit->text();
158 }
159
160 QLineEdit *SearchLineEdit::getLineEdit() {
161     return m_lineEdit;
162 }
163
164 void SearchLineEdit::setEnabled(bool enabled) {
165     ExLineEdit::setEnabled(enabled);
166     emit enabledChanged(enabled);
167 }