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();
void setFilled(bool filled)
void setControlHasText(bool controlHasText)
qreal controlImplicitBackgroundHeight() const
void setControlImplicitBackgroundHeight(qreal controlImplicitBackgroundHeight)
bool controlHasActiveFocus() const
void setFloatingLeftPadding(int floatingLeftPadding)
bool controlHasText() const
void setVerticalPadding(qreal verticalPadding)
void setControlHeight(qreal controlHeight)
qreal verticalPadding() const
void setLeftPadding(int leftPadding)
void componentComplete() override
\reimp Derived classes should call the base class method before adding their own actions to perform a...
int largestHeight() const
qreal controlHeight() const
void setControlHasActiveFocus(bool controlHasActiveFocus)
static QT_BEGIN_NAMESPACE const qreal floatingScale
Q_GLOBAL_STATIC(QEasingCurve, animationEasingCurve, QEasingCurve::OutSine)
qreal controlTopInset(QQuickItem *textControl)