// SPDX-License-Identifier: LGPL-3.0-or-later
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* Copyright (C) 2013 - 2024, nymea GmbH
* Copyright (C) 2024 - 2025, chargebyte austria GmbH
*
* This file is part of libnymea-app.
*
* libnymea-app is free software: you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* libnymea-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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with libnymea-app. If not, see .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#ifndef THINGSPROXY_H
#define THINGSPROXY_H
#include
#include
#include
#include "things.h"
class Engine;
class ThingsProxy : public QSortFilterProxyModel
{
Q_OBJECT
Q_PROPERTY(int count READ rowCount NOTIFY countChanged)
Q_PROPERTY(Engine* engine READ engine WRITE setEngine NOTIFY engineChanged)
Q_PROPERTY(ThingsProxy *parentProxy READ parentProxy WRITE setParentProxy NOTIFY parentProxyChanged)
Q_PROPERTY(QString filterTagId READ filterTagId WRITE setFilterTagId NOTIFY filterTagIdChanged)
Q_PROPERTY(QString filterTagValue READ filterTagValue WRITE setFilterTagValue NOTIFY filterTagValueChanged)
Q_PROPERTY(QString filterThingId READ filterThingId WRITE setFilterThingId NOTIFY filterThingIdChanged)
Q_PROPERTY(QString hideTagId READ hideTagId WRITE setHideTagId NOTIFY hideTagIdChanged)
Q_PROPERTY(QString hideTagValue READ hideTagValue WRITE setHideTagValue NOTIFY hideTagValueChanged)
Q_PROPERTY(QStringList shownInterfaces READ shownInterfaces WRITE setShownInterfaces NOTIFY shownInterfacesChanged)
Q_PROPERTY(QStringList hiddenInterfaces READ hiddenInterfaces WRITE setHiddenInterfaces NOTIFY hiddenInterfacesChanged)
Q_PROPERTY(QString nameFilter READ nameFilter WRITE setNameFilter NOTIFY nameFilterChanged)
Q_PROPERTY(QStringList shownThingClassIds READ shownThingClassIds WRITE setShownThingClassIds NOTIFY shownThingClassIdsChanged)
Q_PROPERTY(QStringList hiddenThingClassIds READ hiddenThingClassIds WRITE setHiddenThingClassIds NOTIFY hiddenThingClassIdsChanged)
Q_PROPERTY(QStringList shownThingIds READ shownThingIds WRITE setShownThingIds NOTIFY shownThingIdsChanged)
Q_PROPERTY(QStringList hiddenThingIds READ hiddenThingIds WRITE setHiddenThingIds NOTIFY hiddenThingIdsChanged)
Q_PROPERTY(QString requiredEventName READ requiredEventName WRITE setRequiredEventName NOTIFY requiredEventNameChanged)
Q_PROPERTY(QString requiredStateName READ requiredStateName WRITE setRequiredStateName NOTIFY requiredStateNameChanged)
Q_PROPERTY(QString requiredActionName READ requiredActionName WRITE setRequiredActionName NOTIFY requiredActionNameChanged)
// Setting one of those to true will hide those set to false. If all of those are false no IO filtering will be done
Q_PROPERTY(bool showDigitalInputs READ showDigitalInputs WRITE setShowDigitalInputs NOTIFY showDigitalInputsChanged)
Q_PROPERTY(bool showDigitalOutputs READ showDigitalOutputs WRITE setShowDigitalOutputs NOTIFY showDigitalOutputsChanged)
Q_PROPERTY(bool showAnalogInputs READ showAnalogInputs WRITE setShowAnalogInputs NOTIFY showAnalogInputsChanged)
Q_PROPERTY(bool showAnalogOutputs READ showAnalogOutputs WRITE setShowAnalogOutputs NOTIFY showAnalogOutputsChanged)
// Setting this to true will imply filtering for "battery" interface
Q_PROPERTY(bool filterBatteryCritical READ filterBatteryCritical WRITE setFilterBatteryCritical NOTIFY filterBatteryCriticalChanged)
// Setting this to true will imply filtering for "connectable" interface
Q_PROPERTY(bool filterDisconnected READ filterDisconnected WRITE setFilterDisconnected NOTIFY filterDisconnectedChanged)
Q_PROPERTY(bool filterSetupFailed READ filterSetupFailed WRITE setFilterSetupFailed NOTIFY filterSetupFailedChanged)
Q_PROPERTY(bool filterUpdates READ filterUpdates WRITE setFilterUpdates NOTIFY filterUpdatesChanged)
// A map of paramName:value pairs, all given need to match
Q_PROPERTY(QVariantMap paramsFilter READ paramsFilter WRITE setParamsFilter NOTIFY paramsFilterChanged)
// A map of stateName:value pairs, all given need to match
Q_PROPERTY(QVariantMap stateFilter READ stateFilter WRITE setStateFilter NOTIFY stateFilterChanged)
Q_PROPERTY(bool groupByInterface READ groupByInterface WRITE setGroupByInterface NOTIFY groupByInterfaceChanged)
// If set, sorting will happen for the value of the given state. Make sure the filter is set to contain only things that have the given state
// Does not work in combination with groupByInterface
Q_PROPERTY(QString sortStateName READ sortStateName WRITE setSortStateName NOTIFY sortStateNameChanged)
Q_PROPERTY(Qt::SortOrder sortOrder READ sortOrder WRITE setSortOrder NOTIFY sortOrderChanged)
public:
explicit ThingsProxy(QObject *parent = nullptr);
Engine *engine() const;
void setEngine(Engine *engine);
ThingsProxy *parentProxy() const;
void setParentProxy(ThingsProxy *parentProxy);
QString filterTagId() const;
void setFilterTagId(const QString &filterTag);
QString filterTagValue() const;
void setFilterTagValue(const QString &tagValue);
QString hideTagId() const;
void setHideTagId(const QString &tagId);
QString hideTagValue() const;
void setHideTagValue(const QString &tagValue);
QString filterThingId() const;
void setFilterThingId(const QString &filterThingId);
QStringList shownInterfaces() const;
void setShownInterfaces(const QStringList &shownInterfaces);
QStringList hiddenInterfaces() const;
void setHiddenInterfaces(const QStringList &hiddenInterfaces);
QString nameFilter() const;
void setNameFilter(const QString &nameFilter);
QStringList shownThingClassIds() const;
void setShownThingClassIds(const QStringList &shownThingClassIds);
QStringList hiddenThingClassIds() const;
void setHiddenThingClassIds(const QStringList &hiddenThingClassIds);
QStringList shownThingIds() const;
void setShownThingIds(const QStringList &shownThingIds);
QStringList hiddenThingIds() const;
void setHiddenThingIds(const QStringList &hiddenThingIds);
QString requiredEventName() const;
void setRequiredEventName(const QString &requiredEventName);
QString requiredStateName() const;
void setRequiredStateName(const QString &requiredStateName);
QString requiredActionName() const;
void setRequiredActionName(const QString &requiredActionName);
bool showDigitalInputs() const;
void setShowDigitalInputs(bool showDigitalInputs);
bool showDigitalOutputs() const;
void setShowDigitalOutputs(bool showDigitalOutputs);
bool showAnalogInputs() const;
void setShowAnalogInputs(bool showAnalogInputs);
bool showAnalogOutputs() const;
void setShowAnalogOutputs(bool showAnalogOutputs);
bool filterBatteryCritical() const;
void setFilterBatteryCritical(bool filterBatteryCritical);
bool filterDisconnected() const;
void setFilterDisconnected(bool filterDisconnected);
bool filterSetupFailed() const;
void setFilterSetupFailed(bool filterSetupFailed);
bool filterUpdates() const;
void setFilterUpdates(bool filterUpdates);
QVariantMap paramsFilter() const;
void setParamsFilter(const QVariantMap ¶msFilter);
QVariantMap stateFilter() const;
void setStateFilter(const QVariantMap &stateFilter);
bool groupByInterface() const;
void setGroupByInterface(bool groupByInterface);
QString sortStateName() const;
void setSortStateName(const QString &sortStateName);
void setSortOrder(Qt::SortOrder sortOrder);
Q_INVOKABLE Thing *get(int index) const;
Q_INVOKABLE Thing *getThing(const QUuid &thingId) const;
Q_INVOKABLE int indexOf(Thing *thing) const;
signals:
void engineChanged();
void parentProxyChanged();
void filterTagIdChanged();
void filterTagValueChanged();
void hideTagIdChanged();
void hideTagValueChanged();
void filterThingIdChanged();
void shownInterfacesChanged();
void hiddenInterfacesChanged();
void nameFilterChanged();
void shownThingClassIdsChanged();
void hiddenThingClassIdsChanged();
void shownThingIdsChanged();
void hiddenThingIdsChanged();
void requiredEventNameChanged();
void requiredStateNameChanged();
void requiredActionNameChanged();
void showDigitalInputsChanged();
void showDigitalOutputsChanged();
void showAnalogInputsChanged();
void showAnalogOutputsChanged();
void filterBatteryCriticalChanged();
void filterDisconnectedChanged();
void filterSetupFailedChanged();
void filterUpdatesChanged();
void paramsFilterChanged();
void stateFilterChanged();
void groupByInterfaceChanged();
void sortStateNameChanged();
void sortOrderChanged();
void countChanged();
private slots:
void invalidateFilterInternal();
private:
Thing *getInternal(int source_index) const;
Engine *m_engine = nullptr;
ThingsProxy *m_parentProxy = nullptr;
QString m_filterTagId;
QString m_filterTagValue;
QString m_hideTagId;
QString m_hideTagValue;
QString m_filterThingId;
QStringList m_shownInterfaces;
QStringList m_hiddenInterfaces;
QString m_nameFilter;
QList m_shownThingClassIds;
QList m_hiddenThingClassIds;
QList m_shownThingIds;
QList m_hiddenThingIds;
QString m_requiredEventName;
QString m_requiredStateName;
QString m_requiredActionName;
bool m_showDigitalInputs = false;
bool m_showDigitalOutputs = false;
bool m_showAnalogInputs = false;
bool m_showAnalogOutputs = false;
bool m_filterBatteryCritical = false;
bool m_filterDisconnected = false;
bool m_filterSetupFailed = false;
bool m_filterUpdates = false;
QVariantMap m_paramsFilter;
QVariantMap m_stateFilter;
bool m_groupByInterface = false;
QString m_sortStateName;
int m_oldCount = 0;
protected:
bool lessThan(const QModelIndex &left, const QModelIndex &right) const Q_DECL_OVERRIDE;
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override;
};
#endif // THINGSPROXY_H