/* * 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 } } } } } }