Newer
Older
import QtQuick 2.8
import QtQuick.Window 2.0
import QtGraphicalEffects 1.0
Rectangle {
id: menu
color: '#F4F4F4'
signal loadPage(string page)
id: logoBackground
anchors.top: parent.top
anchors.topMargin: menu.height * 0.25
anchors.left: parent.left
anchors.leftMargin: (Screen.width < 1920) ? 30 : 150
anchors.right: parent.right
anchors.rightMargin: (Screen.width < 1920) ? 30 : 150
height: width
source: 'qrc:///images/logo-large-green.png'
fillMode: Image.PreserveAspectFit
clip: true
}
Image {
id: gfLogo
anchors.top: parent.top
anchors.left: parent.horizontalCenter
anchors.right: parent.right
anchors.margins: 10
source: 'qrc:///images/full-logo.png'
fillMode: Image.PreserveAspectFit
}
Image {
id: logo219
anchors.top: gfLogo.bottom
anchors.left: gfLogo.horizontalCenter
anchors.right: parent.right
anchors.margins: 10
source: 'qrc:///images/219-design-logo.svg'
fillMode: Image.PreserveAspectFit
}
id: settings
anchors.top: parent.top
anchors.left: parent.left
anchors.margins: 1
width: 40
height: 40
source: 'qrc:///images/icon-settings.png'
fillMode: Image.PreserveAspectFit
MouseArea {
id: settingsMouseArea
anchors.fill: parent
anchors.margins: -40
onClicked: menu.loadPage('settings')
}
}
ListModel {
id: items
ListElement {
name: 'video'
iconSource: 'qrc:///images/icon-video-active.png'
iconSourceIdle: 'qrc:///images/icon-video-idle.png'
label: 'Video'
}
ListElement {
name: 'hw-info'
iconSource: 'qrc:///images/icon-hw-info-active.png'
iconSourceIdle: 'qrc:///images/icon-hw-info-idle.png'
label: 'About This Device'
}
ListElement {
name: 'industrial'
iconSource: 'qrc:///images/icon-industrial-active.png'
iconSourceIdle: 'qrc:///images/icon-industrial-idle.png'
label: 'Industrial Control'
}
ListElement {
name: 'kiosk'
iconSource: 'qrc:///images/icon-kiosk-active.png'
iconSourceIdle: 'qrc:///images/icon-kiosk-idle.png'
label: 'Ticket Vending\nMachine'
}
ListElement {
name: 'vending'
iconSource: 'qrc:///images/icon-vending-active.png'
iconSourceIdle: 'qrc:///images/icon-vending-idle.png'
label: 'Coffee Machine'
}
ListElement {
name: 'slideshow'
iconSource: 'qrc:///images/icon-slideshow-active.png'
iconSourceIdle: 'qrc:///images/icon-slideshow-idle.png'
label: 'Slideshow'
}
}
Text {
id: viewTitle
font.family: "DINOT"
color: 'black'
text: items.get(view.currentIndex).label
font.pointSize: 30
anchors.horizontalCenter: view.horizontalCenter
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
anchors.bottom : view.verticalCenter
anchors.bottomMargin : 0.05 * Screen.height
z: 5
}
Component.onCompleted: {
if ( Screen.width < 480 || Screen.height < 800 ) {
viewTitle.font.pointSize = 18
}
}
PathView {
id: view
anchors.fill: logoBackground
property double margin: Math.max(30.0, view.width * 0.1)
model: items
pathItemCount: 6
delegate: Component {
Image {
id: image
width: view.width / 3 * PathView.scale
height: sourceSize.height * width / sourceSize.width
source: image.PathView.isCurrentItem ? iconSource : iconSourceIdle
MouseArea {
id: mouseArea
anchors.fill: parent
onClicked: {
if (image.PathView.isCurrentItem) {
menu.loadPage(name)
} else {
view.currentIndex = index
stopAutoRotation()
}
}
}
}
}
preferredHighlightBegin: 0.5
preferredHighlightEnd: 0.5
highlightRangeMode: PathView.StrictlyEnforceRange
dragMargin: 300
path: Path {
startX: 0.5 * view.width
startY: view.height - view.margin
PathLine {
x: view.width - view.margin - (0.1 * view.width / 6)
y: (view.height / 2) + ((view.height / 2) - view.margin) * 0.5
}
PathLine {
x: view.width - view.margin
y: (view.height / 2) - ((view.height / 2) - view.margin) * 0.5
}
PathAttribute { name: "scale"; value: 0.8 }
PathLine {
x: view.width / 2
y: view.margin
}
PathAttribute { name: "scale"; value: 1.0 }
PathLine {
x: view.margin
y: (view.height / 2) - ((view.height / 2) - view.margin) * 0.5
}
PathAttribute { name: "scale"; value: 0.8 }
PathLine {
x: view.margin + (0.1 * view.width / 6)
y: (view.height / 2) + ((view.height / 2) - view.margin) * 0.5
}
PathLine {
x: view.width / 2
y: view.height - view.margin
}
PathAttribute { name: "scale"; value: 0.0 }
}
onDragStarted: stopAutoRotation()
onDragEnded: {
stopAutoRotation()
}
onFlickStarted: stopAutoRotation()
onFlickEnded: stopAutoRotation()
onMovementStarted: stopAutoRotation()
onMovementEnded: stopAutoRotation()
property double prevOffset: 0
onOffsetChanged: {
var delta = Math.abs(offset - prevOffset)
const MAX_ALLOWED_DELTA = 0.75
if (delta > MAX_ALLOWED_DELTA && delta < model.count - MAX_ALLOWED_DELTA) {
offset = prevOffset
} else {
prevOffset = offset
}
}
interactive: true
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
}
function stopAutoRotation() {
rotationTimer.stop()
initRotationTimer.restart()
}
property bool autoRotate: true
onAutoRotateChanged: {
rotationTimer.stop()
if (autoRotate) {
initRotationTimer.start()
} else {
initRotationTimer.stop()
}
}
Timer {
id: initRotationTimer
interval: 10000
running: true
repeat: false
onTriggered: rotationTimer.start()
}
Timer {
id: rotationTimer
interval: 3000
running: false
repeat: true
triggeredOnStart: true
onTriggered: view.decrementCurrentIndex()
}