// SPDX-License-Identifier: GPL-3.0-or-later /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 2013 - 2024, nymea GmbH * Copyright (C) 2024 - 2025, chargebyte austria GmbH * * This file is part of nymea-app. * * nymea-app 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. * * nymea-app 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 nymea-app. If not, see . * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ import QtQuick import QtQuick.Controls import QtQuick.Layouts import Nymea import "../components" import "../delegates" Page { id: root header: NymeaHeader { text: qsTr("Configure Things") onBackPressed: pageStack.pop() HeaderButton { imageSource: "qrc:/icons/find.svg" color: filterInput.shown ? Style.accentColor : Style.iconColor onClicked: filterInput.shown = !filterInput.shown } HeaderButton { imageSource: "qrc:/icons/add.svg" onClicked: pageStack.push(Qt.resolvedUrl("NewThingPage.qml")) } } QtObject { id: d property int pendingCommandId: -1 } Connections { target: engine.thingManager onRemoveThingReply: { if (commandId != d.pendingCommandId) { return; } d.pendingCommandId = -1 switch (thingError) { case Thing.ThingErrorNoError: return; default: var errorDialog = Qt.createComponent(Qt.resolvedUrl("../components/ErrorDialog.qml")) var popup = errorDialog.createObject(root, {error: thingError}) popup.open(); } } } ColumnLayout { anchors.fill: parent ListFilterInput { id: filterInput Layout.fillWidth: true } GroupedListView { Layout.fillWidth: true Layout.fillHeight: true clip: true model: ThingsProxy { id: thingsProxy engine: _engine groupByInterface: true nameFilter: filterInput.shown ? filterInput.text : "" } delegate: ThingDelegate { thing: thingsProxy.getThing(model.id) // FIXME: This isn't entirely correct... we should have a way to know if a particular thing is in fact autocreated // This check might be wrong for thingClasses with multiple create methods... canDelete: !thing.isChild || thing.thingClass.createMethods.indexOf("CreateMethodAuto") < 0 onClicked: { pageStack.push(Qt.resolvedUrl("ConfigureThingPage.qml"), {thing: thing}) } onDeleteClicked: { var popup = removeDialogComponent.createObject(root, {thing: thing}) popup.open() } } } } Component { id: removeDialogComponent NymeaDialog { id: removeDialog title: qsTr("Remove thing?") text: qsTr("Are you sure you want to remove %1 and all associated settings?").arg(thing.name) standardButtons: Dialog.Yes | Dialog.No property Thing thing: null onAccepted: { d.pendingCommand = engine.thingManager.removeThing(thing.id) } } } EmptyViewPlaceholder { anchors { left: parent.left; right: parent.right; margins: app.margins } anchors.verticalCenter: parent.verticalCenter visible: engine.thingManager.things.count === 0 && !engine.thingManager.fetchingData title: qsTr("There are no things set up yet.") text: qsTr("In order for your %1 system to be useful, go ahead and add some things.").arg(Configuration.systemName) imageSource: "qrc:/styles/%1/logo.svg".arg(styleController.currentStyle) buttonText: qsTr("Add a thing") onButtonClicked: pageStack.push(Qt.resolvedUrl("NewThingPage.qml")) } }