File indexing completed on 2024-05-19 04:28:56

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     Q_UNUSED(roles)
0060 
0061     /// the name of the preset is stored in KoResource, not
0062     /// in KisPaintOpSettings, so we should track it separately
0063 
0064     if (m_d->linkedResourceIndex.row() >= topLeft.row() &&
0065             m_d->linkedResourceIndex.row() <= bottomRight.row()) {
0066 
0067         emit sigResourceChanged(key());
0068     }
0069 }
0070 
0071 
0072 /*********************************************************************/
0073 /*          KisCompositeOpResourceConverter                          */
0074 /*********************************************************************/
0075 
0076 
0077 KisCompositeOpResourceConverter::KisCompositeOpResourceConverter()
0078     : KoDerivedResourceConverter(KoCanvasResource::CurrentCompositeOp,
0079                                  KoCanvasResource::CurrentPaintOpPreset)
0080 {
0081 }
0082 
0083 QVariant KisCompositeOpResourceConverter::fromSource(const QVariant &value)
0084 {
0085     KisPaintOpPresetSP preset = value.value<KisPaintOpPresetSP>();
0086     return preset ? preset->settings()->paintOpCompositeOp() : QVariant();
0087 }
0088 
0089 QVariant KisCompositeOpResourceConverter::toSource(const QVariant &value, const QVariant &sourceValue)
0090 {
0091     KisPaintOpPresetSP preset = sourceValue.value<KisPaintOpPresetSP>();
0092     if (!preset) return sourceValue;
0093 
0094     preset->settings()->setPaintOpCompositeOp(value.toString());
0095     return QVariant::fromValue(preset);
0096 }
0097 
0098 /*********************************************************************/
0099 /*          KisEffectiveCompositeOpResourceConverter                 */
0100 /*********************************************************************/
0101 
0102 
0103 KisEffectiveCompositeOpResourceConverter::KisEffectiveCompositeOpResourceConverter()
0104     : KoDerivedResourceConverter(KoCanvasResource::CurrentEffectiveCompositeOp,
0105                                  KoCanvasResource::CurrentPaintOpPreset)
0106 {
0107 }
0108 
0109 QVariant KisEffectiveCompositeOpResourceConverter::fromSource(const QVariant &value)
0110 {
0111     KisPaintOpPresetSP preset = value.value<KisPaintOpPresetSP>();
0112     return preset ? preset->settings()->effectivePaintOpCompositeOp() : QVariant();
0113 }
0114 
0115 QVariant KisEffectiveCompositeOpResourceConverter::toSource(const QVariant &value, const QVariant &sourceValue)
0116 {
0117     Q_UNUSED(value);
0118 
0119     // WARNING: we don't save that!
0120     KisPaintOpPresetSP preset = sourceValue.value<KisPaintOpPresetSP>();
0121     if (!preset) return sourceValue;
0122 
0123     return QVariant::fromValue(preset);
0124 }
0125 
0126 /*********************************************************************/
0127 /*          KisOpacityResourceConverter                              */
0128 /*********************************************************************/
0129 
0130 KisOpacityResourceConverter::KisOpacityResourceConverter()
0131     : KoDerivedResourceConverter(KoCanvasResource::Opacity,
0132                                  KoCanvasResource::CurrentPaintOpPreset)
0133 {
0134 }
0135 
0136 QVariant KisOpacityResourceConverter::fromSource(const QVariant &value)
0137 {
0138     KisPaintOpPresetSP preset = value.value<KisPaintOpPresetSP>();
0139     return preset ? preset->settings()->paintOpOpacity() : QVariant(1.0);
0140 }
0141 
0142 QVariant KisOpacityResourceConverter::toSource(const QVariant &value, const QVariant &sourceValue)
0143 {
0144     KisPaintOpPresetSP preset = sourceValue.value<KisPaintOpPresetSP>();
0145     if (!preset) return sourceValue;
0146 
0147     preset->settings()->setPaintOpOpacity(value.toReal());
0148     return QVariant::fromValue(preset);
0149 }
0150 
0151 /*********************************************************************/
0152 /*          KisFlowResourceConverter                                 */
0153 /*********************************************************************/
0154 
0155 KisFlowResourceConverter::KisFlowResourceConverter()
0156     : KoDerivedResourceConverter(KoCanvasResource::Flow,
0157                                  KoCanvasResource::CurrentPaintOpPreset)
0158 {
0159 }
0160 
0161 QVariant KisFlowResourceConverter::fromSource(const QVariant &value)
0162 {
0163     KisPaintOpPresetSP preset = value.value<KisPaintOpPresetSP>();
0164     return preset ? preset->settings()->paintOpFlow() : QVariant();
0165 }
0166 
0167 QVariant KisFlowResourceConverter::toSource(const QVariant &value, const QVariant &sourceValue)
0168 {
0169     KisPaintOpPresetSP preset = sourceValue.value<KisPaintOpPresetSP>();
0170     if (!preset) return sourceValue;
0171 
0172     preset->settings()->setPaintOpFlow(value.toReal());
0173     return QVariant::fromValue(preset);
0174 }
0175 
0176 /*********************************************************************/
0177 /*          KisFadeResourceConverter                                 */
0178 /*********************************************************************/
0179 
0180 KisFadeResourceConverter::KisFadeResourceConverter()
0181     : KoDerivedResourceConverter(KoCanvasResource::Fade,
0182                                  KoCanvasResource::CurrentPaintOpPreset)
0183 {
0184 }
0185 
0186 QVariant KisFadeResourceConverter::fromSource(const QVariant &value)
0187 {
0188     KisPaintOpPresetSP preset = value.value<KisPaintOpPresetSP>();
0189     return preset ? preset->settings()->paintOpFade() : QVariant();
0190 }
0191 
0192 QVariant KisFadeResourceConverter::toSource(const QVariant &value, const QVariant &sourceValue)
0193 {
0194     KisPaintOpPresetSP preset = sourceValue.value<KisPaintOpPresetSP>();
0195     if (!preset) return sourceValue;
0196 
0197     preset->settings()->setPaintOpFade(value.toReal());
0198     return QVariant::fromValue(preset);
0199 }
0200 
0201 /*********************************************************************/
0202 /*          KisScatterResourceConverter                                 */
0203 /*********************************************************************/
0204 
0205 KisScatterResourceConverter::KisScatterResourceConverter()
0206     : KoDerivedResourceConverter(KoCanvasResource::Scatter,
0207                                  KoCanvasResource::CurrentPaintOpPreset)
0208 {
0209 }
0210 
0211 QVariant KisScatterResourceConverter::fromSource(const QVariant &value)
0212 {
0213     KisPaintOpPresetSP preset = value.value<KisPaintOpPresetSP>();
0214     return preset ? preset->settings()->paintOpScatter() : QVariant();
0215 }
0216 
0217 QVariant KisScatterResourceConverter::toSource(const QVariant &value, const QVariant &sourceValue)
0218 {
0219     KisPaintOpPresetSP preset = sourceValue.value<KisPaintOpPresetSP>();
0220     if (!preset) return sourceValue;
0221 
0222     preset->settings()->setPaintOpScatter(value.toReal());
0223     return QVariant::fromValue(preset);
0224 }
0225 
0226 /*********************************************************************/
0227 /*          KisSizeResourceConverter                                 */
0228 /*********************************************************************/
0229 
0230 KisSizeResourceConverter::KisSizeResourceConverter()
0231     : KoDerivedResourceConverter(KoCanvasResource::Size,
0232                                  KoCanvasResource::CurrentPaintOpPreset)
0233 {
0234 }
0235 
0236 QVariant KisSizeResourceConverter::fromSource(const QVariant &value)
0237 {
0238     KisPaintOpPresetSP preset = value.value<KisPaintOpPresetSP>();
0239     return (preset && preset->settings()) ? preset->settings()->paintOpSize() : QVariant();
0240 }
0241 
0242 QVariant KisSizeResourceConverter::toSource(const QVariant &value, const QVariant &sourceValue)
0243 {
0244     KisPaintOpPresetSP preset = sourceValue.value<KisPaintOpPresetSP>();
0245     if (!preset) return sourceValue;
0246 
0247     preset->settings()->setPaintOpSize(value.toReal());
0248     return QVariant::fromValue(preset);
0249 }
0250 
0251 /*********************************************************************/
0252 /*          KisBrushRotationResourceConverter                        */
0253 /*********************************************************************/
0254 
0255 KisBrushRotationResourceConverter::KisBrushRotationResourceConverter()
0256     : KoDerivedResourceConverter(KoCanvasResource::BrushRotation,
0257                                  KoCanvasResource::CurrentPaintOpPreset)
0258 {
0259 }
0260 
0261 QVariant KisBrushRotationResourceConverter::fromSource(const QVariant &value)
0262 {
0263     KisPaintOpPresetSP preset = value.value<KisPaintOpPresetSP>();
0264     return (preset && preset->settings()) ? preset->settings()->paintOpAngle() : QVariant();
0265 }
0266 
0267 QVariant KisBrushRotationResourceConverter::toSource(const QVariant &value, const QVariant &sourceValue)
0268 {
0269     KisPaintOpPresetSP preset = sourceValue.value<KisPaintOpPresetSP>();
0270     if (!preset) return sourceValue;
0271 
0272     preset->settings()->setPaintOpAngle(value.toReal());
0273     return QVariant::fromValue(preset);
0274 }
0275 
0276 ///*********************************************************************/
0277 ///*          KisPatternSizeResourceConverter                          */
0278 ///*********************************************************************/
0279 //
0280 KisPatternSizeResourceConverter::KisPatternSizeResourceConverter()
0281     : KoDerivedResourceConverter(KoCanvasResource::PatternSize,
0282         KoCanvasResource::CurrentPaintOpPreset)
0283 {
0284 }
0285 
0286 QVariant KisPatternSizeResourceConverter::fromSource(const QVariant& value)
0287 {
0288     KisPaintOpPresetSP preset = value.value<KisPaintOpPresetSP>();
0289     return preset && preset->settings()->hasPatternSettings() ? preset->settings()->paintOpPatternSize() : QVariant::fromValue(1.0);
0290 }
0291 
0292 QVariant KisPatternSizeResourceConverter::toSource(const QVariant& value, const QVariant& sourceValue)
0293 {
0294     KisPaintOpPresetSP preset = sourceValue.value<KisPaintOpPresetSP>();
0295     if (!preset) return sourceValue;
0296 
0297     if (preset->settings()->hasPatternSettings()) {
0298         preset->settings()->setProperty("Texture/Pattern/Scale", value.toReal());
0299     }
0300 
0301     return QVariant::fromValue(preset);
0302 }
0303 
0304 /*********************************************************************/
0305 /*          KisLodAvailabilityResourceConverter                      */
0306 /*********************************************************************/
0307 
0308 KisLodAvailabilityResourceConverter::KisLodAvailabilityResourceConverter()
0309     : KoDerivedResourceConverter(KoCanvasResource::LodAvailability,
0310                                  KoCanvasResource::CurrentPaintOpPreset)
0311 {
0312 }
0313 
0314 QVariant KisLodAvailabilityResourceConverter::fromSource(const QVariant &value)
0315 {
0316     KisPaintOpPresetSP preset = value.value<KisPaintOpPresetSP>();
0317     return preset ? KisPaintOpSettings::isLodUserAllowed(preset->settings()) : QVariant();
0318 }
0319 
0320 QVariant KisLodAvailabilityResourceConverter::toSource(const QVariant &value, const QVariant &sourceValue)
0321 {
0322     KisPaintOpPresetSP preset = sourceValue.value<KisPaintOpPresetSP>();
0323     if (!preset) return sourceValue;
0324 
0325     KisPaintOpSettings::setLodUserAllowed(preset->settings().data(), value.toBool());
0326     return QVariant::fromValue(preset);
0327 }
0328 
0329 /*********************************************************************/
0330 /*          KisLodSizeThresholdResourceConverter                     */
0331 /*********************************************************************/
0332 
0333 KisLodSizeThresholdResourceConverter::KisLodSizeThresholdResourceConverter()
0334     : KoDerivedResourceConverter(KoCanvasResource::LodSizeThreshold,
0335                                  KoCanvasResource::CurrentPaintOpPreset)
0336 {
0337 }
0338 
0339 QVariant KisLodSizeThresholdResourceConverter::fromSource(const QVariant &value)
0340 {
0341     KisPaintOpPresetSP preset = value.value<KisPaintOpPresetSP>();
0342     return preset ? preset->settings()->lodSizeThreshold() : QVariant();
0343 }
0344 
0345 QVariant KisLodSizeThresholdResourceConverter::toSource(const QVariant &value, const QVariant &sourceValue)
0346 {
0347     KisPaintOpPresetSP preset = sourceValue.value<KisPaintOpPresetSP>();
0348     if (!preset) return sourceValue;
0349 
0350     preset->settings()->setLodSizeThreshold(value.toDouble());
0351     return QVariant::fromValue(preset);
0352 }
0353 
0354 /*********************************************************************/
0355 /*          KisLodSizeThresholdSupportedResourceConverter            */
0356 /*********************************************************************/
0357 
0358 KisLodSizeThresholdSupportedResourceConverter::KisLodSizeThresholdSupportedResourceConverter()
0359     : KoDerivedResourceConverter(KoCanvasResource::LodSizeThresholdSupported,
0360                                  KoCanvasResource::CurrentPaintOpPreset)
0361 {
0362 }
0363 
0364 QVariant KisLodSizeThresholdSupportedResourceConverter::fromSource(const QVariant &value)
0365 {
0366     KisPaintOpPresetSP preset = value.value<KisPaintOpPresetSP>();
0367     return preset ? preset->settings()->lodSizeThresholdSupported() : QVariant();
0368 }
0369 
0370 QVariant KisLodSizeThresholdSupportedResourceConverter::toSource(const QVariant &value, const QVariant &sourceValue)
0371 {
0372     // this property of the preset is immutable
0373 
0374     Q_UNUSED(value);
0375     return sourceValue;
0376 }
0377 
0378 
0379 /*********************************************************************/
0380 /*          KisEraserModeResourceConverter                           */
0381 /*********************************************************************/
0382 
0383 KisEraserModeResourceConverter::KisEraserModeResourceConverter()
0384     : KoDerivedResourceConverter(KoCanvasResource::EraserMode,
0385                                  KoCanvasResource::CurrentPaintOpPreset)
0386 {
0387 }
0388 
0389 QVariant KisEraserModeResourceConverter::fromSource(const QVariant &value)
0390 {
0391     KisPaintOpPresetSP preset = value.value<KisPaintOpPresetSP>();
0392     return preset ? preset->settings()->eraserMode() : QVariant();
0393 }
0394 
0395 QVariant KisEraserModeResourceConverter::toSource(const QVariant &value, const QVariant &sourceValue)
0396 {
0397     KisPaintOpPresetSP preset = sourceValue.value<KisPaintOpPresetSP>();
0398     if (!preset) return sourceValue;
0399 
0400     preset->settings()->setEraserMode(value.toBool());
0401     return QVariant::fromValue(preset);
0402 }
0403 
0404 KisBrushNameResourceConverter::KisBrushNameResourceConverter()
0405     : KoDerivedResourceConverter(KoCanvasResource::CurrentPaintOpPresetName,
0406                                  KoCanvasResource::CurrentPaintOpPreset)
0407 {
0408 }
0409 
0410 QVariant KisBrushNameResourceConverter::fromSource(const QVariant &value)
0411 {
0412     KisPaintOpPresetSP preset = value.value<KisPaintOpPresetSP>();
0413     return preset ? preset->name() : QVariant();
0414 }
0415 
0416 QVariant KisBrushNameResourceConverter::toSource(const QVariant &value, const QVariant &sourceValue)
0417 {
0418     KisPaintOpPresetSP preset = sourceValue.value<KisPaintOpPresetSP>();
0419     if (!preset) return sourceValue;
0420 
0421     preset->setName(value.toString());
0422     return QVariant::fromValue(preset);
0423 }