import QtQuick 2.9 import QtQuick.Controls 2.4 DataListView { id: control property var listData: ({}) onListDataChanged: { model = listData[ root.listKey ] === undefined ? 0:listData[ root.listKey ].length } model: listData[ root.listKey ] === undefined ? 0:listData[ root.listKey ].length delegate: ItemDelegate { id: partDel property int ind: index width: parent.width height: 70 text: "" Rectangle { anchors.fill: parent width: partDel.width color: partDel.ind % 2 == 0 ? "white":"lightgrey" opacity: 0.2 } Column { id: partDelCol anchors.fill: parent anchors.margins: 5 Row { id: partDelFirstRow width: parent.width height: parent.height - partDelSecondRow.height Label { height: parent.height width: parent.width * 0.1 fontSizeMode: Text.Fit font.bold: true font.pixelSize: Math.abs( partDelSecondRow.height > 0 ? height * 0.6:height * 0.4 ) verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter text: listData[ "participants" ][index]["result_rank"] } Label { height: parent.height width: parent.width * 0.5 fontSizeMode: Text.Fit font.bold: true font.pixelSize: Math.abs( partDelSecondRow.height > 0 ? height * 0.6:height * 0.4 ) verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignLeft text: listData[ "participants" ][index]["firstname"] + " " + listData[ "participants" ][index]["lastname"] } Label { height: parent.height width: parent.width * 0.4 fontSizeMode: Text.Fit font.bold: false font.pixelSize: Math.abs( partDelSecondRow.height > 0 ? height * 0.4:height * 0.3 ) minimumPixelSize: height * 0.3 elide: "ElideRight" verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter text: "(" + (listData[ "display_athlete" ] === "nation" ? listData[ "participants" ][index]["nation"] : listData[ "participants" ][index]["federation"]) + ")" onLinkActivated: { Qt.openUrlExternally(link) } } } Row { id: partDelSecondRow width: parent.width height: multiResRow.enabled || multiGenResRow.enabled || resultLa.enabled ? parent.height / 2:0 Row { id: multiResRow height: parent.height width: enabled ? parent.width * 0.75:0 enabled: parseInt(listData[ "route_order" ]) > -1 && boulderResRep.model > 0 Repeater { id: boulderResRep model: parseInt(listData[ "route_num_problems" ]) function getDataForIcon(index){ var resultString = listData[ "participants" ][partDel.ind]["boulder"+(index+1)] var resultList = [] if( resultString !== undefined){ resultString = resultString.replace("t", "") resultString = resultString.replace("z", "") resultString = resultString.replace("b", "") resultList = resultString.split(" ") } while (resultList.length < 2){ resultList.unshift(0) } return resultList } delegate: Item { id: boulderResItm anchors.verticalCenter: parent.verticalCenter width: parent.width / ( boulderResRep.model ) height: parent.height Canvas { id: boulderResCv property var resultData: boulderResRep.getDataForIcon(index) anchors.centerIn: parent height: parent.height > parent.width ? parent.width * 0.9:parent.height * 0.9 width: height onPaint: { var width = 24//boulderResCv.width * 0.9 var height = width var radius = width * 0.3 var offsetX = width * 0.05 var offsetY = height * 0.05 console.log("drawing result rect with width: " + width + " and height: " + height) var context = getContext("2d"); context.beginPath(); context.moveTo(0 + offsetX + radius, 0 + offsetY); // top line context.lineTo(width - radius + offsetX, 0 + offsetY); // top right corner context.arc(width-radius + offsetX, radius + offsetY, radius, 1.5 * Math.PI, 0); // right line context.lineTo(width + offsetX, height - radius + offsetY); // bottom right corner context.arc(width-radius + offsetX, height - radius + offsetY, radius, 0, 0.5 * Math.PI); // bottom line context.lineTo(0 + radius + offsetX, height + offsetY); // bottom left corner context.arc(radius + offsetY, height - radius + offsetY, radius, 0.5 * Math.PI, Math.PI); // left line context.lineTo(0 + offsetX, radius + offsetY); // top left corner context.arc(radius + offsetX, radius + offsetY, radius, Math.PI, 1.5 * Math.PI); // fill context.fillStyle = "#b7b7b7"; context.fill(); // outline context.lineWidth = 1; context.strokeStyle = '#424242'; context.stroke(); if(resultData[1] > 0){ // the first triangle context.beginPath(); // top right corner context.arc(width-radius + offsetX, radius + offsetY, radius, 1.75 * Math.PI, 0); // right line context.lineTo(width + offsetX, height - radius + offsetY); // bottom right corner context.arc(width-radius + offsetX, height - radius + offsetY, radius, 0, 0.5 * Math.PI); // bottom line context.lineTo(0 + radius + offsetX, height + offsetY); // bottom left corner context.arc(radius + offsetX, height - radius + offsetY, radius, 0.5 * Math.PI, 0.75 * Math.PI); context.closePath(); context.fillStyle = "#44ed38"; context.fill(); // outline context.lineWidth = 1; context.strokeStyle = '#424242'; context.stroke(); if(resultData[0] > 0){ // the second triangle context.beginPath(); // bottom left corner context.arc(radius + offsetX, height - radius + offsetY, radius, 0.75 * Math.PI, 1 * Math.PI); // left line context.lineTo(0 + offsetX, radius + offsetY); // top left corner context.arc(radius + offsetX, radius + offsetY, radius, Math.PI, 1.5 * Math.PI); // top line context.lineTo(width - radius + offsetX, 0 + offsetY); // top right corner context.arc(width-radius + offsetX, radius + offsetY, radius, 1.5 * Math.PI, 1.75 * Math.PI); context.closePath(); context.fillStyle = "#44ed38"; context.fill(); // outline context.lineWidth = 1; context.strokeStyle = '#424242'; context.stroke(); } } } Label { id: boulderResZoneLa anchors { right: parent.right bottom: parent.bottom margins: boulderResCv.height * 0.05 } height: parent.height / 2 width: parent.width / 2 visible: text !== "0" fontSizeMode: Text.Fit font.pixelSize: height minimumPixelSize: 1 verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter text: boulderResCv.resultData[1] } Label { id: boulderResTopLa anchors { left: parent.left top: parent.top margins: boulderResCv.height * 0.05 } height: parent.height / 2 width: parent.width / 2 visible: text !== "0" fontSizeMode: Text.Fit font.pixelSize: height minimumPixelSize: 1 verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter text: boulderResCv.resultData[0] } } } } } Row { id: multiGenResRow height: parent.height width: enabled ? parent.width - resultLa.width:0 enabled: ((parseInt(listData[ "route_order" ]) === -1) && (generalResRep.model > 0)) ? true:false Repeater { id: generalResRep property var routes: getRoutes() model: routes.length function getRoutes() { var obj = listData["route_names"] var routes = [] for(var prop in obj) { // go through the whole array and search for data keys if (obj.hasOwnProperty(prop) && prop > -1) { routes.push([prop, obj[prop]]) //console.log("found " + obj[prop] + " at index " + prop) } } routes.sort(function(a, b) { return a[0] - b[0]; }); return routes } delegate: Item { id: boulderGenResItm anchors.verticalCenter: parent.verticalCenter width: parent.width / ( generalResRep.model ) height: parent.height visible: boulderGenResLa.text != "" Rectangle { anchors { left: parent.left } width: 1 height: parent.height visible: index === 0 color: "grey" } Rectangle { anchors { right: parent.right } width: 1 height: parent.height color: "grey" } Label { id: boulderGenResLa anchors.centerIn: parent height: parent.height width: parent.width * 0.9 fontSizeMode: Text.Fit font.pixelSize: Math.abs( height * 0.6 ) minimumPixelSize: 1 verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter text: listData[ "participants" ][partDel.ind]["result"+(generalResRep.routes[index][0])] === undefined ? "":listData[ "participants" ][partDel.ind]["result"+(generalResRep.routes[index][0])] } } } } Label { id: resultLa width: enabled ? parent.width * 0.25:0 height: enabled ? parent.height:0 enabled: ( boulderResRep.model > 0 || listData["discipline"] !== "boulder" ) && parseInt(listData[ "route_order" ]) > -1 verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter fontSizeMode: Text.Fit font.pixelSize: Math.abs( height * 0.6 ) minimumPixelSize: 1 text: listData[ "participants" ][partDel.ind]["result"] === undefined ? "":listData[ "participants" ][partDel.ind]["result"] } } } } }