/* blueROCK - for digital rock Copyright (C) 2019 Dorian Zedler This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ import QtQuick 2.9 import QtQuick.Controls 2.4 import QtGraphicalEffects 1.0 import QtQuick.Layouts 1.12 import "../Components" DataListView { id: control property bool ready property string title: control.widgetData['comp_name'] property string subTitle: getSubtitle() property bool titleIsPageTitle: true property Component headerComponent: RowLayout { height: parent.height spacing: 0 ToolButton { id: shareToolBt onClicked: shareWidget(control.title) text: "\uf1e0" font.family: fa5solid.name } ToolButton { id: moreToolBt onClicked: { control.changeCat() } text: "\uf142" font.family: fa5solid.name } } function getSubtitle() { var titleString = control.widgetData["route_name"] //% "(Startlist)" var addition = qsTrId("#startlistHeadline") if(titleString) return addition + " " + titleString else return "" } function changeRoute(route) { updateData({route:route}, true) } function changeCat(){ var cats = control.widgetData["categorys"] cats.sort(function(a, b) { return parseInt(a["GrpId"]) - parseInt(b["GrpId"]); }); var selectOptions = [] for(var prop in cats){ if (cats.hasOwnProperty(prop) && parseInt(cats[prop]["GrpId"]) !== parseInt(params.cat)) { // append all cats and ignore the current one //console.log("found cat: ", cats[prop]['name']) selectOptions.push({text: cats[prop]['name'], data:{cat: cats[prop]['GrpId']}}) } } selector.appear(selectOptions, qsTrId("#selectCategory")) } Connections { target: selector function onSelectionFinished(index, data) { if(data.cat !== undefined){ updateData({cat: data.cat}, true) } } } property var widgetData: currentWidgetData model: widgetData[ "participants" ] === undefined ? 0:widgetData[ "participants" ].length Component.onCompleted: { if(model > 0){ control.ready = true control.status = 200 } else { control.ready = false control.status = 901 } routeSelectTb.setCurrentIndex(routeSelectTb.getIndex(parseInt(control.widgetData['route_order']))) } onRefresh: { updateData({}, false) } delegate: ItemDelegate { id: partDel property int thisIndex: index property var thisData: widgetData[ "participants" ][index] width: control.width height: 50 opacity: 0 scale: 0.9 onThisDataChanged: { fadeInPa.start() } onClicked: { app.openWidget({person:thisData["PerId"]}) } ParallelAnimation { id: fadeInPa NumberAnimation { target: partDel; property: "opacity"; from: 0; to: 1.0; duration: 400 } NumberAnimation { target: partDel; property: "scale"; from: 0.8; to: 1.0; duration: 400 } } text: "" highlighted: partDel.thisIndex % 2 == 0 Row { id: partDelFirstRow anchors { fill: parent leftMargin: parent.width * 0.05 rightMargin: parent.width * 0.05 } spacing: width * 0.05 Label { height: parent.height width: parent.width * 0.1 fontSizeMode: Text.Fit font.bold: true font.pixelSize: Math.abs( height * 0.4 ) verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter text: widgetData[ "participants" ][index]["start_order"] } Label { height: parent.height width: parent.width * 0.45 fontSizeMode: Text.Fit font.bold: true font.pixelSize: Math.abs( height * 0.35 ) verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignLeft minimumPixelSize: 1 text: widgetData[ "participants" ][index]["firstname"] + " " + widgetData[ "participants" ][index]["lastname"] + (partDel.thisData["start_number"] !== undefined ? (" (" + partDel.thisData["start_number"] + ")"):"") } Label { height: parent.height width: parent.width * 0.3 font.bold: false font.pixelSize: height * 0.3 elide: "ElideRight" verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter text: "(" + (widgetData[ "display_athlete" ] === "nation" ? widgetData[ "participants" ][index]["nation"] : widgetData[ "participants" ][index]["federation"]) + ")" onLinkActivated: { Qt.openUrlExternally(link) } } } } footer: ItemDelegate { height: routeSelectTb.height } RectangularGlow { id: toolBarEffect glowRadius: 3 spread: 0.2 color: "black" opacity: 0.3 anchors.fill: routeSelectTb } TabBar { id: routeSelectTb property var tabs: getTabs() property var tabIndexes: [] anchors { left: parent.left right: parent.right bottom: parent.bottom } height: tabs.length > 1 ? 50:0 position: TabBar.Footer function getTabs() { var obj = control.widgetData["route_names"] var buttonData = [] for(var prop in obj) { // go through the whole array and search for data keys if (obj.hasOwnProperty(prop)) { buttonData.push([prop, obj[prop]]) console.log("found " + obj[prop] + " at index " + prop) } } buttonData.sort(function(a, b) { return a[0] - b[0]; }); return buttonData } function getIndex(routeNumber) { console.log("getting index for route number: " + routeNumber) for(var i = 0; i < tabs.length; i++){ //console.log(tabs[i]) if(parseInt(tabs[i][0]) === routeNumber){ console.log("found index: " + i) return i } } return 0 } Repeater { id: routeSelectButtonRep model: routeSelectTb.tabs.length onModelChanged: { routeSelectTb.setCurrentIndex(routeSelectTb.getIndex(parseInt(control.widgetData['route_order']))) } delegate: TabButton { text: routeSelectTb.tabs[index][1] width: Math.max(150, root.width / routeSelectButtonRep.model) //text.length * font.pixelSize onClicked: { //console.log("changing to index: " + index + " (" + routeSelectTb.tabs[index][0] + ", " + routeSelectTb.tabs[index][1] + ")") if(routeSelectTb.getIndex(parseInt(control.widgetData['route_order'])) !== index){ control.changeRoute(routeSelectTb.tabs[index][0]) routeSelectTb.setCurrentIndex(routeSelectTb.getIndex(parseInt(control.widgetData['route_order']))) } } } } } }