1 #include "exlineedit.h"
4 ClearButton::ClearButton(QWidget *parent) : QAbstractButton(parent), hovered(false), mousePressed(false) {
5 setCursor(Qt::ArrowCursor);
6 setToolTip(tr("Clear"));
8 setFocusPolicy(Qt::NoFocus);
11 void ClearButton::paintEvent(QPaintEvent *e) {
13 QPainter painter(this);
14 const int h = height();
16 if (h > 30) iconSize = 22;
17 QIcon::Mode iconMode = QIcon::Normal;
18 if (mousePressed) iconMode = QIcon::Active;
19 QPixmap p = IconUtils::icon("edit-clear").pixmap(iconSize, iconSize, iconMode);
20 int x = (width() - p.width()) / 2;
21 int y = (h - p.height()) / 2;
22 painter.drawPixmap(x, y, p);
25 void ClearButton::textChanged(const QString &text) {
26 setVisible(!text.isEmpty());
29 void ClearButton::enterEvent(QEvent *e) {
34 void ClearButton::leaveEvent(QEvent *e) {
39 void ClearButton::mousePressEvent(QMouseEvent *e) {
44 void ClearButton::mouseReleaseEvent(QMouseEvent *e) {
49 ExLineEdit::ExLineEdit(QWidget *parent)
52 , m_lineEdit(new QLineEdit(this))
53 , m_clearButton(new ClearButton(this)) {
54 setFocusPolicy(m_lineEdit->focusPolicy());
55 setAttribute(Qt::WA_InputMethodEnabled);
56 setSizePolicy(m_lineEdit->sizePolicy());
57 setBackgroundRole(m_lineEdit->backgroundRole());
58 setMouseTracking(true);
60 setAttribute(Qt::WA_MacShowFocusRect, true);
61 QPalette p = m_lineEdit->palette();
65 m_lineEdit->setFrame(false);
66 m_lineEdit->setFocusProxy(this);
67 m_lineEdit->setAttribute(Qt::WA_MacShowFocusRect, false);
68 m_lineEdit->setStyleSheet("background:transparent");
69 QPalette clearPalette = m_lineEdit->palette();
70 clearPalette.setBrush(QPalette::Base, QBrush(Qt::transparent));
71 m_lineEdit->setPalette(clearPalette);
74 connect(m_clearButton, SIGNAL(clicked()), m_lineEdit, SLOT(clear()));
75 connect(m_lineEdit, SIGNAL(textChanged(const QString&)), m_clearButton, SLOT(textChanged(const QString&)));
78 void ExLineEdit::setFont(const QFont &font) {
79 m_lineEdit->setFont(font);
83 void ExLineEdit::setLeftWidget(QWidget *widget) {
84 m_leftWidget = widget;
87 QWidget *ExLineEdit::leftWidget() const {
91 void ExLineEdit::clear() {
95 QString ExLineEdit::text() {
96 return m_lineEdit->text();
99 void ExLineEdit::resizeEvent(QResizeEvent *e) {
100 Q_ASSERT(m_leftWidget);
102 QWidget::resizeEvent(e);
105 void ExLineEdit::updateGeometries() {
106 QStyleOptionFrameV2 panel;
107 initStyleOption(&panel);
108 QRect rect = style()->subElementRect(QStyle::SE_LineEditContents, &panel, this);
111 // int height = rect.height() + padding*2;
112 int width = rect.width();
114 // int m_leftWidgetHeight = m_leftWidget->height();
115 m_leftWidget->setGeometry(rect.x() + 2, 0,
116 m_leftWidget->width(), m_leftWidget->height());
118 int clearButtonWidth = this->height();
119 m_lineEdit->setGeometry(m_leftWidget->x() + m_leftWidget->width(), padding,
120 width - clearButtonWidth - m_leftWidget->width(), this->height() - padding*2);
122 m_clearButton->setGeometry(this->width() - clearButtonWidth, 0,
123 clearButtonWidth, this->height());
126 void ExLineEdit::initStyleOption(QStyleOptionFrameV2 *option) const {
127 option->initFrom(this);
128 option->rect = contentsRect();
129 option->lineWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth, option, this);
130 option->midLineWidth = 0;
131 option->state |= QStyle::State_Sunken;
132 if (m_lineEdit->isReadOnly())
133 option->state |= QStyle::State_ReadOnly;
134 #ifdef QT_KEYPAD_NAVIGATION
136 option->state |= QStyle::State_HasEditFocus;
138 option->features = QStyleOptionFrameV2::None;
141 QSize ExLineEdit::sizeHint() const {
142 m_lineEdit->setFrame(true);
143 QSize size = m_lineEdit->sizeHint();
144 m_lineEdit->setFrame(false);
145 size = size + QSize(3, 3);
149 void ExLineEdit::focusInEvent(QFocusEvent *e) {
150 m_lineEdit->event(e);
151 QWidget::focusInEvent(e);
154 void ExLineEdit::focusOutEvent(QFocusEvent *e) {
155 m_lineEdit->event(e);
157 if (m_lineEdit->completer()) {
158 connect(m_lineEdit->completer(), SIGNAL(activated(QString)),
159 m_lineEdit, SLOT(setText(QString)));
160 connect(m_lineEdit->completer(), SIGNAL(highlighted(QString)),
161 m_lineEdit, SLOT(_q_completionHighlighted(QString)));
163 QWidget::focusOutEvent(e);
166 void ExLineEdit::keyPressEvent(QKeyEvent *e) {
167 if (e->key() == Qt::Key_Escape && !m_lineEdit->text().isEmpty()) {
170 m_lineEdit->event(e);
171 QWidget::keyPressEvent(e);
174 bool ExLineEdit::event(QEvent *e) {
175 if (e->type() == QEvent::ShortcutOverride || e->type() == QEvent::InputMethod)
176 m_lineEdit->event(e);
177 return QWidget::event(e);
180 void ExLineEdit::paintEvent(QPaintEvent *e) {
183 QStyleOptionFrameV2 panel;
184 initStyleOption(&panel);
185 style()->drawPrimitive(QStyle::PE_PanelLineEdit, &panel, &p, this);