diff options
author | zheng_wenlong <wenlong_zheng@nexty-ele.com> | 2019-04-09 10:48:11 +0900 |
---|---|---|
committer | Zheng Wenlong <wenlong_zheng@nexty-ele.com> | 2019-04-10 01:47:42 +0000 |
commit | 99812e94289a083e9d297af50f5b227e3ad58f52 (patch) | |
tree | d9d43dddf03880e6615fcf4cfdaa02cbee5eff54 /app/pages |
Add demo3 warehouse source code for cluster modeicefish_8.99.5icefish_8.99.4icefish_8.99.3icefish_8.99.2icefish_8.99.1icefish/8.99.5icefish/8.99.4icefish/8.99.3icefish/8.99.2icefish/8.99.1halibut_8.0.6halibut_8.0.5halibut_8.0.4halibut_8.0.3halibut_8.0.2halibut_8.0.1halibut_8.0.0halibut_7.99.3halibut_7.99.2halibut_7.99.1halibut/8.0.6halibut/8.0.5halibut/8.0.4halibut/8.0.3halibut/8.0.2halibut/8.0.1halibut/8.0.0halibut/7.99.3halibut/7.99.2halibut/7.99.18.99.58.99.48.99.38.99.28.99.18.0.68.0.58.0.48.0.38.0.28.0.18.0.07.99.37.99.27.99.1halibut
Add demo3 warehouse source code for cluster mode.
[Patch Set 2] Update LICENSE file.
Change-Id: Ib129f18ae67f3913cbf899a2be5eed7beaa65976
BUG-AGL: SPEC-2261
Signed-off-by: zheng_wenlong <wenlong_zheng@nexty-ele.com>
Diffstat (limited to 'app/pages')
-rw-r--r-- | app/pages/DImage.qml | 39 | ||||
-rw-r--r-- | app/pages/DetailPage.qml | 114 | ||||
-rw-r--r-- | app/pages/DownloadBar.qml | 44 | ||||
-rw-r--r-- | app/pages/ListPage.qml | 195 | ||||
-rw-r--r-- | app/pages/ManagementPage.qml | 161 | ||||
-rw-r--r-- | app/pages/SButton.qml | 66 | ||||
-rw-r--r-- | app/pages/SearchList.qml | 333 | ||||
-rw-r--r-- | app/pages/SearchPage.qml | 321 |
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); + } +} |