From d3c564e46f7bc80575271f91b3477a47e6f4d127 Mon Sep 17 00:00:00 2001 From: tiansen Date: Fri, 2 Nov 2018 10:31:57 +0800 Subject: horizontal --- launcher/qml/ChangeItemPosition.js | 89 ++++ launcher/qml/IconItem.qml | 179 ++++--- launcher/qml/Launcher.qml | 531 ++++++++++++++++++--- .../qml/images/AGL_HMI_Blue_Background_Car-01.png | Bin 785945 -> 0 bytes launcher/qml/images/blank_active.png | Bin 0 -> 68320 bytes launcher/qml/images/blank_active.svg | 133 ------ launcher/qml/images/blank_inactive.png | Bin 0 -> 868 bytes launcher/qml/images/blank_inactive.svg | 76 --- launcher/qml/images/browser_active.png | Bin 0 -> 68979 bytes launcher/qml/images/browser_inactive.png | Bin 0 -> 1949 bytes launcher/qml/images/center_background.png | Bin 0 -> 278523 bytes launcher/qml/images/connectivity_active.png | Bin 0 -> 78821 bytes launcher/qml/images/connectivity_active.svg | 231 --------- launcher/qml/images/connectivity_inactive.png | Bin 0 -> 6171 bytes launcher/qml/images/connectivity_inactive.svg | 169 ------- launcher/qml/images/dashboard_active.png | Bin 0 -> 74200 bytes launcher/qml/images/dashboard_active.svg | 174 ------- launcher/qml/images/dashboard_inactive.png | Bin 0 -> 4775 bytes launcher/qml/images/dashboard_inactive.svg | 94 ---- launcher/qml/images/hvac_active.png | Bin 0 -> 74342 bytes launcher/qml/images/hvac_active.svg | 411 ---------------- launcher/qml/images/hvac_inactive.png | Bin 0 -> 5202 bytes launcher/qml/images/hvac_inactive.svg | 349 -------------- launcher/qml/images/images.qrc | 62 +-- launcher/qml/images/mediaplayer_active.png | Bin 0 -> 72606 bytes launcher/qml/images/mediaplayer_active.svg | 172 ------- launcher/qml/images/mediaplayer_inactive.png | Bin 0 -> 3854 bytes launcher/qml/images/mediaplayer_inactive.svg | 111 ----- launcher/qml/images/mixer_active.png | Bin 0 -> 72342 bytes launcher/qml/images/mixer_active.svg | 370 -------------- launcher/qml/images/mixer_inactive.png | Bin 0 -> 3282 bytes launcher/qml/images/mixer_inactive.svg | 308 ------------ launcher/qml/images/music_active.png | Bin 0 -> 72606 bytes launcher/qml/images/music_active.svg | 172 ------- launcher/qml/images/music_inactive.png | Bin 0 -> 3854 bytes launcher/qml/images/music_inactive.svg | 111 ----- launcher/qml/images/navigation_active.png | Bin 0 -> 82996 bytes launcher/qml/images/navigation_active.svg | 245 ---------- launcher/qml/images/navigation_inactive.png | Bin 0 -> 9335 bytes launcher/qml/images/navigation_inactive.svg | 183 ------- launcher/qml/images/phone_active.png | Bin 0 -> 77864 bytes launcher/qml/images/phone_active.svg | 155 ------ launcher/qml/images/phone_inactive.png | Bin 0 -> 4962 bytes launcher/qml/images/phone_inactive.svg | 93 ---- launcher/qml/images/plus_active.svg | 180 ------- launcher/qml/images/plus_inactive.svg | 88 ---- launcher/qml/images/poi_active.png | Bin 0 -> 79835 bytes launcher/qml/images/poi_active.svg | 352 -------------- launcher/qml/images/poi_inactive.png | Bin 0 -> 6367 bytes launcher/qml/images/poi_inactive.svg | 314 ------------ launcher/qml/images/radio_active.png | Bin 0 -> 73543 bytes launcher/qml/images/radio_active.svg | 383 --------------- launcher/qml/images/radio_inactive.png | Bin 0 -> 3680 bytes launcher/qml/images/radio_inactive.svg | 321 ------------- launcher/qml/images/settings_active.png | Bin 0 -> 77571 bytes launcher/qml/images/settings_active.svg | 176 ------- launcher/qml/images/settings_inactive.png | Bin 0 -> 4975 bytes launcher/qml/images/settings_inactive.svg | 114 ----- launcher/qml/images/video_active.svg | 177 ------- launcher/qml/images/video_inactive.svg | 111 ----- launcher/qml/images/videoplayer_active.png | Bin 0 -> 72440 bytes launcher/qml/images/videoplayer_inactive.png | Bin 0 -> 3339 bytes launcher/qml/images/weather_active.png | Bin 0 -> 88254 bytes launcher/qml/images/weather_inactive.png | Bin 0 -> 21222 bytes launcher/qml/images/webbrowser_active.svg | 231 --------- launcher/qml/images/webbrowser_inactive.svg | 165 ------- launcher/qml/qml.qrc | 1 + launcher/src/applicationmodel.cpp | 29 +- launcher/src/main.cpp | 39 +- 69 files changed, 736 insertions(+), 6363 deletions(-) create mode 100644 launcher/qml/ChangeItemPosition.js delete mode 100644 launcher/qml/images/AGL_HMI_Blue_Background_Car-01.png create mode 100644 launcher/qml/images/blank_active.png delete mode 100644 launcher/qml/images/blank_active.svg create mode 100644 launcher/qml/images/blank_inactive.png delete mode 100644 launcher/qml/images/blank_inactive.svg create mode 100644 launcher/qml/images/browser_active.png create mode 100644 launcher/qml/images/browser_inactive.png create mode 100644 launcher/qml/images/center_background.png create mode 100644 launcher/qml/images/connectivity_active.png delete mode 100644 launcher/qml/images/connectivity_active.svg create mode 100644 launcher/qml/images/connectivity_inactive.png delete mode 100644 launcher/qml/images/connectivity_inactive.svg create mode 100644 launcher/qml/images/dashboard_active.png delete mode 100644 launcher/qml/images/dashboard_active.svg create mode 100644 launcher/qml/images/dashboard_inactive.png delete mode 100644 launcher/qml/images/dashboard_inactive.svg create mode 100644 launcher/qml/images/hvac_active.png delete mode 100644 launcher/qml/images/hvac_active.svg create mode 100644 launcher/qml/images/hvac_inactive.png delete mode 100644 launcher/qml/images/hvac_inactive.svg create mode 100644 launcher/qml/images/mediaplayer_active.png delete mode 100644 launcher/qml/images/mediaplayer_active.svg create mode 100644 launcher/qml/images/mediaplayer_inactive.png delete mode 100644 launcher/qml/images/mediaplayer_inactive.svg create mode 100644 launcher/qml/images/mixer_active.png delete mode 100644 launcher/qml/images/mixer_active.svg create mode 100644 launcher/qml/images/mixer_inactive.png delete mode 100644 launcher/qml/images/mixer_inactive.svg create mode 100644 launcher/qml/images/music_active.png delete mode 100644 launcher/qml/images/music_active.svg create mode 100644 launcher/qml/images/music_inactive.png delete mode 100644 launcher/qml/images/music_inactive.svg create mode 100644 launcher/qml/images/navigation_active.png delete mode 100644 launcher/qml/images/navigation_active.svg create mode 100644 launcher/qml/images/navigation_inactive.png delete mode 100644 launcher/qml/images/navigation_inactive.svg create mode 100644 launcher/qml/images/phone_active.png delete mode 100644 launcher/qml/images/phone_active.svg create mode 100644 launcher/qml/images/phone_inactive.png delete mode 100644 launcher/qml/images/phone_inactive.svg delete mode 100644 launcher/qml/images/plus_active.svg delete mode 100644 launcher/qml/images/plus_inactive.svg create mode 100644 launcher/qml/images/poi_active.png delete mode 100644 launcher/qml/images/poi_active.svg create mode 100644 launcher/qml/images/poi_inactive.png delete mode 100644 launcher/qml/images/poi_inactive.svg create mode 100644 launcher/qml/images/radio_active.png delete mode 100644 launcher/qml/images/radio_active.svg create mode 100644 launcher/qml/images/radio_inactive.png delete mode 100644 launcher/qml/images/radio_inactive.svg create mode 100644 launcher/qml/images/settings_active.png delete mode 100644 launcher/qml/images/settings_active.svg create mode 100644 launcher/qml/images/settings_inactive.png delete mode 100644 launcher/qml/images/settings_inactive.svg delete mode 100644 launcher/qml/images/video_active.svg delete mode 100644 launcher/qml/images/video_inactive.svg create mode 100644 launcher/qml/images/videoplayer_active.png create mode 100644 launcher/qml/images/videoplayer_inactive.png create mode 100644 launcher/qml/images/weather_active.png create mode 100644 launcher/qml/images/weather_inactive.png delete mode 100644 launcher/qml/images/webbrowser_active.svg delete mode 100644 launcher/qml/images/webbrowser_inactive.svg diff --git a/launcher/qml/ChangeItemPosition.js b/launcher/qml/ChangeItemPosition.js new file mode 100644 index 0000000..9fae07c --- /dev/null +++ b/launcher/qml/ChangeItemPosition.js @@ -0,0 +1,89 @@ +function next() { + repeater.currentItem += 1; + if (repeater.currentItem > repeater.count - 1) + { + repeater.currentItem = 0; + } + var count = 0; + + for (var i = 0; i < repeater.count; i++) + { + var item = repeater.itemAt(i); + item.currentState -= 1; + if ( item.currentState < 1 ) + { + item.currentState = repeater.count; + } + if ( item.currentState >= 1 && item.currentState <= 10 ) + { + item.state = "pos" + item.currentState + } else if ( item.currentState === 15 ){ + item.state = "pos11"; + } else if ( item.currentState === 16 ){ + item.state = "pos12"; + } else if ( item.currentState === 17 ){ + item.state = "pos13"; + } else if ( item.currentState >= 18 ){ + item.state = "pos0"; + } else { + item.state = "pos10"; + } + } +} + +function prev() { + repeater.currentItem -= 1; + if (repeater.currentItem < 0) + { + repeater.currentItem = repeater.count - 1; + } + var count = repeater.count; + for (var i = 0; i < repeater.count; i++) + { + var item = repeater.itemAt(i); + item.currentState += 1; + if ( item.currentState > repeater.count ) + { + item.currentState = 1; + } + if ( item.currentState >= 1 && item.currentState <= 10 ) + { + item.state = "pos" + item.currentState + } else if ( item.currentState === 15 ){ + item.state = "pos11"; + } else if ( item.currentState === 16 ){ + item.state = "pos12"; + } else if ( item.currentState === 17 ){ + item.state = "pos13"; + } else if ( item.currentState >= 18 ){ + item.state = "pos0"; + } else { + item.state = "pos10"; + } + } +} + +function move(pos, item) { + var distance = firstPox - pos; + if(distance > 200) { + next() + firstPox = pos + iconMoved = true + item.iconReleased() + } else if (distance < -200) { + prev() + firstPox = pos + iconMoved = true + item.iconReleased() + } +} + +function getCenterItem() { + var item; + for (var i = 0; i < repeater.count; i++) + { + item = repeater.itemAt(i) + if (item.state === "pos5" || item.state === "pos14") + return item + } +} diff --git a/launcher/qml/IconItem.qml b/launcher/qml/IconItem.qml index c15a3da..4faa3ea 100644 --- a/launcher/qml/IconItem.qml +++ b/launcher/qml/IconItem.qml @@ -17,104 +17,125 @@ import QtQuick 2.0 import QtQuick.Controls 2.0 import QtGraphicalEffects 1.0 +import "ChangeItemPosition.js" as Cip Item { id: main - width: 320 - height: 320 + width: 300 + height: 485 property string icon: model.icon + property int pid: -1 + property bool isBlank: false + property bool isPressing: false + + Timer { + id: launchTimer + interval: 650 + repeat: false + onTriggered: { + launchApp() + } + } Item { id: container - parent: loc - x: main.x - y: main.y width: main.width height: main.height + MouseArea { + anchors.fill: parent + onClicked: { + if(main.state === "pos14") { + launchApp() + } else if(main.state === "pos4") { + Cip.prev() + launchTimer.start() + } else if(main.state === "pos3") { + Cip.prev() + Cip.prev() + launchTimer.start() + } else if(main.state === "pos2") { + Cip.prev() + Cip.prev() + Cip.prev() + launchTimer.start() + } else if(main.state === "pos1") { + Cip.prev() + Cip.prev() + Cip.prev() + Cip.prev() + launchTimer.start() + } else if(main.state === "pos6") { + Cip.next() + launchTimer.start() + } else if(main.state === "pos7") { + Cip.next() + Cip.next() + launchTimer.start() + } else if(main.state === "pos8") { + Cip.next() + Cip.next() + Cip.next() + launchTimer.start() + } else if(main.state === "pos9") { + Cip.next() + Cip.next() + Cip.next() + Cip.next() + launchTimer.start() + } + } + } Image { id: item anchors.top: parent.top - anchors.topMargin: 20 + anchors.topMargin: 230 anchors.horizontalCenter: parent.horizontalCenter - width: 220 - height: width - source: './images/%1_%2.svg'.arg(model.icon).arg(loc.pressed && (loc.index === model.index || loc.currentId === model.id) ? 'active' : 'inactive') - antialiasing: item.state !== '' - + width: 300 + height: 300 + source: './images/%1_active.png'.arg(model.icon) property string initial: model.name.substring(0,1).toUpperCase() + property bool hasIcon: model.icon !== 'blank' - Item { - id: title - width: 125 - height: 125 + Label { + style: Text.Outline + styleColor: 'white' + color: 'transparent' + font.pixelSize: 225 anchors.centerIn: parent - Repeater { - delegate: Label { - style: Text.Outline - styleColor: 'red' - color: 'transparent' - font.pixelSize: 125 - anchors.centerIn: parent - anchors.horizontalCenterOffset: model.index / 3 - 1 - anchors.verticalCenterOffset: model.index % 3 - 1 - text: item.initial - } - model: main.icon === 'blank' ? 9 : 0 - } - layer.enabled: true - layer.effect: LinearGradient { - gradient: Gradient { - GradientStop { position: -0.5; color: "#6BFBFF" } - GradientStop { position: +1.5; color: "#00ADDC" } - } - } + anchors.verticalCenterOffset: -50 + text: item.initial + visible: item.hasIcon ? false : true } - } - Label { - id: name - anchors.top: item.bottom - anchors.left: parent.left - anchors.right: parent.right - anchors.margins: 20 - font.pixelSize: 25 - font.letterSpacing: 5 - wrapMode: Text.WordWrap - horizontalAlignment: Text.AlignHCenter - color: "white" - text: qsTr(model.name.toUpperCase()) - } - Behavior on x { enabled: item.state !== 'active'; NumberAnimation { duration: 400; easing.type: Easing.OutCubic } } - Behavior on y { enabled: item.state !== 'active'; NumberAnimation { duration: 400; easing.type: Easing.OutCubic } } - SequentialAnimation on rotation { - NumberAnimation { to: 5; duration: 100 } - NumberAnimation { to: -5; duration: 200 } - NumberAnimation { to: 0; duration: 100 } - running: loc.currentId !== '' && item.state !== 'active' - loops: Animation.Infinite; alwaysRunToEnd: true - } - states: [ - State { - name: 'active' - when: loc.currentId == model.id - PropertyChanges { - target: container - x: loc.mouseX - width/2 - y: loc.mouseY - height/2 - scale: 1.15 - z: 10 - } - }, - State { - when: loc.currentId !== '' - PropertyChanges { - target: container - scale: 0.85 - opacity: 0.75 - } + Label { + id: name + anchors.bottom: item.bottom + anchors.left: parent.left + anchors.right: parent.right + anchors.margins: 20 + font.pixelSize: 25 + font.letterSpacing: 5 + wrapMode: Text.WordWrap + horizontalAlignment: Text.AlignHCenter + color: "white" + text: qsTr(model.name.toUpperCase()) } - ] - transitions: Transition { NumberAnimation { properties: 'scale, opacity, x, y'; duration: 150; easing.type: Easing.OutCubic} } + + } + } + function iconPressed() { + item.source = './images/%1_inactive.png'.arg(model.icon) + } + function iconReleased() { + item.source = './images/%1_active.png'.arg(model.icon) + } + function launchApp() { + pid = launcher.launch(model.id) + if (1 < pid) { + } else { + console.warn("app cannot be launched!") + } + homescreenHandler.tapShortcut(model.name) } } diff --git a/launcher/qml/Launcher.qml b/launcher/qml/Launcher.qml index 6d55271..31a9848 100644 --- a/launcher/qml/Launcher.qml +++ b/launcher/qml/Launcher.qml @@ -19,78 +19,495 @@ import QtQuick 2.6 import QtQuick.Layouts 1.1 import QtQuick.Controls 2.0 import AppModel 1.0 +import "ChangeItemPosition.js" as Cip ApplicationWindow { - width: container.width * container.scale - height: container.height * container.scale + id: root property int pid: -1 + property int firstPox: -1 + property bool iconMoved: false - Item { - id: container - anchors.centerIn: parent - width: 1080 - height: 1488 - scale: screenInfo.scale_factor() - - Image { - anchors.centerIn: parent - source: './images/AGL_HMI_Blue_Background_Car-01.png' - } - - GridView { - id: grid - anchors { - topMargin: 60; bottomMargin: 0 - leftMargin: 60; rightMargin: 60 - fill: parent + Timer { + id: timer + interval: 650 + repeat: false + onTriggered: { + var centerItem = Cip.getCenterItem() + centerItem.state = "pos14" + centerImage.opacity = 1.0 } - contentHeight: 320 - flickableDirection: Flickable.AutoFlickDirection - snapMode: GridView.SnapOneRow - visible: true - cellWidth: 320 - cellHeight: 320 - interactive: false + } + Repeater { + id: repeater model: ApplicationModel { id: applicationModel } - delegate: IconItem { - width: grid.cellWidth - height: grid.cellHeight - } - MouseArea { - id: loc - anchors.fill: parent - property string currentId: '' - property int newIndex: -1 - property int index: grid.indexAt(loc.mouseX, loc.mouseY) - x: 62 - y: 264 - onPressAndHold: currentId = applicationModel.id(newIndex = index) - onReleased: { - if(loc.index < 0) { - return + property int currentItem + + IconItem { + id: rect1 + property int currentState: 1 + + width: 300 + height: 590 + + smooth: true + + anchors.centerIn: parent + + Behavior on opacity { + NumberAnimation { duration: 200 } + } + + Behavior on z { + NumberAnimation { duration: 300 } + } + transform: [ + Rotation { + id: rotate + angle: 0 + origin.y: 243 + origin.x: 160 + axis { x: 0; y: 1; z: 0 } + Behavior on angle { + NumberAnimation { easing.overshoot: 1; easing.type: Easing.OutBack; duration: 600 } + } + }, + Translate { + id: trans + x: 0 + y: 0 + Behavior on x { + NumberAnimation { easing.overshoot: 1; easing.type: Easing.OutBack; duration: 600 } + } + Behavior on y { + NumberAnimation { easing.overshoot: 1; easing.type: Easing.OutBack; duration: 600 } + } + }, + Scale { + id: scale + origin.x: 160 + origin.y: 243 + xScale: 1 + yScale: 1 + Behavior on xScale { + NumberAnimation { easing.overshoot: 1; easing.type: Easing.OutBack; duration: 600 } + } + Behavior on yScale { + NumberAnimation { easing.overshoot: 1; easing.type: Easing.OutBack; duration: 600 } + } } - if (currentId === '') { - pid = launcher.launch(applicationModel.id(loc.index)) - if (1 < pid) { - homescreenHandler.tapShortcut(applicationModel.name(loc.index)) + ] + + states: [ + State { + name: "pos0" + PropertyChanges { + target: rotate + angle: 80 + } + PropertyChanges { + target: trans + x: -1050 + y: 270 + } + PropertyChanges { + target: rect1 + z: 0 + opacity: 0 + } + PropertyChanges { + target: scale + xScale: 1.2 + yScale: 1.2 + } + }, + State { + name: "pos1" + PropertyChanges { + target: rotate + angle: 75 + } + PropertyChanges { + target: trans + x: -700 + y: 0 + } + PropertyChanges { + target: rect1 + z: 0 + opacity: 1 + } + PropertyChanges { + target: scale + xScale: 1.2 + yScale: 1.2 + } + }, + State { + name: "pos2" + PropertyChanges { + target: rotate + angle: 60 + } + PropertyChanges { + target: trans + x: -820 + y: 0 + } + PropertyChanges { + target: rect1 + z: 0 + opacity: 1 + } + PropertyChanges { + target: scale + xScale: 0.79 + yScale: 0.79 + } + }, + State { + name: "pos3" + PropertyChanges { + target: rotate + angle: 40 + } + PropertyChanges { + target: trans + x: -780 + y: 0 + } + PropertyChanges { + target: rect1 + z: 0 + opacity: 1 + } + PropertyChanges { + target: scale + xScale: 0.55 + yScale: 0.55 + } + }, + State { + name: "pos4" + PropertyChanges { + target: rotate + angle: 15 + } + PropertyChanges { + target: trans + x: -470 + y: 0 + } + PropertyChanges { + target: rect1 + z: 0 + opacity: 1 + } + PropertyChanges { + target: scale + xScale: 0.45 + yScale: 0.45 + } + }, + State { + name: "pos5" + PropertyChanges { + target: rotate + angle: 0 + } + PropertyChanges { + target: trans + x: 0 + y: 0 + } + PropertyChanges { + target: rect1 + z: 1 + opacity: 1 + } + PropertyChanges { + target: scale + xScale: 0.42 + yScale: 0.42 + } + }, + State { + name: "pos6" + PropertyChanges { + target: rotate + angle: -15 + } + PropertyChanges { + target: trans + x: 470 + y: 0 + } + PropertyChanges { + target: rect1 + z: 0 + opacity: 1 + } + PropertyChanges { + target: scale + xScale: 0.45 + yScale: 0.45 + } + }, + State { + name: "pos7" + PropertyChanges { + target: rotate + angle: -40 + } + PropertyChanges { + target: trans + x: 780 + y: 0 } - else { - console.warn("app cannot be launched!") + PropertyChanges { + target: rect1 + z: 0 + opacity: 1 + } + PropertyChanges { + target: scale + xScale: 0.55 + yScale: 0.55 + } + }, + State { + name: "pos8" + PropertyChanges { + target: rotate + angle: -60 + } + PropertyChanges { + target: trans + x: 820 + y: 0 + } + PropertyChanges { + target: rect1 + z: 0 + opacity: 1 + } + PropertyChanges { + target: scale + xScale: 0.79 + yScale: 0.79 + } + }, + State { + name: "pos9" + PropertyChanges { + target: rotate + angle: -75 + } + PropertyChanges { + target: trans + x: 700 + y: 0 + } + PropertyChanges { + target: rect1 + z: 0 + opacity: 1 + } + PropertyChanges { + target: scale + xScale: 1.2 + yScale: 1.2 + } + }, + State { + name: "pos10" + PropertyChanges { + target: rotate + angle: -80 + } + PropertyChanges { + target: trans + x: 1050 + y: 270 + } + PropertyChanges { + target: rect1 + z: 0 + opacity: 0 + } + PropertyChanges { + target: scale + xScale: 1.2 + yScale: 1.2 + } + }, + State { + name: "pos11" + PropertyChanges { + target: rotate + angle: 0 + } + PropertyChanges { + target: trans + x: 1050 + y: 540 + } + PropertyChanges { + target: rect1 + z: 0 + opacity: 0 + } + PropertyChanges { + target: scale + xScale: 1 + yScale: 1 + } + }, + State { + name: "pos12" + PropertyChanges { + target: rotate + angle: 0 + } + PropertyChanges { + target: trans + x: 0 + y: 540 + } + PropertyChanges { + target: rect1 + z: 0 + opacity: 0 + } + PropertyChanges { + target: scale + xScale: 1 + yScale: 1 + } + }, + State { + name: "pos13" + PropertyChanges { + target: rotate + angle: 0 + } + PropertyChanges { + target: trans + x: -1050 + y: 540 + } + PropertyChanges { + target: rect1 + z: 0 + opacity: 0 + } + PropertyChanges { + target: scale + xScale: 1 + yScale: 1 + } + }, + State { + name: "pos14" + PropertyChanges { + target: rotate + angle: 0 + } + PropertyChanges { + target: trans + x: 0 + y: -50 + } + PropertyChanges { + target: rect1 + z: 1 + opacity: 1 + } + PropertyChanges { + target: scale + xScale: 1 + yScale: 1 } - } else { - currentId = '' } + ] + } + + } + Component.onCompleted: { + repeater.currentItem = 5; + var count = repeater.count; + for ( var i = 0; i < repeater.count; i++) + { + var item = repeater.itemAt(i); + item.currentState = i + 1; + if ( item.currentState >= 1 && item.currentState <= 10 ) + { + item.state = "pos" + item.currentState; + if ( item.currentState === 5 ) + item.state = "pos14"; + } else if ( item.currentState === 15 ){ + item.state = "pos11"; + } else if ( item.currentState === 16 ){ + item.state = "pos12"; + } else if ( item.currentState === 17 ){ + item.state = "pos13"; + } else if ( item.currentState >= 18 ){ + item.state = "pos0"; + } else { + item.state = "pos10"; + } + } + } + + Image { + id: centerImage + source: './images/center_background.png' + height: 590 + width: 350 + anchors.centerIn: parent + opacity: 1.0 + } + + MouseArea { + anchors.fill: parent + propagateComposedEvents: true + z: 2 + + onPressed: { + firstPox = mouseX; + iconMoved = false; + centerImage.opacity = 0.0; + if(mouseX >= 800 && mouseX <= 1120) + { + var item = Cip.getCenterItem() + item.iconPressed() + } + } + + onReleased: { + timer.start() + if(mouseX >= 800 && mouseX <= 1120) + { + var item = Cip.getCenterItem() + item.iconReleased() } - onPositionChanged: { - if (loc.currentId === '') return - if (index < 0) return - if (index === newIndex) return - applicationModel.move(newIndex, newIndex = index) + } + + onClicked: { + if (iconMoved) + { + mouse.accepted = true + } else { + mouse.accepted = false } } + + onPositionChanged: { + var item = Cip.getCenterItem() + Cip.move(mouseX, item) + } } -} + } diff --git a/launcher/qml/images/AGL_HMI_Blue_Background_Car-01.png b/launcher/qml/images/AGL_HMI_Blue_Background_Car-01.png deleted file mode 100644 index 8c01263..0000000 Binary files a/launcher/qml/images/AGL_HMI_Blue_Background_Car-01.png and /dev/null differ diff --git a/launcher/qml/images/blank_active.png b/launcher/qml/images/blank_active.png new file mode 100644 index 0000000..e5a0dd4 Binary files /dev/null and b/launcher/qml/images/blank_active.png differ diff --git a/launcher/qml/images/blank_active.svg b/launcher/qml/images/blank_active.svg deleted file mode 100644 index 10c0a89..0000000 --- a/launcher/qml/images/blank_active.svg +++ /dev/null @@ -1,133 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/launcher/qml/images/blank_inactive.png b/launcher/qml/images/blank_inactive.png new file mode 100644 index 0000000..80b5198 Binary files /dev/null and b/launcher/qml/images/blank_inactive.png differ diff --git a/launcher/qml/images/blank_inactive.svg b/launcher/qml/images/blank_inactive.svg deleted file mode 100644 index 2e467a6..0000000 --- a/launcher/qml/images/blank_inactive.svg +++ /dev/null @@ -1,76 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/launcher/qml/images/browser_active.png b/launcher/qml/images/browser_active.png new file mode 100644 index 0000000..8ef350b Binary files /dev/null and b/launcher/qml/images/browser_active.png differ diff --git a/launcher/qml/images/browser_inactive.png b/launcher/qml/images/browser_inactive.png new file mode 100644 index 0000000..faeee45 Binary files /dev/null and b/launcher/qml/images/browser_inactive.png differ diff --git a/launcher/qml/images/center_background.png b/launcher/qml/images/center_background.png new file mode 100644 index 0000000..8e160f4 Binary files /dev/null and b/launcher/qml/images/center_background.png differ diff --git a/launcher/qml/images/connectivity_active.png b/launcher/qml/images/connectivity_active.png new file mode 100644 index 0000000..168b7fd Binary files /dev/null and b/launcher/qml/images/connectivity_active.png differ diff --git a/launcher/qml/images/connectivity_active.svg b/launcher/qml/images/connectivity_active.svg deleted file mode 100644 index 39d8e50..0000000 --- a/launcher/qml/images/connectivity_active.svg +++ /dev/null @@ -1,231 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/launcher/qml/images/connectivity_inactive.png b/launcher/qml/images/connectivity_inactive.png new file mode 100644 index 0000000..68f1ca0 Binary files /dev/null and b/launcher/qml/images/connectivity_inactive.png differ diff --git a/launcher/qml/images/connectivity_inactive.svg b/launcher/qml/images/connectivity_inactive.svg deleted file mode 100644 index 4cb1c45..0000000 --- a/launcher/qml/images/connectivity_inactive.svg +++ /dev/null @@ -1,169 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/launcher/qml/images/dashboard_active.png b/launcher/qml/images/dashboard_active.png new file mode 100644 index 0000000..84b973b Binary files /dev/null and b/launcher/qml/images/dashboard_active.png differ diff --git a/launcher/qml/images/dashboard_active.svg b/launcher/qml/images/dashboard_active.svg deleted file mode 100644 index a826c0c..0000000 --- a/launcher/qml/images/dashboard_active.svg +++ /dev/null @@ -1,174 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/launcher/qml/images/dashboard_inactive.png b/launcher/qml/images/dashboard_inactive.png new file mode 100644 index 0000000..045658c Binary files /dev/null and b/launcher/qml/images/dashboard_inactive.png differ diff --git a/launcher/qml/images/dashboard_inactive.svg b/launcher/qml/images/dashboard_inactive.svg deleted file mode 100644 index 9c26fe3..0000000 --- a/launcher/qml/images/dashboard_inactive.svg +++ /dev/null @@ -1,94 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/launcher/qml/images/hvac_active.png b/launcher/qml/images/hvac_active.png new file mode 100644 index 0000000..9d4f6ac Binary files /dev/null and b/launcher/qml/images/hvac_active.png differ diff --git a/launcher/qml/images/hvac_active.svg b/launcher/qml/images/hvac_active.svg deleted file mode 100644 index 44d3bd5..0000000 --- a/launcher/qml/images/hvac_active.svg +++ /dev/null @@ -1,411 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/launcher/qml/images/hvac_inactive.png b/launcher/qml/images/hvac_inactive.png new file mode 100644 index 0000000..806d661 Binary files /dev/null and b/launcher/qml/images/hvac_inactive.png differ diff --git a/launcher/qml/images/hvac_inactive.svg b/launcher/qml/images/hvac_inactive.svg deleted file mode 100644 index 67918e6..0000000 --- a/launcher/qml/images/hvac_inactive.svg +++ /dev/null @@ -1,349 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/launcher/qml/images/images.qrc b/launcher/qml/images/images.qrc index cef5f21..821cd7f 100644 --- a/launcher/qml/images/images.qrc +++ b/launcher/qml/images/images.qrc @@ -1,35 +1,35 @@ - AGL_HMI_Blue_Background_Car-01.png - connectivity_active.svg - connectivity_inactive.svg - dashboard_active.svg - dashboard_inactive.svg - hvac_active.svg - hvac_inactive.svg - mixer_active.svg - mixer_inactive.svg - mediaplayer_active.svg - mediaplayer_inactive.svg - music_active.svg - music_inactive.svg - navigation_active.svg - navigation_inactive.svg - phone_active.svg - phone_inactive.svg - poi_active.svg - poi_inactive.svg - radio_active.svg - radio_inactive.svg - settings_active.svg - settings_inactive.svg - video_active.svg - video_inactive.svg - webbrowser_active.svg - webbrowser_inactive.svg - blank_active.svg - blank_inactive.svg - plus_active.svg - plus_inactive.svg + connectivity_active.png + connectivity_inactive.png + dashboard_active.png + dashboard_inactive.png + hvac_active.png + hvac_inactive.png + mixer_active.png + mixer_inactive.png + mediaplayer_active.png + mediaplayer_inactive.png + music_active.png + music_inactive.png + navigation_active.png + navigation_inactive.png + phone_active.png + phone_inactive.png + poi_active.png + poi_inactive.png + radio_active.png + radio_inactive.png + settings_active.png + settings_inactive.png + videoplayer_active.png + videoplayer_inactive.png + browser_active.png + browser_inactive.png + weather_active.png + weather_inactive.png + blank_active.png + blank_inactive.png + center_background.png diff --git a/launcher/qml/images/mediaplayer_active.png b/launcher/qml/images/mediaplayer_active.png new file mode 100644 index 0000000..140733a Binary files /dev/null and b/launcher/qml/images/mediaplayer_active.png differ diff --git a/launcher/qml/images/mediaplayer_active.svg b/launcher/qml/images/mediaplayer_active.svg deleted file mode 100644 index d560c3a..0000000 --- a/launcher/qml/images/mediaplayer_active.svg +++ /dev/null @@ -1,172 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/launcher/qml/images/mediaplayer_inactive.png b/launcher/qml/images/mediaplayer_inactive.png new file mode 100644 index 0000000..38e6111 Binary files /dev/null and b/launcher/qml/images/mediaplayer_inactive.png differ diff --git a/launcher/qml/images/mediaplayer_inactive.svg b/launcher/qml/images/mediaplayer_inactive.svg deleted file mode 100644 index b6ec056..0000000 --- a/launcher/qml/images/mediaplayer_inactive.svg +++ /dev/null @@ -1,111 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/launcher/qml/images/mixer_active.png b/launcher/qml/images/mixer_active.png new file mode 100644 index 0000000..ab0b9f3 Binary files /dev/null and b/launcher/qml/images/mixer_active.png differ diff --git a/launcher/qml/images/mixer_active.svg b/launcher/qml/images/mixer_active.svg deleted file mode 100644 index 2cb3c07..0000000 --- a/launcher/qml/images/mixer_active.svg +++ /dev/null @@ -1,370 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/launcher/qml/images/mixer_inactive.png b/launcher/qml/images/mixer_inactive.png new file mode 100644 index 0000000..e3872bb Binary files /dev/null and b/launcher/qml/images/mixer_inactive.png differ diff --git a/launcher/qml/images/mixer_inactive.svg b/launcher/qml/images/mixer_inactive.svg deleted file mode 100644 index 32e69f0..0000000 --- a/launcher/qml/images/mixer_inactive.svg +++ /dev/null @@ -1,308 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/launcher/qml/images/music_active.png b/launcher/qml/images/music_active.png new file mode 100644 index 0000000..140733a Binary files /dev/null and b/launcher/qml/images/music_active.png differ diff --git a/launcher/qml/images/music_active.svg b/launcher/qml/images/music_active.svg deleted file mode 100644 index d560c3a..0000000 --- a/launcher/qml/images/music_active.svg +++ /dev/null @@ -1,172 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/launcher/qml/images/music_inactive.png b/launcher/qml/images/music_inactive.png new file mode 100644 index 0000000..38e6111 Binary files /dev/null and b/launcher/qml/images/music_inactive.png differ diff --git a/launcher/qml/images/music_inactive.svg b/launcher/qml/images/music_inactive.svg deleted file mode 100644 index b6ec056..0000000 --- a/launcher/qml/images/music_inactive.svg +++ /dev/null @@ -1,111 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/launcher/qml/images/navigation_active.png b/launcher/qml/images/navigation_active.png new file mode 100644 index 0000000..ae3f720 Binary files /dev/null and b/launcher/qml/images/navigation_active.png differ diff --git a/launcher/qml/images/navigation_active.svg b/launcher/qml/images/navigation_active.svg deleted file mode 100644 index dc1fcd3..0000000 --- a/launcher/qml/images/navigation_active.svg +++ /dev/null @@ -1,245 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/launcher/qml/images/navigation_inactive.png b/launcher/qml/images/navigation_inactive.png new file mode 100644 index 0000000..52530d6 Binary files /dev/null and b/launcher/qml/images/navigation_inactive.png differ diff --git a/launcher/qml/images/navigation_inactive.svg b/launcher/qml/images/navigation_inactive.svg deleted file mode 100644 index 97fcf31..0000000 --- a/launcher/qml/images/navigation_inactive.svg +++ /dev/null @@ -1,183 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/launcher/qml/images/phone_active.png b/launcher/qml/images/phone_active.png new file mode 100644 index 0000000..8a10a92 Binary files /dev/null and b/launcher/qml/images/phone_active.png differ diff --git a/launcher/qml/images/phone_active.svg b/launcher/qml/images/phone_active.svg deleted file mode 100644 index e184f26..0000000 --- a/launcher/qml/images/phone_active.svg +++ /dev/null @@ -1,155 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/launcher/qml/images/phone_inactive.png b/launcher/qml/images/phone_inactive.png new file mode 100644 index 0000000..2b61477 Binary files /dev/null and b/launcher/qml/images/phone_inactive.png differ diff --git a/launcher/qml/images/phone_inactive.svg b/launcher/qml/images/phone_inactive.svg deleted file mode 100644 index 7f26834..0000000 --- a/launcher/qml/images/phone_inactive.svg +++ /dev/null @@ -1,93 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/launcher/qml/images/plus_active.svg b/launcher/qml/images/plus_active.svg deleted file mode 100644 index b8a56eb..0000000 --- a/launcher/qml/images/plus_active.svg +++ /dev/null @@ -1,180 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/launcher/qml/images/plus_inactive.svg b/launcher/qml/images/plus_inactive.svg deleted file mode 100644 index 99d52e2..0000000 --- a/launcher/qml/images/plus_inactive.svg +++ /dev/null @@ -1,88 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/launcher/qml/images/poi_active.png b/launcher/qml/images/poi_active.png new file mode 100644 index 0000000..dcf799f Binary files /dev/null and b/launcher/qml/images/poi_active.png differ diff --git a/launcher/qml/images/poi_active.svg b/launcher/qml/images/poi_active.svg deleted file mode 100644 index cb4bc0e..0000000 --- a/launcher/qml/images/poi_active.svg +++ /dev/null @@ -1,352 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/launcher/qml/images/poi_inactive.png b/launcher/qml/images/poi_inactive.png new file mode 100644 index 0000000..c0a4fd3 Binary files /dev/null and b/launcher/qml/images/poi_inactive.png differ diff --git a/launcher/qml/images/poi_inactive.svg b/launcher/qml/images/poi_inactive.svg deleted file mode 100644 index 09c8890..0000000 --- a/launcher/qml/images/poi_inactive.svg +++ /dev/null @@ -1,314 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/launcher/qml/images/radio_active.png b/launcher/qml/images/radio_active.png new file mode 100644 index 0000000..411f94a Binary files /dev/null and b/launcher/qml/images/radio_active.png differ diff --git a/launcher/qml/images/radio_active.svg b/launcher/qml/images/radio_active.svg deleted file mode 100644 index 2d04d72..0000000 --- a/launcher/qml/images/radio_active.svg +++ /dev/null @@ -1,383 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/launcher/qml/images/radio_inactive.png b/launcher/qml/images/radio_inactive.png new file mode 100644 index 0000000..f8c2cc1 Binary files /dev/null and b/launcher/qml/images/radio_inactive.png differ diff --git a/launcher/qml/images/radio_inactive.svg b/launcher/qml/images/radio_inactive.svg deleted file mode 100644 index dcac8ee..0000000 --- a/launcher/qml/images/radio_inactive.svg +++ /dev/null @@ -1,321 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/launcher/qml/images/settings_active.png b/launcher/qml/images/settings_active.png new file mode 100644 index 0000000..e9bec82 Binary files /dev/null and b/launcher/qml/images/settings_active.png differ diff --git a/launcher/qml/images/settings_active.svg b/launcher/qml/images/settings_active.svg deleted file mode 100644 index 5391a08..0000000 --- a/launcher/qml/images/settings_active.svg +++ /dev/null @@ -1,176 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/launcher/qml/images/settings_inactive.png b/launcher/qml/images/settings_inactive.png new file mode 100644 index 0000000..fc72f9d Binary files /dev/null and b/launcher/qml/images/settings_inactive.png differ diff --git a/launcher/qml/images/settings_inactive.svg b/launcher/qml/images/settings_inactive.svg deleted file mode 100644 index 882e3c4..0000000 --- a/launcher/qml/images/settings_inactive.svg +++ /dev/null @@ -1,114 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/launcher/qml/images/video_active.svg b/launcher/qml/images/video_active.svg deleted file mode 100644 index 794a441..0000000 --- a/launcher/qml/images/video_active.svg +++ /dev/null @@ -1,177 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/launcher/qml/images/video_inactive.svg b/launcher/qml/images/video_inactive.svg deleted file mode 100644 index 905d46f..0000000 --- a/launcher/qml/images/video_inactive.svg +++ /dev/null @@ -1,111 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/launcher/qml/images/videoplayer_active.png b/launcher/qml/images/videoplayer_active.png new file mode 100644 index 0000000..69bd5bc Binary files /dev/null and b/launcher/qml/images/videoplayer_active.png differ diff --git a/launcher/qml/images/videoplayer_inactive.png b/launcher/qml/images/videoplayer_inactive.png new file mode 100644 index 0000000..99c44ff Binary files /dev/null and b/launcher/qml/images/videoplayer_inactive.png differ diff --git a/launcher/qml/images/weather_active.png b/launcher/qml/images/weather_active.png new file mode 100644 index 0000000..4ff7223 Binary files /dev/null and b/launcher/qml/images/weather_active.png differ diff --git a/launcher/qml/images/weather_inactive.png b/launcher/qml/images/weather_inactive.png new file mode 100644 index 0000000..d5a18b3 Binary files /dev/null and b/launcher/qml/images/weather_inactive.png differ diff --git a/launcher/qml/images/webbrowser_active.svg b/launcher/qml/images/webbrowser_active.svg deleted file mode 100644 index 70b4617..0000000 --- a/launcher/qml/images/webbrowser_active.svg +++ /dev/null @@ -1,231 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/launcher/qml/images/webbrowser_inactive.svg b/launcher/qml/images/webbrowser_inactive.svg deleted file mode 100644 index 09f34c9..0000000 --- a/launcher/qml/images/webbrowser_inactive.svg +++ /dev/null @@ -1,165 +0,0 @@ - - - -image/svg+xml \ No newline at end of file diff --git a/launcher/qml/qml.qrc b/launcher/qml/qml.qrc index d132fed..0dfd6b1 100644 --- a/launcher/qml/qml.qrc +++ b/launcher/qml/qml.qrc @@ -2,5 +2,6 @@ Launcher.qml IconItem.qml + ChangeItemPosition.js diff --git a/launcher/src/applicationmodel.cpp b/launcher/src/applicationmodel.cpp index 17e38fb..dd6ae5f 100644 --- a/launcher/src/applicationmodel.cpp +++ b/launcher/src/applicationmodel.cpp @@ -41,8 +41,8 @@ namespace { { QString icon = i["name"].toString().toLower(); - if ( !QFile::exists(QString(":/images/%1_active.svg").arg(icon)) || - !QFile::exists(QString(":/images/%1_inactive.svg").arg(icon)) ) + if ( !QFile::exists(QString(":/images/%1_active.png").arg(icon)) || + !QFile::exists(QString(":/images/%1_inactive.png").arg(icon)) ) { icon = "blank"; } @@ -60,10 +60,27 @@ ApplicationModel::Private::Private() auto const id = jso["id"].toString(); auto const icon = get_icon_name(jso); - if ( name != "launcher" && - name != "homescreen-2017" && - name != "homescreen" && - name != "OnScreenApp") { + // Hide HomeScreen icon itself + if (name != "launcher" && + name != "homescreen" && + name != "HomeScreen" && + !name.contains("OnScreen", Qt::CaseInsensitive)) { + this->data.append(AppInfo(icon, name, id)); + } + + HMI_DEBUG("launcher","name: %s icon: %s id: %s.", name.toStdString().c_str(), icon.toStdString().c_str(), id.toStdString().c_str()); + } + for (auto const &app : japps.array()) { + QJsonObject const &jso = app.toObject(); + auto const name = jso["name"].toString(); + auto const id = jso["id"].toString(); + auto const icon = get_icon_name(jso); + + // Hide HomeScreen icon itself + if (name != "launcher" && + name != "homescreen" && + name != "HomeScreen" && + !name.contains("OnScreen", Qt::CaseInsensitive)) { this->data.append(AppInfo(icon, name, id)); } diff --git a/launcher/src/main.cpp b/launcher/src/main.cpp index 91a1d80..937e909 100644 --- a/launcher/src/main.cpp +++ b/launcher/src/main.cpp @@ -100,8 +100,6 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); } - AGLScreenInfo screenInfo(layoutHandler->get_scale_factor()); - if (layoutHandler->requestSurface(myname) != 0) { exit(EXIT_FAILURE); } @@ -121,21 +119,6 @@ int main(int argc, char *argv[]) HMI_DEBUG("launch", "surface %s Event_Invisible", label); }); - homescreenHandler->init(port, token.toStdString().c_str()); - - homescreenHandler->set_event_handler(QLibHomeScreen::Event_TapShortcut, [layoutHandler, myname](json_object *object){ - json_object *appnameJ = nullptr; - if(json_object_object_get_ex(object, "application_name", &appnameJ)) - { - const char *appname = json_object_get_string(appnameJ); - if(myname == appname) - { - qDebug("Surface %s got tapShortcut\n", appname); - layoutHandler->activateSurface(myname); - } - } - }); - QUrl bindingAddress; bindingAddress.setScheme(QStringLiteral("ws")); bindingAddress.setHost(QStringLiteral("localhost")); @@ -158,15 +141,29 @@ int main(int argc, char *argv[]) // mail.qml loading QQmlApplicationEngine engine; - engine.rootContext()->setContextProperty(QStringLiteral("layoutHandler"), layoutHandler); - engine.rootContext()->setContextProperty(QStringLiteral("homescreenHandler"), homescreenHandler); - engine.rootContext()->setContextProperty(QStringLiteral("launcher"), launcher); - engine.rootContext()->setContextProperty(QStringLiteral("screenInfo"), &screenInfo); + engine.rootContext()->setContextProperty("layoutHandler", layoutHandler); + engine.rootContext()->setContextProperty("homescreenHandler", homescreenHandler); + engine.rootContext()->setContextProperty("launcher", launcher); engine.load(QUrl(QStringLiteral("qrc:/Launcher.qml"))); QObject *root = engine.rootObjects().first(); QQuickWindow *window = qobject_cast(root); QObject::connect(window, SIGNAL(frameSwapped()), layoutHandler, SLOT(slotActivateSurface())); + homescreenHandler->init(port, token.toStdString().c_str()); + + homescreenHandler->set_event_handler(QLibHomeScreen::Event_TapShortcut, [layoutHandler, myname](json_object *object){ + json_object *appnameJ = nullptr; + if(json_object_object_get_ex(object, "application_name", &appnameJ)) + { + const char *appname = json_object_get_string(appnameJ); + if(myname == appname) + { + qDebug("Surface %s got tapShortcut\n", appname); + layoutHandler->activateSurface(myname); + } + } + }); + return a.exec(); } -- cgit 1.2.3-korg