Krita Source Code Documentation
Loading...
Searching...
No Matches
DlgCreateBundle Class Reference

#include <dlg_create_bundle.h>

+ Inheritance diagram for DlgCreateBundle:

Public Slots

void updateTitle (int id)
 

Public Member Functions

 DlgCreateBundle (KoResourceBundleSP bundle=nullptr, QWidget *parent=0)
 
 ~DlgCreateBundle () override
 

Public Attributes

QMap< QString, int > m_count
 
QSet< QString > m_tags
 

Private Slots

void accept () override
 
QVector< KisTagSPgetTagsForEmbeddingInResource (QVector< KisTagSP > resourceTags, QString resourceType) const
 
void reject () override
 
void saveToConfiguration (bool full)
 

Private Member Functions

QString createPrettyFilenameFromName (KoResourceSP resource) const
 
void putMetaDataInTheBundle (KoResourceBundleSP bundle) const
 
bool putResourcesInTheBundle (KoResourceBundleSP bundle)
 

Private Attributes

KoResourceBundleSP m_bundle
 
QString m_bundleCreaterMode
 
KisBundleStoragem_bundleStorage
 
PageBundleSaverm_pageBundleSaver
 
PageMetadataInfom_pageMetadataInfo
 
PageResourceChooserm_pageResourceChooser
 
PageTagChooserm_pageTagChooser
 
QString m_previewImage
 
KisResourceStorageSP m_resourceStorage
 
QList< int > m_selectedResourcesIds
 
QList< int > m_selectedTagIds
 
bool m_storageAdded
 
QString m_storageID
 
Ui::WdgDlgCreateBundle * m_ui
 

Detailed Description

Definition at line 27 of file dlg_create_bundle.h.

Constructor & Destructor Documentation

◆ DlgCreateBundle()

DlgCreateBundle::DlgCreateBundle ( KoResourceBundleSP bundle = nullptr,
QWidget * parent = 0 )
explicit

Definition at line 53 of file dlg_create_bundle.cpp.

54 : QWizard(parent)
55 , m_ui(new Ui::WdgDlgCreateBundle)
56 , m_bundle(bundle)
57 , m_storageAdded(false)
58{
59 m_ui->setupUi(this);
60 setWizardStyle(QWizard::ClassicStyle);
61
62 WdgSide *wdgSide = new WdgSide(m_bundle);
63
68
69 setPage(1, m_pageResourceChooser);
70 setPage(2, m_pageTagChooser);
71 setPage(3, m_pageMetadataInfo);
72 setPage(4, m_pageBundleSaver);
73
74 setSideWidget(wdgSide);
75 setButtonText(QWizard::FinishButton, i18n("Save"));
76
77 connect(this, SIGNAL(currentIdChanged(int)), wdgSide, SLOT(focusLabel(int)));
78 connect(this, SIGNAL(currentIdChanged(int)), this, SLOT(updateTitle(int)));
79
80 KisResourceTypeModel resourceTypesModel;
81 for (int i = 0; i < resourceTypesModel.rowCount(); i++) {
82 QModelIndex idx = resourceTypesModel.index(i, 0);
83 QString resourceType = resourceTypesModel.data(idx, Qt::UserRole + KisResourceTypeModel::ResourceType).toString();
84 m_count.insert(resourceType, 0);
85 }
86
87 m_bundleCreaterMode = "Creator";
88
89 if (m_bundle) {
90 m_bundleCreaterMode = "Editor";
91 m_bundleStorage = new KisBundleStorage(m_bundle->filename());
92
94 #if defined HAVE_SEEXPR
95 resourceTypes << ResourceType::SeExprScripts;
96 #endif
98
99 for (int i = 0; i < resourceTypes.size(); i++) {
101 int count = 0;
102 while (iter->hasNext()) {
103 iter->next();
104 count++;
105 }
106 m_count[resourceTypes[i]] = count;
107
109 while (tagIter->hasNext()) {
110 tagIter->next();
111 m_tags.insert(tagIter->tag()->name());
112 }
113 }
114
115 }
116
117 connect(m_pageResourceChooser, SIGNAL(countUpdated()), m_pageBundleSaver, SLOT(onCountUpdated()));
118 connect(m_pageTagChooser, SIGNAL(tagsUpdated()), m_pageBundleSaver, SLOT(onTagsUpdated()));
119}
QList< QString > QStringList
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
PageMetadataInfo * m_pageMetadataInfo
Ui::WdgDlgCreateBundle * m_ui
PageTagChooser * m_pageTagChooser
PageBundleSaver * m_pageBundleSaver
KoResourceBundleSP m_bundle
PageResourceChooser * m_pageResourceChooser
QMap< QString, int > m_count
QSet< QString > m_tags
KisBundleStorage * m_bundleStorage
QSharedPointer< KisResourceStorage::ResourceIterator > resources(const QString &resourceType) override
QSharedPointer< KisResourceStorage::TagIterator > tags(const QString &resourceType) override
QVariant data(const QModelIndex &index, int role) const override
int rowCount(const QModelIndex &parent=QModelIndex()) const override
const QString Palettes
const QString Brushes
const QString GamutMasks
const QString Patterns
const QString SeExprScripts
const QString Gradients
const QString Workspaces
const QString PaintOpPresets

