From b29d07c554e5beed0e88b8d75fc42b40b77fee6c Mon Sep 17 00:00:00 2001 From: Friedemann Kleint <Friedemann.Kleint@digia.com> Date: Wed, 21 Aug 2013 13:15:49 +0200 Subject: [PATCH] Use QLineEdit's clear button feature in Active Qt. Remove old filter widget. Change-Id: I1ee7d8695d98044cc22e83fad81dd1f2b486b419 Reviewed-by: Kevin Ottens <kevin.ottens@kdab.com> Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com> Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com> --- src/activeqt/container/container.pro | 2 - src/activeqt/container/filterwidget.cpp | 320 ------------------------ src/activeqt/container/filterwidget_p.h | 150 ----------- src/activeqt/container/qaxselect.cpp | 2 +- src/activeqt/container/qaxselect.ui | 16 +- 5 files changed, 9 insertions(+), 481 deletions(-) delete mode 100644 src/activeqt/container/filterwidget.cpp delete mode 100644 src/activeqt/container/filterwidget_p.h diff --git a/src/activeqt/container/container.pro b/src/activeqt/container/container.pro index 27edf66e..904a0244 100644 --- a/src/activeqt/container/container.pro +++ b/src/activeqt/container/container.pro @@ -9,7 +9,6 @@ HEADERS = ../control/qaxaggregated.h \ qaxobject.h \ qaxscript.h \ qaxselect.h \ - filterwidget_p.h \ ../shared/qaxtypes.h \ ../shared/qaxutils_p.h @@ -20,7 +19,6 @@ SOURCES = qaxbase.cpp \ qaxscript.cpp \ qaxscriptwrapper.cpp \ qaxselect.cpp \ - filterwidget.cpp \ ../shared/qaxtypes.cpp \ ../shared/qaxutils.cpp diff --git a/src/activeqt/container/filterwidget.cpp b/src/activeqt/container/filterwidget.cpp deleted file mode 100644 index b81fdcca..00000000 --- a/src/activeqt/container/filterwidget.cpp +++ /dev/null @@ -1,320 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the ActiveQt framework of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "filterwidget_p.h" - -#include <QtWidgets/QVBoxLayout> -#include <QtWidgets/QHBoxLayout> -#include <QtWidgets/QLineEdit> -#include <QtGui/QFocusEvent> -#include <QtGui/QPalette> -#include <QtGui/QCursor> -#include <QtWidgets/QToolButton> -#include <QtGui/QPainter> -#include <QtWidgets/QStyle> -#include <QtWidgets/QStyleOption> - -#include <QtCore/QDebug> -#include <QtCore/QPropertyAnimation> - -enum { debugFilter = 0 }; - -/* XPM */ -static const char *cleartext_xpm[] = { -"16 16 53 1", -" c None", -". c #2B2B2B", -"+ c #2D2D2D", -"@ c #2F2F2F", -"# c #323232", -"$ c #373737", -"% c #3C3C3C", -"& c #3E3E3E", -"* c #363636", -"= c #404040", -"- c #494949", -"; c #4E4E4E", -"> c #525252", -", c #444444", -"' c #4F4F4F", -") c #9C9C9C", -"! c #6B6B6B", -"~ c #626262", -"{ c #333333", -"] c #414141", -"^ c #9B9B9B", -"/ c #FFFFFF", -"( c #E5E5E5", -"_ c #737373", -": c #3A3A3A", -"< c #4A4A4A", -"[ c #555555", -"} c #5D5D5D", -"| c #E0E0E0", -"1 c #E7E7E7", -"2 c #3F3F3F", -"3 c #5A5A5A", -"4 c #4B4B4B", -"5 c #E2E2E2", -"6 c #424242", -"7 c #5E5E5E", -"8 c #5B5B5B", -"9 c #505050", -"0 c #6A6A6A", -"a c #E3E3E3", -"b c #4D4D4D", -"c c #545454", -"d c #999999", -"e c #DEDEDE", -"f c #474747", -"g c #878787", -"h c #434343", -"i c #414140", -"j c #454545", -"k c #484848", -"l c #484949", -"m c #484748", -"n c #444544", -" ", -" .+@@+. ", -" #$%&&%$# ", -" *=-;>>;-=* ", -" $,')!~~!)',$ ", -" {]'^/(__(/^']{ ", -" :<[}|/11/|}[<: ", -" 2'3>45//54>3'2 ", -" 6>}785//587}>6 ", -" ]930a/||/a039] ", -" &bcd/e%%e/dcb& ", -" f;6gh]ihg6;f ", -" -f=j99j=f- ", -" k<b99b<k ", -" jkl-mn ", -" "}; - -QT_BEGIN_NAMESPACE - -HintLineEdit::HintLineEdit(QWidget *parent) : - QLineEdit(parent), - m_defaultFocusPolicy(focusPolicy()), - m_refuseFocus(false) -{ -} - -IconButton::IconButton(QWidget *parent) - : QToolButton(parent), m_fader(0) -{ - setCursor(Qt::ArrowCursor); -} - -void IconButton::paintEvent(QPaintEvent *) -{ - QPainter painter(this); - // Note isDown should really use the active state but in most styles - // this has no proper feedback - QIcon::Mode state = QIcon::Disabled; - if (isEnabled()) - state = isDown() ? QIcon::Selected : QIcon::Normal; - QPixmap iconpixmap = icon().pixmap(QSize(ICONBUTTON_SIZE, ICONBUTTON_SIZE), - state, QIcon::Off); - QRect pixmapRect = QRect(0, 0, iconpixmap.width(), iconpixmap.height()); - pixmapRect.moveCenter(rect().center()); - painter.setOpacity(m_fader); - painter.drawPixmap(pixmapRect, iconpixmap); -} - -void IconButton::animateShow(bool visible) -{ - if (visible) { - QPropertyAnimation *animation = new QPropertyAnimation(this, "fader"); - animation->setDuration(160); - animation->setEndValue(1.0); - animation->start(QAbstractAnimation::DeleteWhenStopped); - } else { - QPropertyAnimation *animation = new QPropertyAnimation(this, "fader"); - animation->setDuration(160); - animation->setEndValue(0.0); - animation->start(QAbstractAnimation::DeleteWhenStopped); - } -} - -bool HintLineEdit::refuseFocus() const -{ - return m_refuseFocus; -} - -void HintLineEdit::setRefuseFocus(bool v) -{ - if (v == m_refuseFocus) - return; - m_refuseFocus = v; - setFocusPolicy(m_refuseFocus ? Qt::NoFocus : m_defaultFocusPolicy); -} - -void HintLineEdit::mousePressEvent(QMouseEvent *e) -{ - if (debugFilter) - qDebug() << Q_FUNC_INFO; - // Explicitly focus on click. - if (m_refuseFocus && !hasFocus()) - setFocus(Qt::OtherFocusReason); - QLineEdit::mousePressEvent(e); -} - -void HintLineEdit::focusInEvent(QFocusEvent *e) -{ - if (debugFilter) - qDebug() << Q_FUNC_INFO; - if (m_refuseFocus) { - // Refuse the focus if the mouse is outside. In addition to the mouse - // press logic, this prevents a re-focusing which occurs once - // we actually have focus - const Qt::FocusReason reason = e->reason(); - if (reason == Qt::ActiveWindowFocusReason || reason == Qt::PopupFocusReason) { - const QPoint mousePos = mapFromGlobal(QCursor::pos()); - const bool refuse = !geometry().contains(mousePos); - if (debugFilter) - qDebug() << Q_FUNC_INFO << refuse; - if (refuse) { - e->ignore(); - return; - } - } - } - - QLineEdit::focusInEvent(e); -} - -// ------------------- FilterWidget -FilterWidget::FilterWidget(QWidget *parent, LayoutMode lm) : - QWidget(parent), - m_editor(new HintLineEdit(this)), - m_button(new IconButton(m_editor)), - m_buttonwidth(0) -{ - m_editor->setPlaceholderText(tr("Filter")); - - // Let the style determine minimum height for our widget - QSize size(ICONBUTTON_SIZE + 6, ICONBUTTON_SIZE + 2); - - // Note KDE does not reserve space for the highlight color - if (style()->inherits("OxygenStyle")) - size = size.expandedTo(QSize(24, 0)); - - // Make room for clear icon - QMargins margins = m_editor->textMargins(); - if (layoutDirection() == Qt::LeftToRight) - margins.setRight(size.width()); - else - margins.setLeft(size.width()); - - m_editor->setTextMargins(margins); - - QHBoxLayout *l = new QHBoxLayout(this); - l->setMargin(0); - l->setSpacing(0); - if (lm == LayoutAlignRight) - l->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum)); - - l->addWidget(m_editor); - - // KDE has custom icons for this. Notice that icon namings are counter intuitive - // If these icons are not available we use the freedesktop standard name before - // falling back to a bundled resource - QIcon icon = QIcon::fromTheme(layoutDirection() == Qt::LeftToRight ? - QStringLiteral("edit-clear-locationbar-rtl") : - QStringLiteral("edit-clear-locationbar-ltr"), - QIcon::fromTheme(QStringLiteral("edit-clear"), - QIcon(QPixmap(cleartext_xpm)))); - Q_ASSERT(!icon.availableSizes().isEmpty()); - m_button->setIcon(icon); - m_button->setToolTip(tr("Clear text")); - connect(m_button, SIGNAL(clicked()), this, SLOT(reset())); - connect(m_editor, SIGNAL(textChanged(QString)), this, SLOT(checkButton(QString))); - connect(m_editor, SIGNAL(textEdited(QString)), this, SIGNAL(filterChanged(QString))); -} - -QString FilterWidget::text() const -{ - return m_editor->text(); -} - -void FilterWidget::checkButton(const QString &text) -{ - if (m_oldText.isEmpty() || text.isEmpty()) - m_button->animateShow(!m_editor->text().isEmpty()); - m_oldText = text; -} - -void FilterWidget::reset() -{ - if (debugFilter) - qDebug() << Q_FUNC_INFO; - - if (!m_editor->text().isEmpty()) { - // Editor has lost focus once this is pressed - m_editor->clear(); - emit filterChanged(QString()); - } -} - -void FilterWidget::resizeEvent(QResizeEvent *) -{ - QRect contentRect = m_editor->rect(); - if (layoutDirection() == Qt::LeftToRight) { - const int iconoffset = m_editor->textMargins().right() + 4; - m_button->setGeometry(contentRect.adjusted(m_editor->width() - iconoffset, 0, 0, 0)); - } else { - const int iconoffset = m_editor->textMargins().left() + 4; - m_button->setGeometry(contentRect.adjusted(0, 0, -m_editor->width() + iconoffset, 0)); - } -} - -bool FilterWidget::refuseFocus() const -{ - return m_editor->refuseFocus(); -} - -void FilterWidget::setRefuseFocus(bool v) -{ - m_editor->setRefuseFocus(v); -} - -QT_END_NAMESPACE diff --git a/src/activeqt/container/filterwidget_p.h b/src/activeqt/container/filterwidget_p.h deleted file mode 100644 index 36fcfc0c..00000000 --- a/src/activeqt/container/filterwidget_p.h +++ /dev/null @@ -1,150 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the ActiveQt framework of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names -** of its contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists for the convenience -// of Qt Designer. This header -// file may change from version to version without notice, or even be removed. -// -// We mean it. -// - -#ifndef FILTERWIDGET_H -#define FILTERWIDGET_H - -#include <QtWidgets/QWidget> -#include <QtWidgets/QLineEdit> -#include <QtGui/QColor> -#include <QtWidgets/QToolButton> - -QT_BEGIN_NAMESPACE - -class QToolButton; - -/* Note: This a copy of the filter widget found in the qtools repository - * which was modified to contain cleartext.png as inline XPM image data - * and to have LayoutAlignNone as default parameter in the constructor to - * to suit the QAxSelect dialog's needs. - * - * This widget should never have initial focus - * (ie, be the first widget of a dialog, otherwise the hint cannot be displayed. - * For situations, where it is the only focusable control (widget box), - * there is a special "refuseFocus()" mode, in which it clears the focus - * policy and focuses explicitly on click (note that setting Qt::ClickFocus - * is not sufficient for that as an ActivationFocus will occur). */ - -#define ICONBUTTON_SIZE 16 - -class HintLineEdit : public QLineEdit { - Q_OBJECT -public: - explicit HintLineEdit(QWidget *parent = 0); - - bool refuseFocus() const; - void setRefuseFocus(bool v); - -protected: - virtual void mousePressEvent(QMouseEvent *event); - virtual void focusInEvent(QFocusEvent *e); - -private: - const Qt::FocusPolicy m_defaultFocusPolicy; - bool m_refuseFocus; -}; - -// IconButton: This is a simple helper class that represents clickable icons - -class IconButton: public QToolButton -{ - Q_OBJECT - Q_PROPERTY(float fader READ fader WRITE setFader) -public: - IconButton(QWidget *parent); - void paintEvent(QPaintEvent *event); - float fader() { return m_fader; } - void setFader(float value) { m_fader = value; update(); } - void animateShow(bool visible); - -private: - float m_fader; -}; - -// FilterWidget: For filtering item views, with reset button Uses HintLineEdit. - -class FilterWidget : public QWidget -{ - Q_OBJECT -public: - enum LayoutMode { - // For use in toolbars: Expand to the right - LayoutAlignRight, - // No special alignment - LayoutAlignNone - }; - - explicit FilterWidget(QWidget *parent = 0, LayoutMode lm = LayoutAlignNone); - - QString text() const; - void resizeEvent(QResizeEvent *); - bool refuseFocus() const; // see HintLineEdit - void setRefuseFocus(bool v); - -signals: - void filterChanged(const QString &); - -public slots: - void reset(); - -private slots: - void checkButton(const QString &text); - -private: - HintLineEdit *m_editor; - IconButton *m_button; - int m_buttonwidth; - QString m_oldText; -}; - -QT_END_NAMESPACE - -#endif diff --git a/src/activeqt/container/qaxselect.cpp b/src/activeqt/container/qaxselect.cpp index f08ec346..4751d553 100644 --- a/src/activeqt/container/qaxselect.cpp +++ b/src/activeqt/container/qaxselect.cpp @@ -193,7 +193,7 @@ QAxSelect::QAxSelect(QWidget *parent, Qt::WindowFlags flags) connect(d->selectUi.buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(d->selectUi.buttonBox, SIGNAL(rejected()), this, SLOT(reject())); - connect(d->selectUi.filterLineEdit, SIGNAL(filterChanged(QString)), + connect(d->selectUi.filterLineEdit, SIGNAL(textChanged(QString)), this, SLOT(onFilterLineEditChanged(QString))); } diff --git a/src/activeqt/container/qaxselect.ui b/src/activeqt/container/qaxselect.ui index 6c088c7f..8f88e422 100644 --- a/src/activeqt/container/qaxselect.ui +++ b/src/activeqt/container/qaxselect.ui @@ -59,7 +59,14 @@ <item> <layout class="QVBoxLayout" name="verticalLayout"> <item> - <widget class="FilterWidget" name="filterLineEdit"/> + <widget class="QLineEdit" name="filterLineEdit"> + <property name="placeholderText"> + <string>Filter</string> + </property> + <property name="clearButtonEnabled"> + <bool>true</bool> + </property> + </widget> </item> <item> <widget class="QListView" name="ActiveXList"/> @@ -102,13 +109,6 @@ </layout> </widget> <layoutdefault spacing="6" margin="11"/> - <customwidgets> - <customwidget> - <class>FilterWidget</class> - <extends>QWidget</extends> - <header>filterwidget_p.h</header> - </customwidget> - </customwidgets> <includes> <include location="local">qaxwidget.h</include> </includes> -- GitLab