7#include <QtCore/qpropertyanimation.h>
8#include <QtCore/qparallelanimationgroup.h>
9#include <QtGui/qpainter.h>
10#include <QtGui/qpainterpath.h>
11#include <QtQml/qqmlinfo.h>
12#include <QtQuickTemplates2/private/qquicktheme_p.h>
13#include <QtQuickTemplates2/private/qquicktextarea_p.h>
14#include <QtQuickTemplates2/private/qquicktextfield_p.h>
22
23
24
25
26
27
28
31 : QQuickPlaceholderText(parent)
33 connect(
this, &QQuickMaterialPlaceholderText::effectiveHorizontalAlignmentChanged,
34 this, &QQuickMaterialPlaceholderText::adjustTransformOrigin);
44 if (filled == m_filled)
54 return m_controlHasActiveFocus;
59 if (m_controlHasActiveFocus == controlHasActiveFocus)
62 m_controlHasActiveFocus = controlHasActiveFocus;
63 controlActiveFocusChanged();
64 emit controlHasActiveFocusChanged();
69 return m_controlHasText;
74 if (m_controlHasText == controlHasText)
77 m_controlHasText = controlHasText;
78 updateFocusAnimation();
79 emit controlHasTextChanged();
83
84
85
86
87
90 const bool controlHasActiveFocusOrText = m_controlHasActiveFocus || m_controlHasText;
92 ? controlHasActiveFocusOrText
93 : !text().isEmpty() && controlHasActiveFocusOrText;
100 : !m_controlHasText && !text().isEmpty();
105 setY(shouldFloat() ? floatingTargetY() : normalTargetY());
110 setX(shouldFloat() ? floatingTargetX() : normalTargetX());
115 if (
const auto textArea = qobject_cast<QQuickTextArea *>(textControl))
116 return textArea->topInset();
118 if (
const auto textField = qobject_cast<QQuickTextField *>(textControl))
119 return textField->topInset();
126 auto *textArea = qobject_cast<QQuickTextArea *>(textControl());
127 if (textArea && m_controlHeight >= textArea->implicitHeight()) {
135 return ((m_controlImplicitBackgroundHeight - m_largestHeight) / 2.0)
136 + controlTopInset(textControl());
140 return (m_controlHeight - height()) / 2.0;
148 return m_verticalPadding;
152 return (-m_largestHeight / 2.0) + controlTopInset(textControl());
157 return m_leftPadding;
162 return m_floatingLeftPadding;
166
167
168
169
172 return m_largestHeight;
177 return m_controlImplicitBackgroundHeight;
182 if (qFuzzyCompare(m_controlImplicitBackgroundHeight, controlImplicitBackgroundHeight))
185 m_controlImplicitBackgroundHeight = controlImplicitBackgroundHeight;
186 updateFocusAnimation();
187 emit controlImplicitBackgroundHeightChanged();
191
192
193
194
195
196
197
198
199
202 return m_controlHeight;
207 if (qFuzzyCompare(m_controlHeight, controlHeight))
210 m_controlHeight = controlHeight;
211 updateFocusAnimation();
216 return m_verticalPadding;
221 if (qFuzzyCompare(m_verticalPadding, verticalPadding))
224 m_verticalPadding = verticalPadding;
225 updateFocusAnimation();
226 emit verticalPaddingChanged();
231 if (leftPadding == m_leftPadding)
234 m_leftPadding = leftPadding;
235 updateFocusAnimation();
240 if (floatingLeftPadding == m_floatingLeftPadding)
243 m_floatingLeftPadding = floatingLeftPadding;
244 updateFocusAnimation();
249 switch (effectiveHAlign()) {
250 case QQuickText::AlignLeft:
252 case QQuickText::AlignJustify:
253 setTransformOrigin(QQuickItem::Left);
255 case QQuickText::AlignRight:
256 setTransformOrigin(QQuickItem::Right);
258 case QQuickText::AlignHCenter:
259 setTransformOrigin(QQuickItem::Center);
266 if (m_focusAnimation) {
271 m_focusAnimation->stop();
272 m_focusAnimation.clear();
274 updateFocusAnimation(
true);
279 if (shouldAnimate() && (m_focusAnimation || createIfNeeded)) {
281 if (m_focusAnimation) {
282 duration = m_focusAnimation->totalDuration() - m_focusAnimation->currentTime();
283 m_focusAnimation->stop();
284 m_focusAnimation.clear();
287 m_focusAnimation =
new QParallelAnimationGroup(
this);
289 auto *yAnimation =
new QPropertyAnimation(
this,
"y",
this);
290 yAnimation->setDuration(duration);
291 yAnimation->setStartValue(y());
292 yAnimation->setEndValue(shouldFloat() ? floatingTargetY() : normalTargetY());
293 yAnimation->setEasingCurve(*animationEasingCurve);
294 m_focusAnimation->addAnimation(yAnimation);
296 QPropertyAnimation *xAnimation =
new QPropertyAnimation(
this,
"x",
this);
297 xAnimation->setDuration(duration);
298 xAnimation->setStartValue(x());
299 xAnimation->setEndValue(shouldFloat() ? floatingTargetX() : normalTargetX());
300 xAnimation->setEasingCurve(*animationEasingCurve);
301 m_focusAnimation->addAnimation(xAnimation);
303 auto *scaleAnimation =
new QPropertyAnimation(
this,
"scale",
this);
304 scaleAnimation->setDuration(duration);
305 scaleAnimation->setStartValue(scale());
306 scaleAnimation->setEndValue(shouldFloat() ? floatingScale : 1.0);
307 yAnimation->setEasingCurve(*animationEasingCurve);
308 m_focusAnimation->addAnimation(scaleAnimation);
310 m_focusAnimation->start(QAbstractAnimation::DeleteWhenStopped);
312 if (m_focusAnimation) {
313 m_focusAnimation->stop();
314 m_focusAnimation.clear();
318 setScale(shouldFloat() ? floatingScale : 1.0);
324 QQuickPlaceholderText::componentComplete();
326 adjustTransformOrigin();
328 m_largestHeight = implicitHeight();
329 if (m_largestHeight > 0) {
330 emit largestHeightChanged();
332 qmlWarning(
this) <<
"Expected implicitHeight of placeholder text" << text()
333 <<
"to be greater than 0 by component completion!";
336 updateFocusAnimation();
Combined button and popup list for selecting options.
static QT_BEGIN_NAMESPACE const qreal floatingScale
Q_GLOBAL_STATIC(QEasingCurve, animationEasingCurve, QEasingCurve::OutSine)
qreal controlTopInset(QQuickItem *textControl)