diff options
author | Friedemann Kleint <Friedemann.Kleint@digia.com> | 2013-06-13 16:23:44 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-08-06 08:19:38 +0200 |
commit | 9ce12cc8de940cdd450a28f4bd079acfc3621aa3 (patch) | |
tree | ca07f5b57179b58caae43f0297be4f4d9834d8e5 /src/widgets/widgets/qlineedit_p.h | |
parent | c207724c9bb8e205e756086950063cc91656e401 (diff) |
Add side widgets to QLineEdit via QAction.
Add QLineEdit::addAction() overloads,
allowing for a variable number of icons or user-defined
widgets.
Change-Id: Id298f18c2f47cc998170357e65cc6098df851aab
Done-with: Kevin.Ottens@kdab.com
Reviewed-by: Thomas Zander <zander@kde.org>
Reviewed-by: Richard J. Moore <rich@kde.org>
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@digia.com>
Diffstat (limited to 'src/widgets/widgets/qlineedit_p.h')
-rw-r--r-- | src/widgets/widgets/qlineedit_p.h | 80 |
1 files changed, 77 insertions, 3 deletions
diff --git a/src/widgets/widgets/qlineedit_p.h b/src/widgets/widgets/qlineedit_p.h index 4eb35b7dc6..19dbde6558 100644 --- a/src/widgets/widgets/qlineedit_p.h +++ b/src/widgets/widgets/qlineedit_p.h @@ -58,7 +58,9 @@ #ifndef QT_NO_LINEEDIT #include "private/qwidget_p.h" #include "QtWidgets/qlineedit.h" +#include "QtWidgets/qtoolbutton.h" #include "QtGui/qtextlayout.h" +#include "QtGui/qicon.h" #include "QtWidgets/qstyleoption.h" #include "QtCore/qbasictimer.h" #include "QtWidgets/qcompleter.h" @@ -69,16 +71,54 @@ QT_BEGIN_NAMESPACE +// QLineEditIconButton: This is a simple helper class that represents clickable icons that fade in with text + +class QLineEditIconButton : public QToolButton +{ + Q_OBJECT + Q_PROPERTY(qreal opacity READ opacity WRITE setOpacity) +public: + enum { IconMargin = 4, IconButtonSize = 16 }; + + explicit QLineEditIconButton(QWidget *parent = 0); + + qreal opacity() const { return m_opacity; } + void setOpacity(qreal value); + void animateShow(bool visible) { startOpacityAnimation(visible ? 1.0 : 0.0); } + +protected: + void paintEvent(QPaintEvent *event); + +private: + void startOpacityAnimation(qreal endValue); + + qreal m_opacity; +}; + class Q_AUTOTEST_EXPORT QLineEditPrivate : public QWidgetPrivate { Q_DECLARE_PUBLIC(QLineEdit) public: + enum SideWidgetFlag { + SideWidgetFadeInWithText = 0x1, + SideWidgetCreatedByWidgetAction = 0x2 + }; + + struct SideWidgetEntry { + SideWidgetEntry(QWidget *w = 0, QAction *a = 0, int _flags = 0) : widget(w), action(a), flags(_flags) {} + + QWidget *widget; + QAction *action; + int flags; + }; + typedef QList<SideWidgetEntry> SideWidgetEntryList; QLineEditPrivate() : control(0), frame(1), contextMenuEnabled(1), cursorVisible(0), dragEnabled(0), clickCausedFocus(0), hscroll(0), vscroll(0), alignment(Qt::AlignLeading | Qt::AlignVCenter), - leftTextMargin(0), topTextMargin(0), rightTextMargin(0), bottomTextMargin(0) + leftTextMargin(0), topTextMargin(0), rightTextMargin(0), bottomTextMargin(0), + lastTextSize(0) { } @@ -145,15 +185,49 @@ public: QBasicTimer dndTimer; void drag(); #endif + void _q_textChanged(const QString &); - int leftTextMargin; + int leftTextMargin; // use effectiveLeftTextMargin() in case of icon. int topTextMargin; - int rightTextMargin; + int rightTextMargin; // use effectiveRightTextMargin() in case of icon. int bottomTextMargin; QString placeholderText; + + QWidget *addAction(QAction *newAction, QAction *before, QLineEdit::ActionPosition, int flags = 0); + void removeAction(const QActionEvent *e); + QSize iconSize() const; + void positionSideWidgets(); + inline bool hasSideWidgets() const { return !leadingSideWidgets.isEmpty() || !trailingSideWidgets.isEmpty(); } + inline const SideWidgetEntryList &leftSideWidgetList() const + { return q_func()->layoutDirection() == Qt::LeftToRight ? leadingSideWidgets : trailingSideWidgets; } + inline const SideWidgetEntryList &rightSideWidgetList() const + { return q_func()->layoutDirection() == Qt::LeftToRight ? trailingSideWidgets : leadingSideWidgets; } + + int effectiveLeftTextMargin() const; + int effectiveRightTextMargin() const; + +private: + typedef QPair<QLineEdit::ActionPosition, int> PositionIndexPair; + + PositionIndexPair findSideWidget(const QAction *a) const; + + SideWidgetEntryList leadingSideWidgets; + SideWidgetEntryList trailingSideWidgets; + int lastTextSize; + mutable QSize m_iconSize; }; +inline int QLineEditPrivate::effectiveLeftTextMargin() const +{ + return leftTextMargin + leftSideWidgetList().size() * (QLineEditIconButton::IconMargin + iconSize().width()); +} + +inline int QLineEditPrivate::effectiveRightTextMargin() const +{ + return rightTextMargin + rightSideWidgetList().size() * (QLineEditIconButton::IconMargin + iconSize().width()); +} + #endif // QT_NO_LINEEDIT QT_END_NAMESPACE |