Krita Source Code Documentation
Loading...
Searching...
No Matches
KisSprayShapeOptionModel.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2022 Agata Cacko <cacko.azh@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
7
8#include <KisLager.h>
9#include <klocalizedstring.h>
10
11namespace {
12
13auto makeSizePack = lager::lenses::getset(
29 [](const std::tuple<KisSprayShapeOptionData, int, qreal> &value) -> SprayShapeSizePack {
30 auto [optionData, diameter, scale] = value;
31
33 pack.isProportional = optionData.proportional;
34
35 if (optionData.proportional) {
36 pack.pxSize = optionData.size * qreal(diameter) * scale / 100.0;
37 pack.proportionalSize = optionData.size;
38 } else {
39 pack.pxSize = optionData.size;
40 pack.proportionalSize = optionData.size * 100.0 / (qreal(diameter) * scale);
41 }
42 pack.diameter = diameter;
43 pack.scale = scale;
44
45 return pack;
46 },
47 [] (std::tuple<KisSprayShapeOptionData, int, qreal> value, const SprayShapeSizePack &pack) -> std::tuple<KisSprayShapeOptionData, int, qreal> {
48 auto [optionData, diameter, scale] = value;
49
50 optionData.size = pack.isProportional ? pack.proportionalSize : pack.pxSize;
51 optionData.proportional = pack.isProportional;
52
53 return std::make_tuple(optionData,
54 diameter,
55 scale);
56 }
57 );
58
59auto calcEffectiveSize = lager::lenses::getset(
60 [](const SprayShapeSizePack &pack) -> QSize {
61 return pack.isProportional ? pack.proportionalSize : pack.pxSize;
62 },
63 [] (SprayShapeSizePack pack, const QSize &size) -> SprayShapeSizePack {
64 if (pack.isProportional) {
66 pack.pxSize = size * pack.diameter * pack.scale / 100.0;
67 } else {
68 pack.proportionalSize = size * 100.0 / (pack.diameter * pack.scale);
69 pack.pxSize = size;
70 }
71 return pack;
72 }
73 );
74}
75
76KisSprayShapeOptionModel::KisSprayShapeOptionModel(lager::cursor<KisSprayShapeOptionData> _optionData, lager::cursor<int> diameter, lager::cursor<qreal> scale)
77 : optionData(_optionData)
78 , sizePack {lager::with(
79 _optionData,
80 diameter,
81 scale
82 ).zoom(makeSizePack)}
83 , LAGER_QT(shape) {_optionData[&KisSprayShapeOptionData::shape].zoom(kislager::lenses::do_static_cast<quint8, int>)}
84 , LAGER_QT(effectiveSize) {sizePack.zoom(calcEffectiveSize)}
85 , LAGER_QT(effectiveProportional) {sizePack[&SprayShapeSizePack::isProportional]}
86 , LAGER_QT(enabled) {_optionData[&KisSprayShapeOptionData::enabled]}
87 , LAGER_QT(imageUrl) {_optionData[&KisSprayShapeOptionData::imageUrl]}
88 , LAGER_QT(sizeSuffix) { sizePack[&SprayShapeSizePack::isProportional].map([] (bool isProportional) { return isProportional ? i18n("%") : i18n(" px"); } ) }
89{
90}
float value(const T *src, size_t ch)
LAGER_QT(effectiveSize)
KisSprayShapeOptionModel(lager::cursor< KisSprayShapeOptionData > optionData, lager::cursor< int > diameter, lager::cursor< qreal > scale)
int size(const Forest< T > &forest)
Definition KisForest.h:1232