40 QHash<QString, KisSwatchGroupSP>
groups;
67 m_d->warnPalette.setColor(QPalette::Text, Qt::red);
75 if (!model) {
return; }
77 m_d->model->disconnect(
this);
92 if (!
m_d->view) {
return 0; }
93 if (!
m_d->view->document()) {
return 0; }
98 QFormLayout *layout =
new QFormLayout(dialog.mainWidget());
99 QLineEdit *le =
new QLineEdit(i18nc(
"Default name for a new palette",
"New Palette"));
100 layout->addRow(i18n(
"New palette name:"), le);
102 QComboBox *cmbPaletteType =
new QComboBox();
103 cmbPaletteType->addItem(i18nc(
"Palette File Type",
"Krita Palette (KPL)"));
104 cmbPaletteType->addItem(i18nc(
"Palette File Type",
"GIMP Palette (GPL)"));
105 layout->addRow(cmbPaletteType);
107 QCheckBox *chkSaveInDocument =
new QCheckBox(i18n(
"Save Palette in the Current Document"));
108 chkSaveInDocument->setChecked(
false);
109 layout->addRow(chkSaveInDocument);
112 if (dialog.exec() != QDialog::Accepted) {
return 0; }
114 QString name = le->text();
115 if (cmbPaletteType->currentIndex() == 0) {
121 colorSet->setValid(
true);
122 colorSet->setName(name);
123 colorSet->setFilename(name.split(
" ").join(
"_")+colorSet->defaultFileExtension());
125 QString resourceLocation =
"";
126 if (chkSaveInDocument->isChecked()) {
127 resourceLocation =
m_d->view->document()->linkedResourcesStorageId();
141 dialog.setCaption(i18n(
"Import Palette"));
143 dialog.setDefaultDir(QDir::homePath());
144 dialog.setMimeTypeFilters(
QStringList() <<
"application/x-krita-palette" <<
"application/x-gimp-color-palette");
146 QString filename = dialog.filename();
147 if (filename.isEmpty()) {
151 QMessageBox messageBox;
152 messageBox.setText(i18n(
"Do you want to store this palette in your current image?"));
153 messageBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
154 QString storageLocation =
"";
155 if (messageBox.exec() == QMessageBox::Yes) {
156 storageLocation =
m_d->view->document()->linkedResourcesStorageId();
170 if (!
m_d->view) {
return; }
171 if (!
m_d->view->document()) {
return; }
173 m_d->rServer->removeResourceFromServer(cs);
178 if (!
m_d->modifiedPaletteInfo.groups.contains(originalName)) {
180 if (originalName.isEmpty()) {
181 return colorSet->getGlobalGroup()->rowCount();
186 return group->rowCount();
191 return m_d->modifiedPaletteInfo.groups[originalName]->rowCount();
196 if (name ==
m_d->groupBeingRenamed) {
return false; }
198 if (name == group->name()) {
return true; }
205 return m_d->modifiedPaletteInfo.groups.contains(name);
210 Q_FOREACH (
const QString &oldGroupName,
m_d->modifiedPaletteInfo.groups.keys()) {
211 if (
m_d->modifiedPaletteInfo.groups[oldGroupName]->name() == newName) {
220 if (!
m_d->isEditing) {
223 if (newName.isEmpty()) {
return; }
224 m_d->modifiedPaletteInfo.name = newName;
229 if (!
m_d->isEditing) {
232 m_d->modifiedPaletteInfo.columnCount = newCount;
237 if (!
m_d->isEditing) {
241 m_d->query = &dialog;
243 QVBoxLayout *layout =
new QVBoxLayout(dialog.mainWidget());
245 layout->addWidget(
new QLabel(i18n(
"New swatch group name:")));
248 layout->addWidget(leName);
249 layout->addWidget(
new QLabel(i18n(
"Rows of swatches in group:")));
250 QSpinBox *spxRow =
new QSpinBox();
251 spxRow->setValue(20);
252 layout->addWidget(spxRow);
254 if (dialog.exec() != QDialog::Accepted) {
return QString(); }
257 QString realName = leName->text();
258 QString name = realName;
264 newGroup->setName(realName);
265 m_d->newGroupNames.insert(name);
266 newGroup->setRowCount(spxRow->value());
272 if (!
m_d->isEditing) {
276 dialog.setWindowTitle(i18nc(
"@title:dialog",
"Removing Swatch Group"));
277 QFormLayout *editableItems =
new QFormLayout(dialog.mainWidget());
278 QCheckBox *chkKeep =
new QCheckBox();
280 editableItems->addRow(i18nc(
"Shows up when deleting a swatch group",
"Keep the Colors"), chkKeep);
281 if (dialog.exec() != KoDialog::Accepted) {
return false; }
283 m_d->modifiedPaletteInfo.groups.remove(name);
284 m_d->newGroupNames.remove(name);
285 if (chkKeep->isChecked()) {
286 m_d->keepColorGroups.insert(name);
293 if (!
m_d->isEditing) {
299 m_d->query = &dialog;
300 m_d->groupBeingRenamed =
m_d->modifiedPaletteInfo.groups[oldName]->name();
302 QFormLayout *form =
new QFormLayout(dialog.mainWidget());
304 QLineEdit *leNewName =
new QLineEdit();
306 leNewName->setText(
m_d->modifiedPaletteInfo.groups[oldName]->name());
308 form->addRow(i18n(
"New swatch group name:"), leNewName);
310 if (dialog.exec() != KoDialog::Accepted) {
return QString(); }
311 if (leNewName->text().isEmpty()) {
return QString(); }
314 m_d->modifiedPaletteInfo.groups[oldName]->setName(leNewName->text());
315 m_d->modifiedGroupNames.insert(oldName);
317 return leNewName->text();
322 QLineEdit *leGroupName = qobject_cast<QLineEdit*>(sender());
324 leGroupName->setPalette(
m_d->warnPalette);
330 leGroupName->setPalette(
m_d->normalPalette);
338 if (!
m_d->isEditing) {
341 if (!
m_d->modifiedPaletteInfo.groups.contains(name)) {
return; }
342 m_d->modifiedPaletteInfo.groups[name]->setRowCount(newRowCount);
343 m_d->modifiedGroupNames.insert(name);
348 m_d->modifiedPaletteInfo.storageLocation = location;
353 Q_ASSERT(
m_d->model);
354 if (!
m_d->view) {
return; }
355 if (!
m_d->view->document()) {
return; }
357 c.
setId(QString::number(
m_d->model->colorSet()->colorCount() + 1));
358 c.
setName(i18nc(
"Default name for a color swatch",
"Color %1", QString::number(
m_d->model->colorSet()->colorCount()+1)));
359 m_d->model->setSwatch(c, index);
364 if (
m_d->modifiedPaletteInfo.storageLocation ==
m_d->view->document()->linkedResourcesStorageId()) {
366 m_d->view->document()->setModified(
true);
368 m_d->model->colorSet()->setDirty(
true);
373 Q_ASSERT(
m_d->model);
374 if (!
m_d->view) {
return; }
375 if (!
m_d->view->document()) {
return; }
381 m_d->model->removeSwatch(index,
false);
387 if (!
m_d->view) {
return; }
388 if (!
m_d->view->document()) {
return; }
391 dialog.setCaption(i18nc(
"@title:dialog",
"Add a new Color Swatch"));
392 QFormLayout *editableItems =
new QFormLayout(dialog.mainWidget());
394 QString groupName = qvariant_cast<QString>(index.data(Qt::DisplayRole));
402 QLineEdit *lnIDName =
new QLineEdit();
403 QLineEdit *lnGroupName =
new QLineEdit();
405 QCheckBox *chkSpot =
new QCheckBox();
406 chkSpot->setToolTip(i18nc(
"@info:tooltip",
"A spot color is a color that the printer is able to print without mixing the paints it has available to it. The opposite is called a process color."));
410 editableItems->addRow(i18n(
"Swatch ID:"), lnIDName);
411 editableItems->addRow(i18n(
"Color swatch name:"), lnGroupName);
412 editableItems->addRow(i18nc(
"Color as the Color of a Swatch in a Palette",
"Color:"), bnColor);
413 editableItems->addRow(i18n(
"Spot color:"), chkSpot);
415 lnGroupName->setText(entry.
name());
416 lnIDName->setText(entry.
id());
420 if (dialog.exec() == KoDialog::Accepted) {
421 entry.
setName(lnGroupName->text());
422 entry.
setId(lnIDName->text());
425 m_d->model->setSwatch(entry, index);
432 Q_ASSERT(
m_d->model);
433 if (!
m_d->view) {
return; }
434 if (!
m_d->view->document()) {
return; }
437 dialog.setWindowTitle(i18nc(
"@title:dialog",
"Add a new Color Swatch"));
439 QFormLayout *editableItems =
new QFormLayout(dialog.mainWidget());
441 QComboBox *cmbGroups =
new QComboBox();
442 cmbGroups->addItems(
m_d->model->colorSet()->swatchGroupNames());
443 cmbGroups->setCurrentIndex(0);
445 QLineEdit *lnIDName =
new QLineEdit();
446 lnIDName->setText(QString::number(
m_d->model->colorSet()->colorCount() + 1));
448 QLineEdit *lnName =
new QLineEdit();
449 lnName->setText(i18nc(
"Default name for a color swatch",
"Color %1", QString::number(
m_d->model->colorSet()->colorCount()+1)));
454 QCheckBox *chkSpot =
new QCheckBox();
455 chkSpot->setChecked(
false);
456 chkSpot->setToolTip(i18nc(
"@info:tooltip",
"A spot color is a color that the printer is able to print without mixing the paints it has available to it. The opposite is called a process color."));
458 editableItems->addRow(i18n(
"Swatch Group:"), cmbGroups);
459 editableItems->addRow(i18n(
"Swatch ID:"), lnIDName);
460 editableItems->addRow(i18n(
"Color swatch name:"), lnName);
461 editableItems->addRow(i18nc(
"Color as the Color of a Swatch in a Palette",
"Color:"), bnColor);
462 editableItems->addRow(i18n(
"Spot color:"), chkSpot);
464 if (dialog.exec() != KoDialog::Accepted) {
return; }
466 QString groupName = cmbGroups->currentText();
470 newSwatch.
setName(lnName->text());
471 newSwatch.
setId(lnIDName->text());
473 m_d->model->addSwatch(newSwatch, groupName);
474 m_d->modifiedGroupNames.insert(groupName);
476 if (
m_d->isEditing) {
478 cs->addSwatch(newSwatch);
479 if (!
m_d->modifiedPaletteInfo.groups.contains(groupName)) {
480 m_d->modifiedPaletteInfo.groups.insert(groupName, cs);
487 if (
m_d->model->colorSet()) {
488 return m_d->model->colorSet()->isDirty();
496 if (
m_d->isEditing) {
497 qWarning() <<
"KisPaletteEditor::startEditing(): restarting palette editing.";
501 if (!
m_d->model || !
m_d->model->colorSet()) {
506 m_d->modifiedPaletteInfo.name =
palette->name();
507 m_d->modifiedPaletteInfo.storageLocation =
palette->storageLocation();
508 m_d->modifiedPaletteInfo.columnCount =
palette->columnCount();
509 m_d->modifiedPaletteInfo.groups.clear();
511 Q_FOREACH (
const QString &groupName,
palette->swatchGroupNames()) {
513 m_d->modifiedPaletteInfo.groups.insert(groupName, cs);
516 m_d->isEditing =
true;
521 if (!
m_d->isEditing) {
522 qWarning(
"KisPaletteEditor::endEditing(): not in editing state; ignoring.");
531 if (!
m_d->model)
return;
532 if (!
m_d->model->colorSet())
return;
533 if (!
m_d->view)
return;
534 if (!
m_d->view->document())
return;
545 QString resourceLocation =
m_d->model->colorSet()->storageLocation();
546 if (resourceLocation !=
m_d->modifiedPaletteInfo.storageLocation) {
550 Q_FOREACH (
const QString &groupName,
palette->swatchGroupNames()) {
551 if (!modified.
groups.contains(groupName)) {
552 m_d->model->removeGroup(groupName,
m_d->keepColorGroups.contains(groupName));
555 Q_FOREACH (
const QString &groupName,
palette->swatchGroupNames()) {
556 if (
m_d->modifiedGroupNames.contains(groupName)) {
557 m_d->model->setRowCountForGroup(groupName, modified.
groups[groupName]->rowCount());
558 if (groupName != modified.
groups[groupName]->name()) {
559 m_d->model->changeGroupName(groupName, modified.
groups[groupName]->name());
561 modified.
groups.remove(groupName);
574 m_d->modifiedPaletteInfo.groups.clear();
575 m_d->keepColorGroups.clear();
576 m_d->newGroupNames.clear();
577 m_d->modifiedGroupNames.clear();
578 m_d->isEditing =
false;
583 if (!
m_d->model || !
m_d->model->colorSet()) {
return; }
585 QModelIndex index =
m_d->rServer->resourceModel()->indexForResource(
m_d->model->colorSet());
586 bool isGlobal =
false;
587 if (index.isValid()) {
600 }
else if (
m_d->model->colorSet()->version() >= 0) {
602 res =
m_d->rServer->resourceModel()->updateResource(
m_d->model->colorSet());
603 dbgResources << Q_FUNC_INFO <<
"-- Updating resource without user input: " <<
m_d->model->colorSet()->name() <<
"Result:" << res;
610 Q_ASSERT(
m_d->model);
617 QString groupname = i18nc(
"Default new group name",
"New Group %1", QString::number(i));
618 while (
m_d->modifiedPaletteInfo.groups.contains(groupname)) {
620 groupname = i18nc(
"Default new group name",
"New Group %1", QString::number(i));
627 return QDir::fromNativeSeparators(path).section(
'/', -1, -1);
QList< QString > QStringList
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
void setPaletteModel(KisPaletteModel *model)
KoColorSetSP addPalette()
void rename(const QString &newName)
Stage a palette rename.
KisPaletteEditor(QObject *parent=0)
void startEditing()
Start editing the current palette.
void modifyEntry(const QModelIndex &index)
QString newGroupName() const
void removePalette(KoColorSetSP)
void changeColumnCount(int)
Stage a change of the palette's column count.
bool duplicateExistsOriginalGroupName(const QString &name) const
KoColorSetSP importPalette()
QString filenameFromPath(const QString &path) const
void changeGroupRowCount(const QString &name, int newRowCount)
Stage a change to the row count of a group.
QString renameGroup(const QString &oldName)
Stage a rename of a group.
void saveNewPaletteVersion()
saveNewPaletteVersion
QString addGroup()
Stage the addition of a new swatch group.
QScopedPointer< Private > m_d
bool removeGroup(const QString &name)
Stage the removal of a group.
int rowCountOfGroup(const QString &originalName) const
rowCountOfGroup
void setView(KisViewManager *view)
void slotSetDocumentModified()
void removeEntry(const QModelIndex &index)
void endEditing(bool applyChanges=true)
End editing and either apply or discard staged changes.
QString oldNameFromNewName(const QString &newName) const
oldNameFromNewName
void setStorageLocation(QString location)
bool duplicateExistsGroupName(const QString &name) const
void setEntry(const KoColor &color, const QModelIndex &index)
void slotPaletteChanged()
void slotGroupNameChanged(const QString &newName)
void clearStagedChanges()
void addEntry(const KoColor &color)
The KisPaletteModel class This, together with KisPaletteView and KisPaletteDelegate forms a mvc way t...
static KoResourceSP importResourceFileWithUserInput(QWidget *widgetParent, QString storageLocation, QString resourceType, QString resourceFilepath)
static bool renameResourceWithUserInput(QWidget *widgetParent, KoResourceSP resource, QString resourceName)
static bool addResourceWithUserInput(QWidget *widgetParent, KoResourceSP resource, QString storageLocation="")
static bool updateResourceWithUserInput(QWidget *widgetParent, KoResourceSP resource)
KisResourceStorageSP storageForId(const int storageId) const
The KisSwatchGroup class stores a matrix of color swatches swatches can accessed using (x,...
void setSpotColor(bool spotColor)
void setColor(const KoColor &color)
void setId(const QString &id)
void setName(const QString &name)
static const QString GLOBAL_GROUP_NAME
A dialog base class with standard buttons and predefined layouts.
@ Ok
Show Ok button. (this button accept()s the dialog; result set to QDialog::Accepted)
rgba palette[MAX_PALETTE]
QHash< QString, KisSwatchGroupSP > groups
QPointer< KisViewManager > view
QSet< QString > pathsToRemove
KoResourceServer< KoColorSet > * rServer
QPointer< KoDialog > query
QSet< QString > modifiedGroupNames
QSet< QString > newGroupNames
QSet< QString > keepColorGroups
QPointer< KisPaletteModel > model
KisPaletteEditor::PaletteInfo modifiedPaletteInfo
QString groupBeingRenamed
static KoResourceServerProvider * instance()
KoResourceServer< KoColorSet > * paletteServer