References ResourceType::Brushes, connect(), KisResourceTypeModel::data(), ResourceType::GamutMasks, ResourceType::Gradients, m_bundle, m_bundleCreaterMode, m_bundleStorage, m_count, m_pageBundleSaver, m_pageMetadataInfo, m_pageResourceChooser, m_pageTagChooser, m_tags, m_ui, ResourceType::PaintOpPresets, ResourceType::Palettes, ResourceType::Patterns, KisBundleStorage::resources(), KisResourceTypeModel::ResourceType, KisResourceTypeModel::rowCount(), ResourceType::SeExprScripts, KisBundleStorage::tags(), updateTitle(), and ResourceType::Workspaces.

◆ ~DlgCreateBundle()

DlgCreateBundle::~DlgCreateBundle ( )
override

Definition at line 148 of file dlg_create_bundle.cpp.

149{
150 delete m_ui;
151}

References m_ui.

Member Function Documentation

◆ accept

void DlgCreateBundle::accept ( )
overrideprivateslot

Definition at line 312 of file dlg_create_bundle.cpp.

313{
315 QString filename = QString("%1/%2.bundle").arg(m_pageBundleSaver->saveLocation(), name.replace(" ", "_"));
316
317 if (name.isEmpty()) {
319 QMessageBox::warning(this, i18nc("@title:window", "Krita"), i18n("The resource bundle name cannot be empty."));
320 return;
321 }
323
324 if (m_pageBundleSaver->saveLocation().isEmpty() ){
326 QMessageBox::warning(this, i18nc("@title:window", "Krita"), i18n("The save location cannot be empty."));
327 return;
328 }
329 else {
330 QFileInfo fileInfo(filename);
331
332 if (fileInfo.exists()) {
334
335 QMessageBox msgBox(this);
336 msgBox.setIcon(QMessageBox::Question);
337 msgBox.setText(i18nc("In a dialog asking whether to overwrite a bundle (resource pack)", "A bundle with this name already exists."));
338 msgBox.setInformativeText(i18nc("In a dialog regarding overwriting a bundle (resource pack)", "Do you want to overwrite the existing bundle?"));
339 msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Cancel);
340 msgBox.setDefaultButton(QMessageBox::Cancel);
341 int ret = msgBox.exec();
342 if (ret == QMessageBox::Cancel) {
343 return;
344 }
345 }
346
347 if (!m_bundle) {
348 saveToConfiguration(false);
349
350 m_bundle.reset(new KoResourceBundle(filename));
353 return;
354 }
355 if (!m_bundle->save()) {
357 QMessageBox::critical(this,
358 i18nc("@title:window", "Krita"),
359 i18n("Could not open '%1' for saving.", filename));
360 m_bundle.reset();
361 return;
362 }
363 } else {
364 saveToConfiguration(false);
365
366 m_bundle.reset(new KoResourceBundle(filename));
369 return;
370 }
371 if (!m_bundle->save()) {
373 QMessageBox::critical(this,
374 i18nc("@title:window", "Krita"),
375 i18n("Could not open '%1' for saving.", filename));
376 m_bundle.reset();
377 return;
378 }
379 }
380 QWizard::accept();
381 }
382}
bool putResourcesInTheBundle(KoResourceBundleSP bundle)
void putMetaDataInTheBundle(KoResourceBundleSP bundle) const
void saveToConfiguration(bool full)
A KoResourceBundle is a zip file that contains resources, some metadata about the creator of the bund...
QString saveLocation() const
QString bundleName() const
const char * name(StandardAction id)

