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 }