1 #include "searchlineedit.h"
7 #include <QStyleOptionFrameV2>
9 #include "autocomplete.h"
10 #include "iconutils.h"
12 ClearButton::ClearButton(QWidget *parent) : QAbstractButton(parent), hovered(false), mousePressed(false) {
13 setCursor(Qt::ArrowCursor);
14 setToolTip(tr("Clear"));
16 setFocusPolicy(Qt::NoFocus);
19 void ClearButton::paintEvent(QPaintEvent *e) {
21 QPainter painter(this);
22 const int h = height();
24 if (h > 30) iconSize = 22;
25 QIcon::Mode iconMode = QIcon::Normal;
26 if (mousePressed) iconMode = QIcon::Active;
27 QPixmap p = IconUtils::icon("edit-clear").pixmap(iconSize, iconSize, iconMode);
28 // QPixmap p = IconUtils::tintedIcon("edit-clear", Qt::black, QSize(iconSize, iconSize)).pixmap(iconSize, iconSize, iconMode);
29 int x = (width() - p.width()) / 2;
30 int y = (h - p.height()) / 2;
31 painter.drawPixmap(x, y, p);
34 void ClearButton::textChanged(const QString &text) {
35 setVisible(!text.isEmpty());
38 void ClearButton::enterEvent(QEvent *e) {
43 void ClearButton::leaveEvent(QEvent *e) {
48 void ClearButton::mousePressEvent(QEvent *e) {
53 void ClearButton::mouseReleaseEvent(QEvent *e) {
59 Search icon on the left hand side of the search widget
60 When a menu is set a down arrow appears
62 class SearchButton : public QAbstractButton {
64 SearchButton(QWidget *parent = 0);
65 void paintEvent(QPaintEvent *event);
69 void mousePressEvent(QMouseEvent *event);
72 SearchButton::SearchButton(QWidget *parent)
73 : QAbstractButton(parent),
75 setObjectName(QLatin1String("SearchButton"));
76 setCursor(Qt::ArrowCursor);
77 setFocusPolicy(Qt::NoFocus);
80 void SearchButton::mousePressEvent(QMouseEvent *event) {
81 if (m_menu && event->button() == Qt::LeftButton) {
82 QWidget *p = parentWidget();
84 QPoint r = p->mapToGlobal(QPoint(0, p->height()));
85 m_menu->exec(QPoint(r.x() + height() / 2, r.y()));
89 QAbstractButton::mousePressEvent(event);
92 void SearchButton::paintEvent(QPaintEvent *event) {
94 QPainter painter(this);
95 const int h = height();
97 if (h > 30) iconSize = 22;
98 QPixmap p = IconUtils::icon("edit-find").pixmap(iconSize, iconSize);
99 int x = (width() - p.width()) / 2;
100 int y = (h - p.height()) / 2;
101 painter.drawPixmap(x, y, p);
105 SearchLineEdit is an enhanced QLineEdit
106 - A Search icon on the left with optional menu
107 - When there is no text and doesn't have focus an "inactive text" is displayed
108 - When there is text a clear button is displayed on the right hand side
110 SearchLineEdit::SearchLineEdit(QWidget *parent) : ExLineEdit(parent),
111 searchButton(new SearchButton(this)) {
112 connect(lineEdit(), SIGNAL(textChanged(const QString &)), SIGNAL(textChanged(const QString &)));
113 connect(lineEdit(), SIGNAL(textEdited(const QString &)), SIGNAL(textEdited(const QString &)));
114 connect(lineEdit(), SIGNAL(returnPressed()), SLOT(returnPressed()));
116 setLeftWidget(searchButton);
117 inactiveText = tr("Search");
119 QSizePolicy policy = sizePolicy();
120 setSizePolicy(QSizePolicy::Preferred, policy.verticalPolicy());
123 autoComplete = new AutoComplete(this, m_lineEdit);
124 connect(autoComplete, SIGNAL(suggestionAccepted(Suggestion*)), SIGNAL(suggestionAccepted(Suggestion*)));
127 void SearchLineEdit::paintEvent(QPaintEvent *event) {
128 if (lineEdit()->text().isEmpty() && !hasFocus() && !inactiveText.isEmpty()) {
129 ExLineEdit::paintEvent(event);
130 QStyleOptionFrameV2 panel;
131 initStyleOption(&panel);
132 QRect r = style()->subElementRect(QStyle::SE_LineEditContents, &panel, this);
133 QFontMetrics fm = fontMetrics();
134 int horizontalMargin = lineEdit()->x();
135 QRect lineRect(horizontalMargin + r.x(), r.y() + (r.height() - fm.height() + 1) / 2,
136 r.width() - 2 * horizontalMargin, fm.height());
137 QPainter painter(this);
138 painter.setPen(palette().brush(QPalette::Disabled, QPalette::Text).color());
139 painter.drawText(lineRect, Qt::AlignLeft|Qt::AlignVCenter, inactiveText);
141 ExLineEdit::paintEvent(event);
145 void SearchLineEdit::resizeEvent(QResizeEvent *event) {
147 ExLineEdit::resizeEvent(event);
150 void SearchLineEdit::updateGeometries() {
151 int menuHeight = height();
152 int menuWidth = menuHeight + 1;
153 if (!searchButton->m_menu)
154 menuWidth = (menuHeight / 5) * 4;
155 searchButton->resize(QSize(menuWidth, menuHeight));
158 void SearchLineEdit::setInactiveText(const QString &text) {
162 void SearchLineEdit::setMenu(QMenu *menu) {
163 if (searchButton->m_menu)
164 searchButton->m_menu->deleteLater();
165 searchButton->m_menu = menu;
169 QMenu *SearchLineEdit::menu() const {
170 if (!searchButton->m_menu) {
171 searchButton->m_menu = new QMenu(searchButton);
173 (const_cast<SearchLineEdit*>(this))->updateGeometries();
175 return searchButton->m_menu;
178 void SearchLineEdit::returnPressed() {
179 if (!lineEdit()->text().isEmpty()) {
180 autoComplete->preventSuggest();
181 emit search(lineEdit()->text());
185 void SearchLineEdit::enableSuggest() {
186 autoComplete->enableSuggest();
189 void SearchLineEdit::preventSuggest() {
190 autoComplete->preventSuggest();
193 void SearchLineEdit::focusInEvent(QFocusEvent *event) {
194 ExLineEdit::focusInEvent(event);