summaryrefslogtreecommitdiffstats
path: root/src/widgets
diff options
context:
space:
mode:
authorQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2018-11-27 01:00:36 +0100
committerQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2018-11-27 01:00:36 +0100
commitec5e692c1c4d8576d19723bb1193703275efdc90 (patch)
tree976b6844203d60d4bf0b4c65dcfaf8eba7621506 /src/widgets
parentf91d1e08099e67c77c8d7bcda362f07eec054ae8 (diff)
parentba13c6c08f30a4c2f188f69deeaf4ca6a020d7a1 (diff)
Merge remote-tracking branch 'origin/5.12' into dev
Diffstat (limited to 'src/widgets')
-rw-r--r--src/widgets/dialogs/qmessagebox.cpp5
-rw-r--r--src/widgets/graphicsview/qgraphicsproxywidget.cpp8
-rw-r--r--src/widgets/kernel/qwidget.cpp29
-rw-r--r--src/widgets/kernel/qwidget_p.h1
-rw-r--r--src/widgets/kernel/qwindowcontainer.cpp6
-rw-r--r--src/widgets/widgets/qlineedit.cpp5
-rw-r--r--src/widgets/widgets/qlineedit_p.cpp98
-rw-r--r--src/widgets/widgets/qlineedit_p.h15
8 files changed, 116 insertions, 51 deletions
diff --git a/src/widgets/dialogs/qmessagebox.cpp b/src/widgets/dialogs/qmessagebox.cpp
index 32190151bc..ffbbe82856 100644
--- a/src/widgets/dialogs/qmessagebox.cpp
+++ b/src/widgets/dialogs/qmessagebox.cpp
@@ -1832,8 +1832,9 @@ void QMessageBox::aboutQt(QWidget *parent, const QString &title)
"<h3>About Qt</h3>"
"<p>This program uses Qt version %1.</p>"
).arg(QLatin1String(QT_VERSION_STR));
- QString translatedTextAboutQtText;
- translatedTextAboutQtText = QMessageBox::tr(
+ //: Leave this text untranslated or include a verbatim copy of it below
+ //: and note that it is the authoritative version in case of doubt.
+ const QString translatedTextAboutQtText = QMessageBox::tr(
"<p>Qt is a C++ toolkit for cross-platform application "
"development.</p>"
"<p>Qt provides single-source portability across all major desktop "
diff --git a/src/widgets/graphicsview/qgraphicsproxywidget.cpp b/src/widgets/graphicsview/qgraphicsproxywidget.cpp
index 177dbc4871..513cf9d361 100644
--- a/src/widgets/graphicsview/qgraphicsproxywidget.cpp
+++ b/src/widgets/graphicsview/qgraphicsproxywidget.cpp
@@ -607,20 +607,20 @@ void QGraphicsProxyWidgetPrivate::setWidget_helper(QWidget *newWidget, bool auto
for (QGraphicsItem *child : childItems) {
if (child->d_ptr->isProxyWidget()) {
QGraphicsProxyWidget *childProxy = static_cast<QGraphicsProxyWidget *>(child);
- QWidget * parent = childProxy->widget();
- while (parent->parentWidget() != 0) {
+ QWidget *parent = childProxy->widget();
+ while (parent && parent->parentWidget()) {
if (parent == widget)
break;
parent = parent->parentWidget();
}
if (!childProxy->widget() || parent != widget)
continue;
- childProxy->setWidget(0);
+ childProxy->setWidget(nullptr);
delete childProxy;
}
}
- widget = 0;
+ widget = nullptr;
#ifndef QT_NO_CURSOR
q->unsetCursor();
#endif
diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp
index 85a89b717e..ccfd3534cd 100644
--- a/src/widgets/kernel/qwidget.cpp
+++ b/src/widgets/kernel/qwidget.cpp
@@ -1775,7 +1775,6 @@ void QWidgetPrivate::createTLExtra()
x->posIncludesFrame = 0;
x->sizeAdjusted = false;
x->inTopLevelResize = false;
- x->inRepaint = false;
x->embedded = 0;
x->window = 0;
x->shareContext = 0;
@@ -6596,20 +6595,25 @@ QWidget *QWidgetPrivate::deepestFocusProxy() const
return focusProxy;
}
+static inline bool isEmbedded(const QWindow *w)
+{
+ const auto platformWindow = w->handle();
+ return platformWindow && platformWindow->isEmbedded();
+}
+
void QWidgetPrivate::setFocus_sys()
{
Q_Q(QWidget);
// Embedded native widget may have taken the focus; get it back to toplevel
// if that is the case (QTBUG-25852)
- const QWidget *topLevel = q->window();
- // Do not activate in case the popup menu opens another application (QTBUG-70810).
- if (QGuiApplication::applicationState() == Qt::ApplicationActive
- && topLevel->windowType() != Qt::Popup) {
- if (QWindow *nativeWindow = q->window()->windowHandle()) {
- if (nativeWindow != QGuiApplication::focusWindow()
- && q->testAttribute(Qt::WA_WState_Created)) {
- nativeWindow->requestActivate();
- }
+ // Do not activate in case the popup menu opens another application (QTBUG-70810)
+ // unless the application is embedded (QTBUG-71991).
+ if (QWindow *nativeWindow = q->testAttribute(Qt::WA_WState_Created) ? q->window()->windowHandle() : nullptr) {
+ if (nativeWindow->type() != Qt::Popup && nativeWindow != QGuiApplication::focusWindow()
+ && (QGuiApplication::applicationState() == Qt::ApplicationActive
+ || QCoreApplication::testAttribute(Qt::AA_PluginApplication)
+ || isEmbedded(nativeWindow))) {
+ nativeWindow->requestActivate();
}
}
}
@@ -11036,11 +11040,8 @@ void QWidgetPrivate::repaint(T r)
return;
QTLWExtra *tlwExtra = q->window()->d_func()->maybeTopData();
- if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore) {
- tlwExtra->inRepaint = true;
+ if (tlwExtra && !tlwExtra->inTopLevelResize && tlwExtra->backingStore)
tlwExtra->backingStoreTracker->markDirty(r, q, QWidgetBackingStore::UpdateNow);
- tlwExtra->inRepaint = false;
- }
}
/*!
diff --git a/src/widgets/kernel/qwidget_p.h b/src/widgets/kernel/qwidget_p.h
index 0c7a5b1944..7ebc2cd58e 100644
--- a/src/widgets/kernel/qwidget_p.h
+++ b/src/widgets/kernel/qwidget_p.h
@@ -190,7 +190,6 @@ struct QTLWExtra {
uint posIncludesFrame : 1;
uint sizeAdjusted : 1;
uint inTopLevelResize : 1;
- uint inRepaint : 1;
uint embedded : 1;
// *************************** Platform specific values (bit fields first) **********
diff --git a/src/widgets/kernel/qwindowcontainer.cpp b/src/widgets/kernel/qwindowcontainer.cpp
index 81916bba90..d2680e5280 100644
--- a/src/widgets/kernel/qwindowcontainer.cpp
+++ b/src/widgets/kernel/qwindowcontainer.cpp
@@ -227,6 +227,12 @@ QWindowContainer::QWindowContainer(QWindow *embeddedWindow, QWidget *parent, Qt:
embeddedWindow->setSurfaceType(QSurface::RasterGLSurface);
d->window = embeddedWindow;
+
+ QString windowName = d->window->objectName();
+ if (windowName.isEmpty())
+ windowName = QString::fromUtf8(d->window->metaObject()->className());
+ d->fakeParent.setObjectName(windowName + "ContainerFakeParent");
+
d->window->setParent(&d->fakeParent);
setAcceptDrops(true);
diff --git a/src/widgets/widgets/qlineedit.cpp b/src/widgets/widgets/qlineedit.cpp
index 242a4405ca..2ae2e16c89 100644
--- a/src/widgets/widgets/qlineedit.cpp
+++ b/src/widgets/widgets/qlineedit.cpp
@@ -488,7 +488,10 @@ void QLineEdit::setClearButtonEnabled(bool enable)
QAction *clearAction = new QAction(d->clearButtonIcon(), QString(), this);
clearAction->setEnabled(!isReadOnly());
clearAction->setObjectName(QLatin1String(clearButtonActionNameC));
- d->addAction(clearAction, 0, QLineEdit::TrailingPosition, QLineEditPrivate::SideWidgetClearButton | QLineEditPrivate::SideWidgetFadeInWithText);
+
+ int flags = QLineEditPrivate::SideWidgetClearButton | QLineEditPrivate::SideWidgetFadeInWithText;
+ auto widgetAction = d->addAction(clearAction, nullptr, QLineEdit::TrailingPosition, flags);
+ widgetAction->setVisible(!text().isEmpty());
} else {
QAction *clearAction = findChild<QAction *>(QLatin1String(clearButtonActionNameC));
Q_ASSERT(clearAction);
diff --git a/src/widgets/widgets/qlineedit_p.cpp b/src/widgets/widgets/qlineedit_p.cpp
index df8d534afa..6dcb2dd693 100644
--- a/src/widgets/widgets/qlineedit_p.cpp
+++ b/src/widgets/widgets/qlineedit_p.cpp
@@ -392,9 +392,47 @@ void QLineEditIconButton::setOpacity(qreal value)
}
#if QT_CONFIG(animation)
+bool QLineEditIconButton::shouldHideWithText() const
+{
+ return m_hideWithText;
+}
+
+void QLineEditIconButton::setHideWithText(bool hide)
+{
+ m_hideWithText = hide;
+}
+
+void QLineEditIconButton::onAnimationFinished()
+{
+ if (shouldHideWithText() && isVisible() && !m_wasHidden) {
+ hide();
+
+ // Invalidate previous geometry to take into account new size of side widgets
+ if (auto le = lineEditPrivate())
+ le->updateGeometry_helper(true);
+ }
+}
+
+void QLineEditIconButton::animateShow(bool visible)
+{
+ m_wasHidden = visible;
+
+ if (shouldHideWithText() && !isVisible()) {
+ show();
+
+ // Invalidate previous geometry to take into account new size of side widgets
+ if (auto le = lineEditPrivate())
+ le->updateGeometry_helper(true);
+ }
+
+ startOpacityAnimation(visible ? 1.0 : 0.0);
+}
+
void QLineEditIconButton::startOpacityAnimation(qreal endValue)
{
QPropertyAnimation *animation = new QPropertyAnimation(this, QByteArrayLiteral("opacity"));
+ connect(animation, &QPropertyAnimation::finished, this, &QLineEditIconButton::onAnimationFinished);
+
animation->setDuration(160);
animation->setEndValue(endValue);
animation->start(QAbstractAnimation::DeleteWhenStopped);
@@ -409,6 +447,16 @@ void QLineEditIconButton::updateCursor()
}
#endif // QT_CONFIG(toolbutton)
+#if QT_CONFIG(animation) && QT_CONFIG(toolbutton)
+static void displayWidgets(const QLineEditPrivate::SideWidgetEntryList &widgets, bool display)
+{
+ for (const auto &e : widgets) {
+ if (e.flags & QLineEditPrivate::SideWidgetFadeInWithText)
+ static_cast<QLineEditIconButton *>(e.widget)->animateShow(display);
+ }
+}
+#endif
+
void QLineEditPrivate::_q_textChanged(const QString &text)
{
if (hasSideWidgets()) {
@@ -416,15 +464,9 @@ void QLineEditPrivate::_q_textChanged(const QString &text)
if (!newTextSize || !lastTextSize) {
lastTextSize = newTextSize;
#if QT_CONFIG(animation) && QT_CONFIG(toolbutton)
- const bool fadeIn = newTextSize > 0;
- for (const SideWidgetEntry &e : leadingSideWidgets) {
- if (e.flags & SideWidgetFadeInWithText)
- static_cast<QLineEditIconButton *>(e.widget)->animateShow(fadeIn);
- }
- for (const SideWidgetEntry &e : trailingSideWidgets) {
- if (e.flags & SideWidgetFadeInWithText)
- static_cast<QLineEditIconButton *>(e.widget)->animateShow(fadeIn);
- }
+ const bool display = newTextSize > 0;
+ displayWidgets(leadingSideWidgets, display);
+ displayWidgets(trailingSideWidgets, display);
#endif
}
}
@@ -541,8 +583,15 @@ QWidget *QLineEditPrivate::addAction(QAction *newAction, QAction *before, QLineE
QLineEditIconButton *toolButton = new QLineEditIconButton(q);
toolButton->setIcon(newAction->icon());
toolButton->setOpacity(lastTextSize > 0 || !(flags & SideWidgetFadeInWithText) ? 1 : 0);
- if (flags & SideWidgetClearButton)
+ if (flags & SideWidgetClearButton) {
QObject::connect(toolButton, SIGNAL(clicked()), q, SLOT(_q_clearButtonClicked()));
+
+#if QT_CONFIG(animation)
+ // The clear button is handled only by this widget. The button should be really
+ // shown/hidden in order to calculate size hints correctly.
+ toolButton->setHideWithText(true);
+#endif
+ }
toolButton->setDefaultAction(newAction);
w = toolButton;
#else
@@ -606,33 +655,26 @@ void QLineEditPrivate::removeAction(QAction *action)
#endif // QT_CONFIG(action)
}
-static bool isSideWidgetVisible(const QLineEditPrivate::SideWidgetEntry &e)
+static int effectiveTextMargin(int defaultMargin, const QLineEditPrivate::SideWidgetEntryList &widgets,
+ const QLineEditPrivate::SideWidgetParameters &parameters)
{
- return e.widget->isVisible();
+ if (widgets.empty())
+ return defaultMargin;
+
+ return defaultMargin + (parameters.margin + parameters.widgetWidth) *
+ int(std::count_if(widgets.begin(), widgets.end(),
+ [](const QLineEditPrivate::SideWidgetEntry &e) {
+ return e.widget->isVisibleTo(e.widget->parentWidget()); }));
}
int QLineEditPrivate::effectiveLeftTextMargin() const
{
- int result = leftTextMargin;
- if (!leftSideWidgetList().empty()) {
- const SideWidgetParameters p = sideWidgetParameters();
- result += (p.margin + p.widgetWidth)
- * int(std::count_if(leftSideWidgetList().begin(), leftSideWidgetList().end(),
- isSideWidgetVisible));
- }
- return result;
+ return effectiveTextMargin(leftTextMargin, leftSideWidgetList(), sideWidgetParameters());
}
int QLineEditPrivate::effectiveRightTextMargin() const
{
- int result = rightTextMargin;
- if (!rightSideWidgetList().empty()) {
- const SideWidgetParameters p = sideWidgetParameters();
- result += (p.margin + p.widgetWidth)
- * int(std::count_if(rightSideWidgetList().begin(), rightSideWidgetList().end(),
- isSideWidgetVisible));
- }
- return result;
+ return effectiveTextMargin(rightTextMargin, rightSideWidgetList(), sideWidgetParameters());
}
diff --git a/src/widgets/widgets/qlineedit_p.h b/src/widgets/widgets/qlineedit_p.h
index 7cd91dfc29..12a2f1ddfd 100644
--- a/src/widgets/widgets/qlineedit_p.h
+++ b/src/widgets/widgets/qlineedit_p.h
@@ -90,7 +90,10 @@ public:
qreal opacity() const { return m_opacity; }
void setOpacity(qreal value);
#if QT_CONFIG(animation)
- void animateShow(bool visible) { startOpacityAnimation(visible ? 1.0 : 0.0); }
+ void animateShow(bool visible);
+
+ bool shouldHideWithText() const;
+ void setHideWithText(bool hide);
#endif
protected:
@@ -100,6 +103,10 @@ protected:
private slots:
void updateCursor();
+#if QT_CONFIG(animation)
+ void onAnimationFinished();
+#endif
+
private:
#if QT_CONFIG(animation)
void startOpacityAnimation(qreal endValue);
@@ -107,6 +114,12 @@ private:
QLineEditPrivate *lineEditPrivate() const;
qreal m_opacity;
+
+#if QT_CONFIG(animation)
+ bool m_hideWithText = false;
+ bool m_wasHidden = false;
+#endif
+
};
#endif // QT_CONFIG(toolbutton)