References PageMetadataInfo::bundleName(), m_bundle, m_pageBundleSaver, m_pageMetadataInfo, putMetaDataInTheBundle(), putResourcesInTheBundle(), PageMetadataInfo::removeWarning(), PageBundleSaver::saveLocation(), saveToConfiguration(), PageBundleSaver::showWarning(), and PageMetadataInfo::showWarning().

◆ createPrettyFilenameFromName()

QString DlgCreateBundle::createPrettyFilenameFromName ( KoResourceSP resource) const
private

Definition at line 272 of file dlg_create_bundle.cpp.

273{
274 QString resourceType = resource->resourceType().first;
275 if (resourceType == ResourceType::Patterns
276 || resourceType == ResourceType::Brushes) {
277 // don't change the filename, if the resource is likely to be linked
278 // by filename to another resource
279 return resource->filename();
280 }
281 // to make sure patterns are saved correctly
282 // note that for now (TM) there are no double-suffixes in resources (like '.tar.gz')
283 // otherwise this code should use completeSuffix() and remove the versioning number
284 // (since that's something we want to get rid of)
285 const auto fileInfo = QFileInfo(resource->filename());
286 const auto prefix = fileInfo.dir();
287 // remove the suffix if the name has a suffix (happens for png patterns)
288 const auto nameWithoutSuffix = QFileInfo(resource->name()).completeBaseName();
289 const auto suffix = fileInfo.suffix();
290 return QDir::cleanPath(prefix.filePath(nameWithoutSuffix + "." + suffix));
291}

References ResourceType::Brushes, and ResourceType::Patterns.

◆ getTagsForEmbeddingInResource

QVector< KisTagSP > DlgCreateBundle::getTagsForEmbeddingInResource ( QVector< KisTagSP > resourceTags,
QString resourceType ) const
privateslot

Definition at line 153 of file dlg_create_bundle.cpp.

154{
155 QVector<KisTagSP> tagsToEmbed;
156 KisTagModel *tagModel = new KisTagModel(resourceType);
157
158 for (int i = 0; i < tagModel->rowCount(); i++) {
159 QModelIndex idx = tagModel->index(i, 0);
160 int id = tagModel->data(idx, Qt::UserRole + KisAllTagsModel::Id).toInt();
161 QString url = tagModel->data(idx, Qt::UserRole + KisAllTagsModel::Url).toString();
162 if (m_selectedTagIds.contains(id)) {
163 KisTagSP tag = tagModel->tagForUrl(url);
164 tagsToEmbed << tag;
165 }
166 }
167
168 return tagsToEmbed;
169}
QList< int > m_selectedTagIds
KisTagSP tagForUrl(const QString &url) const override
Retrieve a tag by url.

References KisAllTagsModel::Id, m_selectedTagIds, KisTagModel::tagForUrl(), and KisAllTagsModel::Url.

◆ putMetaDataInTheBundle()

void DlgCreateBundle::putMetaDataInTheBundle ( KoResourceBundleSP bundle) const
private

