blob: 57d5ccccf6c0e9f12f0c8b4f72819a01a0268d8e [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2017 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:BSD$
** 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.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/
import QtQuick 2.12
import QtTest 1.0
import QtQuick.Controls 2.12
import QtQuick.Templates 2.12 as T
TestCase {
id: testCase
width: 400
height: 400
visible: true
when: windowShown
name: "Popup"
ApplicationWindow {
id: applicationWindow
width: 480
height: 360
}
Component {
id: popupTemplate
T.Popup { }
}
Component {
id: popupControl
Popup { }
}
Component {
id: rect
Rectangle { }
}
Component {
id: signalSpy
SignalSpy { }
}
function test_padding() {
var control = createTemporaryObject(popupTemplate, testCase)
verify(control)
var paddingSpy = createTemporaryObject(signalSpy, testCase, {target: control, signalName: "paddingChanged"})
verify(paddingSpy.valid)
var topPaddingSpy = createTemporaryObject(signalSpy, testCase, {target: control, signalName: "topPaddingChanged"})
verify(topPaddingSpy.valid)
var leftPaddingSpy = createTemporaryObject(signalSpy, testCase, {target: control, signalName: "leftPaddingChanged"})
verify(leftPaddingSpy.valid)
var rightPaddingSpy = createTemporaryObject(signalSpy, testCase, {target: control, signalName: "rightPaddingChanged"})
verify(rightPaddingSpy.valid)
var bottomPaddingSpy = createTemporaryObject(signalSpy, testCase, {target: control, signalName: "bottomPaddingChanged"})
verify(bottomPaddingSpy.valid)
var paddingChanges = 0
var topPaddingChanges = 0
var leftPaddingChanges = 0
var rightPaddingChanges = 0
var bottomPaddingChanges = 0
compare(control.padding, 0)
compare(control.topPadding, 0)
compare(control.leftPadding, 0)
compare(control.rightPadding, 0)
compare(control.bottomPadding, 0)
compare(control.availableWidth, 0)
compare(control.availableHeight, 0)
control.width = 100
control.height = 100
control.padding = 10
compare(control.padding, 10)
compare(control.topPadding, 10)
compare(control.leftPadding, 10)
compare(control.rightPadding, 10)
compare(control.bottomPadding, 10)
compare(paddingSpy.count, ++paddingChanges)
compare(topPaddingSpy.count, ++topPaddingChanges)
compare(leftPaddingSpy.count, ++leftPaddingChanges)
compare(rightPaddingSpy.count, ++rightPaddingChanges)
compare(bottomPaddingSpy.count, ++bottomPaddingChanges)
control.topPadding = 20
compare(control.padding, 10)
compare(control.topPadding, 20)
compare(control.leftPadding, 10)
compare(control.rightPadding, 10)
compare(control.bottomPadding, 10)
compare(paddingSpy.count, paddingChanges)
compare(topPaddingSpy.count, ++topPaddingChanges)
compare(leftPaddingSpy.count, leftPaddingChanges)
compare(rightPaddingSpy.count, rightPaddingChanges)
compare(bottomPaddingSpy.count, bottomPaddingChanges)
control.leftPadding = 30
compare(control.padding, 10)
compare(control.topPadding, 20)
compare(control.leftPadding, 30)
compare(control.rightPadding, 10)
compare(control.bottomPadding, 10)
compare(paddingSpy.count, paddingChanges)
compare(topPaddingSpy.count, topPaddingChanges)
compare(leftPaddingSpy.count, ++leftPaddingChanges)
compare(rightPaddingSpy.count, rightPaddingChanges)
compare(bottomPaddingSpy.count, bottomPaddingChanges)
control.rightPadding = 40
compare(control.padding, 10)
compare(control.topPadding, 20)
compare(control.leftPadding, 30)
compare(control.rightPadding, 40)
compare(control.bottomPadding, 10)
compare(paddingSpy.count, paddingChanges)
compare(topPaddingSpy.count, topPaddingChanges)
compare(leftPaddingSpy.count, leftPaddingChanges)
compare(rightPaddingSpy.count, ++rightPaddingChanges)
compare(bottomPaddingSpy.count, bottomPaddingChanges)
control.bottomPadding = 50
compare(control.padding, 10)
compare(control.topPadding, 20)
compare(control.leftPadding, 30)
compare(control.rightPadding, 40)
compare(control.bottomPadding, 50)
compare(paddingSpy.count, paddingChanges)
compare(topPaddingSpy.count, topPaddingChanges)
compare(leftPaddingSpy.count, leftPaddingChanges)
compare(rightPaddingSpy.count, rightPaddingChanges)
compare(bottomPaddingSpy.count, ++bottomPaddingChanges)
control.padding = 60
compare(control.padding, 60)
compare(control.topPadding, 20)
compare(control.leftPadding, 30)
compare(control.rightPadding, 40)
compare(control.bottomPadding, 50)
compare(paddingSpy.count, ++paddingChanges)
compare(topPaddingSpy.count, topPaddingChanges)
compare(leftPaddingSpy.count, leftPaddingChanges)
compare(rightPaddingSpy.count, rightPaddingChanges)
compare(bottomPaddingSpy.count, bottomPaddingChanges)
}
function test_availableSize() {
var control = createTemporaryObject(popupTemplate, testCase)
verify(control)
var availableWidthSpy = createTemporaryObject(signalSpy, testCase, {target: control, signalName: "availableWidthChanged"})
verify(availableWidthSpy.valid)
var availableHeightSpy = createTemporaryObject(signalSpy, testCase, {target: control, signalName: "availableHeightChanged"})
verify(availableHeightSpy.valid)
var availableWidthChanges = 0
var availableHeightChanges = 0
control.width = 100
compare(control.availableWidth, 100)
compare(availableWidthSpy.count, ++availableWidthChanges)
compare(availableHeightSpy.count, availableHeightChanges)
control.height = 100
compare(control.availableHeight, 100)
compare(availableWidthSpy.count, availableWidthChanges)
compare(availableHeightSpy.count, ++availableHeightChanges)
control.padding = 10
compare(control.availableWidth, 80)
compare(control.availableHeight, 80)
compare(availableWidthSpy.count, ++availableWidthChanges)
compare(availableHeightSpy.count, ++availableHeightChanges)
control.topPadding = 20
compare(control.availableWidth, 80)
compare(control.availableHeight, 70)
compare(availableWidthSpy.count, availableWidthChanges)
compare(availableHeightSpy.count, ++availableHeightChanges)
control.leftPadding = 30
compare(control.availableWidth, 60)
compare(control.availableHeight, 70)
compare(availableWidthSpy.count, ++availableWidthChanges)
compare(availableHeightSpy.count, availableHeightChanges)
control.rightPadding = 40
compare(control.availableWidth, 30)
compare(control.availableHeight, 70)
compare(availableWidthSpy.count, ++availableWidthChanges)
compare(availableHeightSpy.count, availableHeightChanges)
control.bottomPadding = 50
compare(control.availableWidth, 30)
compare(control.availableHeight, 30)
compare(availableWidthSpy.count, availableWidthChanges)
compare(availableHeightSpy.count, ++availableHeightChanges)
control.padding = 60
compare(control.availableWidth, 30)
compare(control.availableHeight, 30)
compare(availableWidthSpy.count, availableWidthChanges)
compare(availableHeightSpy.count, availableHeightChanges)
control.width = 0
compare(control.availableWidth, 0)
compare(availableWidthSpy.count, ++availableWidthChanges)
compare(availableHeightSpy.count, availableHeightChanges)
control.height = 0
compare(control.availableHeight, 0)
compare(availableWidthSpy.count, availableWidthChanges)
compare(availableHeightSpy.count, ++availableHeightChanges)
}
function test_position() {
var control = createTemporaryObject(popupControl, testCase, {visible: true, leftMargin: 10, topMargin: 20, width: 100, height: 100})
verify(control)
verify(control.visible)
var xSpy = createTemporaryObject(signalSpy, testCase, {target: control, signalName: "xChanged"})
verify(xSpy.valid)
var ySpy = createTemporaryObject(signalSpy, testCase, {target: control, signalName: "yChanged"})
verify(ySpy.valid)
// moving outside margins does not trigger change notifiers
control.x = -100
compare(control.x, 10)
compare(control.y, 20)
compare(xSpy.count, 0)
compare(ySpy.count, 0)
control.y = -200
compare(control.x, 10)
compare(control.y, 20)
compare(xSpy.count, 0)
compare(ySpy.count, 0)
// moving within margins triggers change notifiers
control.x = 30
compare(control.x, 30)
compare(control.y, 20)
compare(xSpy.count, 1)
compare(ySpy.count, 0)
control.y = 40
compare(control.x, 30)
compare(control.y, 40)
compare(xSpy.count, 1)
compare(ySpy.count, 1)
// re-parent and reset the position
control.parent = createTemporaryObject(rect, testCase, {color: "red", width: 100, height: 100})
control.x = 0
control.y = 0
compare(xSpy.count, 2)
compare(ySpy.count, 2)
// moving parent outside margins triggers change notifiers
control.parent.x = -50
compare(control.x, 50 + control.leftMargin)
compare(xSpy.count, 3)
compare(ySpy.count, 2)
control.parent.y = -60
compare(control.y, 60 + control.topMargin)
compare(xSpy.count, 3)
compare(ySpy.count, 3)
}
function test_resetSize() {
var control = createTemporaryObject(popupControl, testCase, {visible: true, margins: 0})
verify(control)
control.scale = 1.0
control.width = control.implicitWidth = testCase.width + 10
control.height = control.implicitHeight = testCase.height + 10
compare(control.width, testCase.width + 10)
compare(control.height, testCase.height + 10)
control.width = undefined
control.height = undefined
compare(control.width, testCase.width)
compare(control.height, testCase.height)
}
function test_negativeMargins() {
var control = createTemporaryObject(popupControl, testCase, {implicitWidth: testCase.width, implicitHeight: testCase.height})
verify(control)
control.open()
verify(control.visible)
compare(control.x, 0)
compare(control.y, 0)
compare(control.margins, -1)
compare(control.topMargin, -1)
compare(control.leftMargin, -1)
compare(control.rightMargin, -1)
compare(control.bottomMargin, -1)
control.x = -10
control.y = -10
compare(control.x, 0)
compare(control.y, 0)
}
function test_margins() {
var control = createTemporaryObject(popupTemplate, testCase, {width: 100, height: 100})
verify(control)
control.open()
verify(control.visible)
control.margins = 10
compare(control.margins, 10)
compare(control.topMargin, 10)
compare(control.leftMargin, 10)
compare(control.rightMargin, 10)
compare(control.bottomMargin, 10)
compare(control.contentItem.parent.x, 10)
compare(control.contentItem.parent.y, 10)
control.topMargin = 20
compare(control.margins, 10)
compare(control.topMargin, 20)
compare(control.leftMargin, 10)
compare(control.rightMargin, 10)
compare(control.bottomMargin, 10)
compare(control.contentItem.parent.x, 10)
compare(control.contentItem.parent.y, 20)
control.leftMargin = 20
compare(control.margins, 10)
compare(control.topMargin, 20)
compare(control.leftMargin, 20)
compare(control.rightMargin, 10)
compare(control.bottomMargin, 10)
compare(control.contentItem.parent.x, 20)
compare(control.contentItem.parent.y, 20)
control.x = testCase.width
control.y = testCase.height
compare(control.contentItem.parent.x, testCase.width - control.width - 10)
compare(control.contentItem.parent.y, testCase.height - control.height - 10)
control.rightMargin = 20
compare(control.margins, 10)
compare(control.topMargin, 20)
compare(control.leftMargin, 20)
compare(control.rightMargin, 20)
compare(control.bottomMargin, 10)
compare(control.contentItem.parent.x, testCase.width - control.width - 20)
compare(control.contentItem.parent.y, testCase.height - control.height - 10)
control.bottomMargin = 20
compare(control.margins, 10)
compare(control.topMargin, 20)
compare(control.leftMargin, 20)
compare(control.rightMargin, 20)
compare(control.bottomMargin, 20)
compare(control.contentItem.parent.x, testCase.width - control.width - 20)
compare(control.contentItem.parent.y, testCase.height - control.height - 20)
control.margins = undefined
compare(control.margins, -1)
control.bottomMargin = undefined
compare(control.bottomMargin, -1)
compare(control.contentItem.parent.x, testCase.width - control.width - 20)
compare(control.contentItem.parent.y, testCase.height)
control.rightMargin = undefined
compare(control.rightMargin, -1)
compare(control.contentItem.parent.x, testCase.width)
compare(control.contentItem.parent.y, testCase.height)
control.x = -testCase.width
control.y = -testCase.height
compare(control.contentItem.parent.x, 20)
compare(control.contentItem.parent.y, 20)
control.topMargin = undefined
compare(control.topMargin, -1)
compare(control.contentItem.parent.x, 20)
compare(control.contentItem.parent.y, -testCase.height)
control.leftMargin = undefined
compare(control.leftMargin, -1)
compare(control.contentItem.parent.x, -testCase.width)
compare(control.contentItem.parent.y, -testCase.height)
}
function test_background() {
var control = createTemporaryObject(popupTemplate, testCase)
verify(control)
control.background = rect.createObject(testCase)
// background has no x or width set, so its width follows control's width
control.width = 320
compare(control.background.width, control.width)
// background has no y or height set, so its height follows control's height
compare(control.background.height, control.height)
control.height = 240
// has width => width does not follow
control.background.width /= 2
control.width += 20
verify(control.background.width !== control.width)
// reset width => width follows again
control.background.width = undefined
control.width += 20
compare(control.background.width, control.width)
// has x => width does not follow
control.background.x = 10
control.width += 20
verify(control.background.width !== control.width)
// has height => height does not follow
control.background.height /= 2
control.height -= 20
verify(control.background.height !== control.height)
// reset height => height follows again
control.background.height = undefined
control.height -= 20
compare(control.background.height, control.height)
// has y => height does not follow
control.background.y = 10
control.height -= 20
verify(control.background.height !== control.height)
}
function getChild(control, objname, idx) {
var index = idx
for (var i = index+1; i < control.children.length; i++)
{
if (control.children[i].objectName === objname) {
index = i
break
}
}
return index
}
Component {
id: component
ApplicationWindow {
id: _window
width: 400
height: 400
visible: true
font.pixelSize: 40
property alias pane: _pane
property alias popup: _popup
property SignalSpy fontspy: SignalSpy { target: _window; signalName: "fontChanged" }
Pane {
id: _pane
property alias button: _button
font.pixelSize: 30
property SignalSpy fontspy: SignalSpy { target: _pane; signalName: "fontChanged" }
Column {
Button {
id: _button
text: "Button"
font.pixelSize: 20
property SignalSpy fontspy: SignalSpy { target: _button; signalName: "fontChanged" }
Popup {
id: _popup
property alias button: _button2
property alias listview: _listview
y: _button.height
implicitHeight: Math.min(396, _listview.contentHeight)
property SignalSpy fontspy: SignalSpy { target: _popup; signalName: "fontChanged" }
contentItem: Column {
Button {
id: _button2
text: "Button"
property SignalSpy fontspy: SignalSpy { target: _button2; signalName: "fontChanged" }
}
ListView {
id: _listview
height: _button.height * 20
model: 2
delegate: Button {
id: _button3
objectName: "delegate"
width: _button.width
height: _button.height
text: "N: " + index
checkable: true
autoExclusive: true
property SignalSpy fontspy: SignalSpy { target: _button3; signalName: "fontChanged" }
}
}
}
}
}
}
}
}
}
function test_font() { // QTBUG_50984, QTBUG-51696
var window = createTemporaryObject(component, testCase)
verify(window)
compare(window.font.pixelSize, 40)
compare(window.pane.font.pixelSize, 30)
compare(window.pane.button.font.pixelSize, 20)
compare(window.popup.font.pixelSize, 40)
compare(window.popup.button.font.pixelSize, 40)
var idx1 = getChild(window.popup.listview.contentItem, "delegate", -1)
compare(window.popup.listview.contentItem.children[idx1].font.pixelSize, 40)
var idx2 = getChild(window.popup.listview.contentItem, "delegate", idx1)
compare(window.popup.listview.contentItem.children[idx2].font.pixelSize, 40)
window.pane.button.font.pixelSize = 30
compare(window.font.pixelSize, 40)
compare(window.fontspy.count, 0)
compare(window.pane.font.pixelSize, 30)
compare(window.pane.fontspy.count, 0)
compare(window.pane.button.font.pixelSize, 30)
compare(window.pane.button.fontspy.count, 1)
compare(window.popup.font.pixelSize, 40)
compare(window.popup.fontspy.count, 0)
compare(window.popup.button.font.pixelSize, 40)
compare(window.popup.button.fontspy.count, 0)
compare(window.popup.listview.contentItem.children[idx1].font.pixelSize, 40)
compare(window.popup.listview.contentItem.children[idx1].fontspy.count, 0)
compare(window.popup.listview.contentItem.children[idx2].font.pixelSize, 40)
compare(window.popup.listview.contentItem.children[idx2].fontspy.count, 0)
window.font.pixelSize = 50
compare(window.font.pixelSize, 50)
compare(window.fontspy.count, 1)
compare(window.pane.font.pixelSize, 30)
compare(window.pane.fontspy.count, 0)
compare(window.pane.button.font.pixelSize, 30)
compare(window.pane.button.fontspy.count, 1)
compare(window.popup.font.pixelSize, 50)
compare(window.popup.fontspy.count, 1)
compare(window.popup.button.font.pixelSize, 50)
compare(window.popup.button.fontspy.count, 1)
compare(window.popup.listview.contentItem.children[idx1].font.pixelSize, 50)
compare(window.popup.listview.contentItem.children[idx1].fontspy.count, 1)
compare(window.popup.listview.contentItem.children[idx2].font.pixelSize, 50)
compare(window.popup.listview.contentItem.children[idx2].fontspy.count, 1)
window.popup.button.font.pixelSize = 10
compare(window.font.pixelSize, 50)
compare(window.fontspy.count, 1)
compare(window.pane.font.pixelSize, 30)
compare(window.pane.fontspy.count, 0)
compare(window.pane.button.font.pixelSize, 30)
compare(window.pane.button.fontspy.count, 1)
compare(window.popup.font.pixelSize, 50)
compare(window.popup.fontspy.count, 1)
compare(window.popup.button.font.pixelSize, 10)
compare(window.popup.button.fontspy.count, 2)
compare(window.popup.listview.contentItem.children[idx1].font.pixelSize, 50)
compare(window.popup.listview.contentItem.children[idx1].fontspy.count, 1)
compare(window.popup.listview.contentItem.children[idx2].font.pixelSize, 50)
compare(window.popup.listview.contentItem.children[idx2].fontspy.count, 1)
window.popup.font.pixelSize = 60
compare(window.font.pixelSize, 50)
compare(window.fontspy.count, 1)
compare(window.pane.font.pixelSize, 30)
compare(window.pane.fontspy.count, 0)
compare(window.pane.button.font.pixelSize, 30)
compare(window.pane.button.fontspy.count, 1)
compare(window.popup.font.pixelSize, 60)
compare(window.popup.fontspy.count, 2)
compare(window.popup.button.font.pixelSize, 10)
compare(window.popup.button.fontspy.count, 2)
compare(window.popup.listview.contentItem.children[idx1].font.pixelSize, 60)
compare(window.popup.listview.contentItem.children[idx1].fontspy.count, 2)
compare(window.popup.listview.contentItem.children[idx2].font.pixelSize, 60)
compare(window.popup.listview.contentItem.children[idx2].fontspy.count, 2)
}
Component {
id: localeComponent
Pane {
property alias button: _button
property alias popup: _popup
locale: Qt.locale("en_US")
Column {
Button {
id: _button
text: "Button"
locale: Qt.locale("nb_NO")
Popup {
id: _popup
property alias button1: _button1
property alias button2: _button2
y: _button.height
locale: Qt.locale("fi_FI")
implicitHeight: Math.min(396, _column.contentHeight)
contentItem: Column {
id: _column
Button {
id: _button1
text: "Button 1"
objectName: "1"
}
Button {
id: _button2
text: "Button 2"
locale: Qt.locale("nb_NO")
objectName: "2"
}
}
}
}
}
}
}
function test_locale() { // QTBUG_50984
// test looking up natural locale from ancestors
var control = createTemporaryObject(localeComponent, applicationWindow.contentItem)
verify(control)
compare(control.locale.name, "en_US")
compare(control.button.locale.name, "nb_NO")
compare(control.popup.locale.name, "fi_FI")
compare(control.popup.button1.locale.name, "fi_FI")
compare(control.popup.button2.locale.name, "nb_NO")
control.ApplicationWindow.window.locale = undefined
}
Component {
id: localeChangeComponent
Pane {
id: _pane
property alias button: _button
property alias popup: _popup
property SignalSpy localespy: SignalSpy {
target: _pane
signalName: "localeChanged"
}
property SignalSpy mirrorspy: SignalSpy {
target: _pane
signalName: "mirroredChanged"
}
Column {
Button {
id: _button
text: "Button"
property SignalSpy localespy: SignalSpy {
target: _button
signalName: "localeChanged"
}
property SignalSpy mirrorspy: SignalSpy {
target: _button
signalName: "mirroredChanged"
}
Popup {
id: _popup
property alias button1: _button1
property alias button2: _button2
y: _button.height
implicitHeight: Math.min(396, _column.contentHeight)
property SignalSpy localespy: SignalSpy {
target: _popup
signalName: "localeChanged"
}
contentItem: Column {
id: _column
Button {
id: _button1
text: "Button 1"
property SignalSpy localespy: SignalSpy {
target: _button1
signalName: "localeChanged"
}
property SignalSpy mirrorspy: SignalSpy {
target: _button1
signalName: "mirroredChanged"
}
}
Button {
id: _button2
text: "Button 2"
property SignalSpy localespy: SignalSpy {
target: _button2
signalName: "localeChanged"
}
property SignalSpy mirrorspy: SignalSpy {
target: _button2
signalName: "mirroredChanged"
}
}
}
}
}
}
}
}
function test_locale_changes() { // QTBUG_50984
// test default locale and locale inheritance
var control = createTemporaryObject(localeChangeComponent, applicationWindow.contentItem)
verify(control)
var defaultLocale = Qt.locale()
compare(control.ApplicationWindow.window.locale.name, defaultLocale.name)
compare(control.locale.name, defaultLocale.name)
compare(control.button.locale.name, defaultLocale.name)
compare(control.popup.locale.name, defaultLocale.name)
compare(control.popup.button1.locale.name, defaultLocale.name)
compare(control.popup.button2.locale.name, defaultLocale.name)
control.ApplicationWindow.window.locale = Qt.locale("nb_NO")
compare(control.ApplicationWindow.window.locale.name, "nb_NO")
compare(control.locale.name, "nb_NO")
compare(control.button.locale.name, "nb_NO")
compare(control.popup.locale.name, "nb_NO")
compare(control.popup.button1.locale.name, "nb_NO")
compare(control.popup.button2.locale.name, "nb_NO")
compare(control.localespy.count, 1)
compare(control.button.localespy.count, 1)
compare(control.popup.localespy.count, 1)
compare(control.popup.button1.localespy.count, 1)
compare(control.popup.button2.localespy.count, 1)
control.ApplicationWindow.window.locale = undefined
compare(control.ApplicationWindow.window.locale.name, defaultLocale.name)
compare(control.locale.name, defaultLocale.name)
compare(control.button.locale.name, defaultLocale.name)
compare(control.popup.locale.name, defaultLocale.name)
compare(control.popup.button1.locale.name, defaultLocale.name)
compare(control.popup.button2.locale.name, defaultLocale.name)
compare(control.localespy.count, 2)
compare(control.button.localespy.count, 2)
compare(control.popup.localespy.count, 2)
compare(control.popup.button1.localespy.count, 2)
compare(control.popup.button2.localespy.count, 2)
control.locale = Qt.locale("ar_EG")
compare(control.ApplicationWindow.window.locale.name, defaultLocale.name)
compare(control.locale.name, "ar_EG")
compare(control.button.locale.name, "ar_EG")
compare(control.popup.locale.name, defaultLocale.name)
compare(control.popup.button1.locale.name, defaultLocale.name)
compare(control.popup.button2.locale.name, defaultLocale.name)
compare(control.localespy.count, 3)
compare(control.mirrorspy.count, 1)
compare(control.button.localespy.count, 3)
compare(control.button.mirrorspy.count, 1)
compare(control.popup.localespy.count, 2)
compare(control.popup.button1.localespy.count, 2)
compare(control.popup.button2.localespy.count, 2)
control.ApplicationWindow.window.locale = Qt.locale("ar_EG")
compare(control.ApplicationWindow.window.locale.name, "ar_EG")
compare(control.locale.name, "ar_EG")
compare(control.button.locale.name, "ar_EG")
compare(control.popup.locale.name, "ar_EG")
compare(control.popup.button1.locale.name, "ar_EG")
compare(control.popup.button2.locale.name, "ar_EG")
compare(control.localespy.count, 3)
compare(control.mirrorspy.count, 1)
compare(control.button.localespy.count, 3)
compare(control.button.mirrorspy.count, 1)
compare(control.popup.localespy.count, 3)
compare(control.popup.button1.localespy.count, 3)
compare(control.popup.button1.mirrorspy.count, 1)
compare(control.popup.button2.localespy.count, 3)
compare(control.popup.button2.mirrorspy.count, 1)
control.button.locale = Qt.locale("nb_NO")
compare(control.ApplicationWindow.window.locale.name, "ar_EG")
compare(control.locale.name, "ar_EG")
compare(control.button.locale.name, "nb_NO")
compare(control.popup.locale.name, "ar_EG")
compare(control.popup.button1.locale.name, "ar_EG")
compare(control.popup.button2.locale.name, "ar_EG")
compare(control.localespy.count, 3)
compare(control.mirrorspy.count, 1)
compare(control.button.localespy.count, 4)
compare(control.button.mirrorspy.count, 2)
compare(control.popup.localespy.count, 3)
compare(control.popup.button1.localespy.count, 3)
compare(control.popup.button2.localespy.count, 3)
control.locale = undefined
compare(control.ApplicationWindow.window.locale.name, "ar_EG")
compare(control.locale.name, "ar_EG")
compare(control.button.locale.name, "nb_NO")
compare(control.popup.locale.name, "ar_EG")
compare(control.popup.button1.locale.name, "ar_EG")
compare(control.popup.button2.locale.name, "ar_EG")
compare(control.localespy.count, 3)
compare(control.mirrorspy.count, 1)
compare(control.button.localespy.count, 4)
compare(control.button.mirrorspy.count, 2)
compare(control.popup.localespy.count, 3)
compare(control.popup.button1.localespy.count, 3)
compare(control.popup.button2.localespy.count, 3)
control.popup.button1.locale = Qt.locale("nb_NO")
compare(control.ApplicationWindow.window.locale.name, "ar_EG")
compare(control.locale.name, "ar_EG")
compare(control.button.locale.name, "nb_NO")
compare(control.popup.locale.name, "ar_EG")
compare(control.popup.button1.locale.name, "nb_NO")
compare(control.popup.button2.locale.name, "ar_EG")
compare(control.localespy.count, 3)
compare(control.mirrorspy.count, 1)
compare(control.button.localespy.count, 4)
compare(control.button.mirrorspy.count, 2)
compare(control.popup.localespy.count, 3)
compare(control.popup.button1.localespy.count, 4)
compare(control.popup.button1.mirrorspy.count, 2)
compare(control.popup.button2.localespy.count, 3)
compare(control.popup.button2.mirrorspy.count, 1)
control.popup.locale = Qt.locale("fi_FI")
compare(control.ApplicationWindow.window.locale.name, "ar_EG")
compare(control.locale.name, "ar_EG")
compare(control.button.locale.name, "nb_NO")
compare(control.popup.locale.name, "fi_FI")
compare(control.popup.button1.locale.name, "nb_NO")
compare(control.popup.button2.locale.name, "fi_FI")
compare(control.localespy.count, 3)
compare(control.mirrorspy.count, 1)
compare(control.button.localespy.count, 4)
compare(control.button.mirrorspy.count, 2)
compare(control.popup.localespy.count, 4)
compare(control.popup.button1.localespy.count, 4)
compare(control.popup.button1.mirrorspy.count, 2)
compare(control.popup.button2.localespy.count, 4)
compare(control.popup.button2.mirrorspy.count, 2)
control.ApplicationWindow.window.locale = undefined
compare(control.ApplicationWindow.window.locale.name, defaultLocale.name)
compare(control.locale.name, defaultLocale.name)
compare(control.button.locale.name, "nb_NO")
compare(control.popup.locale.name, "fi_FI")
compare(control.popup.button1.locale.name, "nb_NO")
compare(control.popup.button2.locale.name, "fi_FI")
compare(control.localespy.count, 4)
compare(control.mirrorspy.count, 2)
compare(control.button.localespy.count, 4)
compare(control.button.mirrorspy.count, 2)
compare(control.popup.localespy.count, 4)
compare(control.popup.button1.localespy.count, 4)
compare(control.popup.button1.mirrorspy.count, 2)
compare(control.popup.button2.localespy.count, 4)
compare(control.popup.button2.mirrorspy.count, 2)
control.popup.locale = undefined
compare(control.ApplicationWindow.window.locale.name, defaultLocale.name)
compare(control.locale.name, defaultLocale.name)
compare(control.button.locale.name, "nb_NO")
compare(control.popup.locale.name, defaultLocale.name)
compare(control.popup.button1.locale.name, "nb_NO")
compare(control.popup.button2.locale.name, defaultLocale.name)
compare(control.localespy.count, 4)
compare(control.mirrorspy.count, 2)
compare(control.button.localespy.count, 4)
compare(control.button.mirrorspy.count, 2)
compare(control.popup.localespy.count, 5)
compare(control.popup.button1.localespy.count, 4)
compare(control.popup.button1.mirrorspy.count, 2)
compare(control.popup.button2.localespy.count, 5)
compare(control.popup.button2.mirrorspy.count, 2)
}
function test_size() {
var control = createTemporaryObject(popupControl, testCase)
verify(control)
var openedSpy = createTemporaryObject(signalSpy, testCase, {target: control, signalName: "opened"})
verify(openedSpy.valid)
control.open()
openedSpy.wait()
compare(openedSpy.count, 1)
verify(control.visible)
// remove the background so that it won't affect the implicit size of the popup,
// so the implicit sizes tested below are entirely based on the content size
control.background = null
// implicit size of the content
control.contentItem.implicitWidth = 10
compare(control.implicitWidth, 10 + control.leftPadding + control.rightPadding)
compare(control.width, control.implicitWidth)
compare(control.contentItem.width, control.width - control.leftPadding - control.rightPadding)
control.contentItem.implicitHeight = 20
compare(control.implicitHeight, 20 + control.topPadding + control.bottomPadding)
compare(control.height, control.implicitHeight)
compare(control.contentItem.height, control.height - control.topPadding - control.bottomPadding)
// implicit size of the popup
control.implicitWidth = 30
compare(control.implicitWidth, 30)
compare(control.width, 30)
compare(control.contentItem.width, control.width - control.leftPadding - control.rightPadding)
control.implicitHeight = 40
compare(control.implicitHeight, 40)
compare(control.height, 40)
compare(control.contentItem.height, control.height - control.topPadding - control.bottomPadding)
// set explicit size
control.width = 50
compare(control.implicitWidth, 30)
compare(control.width, 50)
compare(control.contentItem.width, control.width - control.leftPadding - control.rightPadding)
control.height = 60
compare(control.implicitHeight, 40)
compare(control.height, 60)
compare(control.contentItem.height, control.height - control.topPadding - control.bottomPadding)
// reset explicit size
control.width = undefined
compare(control.implicitWidth, 30)
compare(control.width, 30)
compare(control.contentItem.width, control.width - control.leftPadding - control.rightPadding)
control.height = undefined
compare(control.implicitHeight, 40)
compare(control.height, 40)
compare(control.contentItem.height, control.height - control.topPadding - control.bottomPadding)
}
function test_visible() {
var control = createTemporaryObject(popupTemplate, testCase, {visible: true})
verify(control)
// QTBUG-51989
tryCompare(control, "visible", true)
// QTBUG-55347
control.parent = null
verify(!control.visible)
}
Component {
id: overlayTest
ApplicationWindow {
property alias firstDrawer: firstDrawer
property alias secondDrawer: secondDrawer
property alias modalPopup: modalPopup
property alias modelessPopup: modelessPopup
property alias plainPopup: plainPopup
property alias modalPopupWithoutDim: modalPopupWithoutDim
visible: true
Drawer {
z: 0
id: firstDrawer
}
Drawer {
z: 1
id: secondDrawer
}
Popup {
id: modalPopup
z: 2
modal: true
exit: Transition { PauseAnimation { duration: 200 } }
}
Popup {
id: modelessPopup
z: 3
dim: true
exit: Transition { PauseAnimation { duration: 200 } }
}
Popup {
id: plainPopup
z: 4
enter: Transition { PauseAnimation { duration: 200 } }
exit: Transition { PauseAnimation { duration: 200 } }
}
Popup {
id: modalPopupWithoutDim
z: 5
dim: false
modal: true
exit: Transition { PauseAnimation { duration: 200 } }
}
}
}
function indexOf(array, item) {
for (var idx = 0; idx < array.length; ++idx) {
if (item === array[idx])
return idx;
}
return -1
}
function findOverlay(window, popup) {
var item = popup.contentItem.parent
var idx = indexOf(window.overlay.children, item)
return window.overlay.children[idx - 1]
}
function test_overlay() {
var window = createTemporaryObject(overlayTest, testCase)
verify(window)
window.requestActivate()
tryCompare(window, "active", true)
compare(window.overlay.children.length, 0)
compare(window.overlay, window.Overlay.overlay)
var firstOverlay = findOverlay(window, window.firstDrawer)
verify(!firstOverlay)
window.firstDrawer.open()
compare(window.overlay.children.length, 2) // 1 drawer + 1 overlay
firstOverlay = findOverlay(window, window.firstDrawer)
verify(firstOverlay)
compare(firstOverlay.z, window.firstDrawer.z)
compare(indexOf(window.overlay.children, firstOverlay),
indexOf(window.overlay.children, window.firstDrawer.contentItem.parent) - 1)
tryCompare(firstOverlay, "opacity", 1.0)
var secondOverlay = findOverlay(window, window.secondDrawer)
verify(!secondOverlay)
window.secondDrawer.open()
compare(window.overlay.children.length, 4) // 2 drawers + 2 overlays
secondOverlay = findOverlay(window, window.secondDrawer)
verify(secondOverlay)
compare(secondOverlay.z, window.secondDrawer.z)
compare(indexOf(window.overlay.children, secondOverlay),
indexOf(window.overlay.children, window.secondDrawer.contentItem.parent) - 1)
tryCompare(secondOverlay, "opacity", 1.0)
window.firstDrawer.close()
tryCompare(window.firstDrawer, "visible", false)
firstOverlay = findOverlay(window, window.firstDrawer)
verify(!firstOverlay)
compare(window.overlay.children.length, 2) // 1 drawer + 1 overlay
window.secondDrawer.close()
tryCompare(window.secondDrawer, "visible", false)
secondOverlay = findOverlay(window, window.secondDrawer)
verify(!secondOverlay)
compare(window.overlay.children.length, 0)
var modalOverlay = findOverlay(window, window.modalPopup)
verify(!modalOverlay)
window.modalPopup.open()
modalOverlay = findOverlay(window, window.modalPopup)
verify(modalOverlay)
compare(modalOverlay.z, window.modalPopup.z)
compare(window.modalPopup.visible, true)
tryCompare(modalOverlay, "opacity", 1.0)
compare(window.overlay.children.length, 2) // 1 popup + 1 overlay
var modelessOverlay = findOverlay(window, window.modelessPopup)
verify(!modelessOverlay)
window.modelessPopup.open()
modelessOverlay = findOverlay(window, window.modelessPopup)
verify(modelessOverlay)
compare(modelessOverlay.z, window.modelessPopup.z)
compare(window.modelessPopup.visible, true)
tryCompare(modelessOverlay, "opacity", 1.0)
compare(window.overlay.children.length, 4) // 2 popups + 2 overlays
window.modelessPopup.close()
tryCompare(window.modelessPopup, "visible", false)
modelessOverlay = findOverlay(window, window.modelessPopup)
verify(!modelessOverlay)
compare(window.overlay.children.length, 2) // 1 popup + 1 overlay
compare(window.modalPopup.visible, true)
compare(modalOverlay.opacity, 1.0)
window.modalPopup.close()
tryCompare(window.modalPopup, "visible", false)
modalOverlay = findOverlay(window, window.modalPopup)
verify(!modalOverlay)
compare(window.overlay.children.length, 0)
window.plainPopup.open()
tryCompare(window.plainPopup, "visible", true)
compare(window.overlay.children.length, 1) // only popup added, no overlays involved
window.plainPopup.modal = true
compare(window.overlay.children.length, 2) // overlay added
window.plainPopup.close()
tryCompare(window.plainPopup, "visible", false)
compare(window.overlay.children.length, 0) // popup + overlay removed
window.modalPopupWithoutDim.open()
tryCompare(window.modalPopupWithoutDim, "visible", true)
compare(window.overlay.children.length, 1) // only popup added, no overlays involved
window.modalPopupWithoutDim.dim = true
compare(window.overlay.children.length, 2) // overlay added
window.modalPopupWithoutDim.close()
tryCompare(window.modalPopupWithoutDim, "visible", false)
compare(window.overlay.children.length, 0) // popup + overlay removed
}
function test_attached_applicationwindow() {
var control = createTemporaryObject(popupControl, applicationWindow.contentItem)
verify(control)
var child = rect.createObject(control.contentItem)
compare(control.ApplicationWindow.window, applicationWindow)
compare(control.contentItem.ApplicationWindow.window, applicationWindow)
compare(child.ApplicationWindow.window, applicationWindow)
control.parent = null
compare(control.ApplicationWindow.window, null)
compare(control.contentItem.ApplicationWindow.window, null)
compare(child.ApplicationWindow.window, null)
}
Component {
id: pausePopup
Popup {
enter: Transition { PauseAnimation { duration: 200 } }
exit: Transition { PauseAnimation { duration: 200 } }
}
}
function test_openedClosed() {
var control = createTemporaryObject(pausePopup, testCase)
verify(control)
var openedSpy = createTemporaryObject(signalSpy, testCase, {target: control, signalName: "opened"})
verify(openedSpy.valid)
var closedSpy = createTemporaryObject(signalSpy, testCase, {target: control, signalName: "closed"})
verify(closedSpy.valid)
var openedChangeSpy = createTemporaryObject(signalSpy, testCase, {target: control, signalName: "openedChanged"})
verify(openedChangeSpy.valid)
control.open()
compare(control.visible, true)
compare(control.opened, false)
compare(openedChangeSpy.count, 0)
compare(openedSpy.count, 0)
tryCompare(openedSpy, "count", 1)
compare(control.opened, true)
compare(openedChangeSpy.count, 1)
compare(closedSpy.count, 0)
control.close()
compare(control.visible, true)
compare(control.opened, false)
compare(openedChangeSpy.count, 2)
compare(openedSpy.count, 1)
compare(closedSpy.count, 0)
tryCompare(closedSpy, "count", 1)
compare(control.opened, false)
compare(openedChangeSpy.count, 2)
compare(control.visible, false)
}
Component {
id: xyBindingLoop
ApplicationWindow {
id: window
width: 360
height: 360
visible: true
property alias popup: popup
Popup {
id: popup
visible: true
x: (parent.width - width) / 2
y: (parent.height - height) / 2
Label {
text: "Content"
anchors.fill: parent
}
}
}
}
function test_xyBindingLoop() {
var window = createTemporaryObject(xyBindingLoop, testCase)
var control = window.popup
waitForRendering(control.contentItem)
compare(control.x, (control.parent.width - control.width) / 2)
compare(control.y, (control.parent.height - control.height) / 2)
}
function test_windowParent() {
var control = createTemporaryObject(popupControl, applicationWindow, {width: 100, height: 100})
verify(control)
control.open()
verify(control.visible)
}
function test_deferredBackgroundSize() {
var control = createTemporaryObject(popupControl, testCase, {width: 200, height: 100})
verify(control)
compare(control.background.width, 200 + (control.background.leftInset || 0) + (control.background.rightInset || 0))
compare(control.background.height, 100 + (control.background.topInset || 0) + (control.background.bottomInset || 0))
}
function test_anchors() {
var control = createTemporaryObject(popupControl, applicationWindow.contentItem.Overlay.overlay,
{ visible: true, width: 100, height: 100 })
verify(control)
verify(control.visible)
// If there is a transition then make sure it is finished
if (control.enter !== null)
tryCompare(control.enter, "running", false)
compare(control.parent, control.Overlay.overlay)
compare(control.x, 0)
compare(control.y, 0)
var overlay = control.Overlay.overlay
verify(overlay)
var centerInSpy = createTemporaryObject(signalSpy, testCase, { target: control.anchors, signalName: "centerInChanged" })
verify(centerInSpy.valid)
applicationWindow.visible = true
verify(waitForRendering(applicationWindow.contentItem))
verify(overlay.width > 0)
verify(overlay.height > 0)
// Center the popup in the window via the overlay.
control.anchors.centerIn = Qt.binding(function() { return control.parent; })
compare(centerInSpy.count, 1)
compare(control.x, (overlay.width - (control.width * control.scale)) / 2)
compare(control.y, (overlay.height - (control.width * control.scale)) / 2)
// Ensure that it warns when trying to set it to an item that's not its parent.
var anotherItem = createTemporaryObject(rect, applicationWindow.contentItem, { x: 100, y: 100, width: 50, height: 50 })
verify(anotherItem)
ignoreWarning(Qt.resolvedUrl("tst_popup.qml") + ":77:9: QML Popup: Popup can only be centered within its immediate parent or Overlay.overlay")
control.anchors.centerIn = anotherItem
// The property will change, because we can't be sure that the parent
// in QQuickPopupAnchors::setCenterIn() is the final parent, as some reparenting can happen.
// We still expect the warning from QQuickPopupPositioner::reposition() though.
compare(centerInSpy.count, 2)
compare(control.anchors.centerIn, anotherItem)
// The binding to the popup's parent was broken above, so restore it.
control.anchors.centerIn = Qt.binding(function() { return control.parent; })
compare(centerInSpy.count, 3)
// Change the popup's parent and ensure that it's anchored accordingly.
control.parent = Qt.binding(function() { return anotherItem; })
compare(control.parent, anotherItem)
compare(control.anchors.centerIn, anotherItem)
compare(centerInSpy.count, 4)
compare(control.x, (anotherItem.width - (control.width * control.scale)) / 2)
compare(control.y, (anotherItem.height - (control.height * control.scale)) / 2)
// Check that anchors.centerIn beats x and y coordinates as it does in QQuickItem.
control.x = 33;
control.y = 44;
compare(control.x, (anotherItem.width - (control.width * control.scale)) / 2)
compare(control.y, (anotherItem.height - (control.height * control.scale)) / 2)
// Check that the popup's x and y coordinates are restored when it's no longer centered.
control.anchors.centerIn = undefined
compare(centerInSpy.count, 5)
compare(control.x, 33)
compare(control.y, 44)
// Test centering in the overlay while having a different parent (anotherItem).
control.anchors.centerIn = overlay
compare(centerInSpy.count, 6)
compare(control.x, (overlay.width - (control.width * control.scale)) / 2)
compare(control.y, (overlay.height - (control.height * control.scale)) / 2)
// TODO: do this properly by creating a component or something
applicationWindow.visible = false
}
Component {
id: shortcutWindowComponent
ApplicationWindow {
id: window
width: 360
height: 360
visible: true
property alias popup: popup
property alias shortcut: shortcut
Popup {
id: popup
Shortcut {
id: shortcut
sequence: "A"
onActivated: popup.visible = !popup.visible
}
}
}
}
function test_shortcut() {
// Tests that a Shortcut with Qt.WindowShortcut context
// that is declared within a Popup is activated.
var window = createTemporaryObject(shortcutWindowComponent, testCase)
var control = window.popup
window.requestActivate()
tryCompare(window, "active", true)
var shortcutActivatedSpy = createTemporaryObject(signalSpy, testCase,
{ target: window.shortcut, signalName: "activated"} )
verify(shortcutActivatedSpy.valid)
waitForRendering(window.contentItem)
keyClick(Qt.Key_A)
compare(shortcutActivatedSpy.count, 1)
tryCompare(control, "visible", true)
keyClick(Qt.Key_A)
compare(shortcutActivatedSpy.count, 2)
tryCompare(control, "visible", false)
}
}