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
39
41 : QObject(parent)
42 , d(new Private(this))
43{
44 d->textPropertyConfigModel = new TextPropertyConfigModel(this);
46 QStringList wellFormedBCPNames;
47 Q_FOREACH (const QString langCode, KLocalizedString::languages()) {
48 locales.append(QLocale(langCode));
49 wellFormedBCPNames.append(langCode.split("_").join("-"));
50 }
51 d->locales = wellFormedBCPNames;
52
53 connect(d->textModel, SIGNAL(textPropertyChanged()),
54 &d->modelToProviderCompressor, SLOT(start()));
55 connect(&d->modelToProviderCompressor, SIGNAL(timeout()), this, SLOT(slotTextPropertiesChanged()));
56 connect(d->textModel, SIGNAL(textPropertyChanged()),
57 this, SIGNAL(textPropertiesChanged()));
58}
59
64
66{
67 d->provider = kisview->canvasResourceProvider();
68 if (d->provider) {
69 connect(d->provider, SIGNAL(sigTextPropertiesChanged()),
71
72 // This initializes the docker to an empty entry;
73 KoSvgTextPropertyData textData;
75 d->provider->setTextPropertyData(textData);
76 }
77}
78
80{
81 //setEnabled(true);
82
83 if (m_canvas == canvas) {
84 return;
85 }
86
87 if (m_canvas) {
88 m_canvas->disconnectCanvasObserver(this);
89 }
90
91 KIS_ASSERT(canvas);
92
93 m_canvas = dynamic_cast<KisCanvas2*>(canvas);
94 if (m_canvas && m_canvas->currentImage()) {
95 d->currentDpi = m_canvas->currentImage()->xRes() * 72.0;
96 Q_EMIT dpiChanged();
97 }
98}
99
104
106{
107 return d->currentDpi;
108}
109
111{
112 return d->locales;
113}
114
119
121{
122 return d->textPropertyConfigModel;
123}
124
126{
127 return d->hasFocus;
128}
129
131{
132 if (d->hasFocus == focus) return;
133 d->hasFocus = focus;
134 Q_EMIT hasFocusChanged();
135}
136
138{
139 KoSvgTextPropertyData data = d->provider->textPropertyData();
140 const bool shouldSet = d->hasFocus? !d->modelToProviderCompressor.isActive(): true;
141 if (d->textModel->textData.get() != data && shouldSet) {
142 d->textModel->textData.set(data);
143 Q_EMIT textPropertiesChanged();
144 }
145}
146
148{
149 KoSvgTextPropertyData textData = d->textModel->textData.get();
150 debugFlake << Q_FUNC_INFO << textData;
151 if (d->provider && d->provider->textPropertyData() != textData) {
152 d->provider->setTextPropertyData(textData);
153 }
154}
155
157{
158 TextPropertyConfigDialog dialog(qApp->activeWindow());
159 dialog.setTextPropertyConfigModel(d->textPropertyConfigModel);
160 if (dialog.exec() == QDialog::Accepted) {
161 dialog.model()->saveConfiguration();
163 }
164}
165
167{
168 KoCssStylePresetSP preset = resource.staticCast<KoCssStylePreset>();
169 if (!preset) return;
170 KoSvgTextPropertyData textData = d->textModel->textData.get();
171 KoSvgTextProperties properties = preset->properties(d->currentDpi, true);
172 Q_FOREACH(KoSvgTextProperties::PropertyId p, properties.properties()) {
173 textData.commonProperties.setProperty(p, properties.property(p));
174 }
175 d->textModel->textData.set(textData);
176}
177
179{
180 KoCssStylePresetSP preset(new KoCssStylePreset(QString()));
181 KoSvgTextPropertyData textData = d->textModel->textData.get();
182 preset->setProperties(textData.commonProperties);
183 preset->setName(i18nc("@info:placeholder", "New Style Preset"));
184 preset->setStyleType("character");
185 preset->updateThumbnail();
186
187 CssStylePresetEditDialog *dialog = new CssStylePresetEditDialog(qApp->activeWindow());
188 dialog->setDpi(d->currentDpi);
189 dialog->setCurrentResource(preset);
190
191 if (dialog->exec() == QDialog::Accepted) {
192 return KisResourceUserOperations::addResourceWithUserInput(qApp->activeWindow(), dialog->currentResource());
193 }
194
195 return false;
196}
197
199{
200 KoCssStylePresetSP preset = resource.staticCast<KoCssStylePreset>();
201 if (!preset) return;
202
203 CssStylePresetEditDialog *dialog = new CssStylePresetEditDialog(qApp->activeWindow());
204 dialog->setCurrentResource(preset);
205
206 if (dialog->exec() == QDialog::Accepted) {
207 KisResourceUserOperations::updateResourceWithUserInput(qApp->activeWindow(), dialog->currentResource());
208 } else {
209 KisResourceModel model = KisResourceModel(ResourceType::CssStyles, qApp->activeWindow());
210 model.reloadResource(preset);
211 }
212}
213
215{
216 KoResourceSP newResource = resource->clone();
217 KoCssStylePresetSP preset = newResource.staticCast<KoCssStylePreset>();
218 if (!preset) return;
219
220 CssStylePresetEditDialog *dialog = new CssStylePresetEditDialog(qApp->activeWindow());
221 dialog->setCurrentResource(preset);
222
223 if (dialog->exec() == QDialog::Accepted) {
224 preset = dialog->currentResource();
225 preset->setFilename(preset->name().replace(' ', '_').replace('.', '_') + preset->defaultFileExtension());
226 KisResourceUserOperations::addResourceWithUserInput(qApp->activeWindow(), preset);
227 }
228}
#define debugFlake
Definition FlakeDebug.h:15
const Params2D p
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
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.
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
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.