summaryrefslogtreecommitdiffstats
path: root/tests/auto/widgets/widgets
diff options
context:
space:
mode:
authorVitaly Fanaskov <vitaly.fanaskov@qt.io>2018-11-22 14:39:51 +0100
committerVitaly Fanaskov <vitaly.fanaskov@qt.io>2018-11-26 16:03:33 +0000
commitba13c6c08f30a4c2f188f69deeaf4ca6a020d7a1 (patch)
tree9514aa7670bf143de6d258a429a5d02d494dee0d /tests/auto/widgets/widgets
parent70d131af33c8b411f430d0699b4294b5976db8e3 (diff)
Fix calculation of text margin if line edit contains side widgets
The previous implementation leads to infinite chain of showing/hidden line edit under circumstances described in QTBUG-54676. We basically got the situation when size hint were calculated differently depending on the line edit visibility state. In this case toolbar layout have to show/hide extension button and line edit a lot of times and can never leave this "loop" (please note, that the chain is much more complicated in reality): Resize toolbar -> Set layout geometry -> Size is OK to display line edit -> Set layout geometry -> Hide extension button -> Set layout geometry (wrong size is calculated here, so "run out of space") -> Hide line edit -> Set layout geometry -> Show extension button -> Set layout geometry - > Size is OK to display line edit ... And we're in the "loop" Clear button is hidden if there is no text in a line edit. In the previous implementation, the button was always visible, only opacity was changing in order to "hide" the button. It resulted to incorrect size hints (regular and minimum). In the current implementation the button is really hidden/shown, and size hints calculated correctly. Also updated unit test for line edit. Remove code duplication in functions for calculation text margin Fixes: QTBUG-54676 Change-Id: I4549c9ea98e10b750ba855a07037f6392276358b Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
Diffstat (limited to 'tests/auto/widgets/widgets')
-rw-r--r--tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp3
-rw-r--r--tests/auto/widgets/widgets/qtoolbar/tst_qtoolbar.cpp79
2 files changed, 81 insertions, 1 deletions
diff --git a/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp b/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp
index 448e2030bc..95799905de 100644
--- a/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp
+++ b/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp
@@ -4451,10 +4451,11 @@ void tst_QLineEdit::clearButtonVisibleAfterSettingText_QTBUG_45518()
QTRY_VERIFY(clearButton->opacity() > 0);
QTRY_COMPARE(clearButton->cursor().shape(), Qt::ArrowCursor);
- QTest::mouseClick(clearButton, Qt::LeftButton, 0, clearButton->rect().center());
+ QTest::mouseClick(clearButton, Qt::LeftButton, nullptr, clearButton->rect().center());
QTRY_COMPARE(edit.text(), QString());
QTRY_COMPARE(clearButton->opacity(), qreal(0));
+ QVERIFY(clearButton->isHidden());
QTRY_COMPARE(clearButton->cursor().shape(), clearButton->parentWidget()->cursor().shape());
edit.setClearButtonEnabled(false);
diff --git a/tests/auto/widgets/widgets/qtoolbar/tst_qtoolbar.cpp b/tests/auto/widgets/widgets/qtoolbar/tst_qtoolbar.cpp
index 301801ed2e..d6c165642e 100644
--- a/tests/auto/widgets/widgets/qtoolbar/tst_qtoolbar.cpp
+++ b/tests/auto/widgets/widgets/qtoolbar/tst_qtoolbar.cpp
@@ -42,6 +42,7 @@
#include <qlineedit.h>
#include <qkeysequence.h>
#include <qmenu.h>
+#include <qlabel.h>
#include <private/qtoolbarextension_p.h>
QT_FORWARD_DECLARE_CLASS(QAction)
@@ -80,6 +81,8 @@ private slots:
void task191727_layout();
void task197996_visibility();
+
+ void extraCpuConsumption(); // QTBUG-54676
};
@@ -1098,5 +1101,81 @@ void tst_QToolBar::task197996_visibility()
QTRY_VERIFY(toolBar->widgetForAction(pAction)->isVisible());
}
+class ShowHideEventCounter : public QObject
+{
+public:
+ using QObject::QObject;
+
+ bool eventFilter(QObject *watched, QEvent *event) override
+ {
+ if (qobject_cast<QLineEdit*>(watched) && !event->spontaneous()) {
+ if (event->type() == QEvent::Show)
+ ++m_showEventsCount;
+
+ if (event->type() == QEvent::Hide)
+ ++m_hideEventsCount;
+ }
+
+ return QObject::eventFilter(watched, event);
+ }
+
+ uint showEventsCount() const { return m_showEventsCount; }
+ uint hideEventsCount() const { return m_hideEventsCount; }
+
+private:
+ uint m_showEventsCount = 0;
+ uint m_hideEventsCount = 0;
+};
+
+void tst_QToolBar::extraCpuConsumption()
+{
+ QMainWindow mainWindow;
+
+ auto tb = new QToolBar(&mainWindow);
+ tb->setMovable(false);
+
+ auto extensions = tb->findChildren<QToolBarExtension *>();
+ QVERIFY(!extensions.isEmpty());
+
+ auto extensionButton = extensions.at(0);
+ QVERIFY(extensionButton);
+
+ tb->addWidget(new QLabel("Lorem ipsum dolor sit amet"));
+
+ auto le = new QLineEdit;
+ le->setClearButtonEnabled(true);
+ le->setText("Lorem ipsum");
+ tb->addWidget(le);
+
+ mainWindow.addToolBar(tb);
+ mainWindow.show();
+ QVERIFY(QTest::qWaitForWindowActive(&mainWindow));
+
+ auto eventCounter = new ShowHideEventCounter(&mainWindow);
+ le->installEventFilter(eventCounter);
+
+ auto defaultSize = mainWindow.size();
+
+ // Line edit should be hidden now and extension button should be displayed
+ for (double p = 0.7; extensionButton->isHidden() || qFuzzyCompare(p, 0.); p -= 0.01) {
+ mainWindow.resize(int(defaultSize.width() * p), defaultSize.height());
+ }
+ QVERIFY(!extensionButton->isHidden());
+
+ // Line edit should be visible, but smaller
+ for (double p = 0.75; !extensionButton->isHidden() || qFuzzyCompare(p, 1.); p += 0.01) {
+ mainWindow.resize(int(defaultSize.width() * p), defaultSize.height());
+ }
+ QVERIFY(extensionButton->isHidden());
+
+ // Dispatch all pending events
+ qApp->sendPostedEvents();
+ qApp->processEvents();
+
+ QCOMPARE(eventCounter->showEventsCount(), eventCounter->hideEventsCount());
+ QCOMPARE(eventCounter->showEventsCount(), uint(1));
+ QCOMPARE(eventCounter->hideEventsCount(), uint(1));
+}
+
QTEST_MAIN(tst_QToolBar)
#include "tst_qtoolbar.moc"