Krita Source Code Documentation
Loading...
Searching...
No Matches
KisMultiSensorsModel.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2011 Cyrille Berger <cberger@cberger.net>
3 * SPDX-FileCopyrightText: 2022 Dmitry Kazakov <dimula73@gmail.com>
4 *
5 * SPDX-License-Identifier: LGPL-2.1-or-later
6 */
7
9#include <KoID.h>
10
12{
13 Private(lager::cursor<MultiSensorData> _sensorsData)
14 : sensorsData(_sensorsData)
15 {}
16
17 lager::cursor<MultiSensorData> sensorsData;
18};
19
20KisMultiSensorsModel::KisMultiSensorsModel(lager::cursor<MultiSensorData> sensorsData,
21 QObject* parent)
22 : QAbstractListModel(parent),
23 m_d(new Private(sensorsData))
24{
25 m_d->sensorsData.bind(std::bind(&KisMultiSensorsModel::slotSensorModelChanged, this));
26}
27
31
32int KisMultiSensorsModel::rowCount(const QModelIndex &/*parent*/) const
33{
34 return m_d->sensorsData->size();
35}
36
37QVariant KisMultiSensorsModel::data(const QModelIndex &index, int role) const
38{
39 if (!index.isValid()) return QVariant();
40
41 if (role == Qt::DisplayRole) {
42 return m_d->sensorsData->at(index.row()).first.name();
43 }
44 else if (role == Qt::CheckStateRole) {
45 return m_d->sensorsData->at(index.row()).second ? Qt::Checked : Qt::Unchecked;
46 }
47 return QVariant();
48}
49
50bool KisMultiSensorsModel::setData(const QModelIndex &index, const QVariant &value, int role)
51{
52 bool result = false;
53
54 if (role == Qt::CheckStateRole) {
55 const bool checked = (value.toInt() == Qt::Checked);
56
57 m_d->sensorsData.update([index, checked] (MultiSensorData sensors) {
58 const int numActiveSensors =
59 std::count_if(sensors.begin(), sensors.end(),
60 std::mem_fn(&SensorData::second));
61
62 // we don't allow unchecking of the last sensor (but why?)
63 if (checked || numActiveSensors > 1 ) {
64 sensors[index.row()].second = checked;
65 }
66 return sensors;
67 });
68 result = true;
69 }
70
71 return result;
72}
73
74Qt::ItemFlags KisMultiSensorsModel::flags(const QModelIndex & /*index */) const
75{
76 return Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled;
77}
78
79QString KisMultiSensorsModel::getSensorId(const QModelIndex& index)
80{
81 if (!index.isValid()) return 0;
82 return m_d->sensorsData->at(index.row()).first.id();
83}
84
85QModelIndex KisMultiSensorsModel::sensorIndex(const QString &id)
86{
87 const size_t foundIndex =
88 std::distance(m_d->sensorsData->begin(),
89 std::find_if(m_d->sensorsData->begin(), m_d->sensorsData->end(),
90 [id] (const SensorData &sensor) {
91 return sensor.first.id() == id;
92 }));
93
94 return foundIndex < m_d->sensorsData->size() ?
95 index(foundIndex) : QModelIndex();
96}
97
99{
100 Q_EMIT dataChanged(index(0), index(rowCount() - 1));
101}
float value(const T *src, size_t ch)
int rowCount(const QModelIndex &parent=QModelIndex()) const override
std::pair< KoID, bool > SensorData
QString getSensorId(const QModelIndex &index)
QScopedPointer< Private > m_d
Qt::ItemFlags flags(const QModelIndex &index) const override
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole) override
KisMultiSensorsModel(lager::cursor< MultiSensorData > sensorsData, QObject *parent=0)
QModelIndex sensorIndex(const QString &id)
std::vector< SensorData > MultiSensorData
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
Private(lager::cursor< MultiSensorData > _sensorsData)
lager::cursor< MultiSensorData > sensorsData