Definition at line 251 of file dlg_create_bundle.cpp.

252{
256 if (bundle->metaData(KisResourceStorage::s_meta_initial_creator, "").isEmpty()) {
258 }
263
264 bundle->setThumbnail(m_pageMetadataInfo->thumbnail());
265
266 // For compatibility
267 bundle->setMetaData("email", m_pageMetadataInfo->email());
268 bundle->setMetaData("license", m_pageMetadataInfo->license());
269 bundle->setMetaData("website", m_pageMetadataInfo->website());
270}
static const QString s_meta_author
static const QString s_meta_title
static const QString s_meta_email
static const QString s_meta_license
static const QString s_meta_description
static const QString s_meta_website
static const QString s_meta_initial_creator
static const QString s_meta_creator
QString email() const
QString license() const
QString website() const
QString authorName() const
QImage thumbnail() const
QString description() const

References PageMetadataInfo::authorName(), PageMetadataInfo::bundleName(), PageMetadataInfo::description(), PageMetadataInfo::email(), PageMetadataInfo::license(), m_pageMetadataInfo, KisResourceStorage::s_meta_author, KisResourceStorage::s_meta_creator, KisResourceStorage::s_meta_description, KisResourceStorage::s_meta_email, KisResourceStorage::s_meta_initial_creator, KisResourceStorage::s_meta_license, KisResourceStorage::s_meta_title, KisResourceStorage::s_meta_website, PageMetadataInfo::thumbnail(), and PageMetadataInfo::website().

◆ putResourcesInTheBundle()

bool DlgCreateBundle::putResourcesInTheBundle ( KoResourceBundleSP bundle)
private

Definition at line 171 of file dlg_create_bundle.cpp.

172{
173 QMap<QString, QSharedPointer<KisResourceModel>> modelsPerResourceType;
174 KisResourceTypeModel resourceTypesModel;
175 for (int i = 0; i < resourceTypesModel.rowCount(); i++) {
176 QModelIndex idx = resourceTypesModel.index(i, 0);
177 QString resourceType = resourceTypesModel.data(idx, Qt::UserRole + KisResourceTypeModel::ResourceType).toString();
179 // BUG: 445408 Ensure potentially linked but disabled resources are visible
180 model->setResourceFilter(KisResourceModel::ShowAllResources);
181 modelsPerResourceType.insert(resourceType, model);
182 }
183
184 QStringList resourceTypes = modelsPerResourceType.keys();
186
187 QStack<int> allResourcesIds;
188 Q_FOREACH(int id, selectedResourcesIds) {
189 allResourcesIds << id;
190 }
191
192 // note: if there are repetitions, it's fine; the bundle will filter them out
193 QHash<QPair<QString, QString>, std::size_t> usedFilenames;
194
195 while(!allResourcesIds.isEmpty()) {
196 const int id = allResourcesIds.takeFirst();
197 KoResourceSP res;
198 QString resourceTypeHere = "";
200 for (const auto &type: resourceTypes) {
201 res = modelsPerResourceType[type]->resourceForId(id);
202 if (!res.isNull()) {
203 resModel = modelsPerResourceType[type];
204 resourceTypeHere = type;
205 break;
206 }
207 }
208 if (!res) {
209 warnKrita << "No resource for id " << id;
210 continue;
211 }
212 const auto prettyFilename = createPrettyFilenameFromName(res);
213
214 if (usedFilenames.value({res->resourceType().first, prettyFilename}, 0) > 0) {
215 QMessageBox::warning(
216 this,
217 i18nc("@title:window", "Krita"),
218 i18nc("Warning message", "More than one resource share the same file name '%1'. Please export them in separate bundles.", prettyFilename));
219 return false;
220 }
221
222 usedFilenames[{res->resourceType().first, prettyFilename}]+= 1;
223
225
226 QVector<KisTagSP> tags = getTagsForEmbeddingInResource(resModel->tagsForResource(id), res->resourceType().first);
227 bundle->addResource(res->resourceType().first, res->filename(), tags, res->md5Sum(), res->resourceId(), prettyFilename);
228
229 if (m_bundleCreaterMode == "Creator") {
230 QList<KoResourceLoadResult> linkedResources = res->linkedResources(KisGlobalResourcesInterface::instance());
231 Q_FOREACH(KoResourceLoadResult linkedResource, linkedResources) {
232 // we have requested linked resources, how can it be an embedded one?
234
235 KoResourceSP resource = linkedResource.resource();
236
237 if (!resource) {
238 qWarning() << "WARNING: DlgCreateBundle::putResourcesInTheBundle couldn't fetch a linked resource" << linkedResource.signature();
239 continue;
240 }
241
242 if (!allResourcesIds.contains(resource->resourceId())) {
243 allResourcesIds.append(resource->resourceId());
244 }
245 }
246 }
247 }
248 return true;
249}
QString createPrettyFilenameFromName(KoResourceSP resource) const
QVector< KisTagSP > getTagsForEmbeddingInResource(QVector< KisTagSP > resourceTags, QString resourceType) const
static KisResourcesInterfaceSP instance()
The KisResourceModel class provides the main access to resources. It is possible to filter the resour...
KoResourceSP resource() const noexcept
KoResourceSignature signature() const
QList< int > getSelectedResourcesIds()
QList< int > selectedTagIds()
#define KIS_SAFE_ASSERT_RECOVER(cond)
Definition kis_assert.h:126
#define warnKrita
Definition kis_debug.h:87

