From 274baa15819458003555749d4e0509ac665f8526 Mon Sep 17 00:00:00 2001 From: Gatis Paeglis Date: Tue, 21 Jan 2014 14:26:36 +0100 Subject: [Launcher Settings] Add Wifi GroupBox Change-Id: I3d9850335c79640d29bb335c24acbfbb79375a1c Reviewed-by: Gatis Paeglis --- .../launchersettings/BrightnessController.qml | 2 +- basicsuite/launchersettings/NetworkController.qml | 2 +- basicsuite/launchersettings/NetworkList.qml | 199 +++++++++++++++++++++ basicsuite/launchersettings/PoweroffAction.qml | 2 +- basicsuite/launchersettings/RebootAction.qml | 2 +- basicsuite/launchersettings/WifiController.qml | 58 ++++++ basicsuite/launchersettings/WifiGroupBox.qml | 92 ++++++++++ basicsuite/launchersettings/main.qml | 38 ++-- experimental/Wifi/main.qml | 199 --------------------- 9 files changed, 380 insertions(+), 214 deletions(-) create mode 100644 basicsuite/launchersettings/NetworkList.qml create mode 100644 basicsuite/launchersettings/WifiController.qml create mode 100644 basicsuite/launchersettings/WifiGroupBox.qml delete mode 100644 experimental/Wifi/main.qml diff --git a/basicsuite/launchersettings/BrightnessController.qml b/basicsuite/launchersettings/BrightnessController.qml index 8ac6118..777fa30 100644 --- a/basicsuite/launchersettings/BrightnessController.qml +++ b/basicsuite/launchersettings/BrightnessController.qml @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ** Contact: For any questions to Digia, please use the contact form at ** http://qt.digia.com/ ** diff --git a/basicsuite/launchersettings/NetworkController.qml b/basicsuite/launchersettings/NetworkController.qml index 1962843..85a8de6 100644 --- a/basicsuite/launchersettings/NetworkController.qml +++ b/basicsuite/launchersettings/NetworkController.qml @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ** Contact: For any questions to Digia, please use the contact form at ** http://qt.digia.com/ ** diff --git a/basicsuite/launchersettings/NetworkList.qml b/basicsuite/launchersettings/NetworkList.qml new file mode 100644 index 0000000..1f26537 --- /dev/null +++ b/basicsuite/launchersettings/NetworkList.qml @@ -0,0 +1,199 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: For any questions to Digia, please use the contact form at +** http://qt.digia.com/ +** +** This file is part of the examples of the Qt Enterprise Embedded. +** +** $QT_BEGIN_LICENSE:BSD$ +** 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 Digia Plc and its Subsidiary(-ies) 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.0 +import Qt.labs.wifi 0.1 + +Item { + Component { + id: listDelegate + Rectangle { + id: delegateBackground + property bool expanded: false + property bool connected: wifiManager.connectedSSID == network.ssid + property variant networkModel: model + property alias ssidText: ssidLabel.text + height: expanded ? 300 : 70 + clip: true // ### fixme + + Behavior on height { NumberAnimation { duration: 500; easing.type: Easing.InOutCubic } } + + width: parent.width + + gradient: Gradient { + GradientStop { position: 0; color: "white" } + GradientStop { position: 1; color: "lightgray" } + } + + Text { + id: ssidLabel + anchors.top: parent.top + anchors.left: parent.left + anchors.margins: 10 + font.pixelSize: 20 + font.bold: true + text: network.ssid + (connected ? " (connected)" : ""); + } + + Text { + id: bssidLabel + anchors.top: ssidLabel.bottom + anchors.left: parent.left + anchors.margins: 5 + anchors.leftMargin: 40 + text: network.bssid + color: "gray" + font.pixelSize: ssidLabel.font.pixelSize * 0.5 + } + + Text { + id: flagsLabel + x: 200 + anchors.top: bssidLabel.top + text: (network.supportsWPA2 ? "WPA2 " : "") + + (network.supportsWPA ? "WPA " : "") + + (network.supportsWEP ? "WEP " : "") + + (network.supportsWPS ? "WPS " : ""); + color: "gray" + font.pixelSize: ssidLabel.font.pixelSize * 0.5 + font.italic: true + } + + Rectangle { + width: Math.max(100 + network.signalStrength, 0) / 100 * parent.width; + height: 20 + radius: 10 + antialiasing: true + anchors.margins: 20 + anchors.right: parent.right + anchors.top: parent.top + color: "lightblue" + border.color: "lightgray" + } + + MouseArea { + anchors.fill: parent + onClicked: { + parent.expanded = !expanded + } + } + + Rectangle { + id: passwordInputBackground + anchors.fill: passwordInput + anchors.margins: -5 + color: "white" + radius: 5 + border.color: "gray" + } + + TextInput { + id: passwordInput + y: 100 + width: 300 + height: 50 + text: "" + anchors.horizontalCenter: parent.horizontalCenter + font.pixelSize: 18 + } + + Rectangle { + id: connectButton + anchors.top: passwordInput.bottom + anchors.margins: 20 + anchors.horizontalCenter: parent.horizontalCenter + width: passwordInput.width + height: passwordInputBackground.height + enabled: wifiManager.networkState != WifiManager.ObtainingIPAddress + + gradient: Gradient { + GradientStop { position: 0; color: "white" } + GradientStop { position: 1; color: buttonMouse.pressed ? "steelblue" : "lightsteelblue" } + } + + border.color: "gray" + + Text { + anchors.centerIn: parent + font.pixelSize: 24 + text: connected ? "Disconnect" : "Connect" + } + MouseArea { + id: buttonMouse + anchors.fill: parent + onClicked: { + networkView.currentIndex = index + if (connected) { + wifiManager.disconnect() + } else { + networkView.activeNetwork = networkView.currentItem + wifiManager.connect(network, passwordInput.text); + } + } + } + } + + } + } + + ListView { + id: networkView + anchors.fill: parent + model: wifiManager.networks + delegate: listDelegate + + property variant activeNetwork: "" + property variant networkState: wifiManager.networkState + + onNetworkStateChanged: { + if (activeNetwork) { + var ssid = activeNetwork.networkModel.ssid + var state = "" + if (networkState == WifiManager.ObtainingIPAddress) + state = " (obtaining ip..)" + else if (networkState == WifiManager.DhcpRequestFailed) + state = " (dhcp request failed)" + else if (networkState == WifiManager.Connected) + state = " (connected)" + activeNetwork.ssidText = ssid + state + } + } + } +} diff --git a/basicsuite/launchersettings/PoweroffAction.qml b/basicsuite/launchersettings/PoweroffAction.qml index 14c100d..8c14b79 100644 --- a/basicsuite/launchersettings/PoweroffAction.qml +++ b/basicsuite/launchersettings/PoweroffAction.qml @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ** Contact: For any questions to Digia, please use the contact form at ** http://qt.digia.com/ ** diff --git a/basicsuite/launchersettings/RebootAction.qml b/basicsuite/launchersettings/RebootAction.qml index 476bdaf..e6f57ca 100644 --- a/basicsuite/launchersettings/RebootAction.qml +++ b/basicsuite/launchersettings/RebootAction.qml @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ** Contact: For any questions to Digia, please use the contact form at ** http://qt.digia.com/ ** diff --git a/basicsuite/launchersettings/WifiController.qml b/basicsuite/launchersettings/WifiController.qml new file mode 100644 index 0000000..3725478 --- /dev/null +++ b/basicsuite/launchersettings/WifiController.qml @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: For any questions to Digia, please use the contact form at +** http://qt.digia.com/ +** +** This file is part of the examples of the Qt Enterprise Embedded. +** +** $QT_BEGIN_LICENSE:BSD$ +** 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 Digia Plc and its Subsidiary(-ies) 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.0 +import Qt.labs.wifi 0.1 as Wifi + +QtObject { + function createWifiGroupBox() + { + if (Wifi.Interface.wifiSupported()) { + var component = Qt.createComponent("WifiGroupBox.qml"); + var wifi = component.createObject(wifiOptions.contentItem); + if (wifi == null) { + wifiOptions.visible = false + print("Error creating WifiGroupBox"); + } + } else { + wifiOptions.visible = false + } + } +} diff --git a/basicsuite/launchersettings/WifiGroupBox.qml b/basicsuite/launchersettings/WifiGroupBox.qml new file mode 100644 index 0000000..f58c129 --- /dev/null +++ b/basicsuite/launchersettings/WifiGroupBox.qml @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: For any questions to Digia, please use the contact form at +** http://qt.digia.com/ +** +** This file is part of the examples of the Qt Enterprise Embedded. +** +** $QT_BEGIN_LICENSE:BSD$ +** 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 Digia Plc and its Subsidiary(-ies) 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.0 +import QtQuick.Controls 1.0 +import QtQuick.Layouts 1.0 + +import Qt.labs.wifi 0.1 + +ColumnLayout { + + anchors.fill:parent + + WifiManager { + id: wifiManager + scanning: backendReady + } + + ColumnLayout { + anchors.fill: parent + + RowLayout { + + Button { + id: wifiOnOffButton + text: (wifiManager.backendReady) ? "Switch Off" : "Switch On" + onClicked: { + if (wifiManager.backendReady) { + if (networkList.visible) + networkList.visible = false + wifiManager.stop() + } else { + wifiManager.start() + } + } + } + + Button { + id: listNetworksButton + visible: wifiManager.backendReady + text: (networkList.visible) ? "Hide wifi networks" + : "List available wifi networks" + onClicked: networkList.visible = !networkList.visible + } + } + + NetworkList { + id: networkList + implicitHeight: 400 + Layout.fillWidth: true + visible: false + clip: true + } + } +} diff --git a/basicsuite/launchersettings/main.qml b/basicsuite/launchersettings/main.qml index 7cd510c..41054fd 100644 --- a/basicsuite/launchersettings/main.qml +++ b/basicsuite/launchersettings/main.qml @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). ** Contact: For any questions to Digia, please use the contact form at ** http://qt.digia.com/ ** @@ -44,7 +44,7 @@ import QtQuick.Controls 1.0 import QtQuick.Layouts 1.0 Rectangle { - id: root; + id: root gradient: Gradient { GradientStop { position: 0; color: "white" } @@ -76,16 +76,19 @@ Rectangle { source: "NetworkController.qml" } - Flickable { + Loader { + id: wifiControllerLoader + source: "WifiController.qml" + } + + ScrollView { + anchors.top: parent.top anchors.horizontalCenter: parent.horizontalCenter anchors.margins: margin anchors.topMargin: 50 height: parent.height - width: mainLayout.width - - contentHeight: mainLayout.height - contentWidth: mainLayout.width + width: mainLayout.width + 40 ColumnLayout { id: mainLayout @@ -95,12 +98,12 @@ Rectangle { GroupBox { id: powerOptions - title: "Power Options" + title: "Power" Layout.fillWidth: true RowLayout { - id: powerButtonColumn + id: powerButtonRow anchors.fill: parent @@ -123,7 +126,7 @@ Rectangle { GroupBox { id: displayOptions - title: "Display Options" + title: "Display" Layout.fillWidth: true @@ -156,7 +159,7 @@ Rectangle { GroupBox { id: networkOptions - title: "Network Options" + title: "Network" Layout.fillWidth: true @@ -187,6 +190,19 @@ Rectangle { } } + + GroupBox { + id: wifiOptions + title: "Wifi" + Layout.fillWidth: true + } + + Component.onCompleted: { + if (wifiControllerLoader.item != undefined) + wifiControllerLoader.item.createWifiGroupBox() + else + wifiOptions.visible = false + } } } } diff --git a/experimental/Wifi/main.qml b/experimental/Wifi/main.qml deleted file mode 100644 index 0f4862c..0000000 --- a/experimental/Wifi/main.qml +++ /dev/null @@ -1,199 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: For any questions to Digia, please use the contact form at -** http://qt.digia.com/ -** -** This file is part of the examples of the Qt Enterprise Embedded. -** -** $QT_BEGIN_LICENSE:BSD$ -** 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 Digia Plc and its Subsidiary(-ies) 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.0 -import Qt.labs.wifi 0.1 - -Rectangle -{ - id: root - - color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1); - - QWifiManager { - id: wifiManager; - - Component.onCompleted: start(); - - onReadyChanged: { - print("QML: QWifiManager is now connected..."); - } - - onOnlineChanged: print(online ? "QML: WifiManager is online" : "QML: WifiManager is not online..."); - - //scanning: ready && connectedSSID == ""; - scanning: ready - } - - Component { - id: listDelegate - - Rectangle { - id: delegateBackground - property bool expanded: false - height: expanded ? 300 : 70 - clip: true // ### fixme - - Behavior on height { NumberAnimation { duration: 500; easing.type: Easing.InOutCubic } } - - width: parent.width - - gradient: Gradient { - GradientStop { position: 0; color: "white" } - GradientStop { position: 67 / delegateBackground.height; color: "lightgray" } - GradientStop { position: 1; color: "gray" } - } - - Text { - id: ssidLabel - anchors.top: parent.top - anchors.left: parent.left - anchors.margins: 10 - font.pixelSize: 24 - font.bold: true - text: network.ssid + (wifiManager.connectedSSID == network.ssid ? " (connected)" : ""); - } - - Text { - id: bssidLabel - anchors.top: ssidLabel.bottom - anchors.left: parent.left - anchors.margins: 5 - anchors.leftMargin: 40 - text: network.bssid - color: "gray" - font.pixelSize: ssidLabel.font.pixelSize * 0.5 - } - - Text { - id: flagsLabel - x: 200 - anchors.top: bssidLabel.top - text: (network.supportsWPA2 ? "WPA2 " : "") - + (network.supportsWPA ? "WPA " : "") - + (network.supportsWEP ? "WEP " : "") - + (network.supportsWPS ? "WPS " : ""); - color: "gray" - font.pixelSize: ssidLabel.font.pixelSize * 0.5 - font.italic: true - } - - Rectangle { - width: Math.max(100 + network.signalStrength, 0) / 100 * parent.width; - height: 20 - radius: 10 - antialiasing: true - anchors.margins: 20 - anchors.right: parent.right - anchors.top: parent.top - color: "lightblue" - border.color: "lightgray" - } - - MouseArea { - anchors.fill: parent - onClicked: { - parent.expanded = !expanded - } - } - - Rectangle { - id: passwordInputBackground - anchors.fill: passwordInput - anchors.margins: -5 - color: "white" - radius: 5 - border.color: "gray" - } - - TextInput { - id: passwordInput - //echoMode: TextInput.PasswordEchoOnEdit - y: 100 - width: 300 - height: 50 - anchors.horizontalCenter: parent.horizontalCenter - font.pixelSize: 18 - } - - Rectangle { - id: connectButton - anchors.top: passwordInput.bottom - anchors.margins: 20 - anchors.horizontalCenter: parent.horizontalCenter - width: passwordInput.width - height: passwordInputBackground.height - - gradient: Gradient { - GradientStop { position: 0; color: "white" } - GradientStop { position: 1; color: buttonMouse.pressed ? "steelblue" : "lightsteelblue" } - } - - border.color: "gray" - - Text { - anchors.centerIn: parent - font.pixelSize: 24 - text: "Connect" - } - MouseArea { - id: buttonMouse - anchors.fill: parent - onClicked: wifiManager.connect(network, passwordInput.text); - } - } - - } - } - - ListView { - anchors.fill: root - model: wifiManager.networks - delegate: listDelegate; - } - - Image { - source: wifiManager.online ? "http://img3.imageshack.us/img3/9870/magepicture.jpg" : "" - anchors.bottom: parent.bottom - - width: parent.width - height: sourceSize.height * (width / sourceSize.width); - } -} -- cgit v1.2.3