From ff085e2591e8257c373db1c52475b9b54c3da56b Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Mon, 3 Jul 2017 11:53:44 +0200 Subject: Add property to disable shaping on fonts Major performance improvements can be gained if you know for sure your text does not require any shaping features. This patch adds Qt Quick support for the QFont::PreferNoShaping flag (though as a boolean property to work better with property bindings). [ChangeLog][QtQuick][Text] Added "font.preferShaping" property to Text, TextEdit and TextInput. This makes it possible to improve performance at the expense of some cosmetic font features. Task-number: QTBUG-56728 Change-Id: Ib4e23d5b21b9d4929562df521347285b2586a62e Reviewed-by: Simon Hausmann --- .../data/text/text_bengali_noshaping.qml | 15 +++++++++++++++ .../data/text/text_latin_noshaping.qml | 15 +++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 tests/manual/scenegraph_lancelot/data/text/text_bengali_noshaping.qml create mode 100644 tests/manual/scenegraph_lancelot/data/text/text_latin_noshaping.qml (limited to 'tests') diff --git a/tests/manual/scenegraph_lancelot/data/text/text_bengali_noshaping.qml b/tests/manual/scenegraph_lancelot/data/text/text_bengali_noshaping.qml new file mode 100644 index 0000000000..343d5768e4 --- /dev/null +++ b/tests/manual/scenegraph_lancelot/data/text/text_bengali_noshaping.qml @@ -0,0 +1,15 @@ +import QtQuick 2.0 + +Item { + width: 320 + height: 480 + + Text { + anchors.fill: parent + wrapMode: Text.WrapAtWordBoundaryOrAnywhere + font.family: "Arial" // Should use Lohit Bengali + font.pixelSize: 20 + font.preferShaping: false + text: "ধারা ১: সমস্ত মানুষ স্বাধীনভাবে সমান মর্যাদা এবং অধিকার নিয়ে জন্মগ্রহণ করে। তাঁদের বিবেক এবং বুদ্ধি আছে; সুতরাং সকলেরই একে অপরের প্রতি ভ্রাতৃত্বসুলভ মনোভাব নিয়ে আচরণ করা উচিৎ।" + } +} diff --git a/tests/manual/scenegraph_lancelot/data/text/text_latin_noshaping.qml b/tests/manual/scenegraph_lancelot/data/text/text_latin_noshaping.qml new file mode 100644 index 0000000000..6dc6c2f3d6 --- /dev/null +++ b/tests/manual/scenegraph_lancelot/data/text/text_latin_noshaping.qml @@ -0,0 +1,15 @@ +import QtQuick 2.0 + +Item { + width: 320 + height: 480 + + Text { + anchors.fill: parent + wrapMode: Text.WrapAtWordBoundaryOrAnywhere + font.family: "Arial" + font.pixelSize: 20 + font.preferShaping: false + text: "Are griffins birds or mammals?" + } +} -- cgit v1.2.3 From 5946917178521f5af0e191fa5c53653b07c27034 Mon Sep 17 00:00:00 2001 From: Shawn Rutledge Date: Fri, 25 Aug 2017 13:44:07 +0200 Subject: pointerhandler manual tests: enable hi-dpi scaling by default Change-Id: I6af55e11f02592f122be54d3d235c69537f3f7fc Reviewed-by: Mitch Curtis --- tests/manual/pointer/main.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'tests') diff --git a/tests/manual/pointer/main.cpp b/tests/manual/pointer/main.cpp index 7935b4072c..5f6af79973 100644 --- a/tests/manual/pointer/main.cpp +++ b/tests/manual/pointer/main.cpp @@ -44,6 +44,7 @@ int main(int argc, char *argv[]) { + QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QGuiApplication app(argc, argv); QQmlApplicationEngine engine; -- cgit v1.2.3 From 4c46dce8fd9c9dddddd1d07f56396b3eabb2efc4 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Wed, 28 Jun 2017 14:39:19 +0200 Subject: Make QtQuickTest::mouseEvent use QTest::mouseX Fixes QQuickItem::isUnderMouse returning wrong information when moving the mouse cursor with QtQuickTest::mouseX Also changes TestCase.mouseDrag to actually resemble more what real life does, i.e. send mouse moves with the same localPos if the item has already moved and update tst_drag.qml accordingly Change-Id: I80e4ab097da90d21ba987466c1b82467755a6b56 Reviewed-by: Shawn Rutledge --- tests/auto/qmltest/events/tst_drag.qml | 106 ++++++++++++----------- tests/auto/qmltest/events/tst_events.qml | 5 +- tests/auto/quicktest/quicktest.pro | 3 +- tests/auto/quicktest/testevent/testevent.pro | 8 ++ tests/auto/quicktest/testevent/tst_testevent.cpp | 81 +++++++++++++++++ 5 files changed, 151 insertions(+), 52 deletions(-) create mode 100644 tests/auto/quicktest/testevent/testevent.pro create mode 100644 tests/auto/quicktest/testevent/tst_testevent.cpp (limited to 'tests') diff --git a/tests/auto/qmltest/events/tst_drag.qml b/tests/auto/qmltest/events/tst_drag.qml index ae77247a41..74affb6287 100644 --- a/tests/auto/qmltest/events/tst_drag.qml +++ b/tests/auto/qmltest/events/tst_drag.qml @@ -72,12 +72,14 @@ Rectangle{ height:100 color: "red" property bool updatePositionWhileDragging: false - property var posX: 0 - property var posY: 0 - - function reset() { - fakeHandle.x = 0 - fakeHandle.y = 0 + property double posX: 0 + property double posY: 0 + + function reset(mouseX, mouseY) { + posX = mouseX; + posY = mouseY; + fakeHandle.x = mouseX; + fakeHandle.y = mouseY; spyX.clear() spyY.clear() } @@ -116,52 +118,56 @@ Rectangle{ TestCase { name:"mouserelease" when:windowShown - function test_mouseDrag() { - mouseDrag(container, 10, 10, util.dragThreshold * 2, util.dragThreshold * 3); - compare(container.x, util.dragThreshold - 1); - compare(container.y, util.dragThreshold * 2 - 1); + + function test_mouseDrag_data() { + return [ + { tag: "short", dx: 20, dy: 30 }, + { tag: "long", dx: 70, dy: 60 }, + { tag: "longshort", dx: 70, dy: 20 }, + { tag: "shortlong", dx: 20, dy: 70 } + ]; + } + + function test_mouseDrag(data) { + container.x = 0; + container.y = 0; + mouseDrag(container, 10, 10, data.dx, data.dy); + compare(container.x, data.dx - util.dragThreshold - 1); + compare(container.y, data.dy - util.dragThreshold - 1); + } + + function test_doSomethingInsteadOfDragging_data() { + return [ + { tag: "short", updatePositionWhileDragging: false, dx: 2*util.dragThreshold, dy: 2*util.dragThreshold }, + { tag: "long", updatePositionWhileDragging: false, dx: 10*util.dragThreshold, dy: 10*util.dragThreshold }, + { tag: "nothing_short", updatePositionWhileDragging: false, dx: 0, dy: 2*util.dragThreshold }, + { tag: "long_nothing", updatePositionWhileDragging: false, dx: 10*util.dragThreshold, dy: 0 }, + { tag: "short_update", updatePositionWhileDragging: true, dx: 2*util.dragThreshold, dy: 2*util.dragThreshold }, + { tag: "long_update", updatePositionWhileDragging: true, dx: 10*util.dragThreshold, dy: 10*util.dragThreshold }, + { tag: "nothing_short_up", updatePositionWhileDragging: true, dx: 0, dy: 2*util.dragThreshold }, + { tag: "long_nothing_up", updatePositionWhileDragging: true, dx: 10*util.dragThreshold, dy: 0 }, + ]; } - function test_doSomethingWhileDragging() { - container2.updatePositionWhileDragging = false - // dx and dy are superior to 3 times util.dragThreshold. - // but here the dragging does not update posX and posY - // posX and posY are only updated on mouseRelease - container2.reset() - mouseDrag(container2, container2.x + 10, container2.y + 10, 10*util.dragThreshold, 10*util.dragThreshold); - compare(spyX.count, 1) - compare(spyY.count, 1) - - container2.updatePositionWhileDragging = true - // dx and dy are superior to 3 times util.dragThreshold. - // 3 intermediate mouseMove when dragging - container2.reset() - mouseDrag(container2, container2.x + 10, container2.y + 10, 10*util.dragThreshold, 10*util.dragThreshold); - compare(spyX.count, 3) - compare(spyY.count, 3) - - // dx and dy are inferior to 3 times util.dragThreshold. - // No intermediate mouseMove when dragging, only one mouseMove - container2.reset() - mouseDrag(container2, container2.x + 10, container2.y + 10, 2*util.dragThreshold, 2*util.dragThreshold); - compare(spyX.count, 1) - compare(spyY.count, 1) - - // dx is superior to 3 times util.dragThreshold. - // 3 intermediate mouseMove when dragging on x axis - // no move on the y axis - container2.reset() - mouseDrag(container2, container2.x + 10, container2.y + 10, 10*util.dragThreshold, 0); - compare(spyX.count, 3) - compare(spyY.count, 0) - - // dy is inferior to 3 times util.dragThreshold. - // No intermediate mouseMove when dragging, only one mouseMove on y axis - // no move on the x axis - container2.reset() - mouseDrag(container2, container2.x + 10, container2.y + 10, 0, 2*util.dragThreshold); - compare(spyX.count, 0) - compare(spyY.count, 1) + function test_doSomethingInsteadOfDragging(data) { + var expectedSpyCountX; + var expectedSpyCountY; + + if (!data.updatePositionWhileDragging) { + expectedSpyCountX = data.dx > util.dragThreshold ? 1 : 0; + expectedSpyCountY = data.dy > util.dragThreshold ? 1 : 0; + } else { + expectedSpyCountX = data.dx > util.dragThreshold * 3 ? 3 : + (data.dx > util.dragThreshold ? 1 : 0); + expectedSpyCountY = data.dy > util.dragThreshold * 3 ? 3 : + (data.dy > util.dragThreshold ? 1 : 0); + } + + container2.updatePositionWhileDragging = data.updatePositionWhileDragging; + container2.reset(container2.x + 10, container2.y + 10); + mouseDrag(container2, container2.x + 10, container2.y + 10, data.dx, data.dy); + compare(spyX.count, expectedSpyCountX) + compare(spyY.count, expectedSpyCountY) } } } diff --git a/tests/auto/qmltest/events/tst_events.qml b/tests/auto/qmltest/events/tst_events.qml index d9868a316c..b3995e99c0 100644 --- a/tests/auto/qmltest/events/tst_events.qml +++ b/tests/auto/qmltest/events/tst_events.qml @@ -59,9 +59,10 @@ Rectangle { Window { id: sub - visible: true + visible: false property bool clicked: false MouseArea { + id: subMouseArea anchors.fill: parent onClicked: sub.clicked = true } @@ -101,6 +102,8 @@ Rectangle { } function test_mouse_click_subwindow() { + sub.visible = true; + waitForRendering(subMouseArea); // Since we don't have a waitForWindowShown mouseClick(sub) tryCompare(sub, "clicked", true, 10000) } diff --git a/tests/auto/quicktest/quicktest.pro b/tests/auto/quicktest/quicktest.pro index 3b4ec23a64..ee22131753 100644 --- a/tests/auto/quicktest/quicktest.pro +++ b/tests/auto/quicktest/quicktest.pro @@ -1,3 +1,4 @@ TEMPLATE = subdirs SUBDIRS = \ - signalspy + signalspy \ + testevent diff --git a/tests/auto/quicktest/testevent/testevent.pro b/tests/auto/quicktest/testevent/testevent.pro new file mode 100644 index 0000000000..bd97e13b89 --- /dev/null +++ b/tests/auto/quicktest/testevent/testevent.pro @@ -0,0 +1,8 @@ +CONFIG += testcase +TARGET = tst_testevent +macos:CONFIG -= app_bundle + +SOURCES += tst_testevent.cpp +QT += quick testlib qmltest-private + +include (../../shared/util.pri) diff --git a/tests/auto/quicktest/testevent/tst_testevent.cpp b/tests/auto/quicktest/testevent/tst_testevent.cpp new file mode 100644 index 0000000000..8adb98f33b --- /dev/null +++ b/tests/auto/quicktest/testevent/tst_testevent.cpp @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include + +#include +#include +#include "QtQuickTest/private/quicktestevent_p.h" + +class tst_testevent : public QObject +{ + Q_OBJECT +public: + +private slots: + void moveSetsQuickItemIsUnderMouse(); +}; + +void tst_testevent::moveSetsQuickItemIsUnderMouse() +{ + QQuickWindow w; + w.resize(400, 400); + w.show(); + w.requestActivate(); + QTest::qWaitForWindowActive(&w); + + QTRY_COMPARE(QGuiApplication::focusWindow(), &w); + + QQuickItem *item = new QQuickItem(w.contentItem()); + item->setX(0); + item->setY(0); + item->setWidth(100); + item->setHeight(100); + + QQuickItem *item2 = new QQuickItem(w.contentItem()); + item2->setX(100); + item2->setY(100); + item2->setWidth(100); + item2->setHeight(100); + + QuickTestEvent te; + te.mouseMove(w.contentItem(), 10, 10, /*delay*/ -1, Qt::NoButton); + + QVERIFY(item->isUnderMouse()); + QVERIFY(!item2->isUnderMouse()); + + te.mouseMove(w.contentItem(), 110, 110, /*delay*/ -1, Qt::NoButton); + + QVERIFY(!item->isUnderMouse()); + QVERIFY(item2->isUnderMouse()); + +} + +QTEST_MAIN(tst_testevent) + +#include "tst_testevent.moc" -- cgit v1.2.3