summaryrefslogtreecommitdiffstats
path: root/app/pages
diff options
context:
space:
mode:
Diffstat (limited to 'app/pages')
-rw-r--r--app/pages/DImage.qml39
-rw-r--r--app/pages/DetailPage.qml114
-rw-r--r--app/pages/DownloadBar.qml44
-rw-r--r--app/pages/ListPage.qml195
-rw-r--r--app/pages/ManagementPage.qml161
-rw-r--r--app/pages/SButton.qml66
-rw-r--r--app/pages/SearchList.qml333
-rw-r--r--app/pages/SearchPage.qml321
8 files changed, 1273 insertions, 0 deletions
diff --git a/app/pages/DImage.qml b/app/pages/DImage.qml
new file mode 100644
index 0000000..dc80585
--- /dev/null
+++ b/app/pages/DImage.qml
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2018 The Qt Company Ltd.
+ * Copyright (c) 2018-2019 TOYOTA MOTOR CORPORATION
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import QtQuick 2.6
+import QtQuick.Controls 2.0
+
+Image {
+ id: imageicon
+ property string icon: ""
+ property string name: ""
+
+ anchors.fill: parent
+ source: icon != ""?icon : 'qrc:/images/blank.svg'
+ property string initial: name.substring(0,1).toUpperCase()
+
+ Label {
+ style: Text.Outline
+ styleColor: "#66FF99"
+ color: 'transparent'
+ font.pixelSize: parent.height * 0.4
+ anchors.centerIn: parent
+ text: parent.initial
+ visible: icon == ""
+ }
+}
diff --git a/app/pages/DetailPage.qml b/app/pages/DetailPage.qml
new file mode 100644
index 0000000..38b7ac2
--- /dev/null
+++ b/app/pages/DetailPage.qml
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2018 The Qt Company Ltd.
+ * Copyright (c) 2018-2019 TOYOTA MOTOR CORPORATION
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import QtQuick 2.6
+import QtQuick.Layouts 1.1
+import QtQuick.Controls 2.0
+
+ Page {
+ id: detailpage
+ visible: true
+
+ property StackView stack: null
+ property var model
+
+ Item {
+ id: backItem
+ width: 80
+ height: 40
+
+ Image {
+ anchors.fill: parent
+ source: 'qrc:/images/Back.svg'
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: {
+ stack.pop(StackView.Immediate)
+ }
+ }
+ }
+
+ RowLayout {
+ id: infoLayout
+
+ height: parent.width / 3
+ width: parent.width
+ anchors.top: backItem.bottom
+ anchors.topMargin: 10
+
+ spacing: 20
+
+ Item {
+ Layout.preferredWidth: 200
+ Layout.preferredHeight: 200
+
+ DImage {
+ id: imageicon
+ icon: model.icon
+ name: model.name
+ }
+ }
+
+ ColumnLayout {
+ spacing: 5
+ Label {
+ Layout.fillWidth: true
+ text: model.name.toUpperCase()
+ font.pixelSize: 32
+ color: '#00ADDC'
+ }
+ Label {
+ text: 'Author: ' + model.author
+ font.pixelSize: 24
+ }
+ Label {
+ text: 'Version: ' + model.version
+ font.pixelSize: 16
+ font.italic: true
+ }
+ Label {
+ text: 'Category: ' + model.category
+ font.pixelSize: 16
+ }
+ Label {
+ text: 'UpdateTime: ' + new Date(model.createdtime)
+ font.pixelSize: 16
+ }
+ }
+ }
+
+ Image {
+ id: dividingLine
+ width: parent.width
+ anchors.top: infoLayout.bottom
+ anchors.topMargin: 10
+ anchors.horizontalCenter: parent.horizontalCenter
+ source: 'qrc:/images/DividingLine.svg'
+ }
+
+ Label {
+ width: parent.width
+ anchors.top: dividingLine.bottom
+ anchors.topMargin: 20
+
+ text: model.description
+ wrapMode: Text.Wrap
+ font.pixelSize: 40
+ }
+ }
diff --git a/app/pages/DownloadBar.qml b/app/pages/DownloadBar.qml
new file mode 100644
index 0000000..6ac82ee
--- /dev/null
+++ b/app/pages/DownloadBar.qml
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2018 The Qt Company Ltd.
+ * Copyright (c) 2018-2019 TOYOTA MOTOR CORPORATION
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import QtQuick 2.6
+import QtQuick.Controls 2.0
+
+ProgressBar {
+ property real progress: 0
+
+ id: progressbar
+ z: -1
+ value: (progress/100)
+
+ background: Rectangle {
+ anchors.fill: parent
+ color: "transparent"
+ opacity: 0
+ }
+
+ contentItem: Item {
+ anchors.fill: parent
+
+ Rectangle {
+ width: progressbar.value * parent.width
+ height: parent.height
+ opacity: 0.3
+ color: "#32d0eb"
+ }
+ }
+} \ No newline at end of file
diff --git a/app/pages/ListPage.qml b/app/pages/ListPage.qml
new file mode 100644
index 0000000..d3295ff
--- /dev/null
+++ b/app/pages/ListPage.qml
@@ -0,0 +1,195 @@
+/*
+ * Copyright (C) 2018 The Qt Company Ltd.
+ * Copyright (c) 2018-2019 TOYOTA MOTOR CORPORATION
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import QtQuick 2.6
+import QtQuick.Layouts 1.1
+import QtQuick.Controls 2.0
+
+Page {
+ id: root
+ property alias model: listView.model
+
+ property int currentPageIndex: 0
+
+ property int nPullHeight: 100
+
+ property int oldContentY: 0
+
+ BusyIndicator {
+ id: prevBusyIndicator
+ anchors.horizontalCenter: parent.horizontalCenter
+ implicitWidth: 60
+ implicitHeight: 60
+ running: false
+ }
+ BusyIndicator {
+ id: nextBusyIndicator
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.bottom: parent.bottom
+ implicitWidth: 60
+ implicitHeight: 60
+ running: false
+ }
+
+ StackView {
+ id: stack
+ initialItem: listView
+ anchors.fill: parent
+ anchors.margins: root.width * 0.075
+ }
+
+ ListView {
+ id: listView
+ //anchors.fill: parent
+ //anchors.margins: root.width * 0.075
+ clip: true
+
+ delegate: MouseArea {
+ id: delegate
+ width: listView.width
+ height: width / 6
+
+ RowLayout {
+ anchors.fill: parent
+
+ Item {
+ Layout.preferredWidth: 80
+ Layout.preferredHeight: 80
+
+ MouseArea{
+ anchors.fill: parent
+ z: 2
+ onClicked: {
+ stack.push("qrc:/pages/DetailPage.qml", {stack: stack, model: model}, StackView.Immediate)
+ }
+ }
+
+ DImage {
+ id: imageicon
+ icon: model.icon
+ name: model.name
+ }
+ }
+
+ ColumnLayout {
+ Label {
+ Layout.fillWidth: true
+ text: model.name.toUpperCase()
+ color: '#00ADDC'
+ }
+ Label {
+ text: 'Version: ' + model.version
+ font.pixelSize: 16
+ font.italic: true
+ }
+ Label {
+ text: 'Description: ' + model.description
+ font.pixelSize: 16
+ wrapMode: Text.Wrap
+ elide: Text.ElideRight
+ Layout.preferredWidth: 400
+ Layout.preferredHeight: 40
+ }
+ }
+ ColumnLayout {
+ spacing: 5
+ Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
+
+ Button {
+ anchors.right: parent.right
+ anchors.rightMargin: 6
+ text: model.statetext
+ onClicked: {
+ if (model.statetext === 'Install' || model.statetext === 'Update') {
+ listView.model.install(model.index)
+ } else if (model.statetext === 'Launch') {
+ if (listView.model.launch(model.id) > 1) {
+ homescreenHandler.tapShortcut(model.name)
+ } else {
+ console.warn('app cannot be launched')
+ }
+ }
+ }
+ implicitWidth: 140
+ implicitHeight: 40
+ }
+ }
+ }
+
+ DownloadBar {
+ anchors.fill: parent
+ progress: model.progress
+ }
+ Image {
+ source: 'qrc:/images/DividingLine.svg'
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.top: parent.top
+ visible: model.index > 0
+ }
+ }
+
+ onMovementStarted: {
+ oldContentY = contentY
+ }
+
+ onFlickStarted: {
+ if (contentY < -nPullHeight && prevBusyIndicator.running == false) {
+ prevBusyIndicator.running = true
+ listView.model.getPrevPage(currentPageIndex)
+ } else if (nextBusyIndicator.running == false) {
+ if ((contentHeight > 0) && (contentY > (contentHeight - height + nPullHeight))) {
+ nextBusyIndicator.running = true
+ listView.model.getNextPage(currentPageIndex)
+ }
+ }
+ }
+ }
+
+ Connections {
+ target: listView.model
+ onRequestCompleted: {
+ if (isPrev) {
+ if (pageIndex > 0 && offsetSize == 0) {
+ listView.model.getPrevPage(pageIndex - 1)
+ return
+ }
+ currentPageIndex = pageIndex
+ prevBusyIndicator.running = false
+ } else {
+ nextBusyIndicator.running = false
+
+ if (listView.contentHeight > listView.height){
+ var itemHeight = listView.contentHeight / listView.count
+
+ if (offsetSize <= 0) {
+ listView.contentY = listView.contentHeight - listView.height
+ } else if (offsetSize < pageSize){
+ var viewCount = listView.height / itemHeight
+
+ if (offsetSize <= (viewCount / 2)) {
+ listView.contentY = oldContentY + (offsetSize * itemHeight)
+ } else {
+ listView.contentY = oldContentY + (listView.height / 2)
+ }
+ } else {
+ currentPageIndex = pageIndex
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/app/pages/ManagementPage.qml b/app/pages/ManagementPage.qml
new file mode 100644
index 0000000..b6e55ad
--- /dev/null
+++ b/app/pages/ManagementPage.qml
@@ -0,0 +1,161 @@
+/*
+ * Copyright (C) 2018 The Qt Company Ltd.
+ * Copyright (c) 2018-2019 TOYOTA MOTOR CORPORATION
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import QtQuick 2.6
+import QtQuick.Layouts 1.1
+import QtQuick.Controls 2.0
+
+Page {
+ id: root
+ property alias model: listView.model
+
+ property int nPullHeight: 300
+
+ BusyIndicator {
+ id: busyIndicator
+ anchors.horizontalCenter: parent.horizontalCenter
+ implicitWidth: 60
+ implicitHeight: 60
+ running: false
+ }
+
+ ListView {
+ id: listView
+ anchors.fill: parent
+ anchors.margins: root.width * 0.075
+ clip: true
+
+ delegate: MouseArea {
+ id: delegate
+ width: listView.width
+ height: width / 6
+ RowLayout {
+ anchors.fill: parent
+ Item {
+ Layout.preferredWidth: 100
+ Layout.preferredHeight: 100
+
+ DImage {
+ id: imageicon
+ icon: model.icon != ""?'file://' + model.icon : ''
+ name: model.name
+ }
+ }
+ ColumnLayout {
+ Label {
+ Layout.fillWidth: true
+ text: model.name.toUpperCase()
+ color: '#00ADDC'
+ }
+ Label {
+ text: 'Version: ' + model.version
+ font.pixelSize: 16
+ font.italic: true
+ }
+ Label {
+ text: 'Description: ' + model.description
+ font.pixelSize: 16
+ wrapMode: Text.Wrap
+ elide: Text.ElideRight
+ Layout.preferredWidth: 400
+ Layout.preferredHeight: 40
+ }
+ }
+ ColumnLayout {
+ spacing: 5
+ Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
+
+ Button {
+ anchors.right: parent.right
+ anchors.rightMargin: 6
+ text: 'Launch'
+ onClicked: {
+ if (listView.model.launch(model.id) > 1) {
+ homescreenHandler.tapShortcut(model.name)
+ } else {
+ console.warn('app cannot be launched')
+ }
+ }
+ implicitWidth: 140
+ implicitHeight: 40
+ }
+ Button {
+ anchors.right: parent.right
+ anchors.rightMargin: 6
+ visible: model.name.toUpperCase() != "HOMESCREEN" && model.name.toUpperCase() != "LAUNCHER"
+ text: 'Uninstall'
+ onClicked: {
+ listView.model.uninstall(model.index)
+ }
+ implicitWidth: 140
+ implicitHeight: 40
+ }
+ }
+ }
+ Image {
+ source: 'qrc:/images/DividingLine.svg'
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.top: parent.top
+ visible: model.index > 0
+ }
+
+ }
+
+ states: [
+ State {
+ name: "refreshState"; when: listView.contentY < -nPullHeight
+ StateChangeScript {
+ name: "refreshScript"
+ script: refreshModel()
+ }
+ }
+ ]
+ }
+
+ function refreshModel() {
+ listView.y = nPullHeight;
+
+ busyIndicator.running = true
+ refreshTimer.start();
+ }
+
+ Timer {
+ id: refreshTimer
+ interval: 1000
+ repeat: false
+ running: false
+ onTriggered: {
+ listView.model.refresh()
+ refreshAnimation.start();
+ }
+ }
+
+ NumberAnimation {
+ id: refreshAnimation
+ target: listView
+ property: "y"
+ duration: 100
+ from: nPullHeight
+ to: 0
+ onStopped: {
+ busyIndicator.running = false
+ listView.y = 0;
+ }
+ }
+
+}
+
diff --git a/app/pages/SButton.qml b/app/pages/SButton.qml
new file mode 100644
index 0000000..d91a9a4
--- /dev/null
+++ b/app/pages/SButton.qml
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2016 The Qt Company Ltd.
+ * Copyright (c) 2018-2019 TOYOTA MOTOR CORPORATION
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import QtQuick 2.6
+import QtQuick.Window 2.0
+import QtQuick.Templates 2.0 as T
+
+T.Button {
+ id: root
+ implicitWidth: background.implicitWidth
+ implicitHeight: background.implicitHeight
+ font.family: 'Roboto'
+ font.pixelSize: Math.min(Screen.width, Screen.height) / 50
+
+ Translate {
+ id: translate
+ }
+
+ contentItem: Text {
+ text: root.text
+ font: root.font
+ opacity: enabled ? 1.0 : 0.3
+ color: 'white'
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ elide: Text.ElideRight
+ transform: translate
+ }
+
+ background: Image {
+ anchors.fill:parent
+ source: root.highlighted ? 'qrc:/images/HMI_Settings_Button_Ok.svg' : 'qrc:/images/HMI_Settings_Button_Cancel.svg'
+ fillMode: Image.Stretch
+ transform: translate
+ }
+
+ states: [
+ State {
+ name: 'pressed'
+ when: root.pressed
+ PropertyChanges {
+ target: translate
+ x: 3
+ y: 3
+ }
+ PropertyChanges {
+ target: background
+ opacity: 0.75
+ }
+ }
+ ]
+}
diff --git a/app/pages/SearchList.qml b/app/pages/SearchList.qml
new file mode 100644
index 0000000..becb43c
--- /dev/null
+++ b/app/pages/SearchList.qml
@@ -0,0 +1,333 @@
+/*
+ * Copyright (C) 2018 The Qt Company Ltd.
+ * Copyright (c) 2018-2019 TOYOTA MOTOR CORPORATION
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import QtQuick 2.6
+import QtQuick.Layouts 1.1
+import QtQuick.Controls 2.0
+
+Page {
+ id: root
+
+ property alias model: listView.model
+
+ property int appSearchType: -1
+ property string appSearchKeyword: ""
+ property int appSize: 0
+ property int pageSize: 0
+
+ property int currentPageIndex: 0
+ property int nPullHeight: 100
+
+ property int oldContentY: 0
+
+ BusyIndicator {
+ id: prevBusyIndicator
+ anchors.horizontalCenter: parent.horizontalCenter
+ implicitWidth: 60
+ implicitHeight: 60
+ running: false
+ }
+ BusyIndicator {
+ id: nextBusyIndicator
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.bottom: parent.bottom
+ implicitWidth: 60
+ implicitHeight: 60
+ running: false
+ }
+
+ StackView {
+ id: stack
+ initialItem: listPage
+ anchors.fill: parent
+ anchors.leftMargin: root.width * 0.04
+ anchors.rightMargin: root.width * 0.04
+ anchors.topMargin: root.width * 0.04
+ Component.onCompleted: {
+ listView.model.clearList();
+ stack.push("qrc:/pages/SearchPage.qml",
+ {appSearchKeyword: appSearchKeyword,
+ appSearchType: appSearchType,
+ parentPage: root}, StackView.Immediate)
+ console.log("depth=", depth.toString())
+ }
+ }
+ Page {
+ id: listPage
+ anchors.fill: parent
+ RowLayout {
+ id: keywordLayout
+ //height: parent.width / 3
+ width: parent.width
+ //anchors.top: root.top
+ //anchors.topMargin: 10
+
+ spacing: 20
+ ColumnLayout {
+ spacing: 5
+ RowLayout {
+ Label {
+ Layout.fillWidth: true
+ text: qsTr("KeyWord")
+ font.pixelSize: 32
+ font.bold: true
+ color: '#00ADDC'
+ }
+ Item {
+ id: backItem
+ width: 80
+ height: 40
+ Layout.alignment: Qt.AlignRight | Qt.AlignTop
+ Image {
+ //Layout.alignment: Qt.AlignRight | At.AlignVCenter
+ id: backBtn
+ anchors.fill: parent
+ source: 'qrc:/images/Back.svg'
+ }
+ MouseArea {
+ anchors.fill: parent
+ onClicked: {
+ listView.model.clearList();
+ stack.push("qrc:/pages/SearchPage.qml",
+ {appSearchKeyword: appSearchKeyword,
+ appSearchType: appSearchType,
+ parentPage: root}, StackView.Immediate)
+ }
+ }
+ }
+ }
+ RowLayout {
+ width: root.width
+ spacing: 10
+ TextEdit {
+ id: textInputKeyWord
+ Layout.fillWidth: true
+ text: appSearchKeyword == "" ? qsTr("Please input keyword!") : appSearchKeyword
+ font.pixelSize: 32
+ font.bold: true
+ font.wordSpacing: -1
+ font.letterSpacing: 0
+ clip: true
+ font.weight: Font.Normal
+ font.capitalization: Font.MixedCase
+ onFocusChanged: {
+ if(focus === false){
+ if(text === ""){
+ text = qsTr("Please input keyword!")
+ }
+ }
+ }
+ Rectangle {
+ anchors.fill: parent
+ color:"transparent"
+ border.color: "#66FF99"
+ border.width: 2
+ z: -1
+ }
+ }
+ SButton {
+ text: 'X'
+ anchors.rightMargin: 100
+
+ visible: textInputKeyWord.text != ""
+ onClicked: {
+ textInputKeyWord.text = "";
+ textInputKeyWord.forceActiveFocus();
+ }
+ implicitWidth: 40
+ implicitHeight: 40
+ }
+ Item {
+ id: searchBtn
+ width: 140
+ height: 40
+ Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
+ SButton {
+ anchors.fill:parent
+ enabled: (textInputKeyWord.text != ""
+ && textInputKeyWord.text != "Please input keyword!")
+ text: 'Search'
+ onClicked: {
+ listView.model.clearList();
+ if(textInputKeyWord.text != "Please input keyword!") {
+ appSearchKeyword = textInputKeyWord.text;
+ } else {
+ appSearchKeyword = "";
+ }
+ popBack(appSearchKeyword, appSearchType);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ ListView {
+ id: listView
+ width: parent.width
+ height: parent.height - keywordLayout.height
+ anchors.top: keywordLayout.bottom
+
+ clip: true
+
+ delegate: MouseArea {
+ id: delegate
+ width: listView.width
+ height: width / 6
+
+ RowLayout {
+ anchors.fill: parent
+
+ Item {
+ Layout.preferredWidth: 80
+ Layout.preferredHeight: 80
+
+ MouseArea{
+ anchors.fill: parent
+ z: 2
+ onClicked: {
+ stack.push("qrc:/pages/DetailPage.qml", {stack: stack, model: model}, StackView.Immediate)
+ }
+ }
+
+ DImage {
+ id: imageicon
+ icon: model.icon
+ name: model.name
+ }
+ }
+
+ ColumnLayout {
+ Label {
+ Layout.fillWidth: true
+ text: model.name.toUpperCase()
+ color: '#00ADDC'
+ }
+ Label {
+ text: 'Version: ' + model.version
+ font.pixelSize: 16
+ font.italic: true
+ }
+ Label {
+ text: 'Description: ' + model.description
+ font.pixelSize: 16
+ wrapMode: Text.Wrap
+ elide: Text.ElideRight
+ Layout.preferredWidth: 400
+ Layout.preferredHeight: 40
+ }
+ }
+ ColumnLayout {
+ spacing: 5
+ Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
+
+ Button {
+ anchors.right: parent.right
+ anchors.rightMargin: 6
+ text: model.statetext
+ onClicked: {
+ if (model.statetext === 'Install' || model.statetext === 'Update') {
+ listView.model.install(model.index)
+ } else if (model.statetext === 'Launch') {
+ if (listView.model.launch(model.id) > 1) {
+ homescreenHandler.tapShortcut(model.name)
+ } else {
+ console.warn('app cannot be launched')
+ }
+ }
+ }
+ implicitWidth: 140
+ implicitHeight: 40
+ }
+ }
+ }
+
+ DownloadBar {
+ anchors.fill: parent
+ progress: model.progress
+ }
+ Image {
+ source: 'qrc:/images/DividingLine.svg'
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.top: parent.top
+ visible: model.index > 0
+ }
+ }
+
+ onMovementStarted: {
+ oldContentY = contentY
+ }
+
+ onFlickStarted: {
+ if (contentY < -nPullHeight && prevBusyIndicator.running == false) {
+ prevBusyIndicator.running = true
+ listView.model.getPrevPage(currentPageIndex)
+ } else if (nextBusyIndicator.running == false) {
+ if ((contentHeight > 0) && (contentY > (contentHeight - height + nPullHeight))) {
+ nextBusyIndicator.running = true
+ listView.model.getNextPage(currentPageIndex)
+ }
+ }
+ }
+ }
+
+ Connections {
+ target: listView.model
+ onRequestCompleted: {
+ if (isPrev) {
+ if (pageIndex > 0 && offsetSize == 0) {
+ listView.model.getPrevPage(pageIndex - 1)
+ return
+ }
+ currentPageIndex = pageIndex
+ prevBusyIndicator.running = false
+ } else {
+ nextBusyIndicator.running = false
+
+ if (listView.contentHeight > listView.height){
+ var itemHeight = listView.contentHeight / listView.count
+
+ if (offsetSize <= 0) {
+ listView.contentY = listView.contentHeight - listView.height
+ } else if (offsetSize < pageSize){
+ var viewCount = listView.height / itemHeight
+
+ if (offsetSize <= (viewCount / 2)) {
+ listView.contentY = oldContentY + (offsetSize * itemHeight)
+ } else {
+ listView.contentY = oldContentY + (listView.height / 2)
+ }
+ } else {
+ currentPageIndex = pageIndex
+ }
+ }
+ }
+ }
+ }
+ }
+
+ function popBack(name, typeid)
+ {
+ appSearchKeyword = name;
+ appSearchType = typeid;
+
+ currentPageIndex = 0;
+ listView.model.getPrevPage(currentPageIndex, appSearchKeyword, appSearchType);
+ stack.pop(StackView.Immediate);
+ console.log("SearchList:Keyword=", appSearchKeyword, "typeid=", appSearchType.toString());
+ }
+}
diff --git a/app/pages/SearchPage.qml b/app/pages/SearchPage.qml
new file mode 100644
index 0000000..847b1f7
--- /dev/null
+++ b/app/pages/SearchPage.qml
@@ -0,0 +1,321 @@
+/*
+ * Copyright (C) 2018 The Qt Company Ltd.
+ * Copyright (c) 2018-2019 TOYOTA MOTOR CORPORATION
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import QtQuick 2.6
+import QtQuick.Controls 2.0
+import QtQuick.Layouts 1.1
+
+Page {
+ id: root
+
+ property variant parentPage: null
+ property int appSearchType: -1
+ property string appSearchKeyword: ""
+ property variant appTypeSelectlist:[
+ "Automotive",
+ "Operation System",
+ "Connectivity",
+ "Graphics",
+ "Navigation",
+ "Multimedia",
+ "Nativate APP",
+ "AGL APP",
+ "Web APP",
+ "Other"]
+
+ RowLayout {
+ id: keywordLayout
+ //height: parent.width / 3
+ width: parent.width
+ //anchors.top: root.top
+ //anchors.topMargin: 10
+
+ spacing: 20
+ ColumnLayout {
+ spacing: 5
+ Label {
+ Layout.fillWidth: true
+ text: qsTr("KeyWord:")
+ font.pixelSize: 32
+ font.bold: true
+ color: '#00ADDC'
+ }
+ RowLayout {
+ width: root.width
+ spacing: 10
+ TextEdit {
+ id: textInputKeyWord
+ Layout.fillWidth: true
+ text: appSearchKeyword == "" ? qsTr("Please input keyword!") : appSearchKeyword
+ font.pixelSize: 32
+ font.bold: true
+ font.wordSpacing: -1
+ font.letterSpacing: 0
+ clip: true
+ font.weight: Font.Normal
+ font.capitalization: Font.MixedCase
+ onFocusChanged: {
+ if(focus === false){
+ if(text === ""){
+ text = qsTr("Please input keyword!")
+ }
+ }
+ }
+ Rectangle {
+ anchors.fill: parent
+ color:"transparent"
+ border.color: "#66FF99"
+ border.width: 2
+ z: -1
+ }
+ }
+ SButton {
+ text: 'X'
+ anchors.rightMargin: 100
+
+ visible: textInputKeyWord.text != ""
+ onClicked: {
+ textInputKeyWord.text = "";
+ textInputKeyWord.forceActiveFocus();
+ }
+
+
+ implicitWidth: 40
+ implicitHeight: 40
+ }
+ Item {
+ id: searchBtn
+ width: 140
+ height: 40
+ Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
+ SButton {
+ anchors.fill:parent
+ enabled: (textInputKeyWord.text != ""
+ && textInputKeyWord.text != "Please input keyword!")
+ || appSearchType != -1
+ text: 'Search'
+ onClicked: {
+ getSearchList();
+ }
+ }
+ }
+ }
+ Label {
+ Layout.fillWidth: true
+ text: qsTr("App Type:")
+ font.pixelSize: 32
+ font.bold: true
+ color: '#00ADDC'
+ }
+ }
+ }
+
+ RowLayout {
+ id: infoLayout
+ height: root.width / 3 * 2
+ width: root.width
+ anchors.top: keywordLayout.bottom
+ anchors.topMargin: 10
+ spacing: 20
+ ColumnLayout {
+ Layout.alignment: Qt.AlignCenter | Qt.AlignVCenter
+ spacing: 60
+
+ SButton {
+ text: appTypeSelectlist[0]
+ highlighted: appSearchType == getSelectAppTypeId(text)
+ onClicked:{
+ var appTypeid = getSelectAppTypeId(text);
+ if(appSearchType === appTypeid) {
+ appSearchType = -1;
+ } else {
+ appSearchType = appTypeid;
+ }
+ console.log("appSearchType=", appSearchType.toString(), appTypeid.toString());
+ }
+ implicitWidth: 320
+ implicitHeight: 60
+ }
+ SButton {
+ text: appTypeSelectlist[2]
+ highlighted: appSearchType == getSelectAppTypeId(text)
+ onClicked:{
+ var appTypeid = getSelectAppTypeId(text);
+ if(appSearchType == appTypeid) {
+ appSearchType = -1;
+ } else {
+ appSearchType = appTypeid;
+ }
+ console.log("appSearchType=", appSearchType.toString(), appSearchType.toString());
+ }
+ implicitWidth: 320
+ implicitHeight: 60
+ }
+ SButton {
+ text: appTypeSelectlist[4]//qsTr("Navigation")
+ highlighted: appSearchType == getSelectAppTypeId(text)
+ onClicked:{
+ var appTypeid = getSelectAppTypeId(text);
+ if(appSearchType == appTypeid) {
+ appSearchType = -1;
+ } else {
+ appSearchType = appTypeid;
+ }
+ console.log("appSearchType=", appSearchType.toString(), appSearchType.toString());
+ }
+ implicitWidth: 320
+ implicitHeight: 60
+ }
+ SButton {
+ text: appTypeSelectlist[6]//qsTr("Nativate APP")
+ highlighted: appSearchType == getSelectAppTypeId(text)
+ onClicked:{
+ var appTypeid = getSelectAppTypeId(text);
+ if(appSearchType == appTypeid) {
+ appSearchType = -1;
+ } else {
+ appSearchType = appTypeid;
+ }
+ }
+ implicitWidth: 320
+ implicitHeight: 60
+ }
+ SButton {
+ text: appTypeSelectlist[8]//qsTr("Web APP")
+ highlighted: appSearchType == getSelectAppTypeId(text)
+ onClicked:{
+ var appTypeid = getSelectAppTypeId(text);
+ if(appSearchType == appTypeid) {
+ appSearchType = -1;
+ } else {
+ appSearchType = appTypeid;
+ }
+ }
+ implicitWidth: 320
+ implicitHeight: 60
+ }
+ }
+ ColumnLayout {
+ Layout.alignment: Qt.AlignCenter | Qt.AlignVCenter
+ spacing: 60
+
+ SButton {
+ text: appTypeSelectlist[1]//qsTr("Operation System")
+ highlighted: appSearchType == getSelectAppTypeId(text)
+ onClicked:{
+ var appTypeid = getSelectAppTypeId(text);
+ if(appSearchType == appTypeid) {
+ appSearchType = -1;
+ } else {
+ appSearchType = appTypeid;
+ }
+ }
+ implicitWidth: 320
+ implicitHeight: 60
+ }
+ SButton {
+ text: appTypeSelectlist[3]//qsTr("Graphics")
+ highlighted: appSearchType == getSelectAppTypeId(text)
+ onClicked:{
+ var appTypeid = getSelectAppTypeId(text);
+ if(appSearchType == appTypeid) {
+ appSearchType = -1;
+ } else {
+ appSearchType = appTypeid;
+ }
+ }
+ implicitWidth: 320
+ implicitHeight: 60
+ }
+ SButton {
+ text: appTypeSelectlist[5]//qsTr("Multimedia")
+ highlighted: appSearchType === getSelectAppTypeId(text)
+ onClicked:{
+ var appTypeid = getSelectAppTypeId(text);
+ if(appSearchType == appTypeid) {
+ appSearchType = -1;
+ } else {
+ appSearchType = appTypeid;
+ }
+ }
+ implicitWidth: 320
+ implicitHeight: 60
+ }
+ SButton {
+ text: appTypeSelectlist[7]//qsTr("AGL APP")
+ highlighted: appSearchType === getSelectAppTypeId(text)
+ onClicked:{
+ var appTypeid = getSelectAppTypeId(text);
+ if(appSearchType == appTypeid) {
+ appSearchType = -1;
+ } else {
+ appSearchType = appTypeid;
+ }
+ }
+ implicitWidth: 320
+ implicitHeight: 60
+ }
+ SButton {
+ text: appTypeSelectlist[9]//qsTr("Other")
+ highlighted: appSearchType === getSelectAppTypeId(text)
+ onClicked:{
+ var appTypeid = getSelectAppTypeId(text);
+ if(appSearchType === appTypeid) {
+ appSearchType = -1;
+ } else {
+ appSearchType = appTypeid;
+ }
+ }
+ implicitWidth: 320
+ implicitHeight: 60
+ }
+ }
+
+
+ }
+
+
+ Rectangle {
+ anchors.fill: infoLayout
+ color: 'transparent'
+ border.color: 'grey'
+ z: -1
+ }
+
+
+ function getSelectAppTypeId(name){
+ for(var key in appTypeSelectlist){
+ if(name == appTypeSelectlist[key]){
+ return Number(key);
+ }
+ }
+ return -1;
+ }
+
+ function getSearchList()
+ {
+ if(textInputKeyWord.text != "Please input keyword!") {
+ appSearchKeyword = textInputKeyWord.text;
+ } else {
+ appSearchKeyword = "";
+ }
+
+ console.log("SearchPage:KeyWord=", appSearchKeyword,
+ "appTypeid=", appSearchType.toString());
+ parentPage.popBack(appSearchKeyword, appSearchType);
+ }
+}