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 }