File indexing completed on 2024-05-26 04:34:06

0001 /*
0002  *  SPDX-FileCopyrightText: 2011 Cyrille Berger <cberger@cberger.net>
0003  *  SPDX-FileCopyrightText: 2022 Dmitry Kazakov <dimula73@gmail.com>
0004  *
0005  *  SPDX-License-Identifier: GPL-2.0-or-later
0006  */
0007 #include "KisMultiSensorsSelector.h"
0008 
0009 #include "KisCurveOptionData.h"
0010 #include "ui_wdgmultisensorsselector.h"
0011 #include "KisMultiSensorsModel.h"
0012 #include <KisDynamicSensorFactoryRegistry.h>
0013 
0014 
0015 struct KisMultiSensorsSelector::Private {
0016     lager::cursor<KisCurveOptionDataCommon> optionData;
0017 
0018     Ui_WdgMultiSensorsSelector form;
0019     KisMultiSensorsModel* model;
0020     QWidget* currentConfigWidget;
0021     QHBoxLayout* layout;
0022 };
0023 
0024 auto sensorsLens = lager::lenses::getset(
0025     [](const KisCurveOptionDataCommon &data) -> KisMultiSensorsModel::MultiSensorData {
0026         std::vector<const KisSensorData*> srcSensors = data.sensors();
0027 
0028         KisMultiSensorsModel::MultiSensorData sensors;
0029         sensors.reserve(srcSensors.size());
0030 
0031         Q_FOREACH(const KisSensorData* srcSensor, srcSensors) {
0032             sensors.emplace_back(srcSensor->id, srcSensor->isActive);
0033         }
0034         return sensors;
0035     },
0036     [](KisCurveOptionDataCommon data, KisMultiSensorsModel::MultiSensorData sensors) -> KisCurveOptionDataCommon {
0037         std::vector<KisSensorData*> parentSensors = data.sensors();
0038 
0039         KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(parentSensors.size() == sensors.size(), data);
0040 
0041         auto parentIt = parentSensors.begin();
0042         auto it = sensors.begin();
0043         for (; parentIt != parentSensors.end(); ++parentIt, ++it) {
0044 
0045             KIS_SAFE_ASSERT_RECOVER((*parentIt)->id == it->first) {
0046                 continue;
0047             }
0048             (*parentIt)->isActive = it->second;
0049         }
0050 
0051         return data;
0052     });
0053 
0054 
0055 
0056 KisMultiSensorsSelector::KisMultiSensorsSelector(QWidget* parent)
0057     : QWidget(parent)
0058     , d(new Private)
0059 {
0060     d->currentConfigWidget = 0;
0061     d->form.setupUi(this);
0062 
0063     connect(d->form.sensorsList, SIGNAL(activated(QModelIndex)), SLOT(setCurrent(QModelIndex)));
0064     connect(d->form.sensorsList, SIGNAL(clicked(QModelIndex)), SLOT(setCurrent(QModelIndex)));
0065 
0066     d->layout = new QHBoxLayout(d->form.widgetConfiguration);
0067 
0068     // allow the list viewport to be responsive to input release events
0069     d->form.sensorsList->viewport()->installEventFilter(this);
0070 }
0071 
0072 KisMultiSensorsSelector::~KisMultiSensorsSelector()
0073 {
0074     delete d;
0075 }
0076 
0077 void KisMultiSensorsSelector::setOptionDataCursor(lager::cursor<KisCurveOptionDataCommon> optionData)
0078 {
0079     d->optionData = optionData;
0080     d->model = new KisMultiSensorsModel(optionData.zoom(sensorsLens), this);
0081     d->form.sensorsList->setModel(d->model);
0082 
0083     // TODO: verify that at least one sensor is always active!
0084 }
0085 
0086 void KisMultiSensorsSelector::setCurrent(const QString &id)
0087 {
0088     const QModelIndex index = d->model->sensorIndex(id);
0089     KIS_SAFE_ASSERT_RECOVER_RETURN(index.isValid());
0090 
0091     d->form.sensorsList->setCurrentIndex(index);
0092 
0093     sensorActivated(index);
0094     Q_EMIT highlightedSensorChanged(id);
0095 }
0096 
0097 void KisMultiSensorsSelector::setCurrent(const QModelIndex& index)
0098 {
0099     setCurrent(d->model->getSensorId(index));
0100 }
0101 
0102 QString KisMultiSensorsSelector::currentHighlighted()
0103 {
0104     return d->model->getSensorId(d->form.sensorsList->currentIndex());
0105 }
0106 
0107 void KisMultiSensorsSelector::sensorActivated(const QModelIndex& index)
0108 {
0109     delete d->currentConfigWidget;
0110 
0111     KisDynamicSensorFactory *factory =
0112         KisDynamicSensorFactoryRegistry::instance()->get(d->model->getSensorId(index));
0113     KIS_SAFE_ASSERT_RECOVER_RETURN(factory);
0114 
0115     d->currentConfigWidget = factory->createConfigWidget(d->optionData, d->form.widgetConfiguration);
0116     if (d->currentConfigWidget) {
0117         d->layout->addWidget(d->currentConfigWidget);
0118     }
0119 }
0120 
0121 bool KisMultiSensorsSelector::eventFilter(QObject *obj, QEvent *event)
0122 {
0123     /**
0124      * This filter makes it possibe to select a sensor by click+drag gesture.
0125      * Such gesture is very easy to do with a tablet stylus. Basically, we
0126      * activate the lastly-dragged-over sensor on mause/tablet-release
0127      */
0128 
0129     if (event->type() == (QEvent::MouseButtonRelease) || event->type() == QEvent::TabletRelease) {
0130         QModelIndex index = d->form.sensorsList->currentIndex();
0131         setCurrent(index);
0132         event->accept();
0133     }
0134 
0135     return QObject::eventFilter(obj, event);
0136 }