Krita Source Code Documentation
Loading...
Searching...
No Matches
TextPropertiesCanvasObserver.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2025 Wolthera van Hövell tot Westerflier <griffinvalley@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
7
8#include <KLocalizedContext>
9
10#include <KisViewManager.h>
13
14#include <KisResourceModel.h>
16
17#include <lager/state.hpp>
18#include <QApplication>
19
22
42
44 : QObject(parent)
45 , d(new Private(this))
46{
47 d->textPropertyConfigModel = new TextPropertyConfigModel(this);
49 QStringList wellFormedBCPNames;
50 Q_FOREACH (const QString langCode, KLocalizedString::languages()) {
51 locales.append(QLocale(langCode));
52 wellFormedBCPNames.append(langCode.split("_").join("-"));
53 }
54 d->locales = wellFormedBCPNames;
55
56 connect(d->textModel, SIGNAL(textPropertyChanged()),
57 &d->textToProviderCompressor, SLOT(start()));
58 connect(d->characterModel, SIGNAL(textPropertyChanged()),
59 &d->characterToProviderCompressor, SLOT(start()));
60 connect(&d->textToProviderCompressor, SIGNAL(timeout()), this, SLOT(slotTextPropertiesChanged()));
61 connect(&d->characterToProviderCompressor, SIGNAL(timeout()), this, SLOT(slotCharacterPropertiesChanged()));
62 connect(d->textModel, SIGNAL(textPropertyChanged()),
63 this, SIGNAL(textPropertiesChanged()));
64 connect(d->characterModel, SIGNAL(textPropertyChanged()),
65 this, SIGNAL(characterPropertiesChanged()));
66}
67
72
74{
75 d->provider = kisview->canvasResourceProvider();
76 if (d->provider) {
77 connect(d->provider, SIGNAL(sigTextPropertiesChanged()),
79 connect(d->provider, SIGNAL(sigCharacterPropertiesChanged()),
81
82 // This initializes the docker to an empty entry;
83 KoSvgTextPropertyData textData;
85 textData.enabled = true;
86 d->provider->setTextPropertyData(textData);
87 textData.enabled = false;
88 d->provider->setCharacterPropertyData(textData);
89 }
90}
91
93{
94 //setEnabled(true);
95
96 if (m_canvas == canvas) {
97 return;
98 }
99
100 if (m_canvas) {
101 m_canvas->disconnectCanvasObserver(this);
102 }
103
104 KIS_ASSERT(canvas);
105
106 m_canvas = dynamic_cast<KisCanvas2*>(canvas);
107 if (m_canvas && m_canvas->currentImage()) {
108 d->currentDpi = m_canvas->currentImage()->xRes() * 72.0;
109 Q_EMIT dpiChanged();
110 }
111}
112
117
119{
120 return d->currentDpi;
121}
122
124{
125 return d->locales;
126}
127
132
137
139{
140 return d->textPropertyConfigModel;
141}
142
144{
145 return d->hasFocus;
146}
147
149{
150 if (d->hasFocus == focus) return;
151 d->hasFocus = focus;
152 Q_EMIT hasFocusChanged();
153}
154
156{
157 KoSvgTextPropertyData data = d->provider->textPropertyData();
158 const bool shouldSet = d->hasFocus? !d->textToProviderCompressor.isActive(): true;
159 if (d->textModel->textData.get() != data && shouldSet) {
160 d->textModel->textData.set(data);
161 Q_EMIT textPropertiesChanged();
162 }
163}
164
166{
167 KoSvgTextPropertyData data = d->provider->characterTextPropertyData();
168 const bool shouldSet = d->hasFocus? !d->characterToProviderCompressor.isActive(): true;
169 if (d->characterModel->textData.get() != data && shouldSet) {
170 d->characterModel->textData.set(data);
172 }
173}
174
176{
177 KoSvgTextPropertyData textData = d->textModel->textData.get();
178 debugFlake << Q_FUNC_INFO << textData;
179 if (d->provider && d->provider->textPropertyData() != textData) {
180 d->provider->setTextPropertyData(textData);
181 }
182}
183
185{
186 KoSvgTextPropertyData characterData = d->characterModel->textData.get();
187 debugFlake << Q_FUNC_INFO << characterData;
188 if (d->provider && d->provider->characterTextPropertyData() != characterData) {
189 d->provider->setCharacterPropertyData(characterData);
190 }
191}
192
194{
195 TextPropertyConfigDialog dialog(qApp->activeWindow());
196 dialog.setTextPropertyConfigModel(d->textPropertyConfigModel);
197 if (dialog.exec() == QDialog::Accepted) {
198 dialog.model()->saveConfiguration();
200 }
201}
202
204{
205 KoCssStylePresetSP preset = resource.staticCast<KoCssStylePreset>();
206 if (!preset) return;
207 KoSvgTextPropertiesModel *model = d->characterModel->enabled() && d->characterModel->spanSelection()? d->characterModel: d->textModel;
208 KoSvgTextPropertyData textData = model->textData.get();
209 KoSvgTextProperties properties = preset->properties(d->currentDpi, true);
210 Q_FOREACH(KoSvgTextProperties::PropertyId p, properties.properties()) {
211 textData.commonProperties.setProperty(p, properties.property(p));
212 }
213 model->textData.set(textData);
214}
215
217{
218 KoCssStylePresetSP preset(new KoCssStylePreset(QString()));
219 KoSvgTextPropertiesModel *model = d->characterModel->enabled() && d->characterModel->spanSelection()? d->characterModel: d->textModel;
220 KoSvgTextPropertyData textData = model->textData.get();
221 preset->setProperties(textData.commonProperties);
222 preset->setName(i18nc("@info:placeholder", "New Style Preset"));
223 preset->setStyleType("character");
224 preset->updateThumbnail();
225
226 CssStylePresetEditDialog *dialog = new CssStylePresetEditDialog(qApp->activeWindow());
227 dialog->setDpi(d->currentDpi);
228 dialog->setCurrentResource(preset);
229
230 if (dialog->exec() == QDialog::Accepted) {
231 return KisResourceUserOperations::addResourceWithUserInput(qApp->activeWindow(), dialog->currentResource());
232 }
233
234 return false;
235}
236
238{
239 KoCssStylePresetSP preset = resource.staticCast<KoCssStylePreset>();
240 if (!preset) return;
241
242 CssStylePresetEditDialog *dialog = new CssStylePresetEditDialog(qApp->activeWindow());
243 dialog->setCurrentResource(preset);
244
245 if (dialog->exec() == QDialog::Accepted) {
246 KisResourceUserOperations::updateResourceWithUserInput(qApp->activeWindow(), dialog->currentResource());
247 } else {
248 KisResourceModel model = KisResourceModel(ResourceType::CssStyles, qApp->activeWindow());
249 model.reloadResource(preset);
250 }
251}
252
254{
255 KoResourceSP newResource = resource->clone();
256 KoCssStylePresetSP preset = newResource.staticCast<KoCssStylePreset>();
257 if (!preset) return;
258
259 CssStylePresetEditDialog *dialog = new CssStylePresetEditDialog(qApp->activeWindow());
260 dialog->setCurrentResource(preset);
261
262 if (dialog->exec() == QDialog::Accepted) {
263 preset = dialog->currentResource();
264 preset->setFilename(preset->name().replace(' ', '_').replace('.', '_') + preset->defaultFileExtension());
265 KisResourceUserOperations::addResourceWithUserInput(qApp->activeWindow(), preset);
266 }
267}
#define debugFlake
Definition FlakeDebug.h:15
const Params2D p
The KisResourceModel class provides the main access to resources. It is possible to filter the resour...
bool reloadResource(KoResourceSP resource) override
reloadResource
static bool addResourceWithUserInput(QWidget *widgetParent, KoResourceSP resource, QString storageLocation="")
static bool updateResourceWithUserInput(QWidget *widgetParent, KoResourceSP resource)
KisCanvasResourceProvider * canvasResourceProvider()
The KoCssStylePreset class.
The KoSvgTextPropertiesModel class.
lager::cursor< KoSvgTextPropertyData > textData
QList< PropertyId > properties() const
QVariant property(PropertyId id, const QVariant &defaultValue=QVariant()) const
void setProperty(PropertyId id, const QVariant &value)
TextPropertyConfigModel * textPropertyConfig
const QScopedPointer< Private > d
void cloneAndEditPreset(KoResourceSP resource)
void setCanvas(KoCanvasBase *canvas) override
localesChangedKoSvgTextPropertiesModel * textProperties
KoSvgTextPropertiesModel * characterProperties
void setViewManager(KisViewManager *kisview) override
TextPropertiesCanvasObserver(QObject *parent=nullptr)
#define KIS_ASSERT(cond)
Definition kis_assert.h:33
const QString CssStyles
The KoSvgTextPropertyData struct.
KoSvgTextProperties commonProperties
The properties common between all the selected text.
KoSvgTextProperties inheritedProperties
The properties that are inherited, so that widgets may be set correctly.