import QtQuick 2.9 import org.kde.kirigami 2.12 as Kirigami import QtQuick.Controls 2.9 as Controls import QtQuick.Layouts 1.12 as Layouts Kirigami.ApplicationWindow { id: root title: "Vehicle Voyage" Kirigami.PageRouter { id: router initialRoute: "main" pageStack: root.pageStack.columnView Kirigami.PageRoute { name: "main" Component { Kirigami.Page { id: mainPage mainAction: Kirigami.Action { text: qsTr("Add Vehicle") onTriggered: { router.navigateToRoute(["main","addvehicle"]); } } contextualActions: [ Kirigami.Action { iconName: "help-about" text: qsTr("About") onTriggered: { router.navigateToRoute("about"); } } ] title: "Vehicles" Kirigami.CardsListView { Layouts.Layout.fillWidth: true Layouts.Layout.fillHeight: true id: vehicleView model: vehicleModel delegate: Kirigami.Card { id: card banner { title: name } } Controls.ScrollBar.vertical: Controls.ScrollBar {} } } } } Kirigami.PageRoute { name: "about" Component { Kirigami.AboutPage { id: aboutPage actions.main: Kirigami.Action { iconName: "window-close" text: qsTr("Close") onTriggered: { router.navigateToRoute("main"); } } aboutData: appAboutData } } } Kirigami.PageRoute { name: "addvehicle" Component { Kirigami.Page { title: qsTr("Add Vehicle") Layouts.ColumnLayout { anchors.fill: parent Layouts.RowLayout { Controls.Label { text: qsTr("Name")+":" } Controls.TextField { // } } Layouts.RowLayout { Controls.Label { text: qsTr("Make")+":" } Controls.TextField { // } } Layouts.RowLayout { Controls.Label { text: qsTr("Model")+":" } Controls.TextField { // } } Layouts.RowLayout { Controls.Label { text: qsTr("Year")+":" } Controls.TextField { inputMethodHints: Qt.ImhDigitsOnly validator: IntValidator { bottom: 1900 top: 4000 } } } Controls.Button { text: qsTr("Add") highlighted: true onClicked: { router.popRoute(); } } } } } } } /*Kirigami.Page { id: mainPage mainAction: Kirigami.Action { iconName: "view-refresh" text: qsTr("Query Device") onTriggered: { deviceSelect.open(); } } contextualActions: [ Kirigami.Action { iconName: "help-about" text: qsTr("About") onTriggered: { pageStack.replace(aboutPageComponent); } } ] title: "Monitor" leftPadding: 0 rightPadding: 0 Layouts.ColumnLayout { anchors.fill: parent Kirigami.InlineMessage { Layouts.Layout.fillWidth: true Layouts.Layout.leftMargin: 10 Layouts.Layout.rightMargin: 10 z: 9997 type: Kirigami.MessageType.Error id: errorMessage showCloseButton: true Connections { target: qiflora onErrorHappened: { errorMessage.text = description; errorMessage.visible = true; } } } Kirigami.CardsListView { Layouts.Layout.fillWidth: true Layouts.Layout.fillHeight: true id: monitorView model: ListModel { id: monitorTypes ListElement{ chartType: "temperature" title: "Temperature" icon: "filename-bpm-amarok" lineColor: "red" units: "°C" yMin: -20 yMax: 40 modelCol: 1 } ListElement{ chartType: "moisture" title: "Moisture" icon: "colors-chromablue" lineColor: "cyan" units: "%" yMin: 0 yMax: 75 modelCol: 3 } ListElement{ chartType: "conductivity" title: "Conductivity" icon: "quickopen" lineColor: "gold" units: "µS/cm" yMin: 0 yMax: 6000 modelCol: 4 } ListElement{ chartType: "brightness" title: "Brightness" icon: "contrast" lineColor: "orange" units: "lux" yMin: 0 yMax: 30000 modelCol: 2 } } delegate: Kirigami.Card { id: card banner { title: qsTr(model.title) titleIcon: model.icon titleLevel: 2 } header: Row { layoutDirection: Qt.RightToLeft topPadding: 10.0 rightPadding: 10.0 Layouts.ColumnLayout { Kirigami.Heading { Layouts.Layout.alignment: Qt.AlignCenter level: 4 text: qsTr("Last Measured") } Kirigami.Heading { Layouts.Layout.alignment: Qt.AlignCenter level: 3 text: { if(model.chartType == "temperature") Math.round(qiflora.temperature*10)/10 + "°C\n" + (Math.round((qiflora.temperature*1.8+32)*10)/10) + "°F" else if(model.chartType == "moisture") qiflora.moisture + "%" else if(model.chartType == "conductivity") qiflora.conduction + " µS/cm" else if(model.chartType == "brightness") qiflora.brightness + " lux" } } } } contentItem: Item { implicitWidth: 300 implicitHeight: 200 Charts.ChartView { id: chart antialiasing: true backgroundColor: Kirigami.Theme.buttonBackgroundColor titleColor: Kirigami.Theme.textColor legend.visible: false anchors.fill: parent Charts.LineSeries { id: series axisX: Charts.DateTimeAxis { id: dateAx labelsColor: Kirigami.Theme.textColor format: "MMM d yyyy ha" Component.onCompleted: { //On load, change date span to last 24 to remove awkward 1969 empty dates. var yesterday = new Date(); yesterday.setDate(yesterday.getDate() -1); dateAx.min = yesterday; dateAx.max = new Date(); } } axisY: Charts.ValueAxis { id: valueAx labelFormat: "%d "+units labelsColor: Kirigami.Theme.textColor min: yMin max: yMax } color: model.lineColor name: model.title Charts.VXYModelMapper { model: qiflora.model xColumn: 0 yColumn: modelCol } } Connections { target: qiflora.model onRowsInserted: { //Readjust graphs to show date range from earliest item. dateAx.max = new Date(); dateAx.min = qiflora.model.data(qiflora.model.index(0,0)); } } } } } Controls.ScrollBar.vertical: Controls.ScrollBar {} } } Kirigami.OverlaySheet { id: deviceSelect showCloseButton: false contentItem: ListView { header: Column { Rectangle { height: 10 color: "transparent" } Kirigami.Heading { text: qsTr("Select Device to Query") } Rectangle { height: 10 color: "transparent" } } id: deviceList model: qiflora.devices delegate: Kirigami.AbstractListItem { Layouts.ColumnLayout { Kirigami.Heading { text:model.modelData.name level: 2 } Kirigami.Heading { text:model.modelData.address level: 5 } } onClicked: { qiflora.updateDataFromDevice(model.modelData.address); deviceSelect.close(); } } } onSheetOpenChanged: { if(!sheetOpen) { qiflora.stopSearch(); } else { qiflora.startSearch(); } } } }*/ }