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 }