References createPrettyFilenameFromName(), KisResourceTypeModel::data(), KoResourceLoadResult::EmbeddedResource, PageResourceChooser::getSelectedResourcesIds(), getTagsForEmbeddingInResource(), KisGlobalResourcesInterface::instance(), KIS_SAFE_ASSERT_RECOVER, m_bundleCreaterMode, m_pageResourceChooser, m_pageTagChooser, m_selectedTagIds, KoResourceLoadResult::resource(), KisResourceTypeModel::ResourceType, KisResourceTypeModel::rowCount(), PageTagChooser::selectedTagIds(), KisAbstractResourceFilterInterface::ShowAllResources, KoResourceLoadResult::signature(), KoResourceLoadResult::type(), and warnKrita.

◆ reject

void DlgCreateBundle::reject ( )
overrideprivateslot

Definition at line 384 of file dlg_create_bundle.cpp.

385{
386 if (!m_bundle) {
388 }
389
390 QWizard::reject();
391}

References m_bundle, and saveToConfiguration().

◆ saveToConfiguration

void DlgCreateBundle::saveToConfiguration ( bool full)
privateslot

Definition at line 293 of file dlg_create_bundle.cpp.

294{
295 KisConfig cfg(false);
296 if (full) {
297 cfg.writeEntry<QString>("BundleName", m_pageMetadataInfo->bundleName());
298 cfg.writeEntry<QString>("BundleDescription", m_pageMetadataInfo->description());
299 cfg.writeEntry<QString>("BundleImage", m_pageMetadataInfo->previewImage());
300 } else {
301 cfg.writeEntry<QString>("BundleName", "");
302 cfg.writeEntry<QString>("BundleDescription", "");
303 cfg.writeEntry<QString>("BundleImage", "");
304 }
305 cfg.writeEntry<QString>("BundleExportLocation", m_pageBundleSaver->saveLocation());
306 cfg.writeEntry<QString>("BundleAuthorName", m_pageMetadataInfo->authorName());
307 cfg.writeEntry<QString>("BundleAuthorEmail", m_pageMetadataInfo->email());
308 cfg.writeEntry<QString>("BundleWebsite", m_pageMetadataInfo->website());
309 cfg.writeEntry<QString>("BundleLicense", m_pageMetadataInfo->license());
310}
QString previewImage() const

