File indexing completed on 2024-05-12 16:01:30

0001 /*
0002  *  SPDX-FileCopyrightText: 2016 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "kis_derived_resources.h"
0008 
0009 #include "kis_signal_auto_connection.h"
0010 #include "kis_canvas_resource_provider.h"
0011 #include "kis_paintop_preset.h"
0012 #include "kis_paintop_settings.h"
0013 #include "KisPaintOpPresetUpdateProxy.h"
0014 #include "KisResourceModel.h"
0015 
0016 
0017 struct KisPresetUpdateMediator::Private
0018 {
0019     Private() : model(ResourceType::PaintOpPresets) {}
0020     KisSignalAutoConnectionsStore connections;
0021     KisResourceModel model;
0022     QModelIndex linkedResourceIndex;
0023 };
0024 
0025 KisPresetUpdateMediator::KisPresetUpdateMediator()
0026     : KoResourceUpdateMediator(KoCanvasResource::CurrentPaintOpPreset),
0027       m_d(new Private)
0028 {
0029     connect(&m_d->model, SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&, const QVector<int>&)),
0030             this, SLOT(slotResourceChanged(const QModelIndex&, const QModelIndex&, const QVector<int>&)));
0031 }
0032 
0033 KisPresetUpdateMediator::~KisPresetUpdateMediator()
0034 {
0035 }
0036 
0037 void KisPresetUpdateMediator::connectResource(QVariant sourceResource)
0038 {
0039     KisPaintOpPresetSP preset = sourceResource.value<KisPaintOpPresetSP>();
0040     if (!preset) return;
0041 
0042     m_d->connections.clear();
0043     m_d->connections.addUniqueConnection(
0044         preset->updateProxy(),
0045         SIGNAL(sigSettingsChanged()),
0046         this,
0047         SLOT(slotSettingsChanged()));
0048 
0049     m_d->linkedResourceIndex = m_d->model.indexForResource(preset);
0050 }
0051 
0052 void KisPresetUpdateMediator::slotSettingsChanged()
0053 {
0054     emit sigResourceChanged(key());
0055 }
0056 
0057 void KisPresetUpdateMediator::slotResourceChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles)
0058 {
0059     /// the name of the preset is stored in KoResource, not
0060     /// in KisPaintOpSettings, so we should track it separately
0061 
0062     if (m_d->linkedResourceIndex.row() >= topLeft.row() &&
0063             m_d->linkedResourceIndex.row() <= bottomRight.row()) {
0064 
0065         emit sigResourceChanged(key());
0066     }
0067 }
0068 
0069 
0070 /*********************************************************************/
0071 /*          KisCompositeOpResourceConverter                          */
0072 /*********************************************************************/
0073 
0074 
0075 KisCompositeOpResourceConverter::KisCompositeOpResourceConverter()
0076     : KoDerivedResourceConverter(KoCanvasResource::CurrentCompositeOp,
0077                                  KoCanvasResource::CurrentPaintOpPreset)
0078 {
0079 }
0080 
0081 QVariant KisCompositeOpResourceConverter::fromSource(const QVariant &value)
0082 {
0083     KisPaintOpPresetSP preset = value.value<KisPaintOpPresetSP>();
0084     return preset ? preset->settings()->paintOpCompositeOp() : QVariant();
0085 }
0086 
0087 QVariant KisCompositeOpResourceConverter::toSource(const QVariant &value, const QVariant &sourceValue)
0088 {
0089     KisPaintOpPresetSP preset = sourceValue.value<KisPaintOpPresetSP>();
0090     if (!preset) return sourceValue;
0091 
0092     preset->settings()->setPaintOpCompositeOp(value.toString());
0093     return QVariant::fromValue(preset);
0094 }
0095 
0096 /*********************************************************************/
0097 /*          KisEffectiveCompositeOpResourceConverter                 */
0098 /*********************************************************************/
0099 
0100 
0101 KisEffectiveCompositeOpResourceConverter::KisEffectiveCompositeOpResourceConverter()
0102     : KoDerivedResourceConverter(KoCanvasResource::CurrentEffectiveCompositeOp,
0103                                  KoCanvasResource::CurrentPaintOpPreset)
0104 {
0105 }
0106 
0107 QVariant KisEffectiveCompositeOpResourceConverter::fromSource(const QVariant &value)
0108 {
0109     KisPaintOpPresetSP preset = value.value<KisPaintOpPresetSP>();
0110     return preset ? preset->settings()->effectivePaintOpCompositeOp() : QVariant();
0111 }
0112 
0113 QVariant KisEffectiveCompositeOpResourceConverter::toSource(const QVariant &value, const QVariant &sourceValue)
0114 {
0115     Q_UNUSED(value);
0116 
0117     // WARNING: we don't save that!
0118     KisPaintOpPresetSP preset = sourceValue.value<KisPaintOpPresetSP>();
0119     if (!preset) return sourceValue;
0120 
0121     return QVariant::fromValue(preset);
0122 }
0123 
0124 /*********************************************************************/
0125 /*          KisOpacityResourceConverter                              */
0126 /*********************************************************************/
0127 
0128 KisOpacityResourceConverter::KisOpacityResourceConverter()
0129     : KoDerivedResourceConverter(KoCanvasResource::Opacity,
0130                                  KoCanvasResource::CurrentPaintOpPreset)
0131 {
0132 }
0133 
0134 QVariant KisOpacityResourceConverter::fromSource(const QVariant &value)
0135 {
0136     KisPaintOpPresetSP preset = value.value<KisPaintOpPresetSP>();
0137     return preset ? preset->settings()->paintOpOpacity() : QVariant(1.0);
0138 }
0139 
0140 QVariant KisOpacityResourceConverter::toSource(const QVariant &value, const QVariant &sourceValue)
0141 {
0142     KisPaintOpPresetSP preset = sourceValue.value<KisPaintOpPresetSP>();
0143     if (!preset) return sourceValue;
0144 
0145     preset->settings()->setPaintOpOpacity(value.toReal());
0146     return QVariant::fromValue(preset);
0147 }
0148 
0149 /*********************************************************************/
0150 /*          KisFlowResourceConverter                                 */
0151 /*********************************************************************/
0152 
0153 KisFlowResourceConverter::KisFlowResourceConverter()
0154     : KoDerivedResourceConverter(KoCanvasResource::Flow,
0155                                  KoCanvasResource::CurrentPaintOpPreset)
0156 {
0157 }
0158 
0159 QVariant KisFlowResourceConverter::fromSource(const QVariant &value)
0160 {
0161     KisPaintOpPresetSP preset = value.value<KisPaintOpPresetSP>();
0162     return preset ? preset->settings()->paintOpFlow() : QVariant();
0163 }
0164 
0165 QVariant KisFlowResourceConverter::toSource(const QVariant &value, const QVariant &sourceValue)
0166 {
0167     KisPaintOpPresetSP preset = sourceValue.value<KisPaintOpPresetSP>();
0168     if (!preset) return sourceValue;
0169 
0170     preset->settings()->setPaintOpFlow(value.toReal());
0171     return QVariant::fromValue(preset);
0172 }
0173 
0174 /*********************************************************************/
0175 /*          KisFadeResourceConverter                                 */
0176 /*********************************************************************/
0177 
0178 KisFadeResourceConverter::KisFadeResourceConverter()
0179     : KoDerivedResourceConverter(KoCanvasResource::Fade,
0180                                  KoCanvasResource::CurrentPaintOpPreset)
0181 {
0182 }
0183 
0184 QVariant KisFadeResourceConverter::fromSource(const QVariant &value)
0185 {
0186     KisPaintOpPresetSP preset = value.value<KisPaintOpPresetSP>();
0187     return preset ? preset->settings()->paintOpFade() : QVariant();
0188 }
0189 
0190 QVariant KisFadeResourceConverter::toSource(const QVariant &value, const QVariant &sourceValue)
0191 {
0192     KisPaintOpPresetSP preset = sourceValue.value<KisPaintOpPresetSP>();
0193     if (!preset) return sourceValue;
0194 
0195     preset->settings()->setPaintOpFade(value.toReal());
0196     return QVariant::fromValue(preset);
0197 }
0198 
0199 /*********************************************************************/
0200 /*          KisScatterResourceConverter                                 */
0201 /*********************************************************************/
0202 
0203 KisScatterResourceConverter::KisScatterResourceConverter()
0204     : KoDerivedResourceConverter(KoCanvasResource::Scatter,
0205                                  KoCanvasResource::CurrentPaintOpPreset)
0206 {
0207 }
0208 
0209 QVariant KisScatterResourceConverter::fromSource(const QVariant &value)
0210 {
0211     KisPaintOpPresetSP preset = value.value<KisPaintOpPresetSP>();
0212     return preset ? preset->settings()->paintOpScatter() : QVariant();
0213 }
0214 
0215 QVariant KisScatterResourceConverter::toSource(const QVariant &value, const QVariant &sourceValue)
0216 {
0217     KisPaintOpPresetSP preset = sourceValue.value<KisPaintOpPresetSP>();
0218     if (!preset) return sourceValue;
0219 
0220     preset->settings()->setPaintOpScatter(value.toReal());
0221     return QVariant::fromValue(preset);
0222 }
0223 
0224 /*********************************************************************/
0225 /*          KisSizeResourceConverter                                 */
0226 /*********************************************************************/
0227 
0228 KisSizeResourceConverter::KisSizeResourceConverter()
0229     : KoDerivedResourceConverter(KoCanvasResource::Size,
0230                                  KoCanvasResource::CurrentPaintOpPreset)
0231 {
0232 }
0233 
0234 QVariant KisSizeResourceConverter::fromSource(const QVariant &value)
0235 {
0236     KisPaintOpPresetSP preset = value.value<KisPaintOpPresetSP>();
0237     return (preset && preset->settings()) ? preset->settings()->paintOpSize() : QVariant();
0238 }
0239 
0240 QVariant KisSizeResourceConverter::toSource(const QVariant &value, const QVariant &sourceValue)
0241 {
0242     KisPaintOpPresetSP preset = sourceValue.value<KisPaintOpPresetSP>();
0243     if (!preset) return sourceValue;
0244 
0245     preset->settings()->setPaintOpSize(value.toReal());
0246     return QVariant::fromValue(preset);
0247 }
0248 
0249 ///*********************************************************************/
0250 ///*          KisPatternSizeResourceConverter                          */
0251 ///*********************************************************************/
0252 //
0253 KisPatternSizeResourceConverter::KisPatternSizeResourceConverter()
0254     : KoDerivedResourceConverter(KoCanvasResource::PatternSize,
0255         KoCanvasResource::CurrentPaintOpPreset)
0256 {
0257 }
0258 
0259 QVariant KisPatternSizeResourceConverter::fromSource(const QVariant& value)
0260 {
0261     KisPaintOpPresetSP preset = value.value<KisPaintOpPresetSP>();
0262     return preset && preset->settings()->hasPatternSettings() ? preset->settings()->paintOpPatternSize() : QVariant::fromValue(1.0);
0263 }
0264 
0265 QVariant KisPatternSizeResourceConverter::toSource(const QVariant& value, const QVariant& sourceValue)
0266 {
0267     KisPaintOpPresetSP preset = sourceValue.value<KisPaintOpPresetSP>();
0268     if (!preset) return sourceValue;
0269 
0270     if (preset->settings()->hasPatternSettings()) {
0271         preset->settings()->setProperty("Texture/Pattern/Scale", value.toReal());
0272     }
0273 
0274     return QVariant::fromValue(preset);
0275 }
0276 
0277 /*********************************************************************/
0278 /*          KisLodAvailabilityResourceConverter                      */
0279 /*********************************************************************/
0280 
0281 KisLodAvailabilityResourceConverter::KisLodAvailabilityResourceConverter()
0282     : KoDerivedResourceConverter(KoCanvasResource::LodAvailability,
0283                                  KoCanvasResource::CurrentPaintOpPreset)
0284 {
0285 }
0286 
0287 QVariant KisLodAvailabilityResourceConverter::fromSource(const QVariant &value)
0288 {
0289     KisPaintOpPresetSP preset = value.value<KisPaintOpPresetSP>();
0290     return preset ? KisPaintOpSettings::isLodUserAllowed(preset->settings()) : QVariant();
0291 }
0292 
0293 QVariant KisLodAvailabilityResourceConverter::toSource(const QVariant &value, const QVariant &sourceValue)
0294 {
0295     KisPaintOpPresetSP preset = sourceValue.value<KisPaintOpPresetSP>();
0296     if (!preset) return sourceValue;
0297 
0298     KisPaintOpSettings::setLodUserAllowed(preset->settings().data(), value.toBool());
0299     return QVariant::fromValue(preset);
0300 }
0301 
0302 /*********************************************************************/
0303 /*          KisLodSizeThresholdResourceConverter                     */
0304 /*********************************************************************/
0305 
0306 KisLodSizeThresholdResourceConverter::KisLodSizeThresholdResourceConverter()
0307     : KoDerivedResourceConverter(KoCanvasResource::LodSizeThreshold,
0308                                  KoCanvasResource::CurrentPaintOpPreset)
0309 {
0310 }
0311 
0312 QVariant KisLodSizeThresholdResourceConverter::fromSource(const QVariant &value)
0313 {
0314     KisPaintOpPresetSP preset = value.value<KisPaintOpPresetSP>();
0315     return preset ? preset->settings()->lodSizeThreshold() : QVariant();
0316 }
0317 
0318 QVariant KisLodSizeThresholdResourceConverter::toSource(const QVariant &value, const QVariant &sourceValue)
0319 {
0320     KisPaintOpPresetSP preset = sourceValue.value<KisPaintOpPresetSP>();
0321     if (!preset) return sourceValue;
0322 
0323     preset->settings()->setLodSizeThreshold(value.toDouble());
0324     return QVariant::fromValue(preset);
0325 }
0326 
0327 /*********************************************************************/
0328 /*          KisLodSizeThresholdSupportedResourceConverter            */
0329 /*********************************************************************/
0330 
0331 KisLodSizeThresholdSupportedResourceConverter::KisLodSizeThresholdSupportedResourceConverter()
0332     : KoDerivedResourceConverter(KoCanvasResource::LodSizeThresholdSupported,
0333                                  KoCanvasResource::CurrentPaintOpPreset)
0334 {
0335 }
0336 
0337 QVariant KisLodSizeThresholdSupportedResourceConverter::fromSource(const QVariant &value)
0338 {
0339     KisPaintOpPresetSP preset = value.value<KisPaintOpPresetSP>();
0340     return preset ? preset->settings()->lodSizeThresholdSupported() : QVariant();
0341 }
0342 
0343 QVariant KisLodSizeThresholdSupportedResourceConverter::toSource(const QVariant &value, const QVariant &sourceValue)
0344 {
0345     // this property of the preset is immutable
0346 
0347     Q_UNUSED(value);
0348     return sourceValue;
0349 }
0350 
0351 
0352 /*********************************************************************/
0353 /*          KisEraserModeResourceConverter                           */
0354 /*********************************************************************/
0355 
0356 KisEraserModeResourceConverter::KisEraserModeResourceConverter()
0357     : KoDerivedResourceConverter(KoCanvasResource::EraserMode,
0358                                  KoCanvasResource::CurrentPaintOpPreset)
0359 {
0360 }
0361 
0362 QVariant KisEraserModeResourceConverter::fromSource(const QVariant &value)
0363 {
0364     KisPaintOpPresetSP preset = value.value<KisPaintOpPresetSP>();
0365     return preset ? preset->settings()->eraserMode() : QVariant();
0366 }
0367 
0368 QVariant KisEraserModeResourceConverter::toSource(const QVariant &value, const QVariant &sourceValue)
0369 {
0370     KisPaintOpPresetSP preset = sourceValue.value<KisPaintOpPresetSP>();
0371     if (!preset) return sourceValue;
0372 
0373     preset->settings()->setEraserMode(value.toBool());
0374     return QVariant::fromValue(preset);
0375 }
0376 
0377 KisBrushNameResourceConverter::KisBrushNameResourceConverter()
0378     : KoDerivedResourceConverter(KoCanvasResource::CurrentPaintOpPresetName,
0379                                  KoCanvasResource::CurrentPaintOpPreset)
0380 {
0381 }
0382 
0383 QVariant KisBrushNameResourceConverter::fromSource(const QVariant &value)
0384 {
0385     KisPaintOpPresetSP preset = value.value<KisPaintOpPresetSP>();
0386     return preset ? preset->name() : QVariant();
0387 }
0388 
0389 QVariant KisBrushNameResourceConverter::toSource(const QVariant &value, const QVariant &sourceValue)
0390 {
0391     KisPaintOpPresetSP preset = sourceValue.value<KisPaintOpPresetSP>();
0392     if (!preset) return sourceValue;
0393 
0394     preset->setName(value.toString());
0395     return QVariant::fromValue(preset);
0396 }