]> git.sur5r.net Git - minitube/blob - src/searchlineedit.cpp
Add enabledChanged signal
[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     if (m_lineEdit->text().isEmpty() && !hasFocus() && !inactiveText.isEmpty()) {
67         ExLineEdit::paintEvent(e);
68         QStyleOptionFrameV2 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     } else {
79         ExLineEdit::paintEvent(e);
80     }
81 }
82
83 void SearchLineEdit::resizeEvent(QResizeEvent *e) {
84     updateGeometries();
85     ExLineEdit::resizeEvent(e);
86 }
87
88 void SearchLineEdit::updateGeometries() {
89     int menuHeight = height();
90     int menuWidth = menuHeight + 1;
91     if (!searchButton->m_menu)
92         menuWidth = (menuHeight / 5) * 4;
93     searchButton->resize(QSize(menuWidth, menuHeight));
94 }
95
96 void SearchLineEdit::setInactiveText(const QString &text) {
97     inactiveText = text;
98 }
99
100 void SearchLineEdit::setText(const QString &text) {
101     m_lineEdit->setText(text);
102 }
103
104 AutoComplete *SearchLineEdit::getAutoComplete() {
105     return autoComplete;
106 }
107
108 void SearchLineEdit::setMenu(QMenu *menu) {
109     if (searchButton->m_menu)
110         searchButton->m_menu->deleteLater();
111     searchButton->m_menu = menu;
112     updateGeometries();
113 }
114
115 QMenu *SearchLineEdit::menu() const {
116     if (!searchButton->m_menu) {
117         searchButton->m_menu = new QMenu(searchButton);
118         if (isVisible())
119             (const_cast<SearchLineEdit*>(this))->updateGeometries();
120     }
121     return searchButton->m_menu;
122 }
123
124 void SearchLineEdit::returnPressed() {
125     QString text = m_lineEdit->text().simplified();
126     if (!text.isEmpty()) {
127         autoComplete->preventSuggest();
128         emit search(text);
129     }
130 }
131
132 void SearchLineEdit::enableSuggest() {
133     autoComplete->enableSuggest();
134 }
135
136 void SearchLineEdit::preventSuggest() {
137     autoComplete->preventSuggest();
138 }
139
140 void SearchLineEdit::selectAll() {
141     m_lineEdit->selectAll();
142 }
143
144 void SearchLineEdit::setSuggester(Suggester *suggester) {
145     autoComplete->setSuggester(suggester);
146 }
147
148 void SearchLineEdit::focusInEvent(QFocusEvent *e) {
149     ExLineEdit::focusInEvent(e);
150     enableSuggest();
151 }
152
153 void SearchLineEdit::emitTextChanged(const QString &text) {
154     autoComplete->enableSuggest();
155     emit textEdited(text);
156 }
157
158 QString SearchLineEdit::text() {
159     return m_lineEdit->text();
160 }
161
162 QLineEdit *SearchLineEdit::getLineEdit() {
163     return m_lineEdit;
164 }
165
166 void SearchLineEdit::setEnabled(bool enabled) {
167     ExLineEdit::setEnabled(enabled);
168     emit enabledChanged(enabled);
169 }