References PageMetadataInfo::authorName(), PageMetadataInfo::bundleName(), PageMetadataInfo::description(), PageMetadataInfo::email(), PageMetadataInfo::license(), m_pageBundleSaver, m_pageMetadataInfo, PageMetadataInfo::previewImage(), PageBundleSaver::saveLocation(), PageMetadataInfo::website(), and KisConfig::writeEntry().

◆ updateTitle

void DlgCreateBundle::updateTitle ( int id)
slot

Definition at line 121 of file dlg_create_bundle.cpp.

122{
123 if (!m_bundle) {
124 QString title = i18n("Create Resource Bundle");
125
126 switch(id) {
127 case 1: title = i18n("Choose Resources"); break;
128 case 2: title = i18n("Choose Tags"); break;
129 case 3: title = i18n("Enter Bundle Details"); break;
130 case 4: title = i18n("Enter Save Location"); break;
131 }
132
133 setWindowTitle(title);
134 } else {
135 QString title = i18n("Edit Resource Bundle");
136
137 switch(id) {
138 case 1: title = i18n("Edit Resources"); break;
139 case 2: title = i18n("Edit Tags"); break;
140 case 3: title = i18n("Edit Bundle Details"); break;
141 case 4: title = i18n("Edit Save Location"); break;
142 }
143
144 setWindowTitle(title);
145 }
146}

References m_bundle.

Member Data Documentation

◆ m_bundle

KoResourceBundleSP DlgCreateBundle::m_bundle
private

Definition at line 62 of file dlg_create_bundle.h.

◆ m_bundleCreaterMode

QString DlgCreateBundle::m_bundleCreaterMode
private

Definition at line 73 of file dlg_create_bundle.h.

◆ m_bundleStorage

KisBundleStorage* DlgCreateBundle::m_bundleStorage
private

Definition at line 69 of file dlg_create_bundle.h.

◆ m_count

QMap<QString, int> DlgCreateBundle::m_count

Definition at line 35 of file dlg_create_bundle.h.

◆ m_pageBundleSaver

PageBundleSaver* DlgCreateBundle::m_pageBundleSaver
private

Definition at line 67 of file dlg_create_bundle.h.

◆ m_pageMetadataInfo

PageMetadataInfo* DlgCreateBundle::m_pageMetadataInfo
private

Definition at line 66 of file dlg_create_bundle.h.

◆ m_pageResourceChooser

PageResourceChooser* DlgCreateBundle::m_pageResourceChooser
private

Definition at line 64 of file dlg_create_bundle.h.

◆ m_pageTagChooser

PageTagChooser* DlgCreateBundle::m_pageTagChooser
private

Definition at line 65 of file dlg_create_bundle.h.

◆ m_previewImage

QString DlgCreateBundle::m_previewImage
private

Definition at line 61 of file dlg_create_bundle.h.

◆ m_resourceStorage

KisResourceStorageSP DlgCreateBundle::m_resourceStorage
private

Definition at line 70 of file dlg_create_bundle.h.

◆ m_selectedResourcesIds

QList<int> DlgCreateBundle::m_selectedResourcesIds
private

Definition at line 58 of file dlg_create_bundle.h.

◆ m_selectedTagIds

QList<int> DlgCreateBundle::m_selectedTagIds
private

Definition at line 59 of file dlg_create_bundle.h.

◆ m_storageAdded

bool DlgCreateBundle::m_storageAdded
private

Definition at line 72 of file dlg_create_bundle.h.

◆ m_storageID

QString DlgCreateBundle::m_storageID
private

Definition at line 71 of file dlg_create_bundle.h.

◆ m_tags

QSet<QString> DlgCreateBundle::m_tags

Definition at line 36 of file dlg_create_bundle.h.

◆ m_ui

Ui::WdgDlgCreateBundle* DlgCreateBundle::m_ui
private

Definition at line 52 of file dlg_create_bundle.h.


The documentation for this class was generated from the following files: