• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • krita API Reference
  • KDE Home
  • Contact Us
 

KritaWidgets

  • sources
  • kfour-appscomplete
  • krita
  • libs
  • widgets
kis_palette_view.cpp
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: 2016 Dmitry Kazakov <[email protected]>
3  *
4  * SPDX-License-Identifier: GPL-2.0-or-later
5  */
6 
7 #include "kis_palette_view.h"
8 
9 #include <QWheelEvent>
10 #include <QHeaderView>
11 #include <QFormLayout>
12 #include <QLabel>
13 #include <QLineEdit>
14 #include <QCheckBox>
15 #include <QComboBox>
16 #include <QMenu>
17 
18 #include <KConfigGroup>
19 #include <KSharedConfig>
20 #include <KLocalizedString>
21 
22 #include <kis_icon_utils.h>
23 
24 #include <KisKineticScroller.h>
25 
26 #include <KoDialog.h>
27 #include <KoColorDisplayRendererInterface.h>
28 
29 #include "KisPaletteDelegate.h"
30 #include "KisPaletteModel.h"
31 #include "kis_color_button.h"
32 #include <KisSwatch.h>
33 #include <KisResourceModel.h>
34 
35 int KisPaletteView::MININUM_ROW_HEIGHT = 10;
36 
37 struct KisPaletteView::Private
38 {
39  QPointer<KisPaletteModel> model;
40  bool allowPaletteModification {false}; // if modification is allowed from this widget
41 };
42 
43 KisPaletteView::KisPaletteView(QWidget *parent)
44  : QTableView(parent)
45  , m_d(new Private)
46 {
47  setItemDelegate(new KisPaletteDelegate(this));
48 
49  setShowGrid(true);
50  setDropIndicatorShown(true);
51  setDragDropMode(QAbstractItemView::InternalMove);
52  setSelectionMode(QAbstractItemView::SingleSelection);
53  setDragEnabled(false);
54  setAcceptDrops(false);
55 
56  /*
57  * without this, a cycle might be created:
58  * the view stretches to right border, and this make it need a scroll bar;
59  * after the bar is added, the view shrinks to the bar, and this makes it
60  * no longer need the bar any more, and the bar is removed again
61  */
62  setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
63 
64  // set the size of swatches
65  horizontalHeader()->setVisible(false);
66  verticalHeader()->setVisible(false);
67  horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
68  horizontalHeader()->setMinimumSectionSize(MININUM_ROW_HEIGHT);
69  verticalHeader()->setSectionResizeMode(QHeaderView::Fixed);
70  verticalHeader()->setMinimumSectionSize(MININUM_ROW_HEIGHT);
71 
72  connect(horizontalHeader(), SIGNAL(sectionResized(int,int,int)),
73  SLOT(slotHorizontalHeaderResized(int,int,int)));
74  setAutoFillBackground(true);
75 
76  QScroller *scroller = KisKineticScroller::createPreconfiguredScroller(this);
77  if (scroller) {
78  connect(scroller, SIGNAL(stateChanged(QScroller::State)),
79  this, SLOT(slotScrollerStateChanged(QScroller::State)));
80  }
81 
82  connect(this, SIGNAL(clicked(QModelIndex)), SLOT(slotCurrentSelectionChanged(QModelIndex)));
83 }
84 
85 KisPaletteView::~KisPaletteView()
86 {
87 }
88 
89 void KisPaletteView::setCrossedKeyword(const QString &value)
90 {
91  KisPaletteDelegate *delegate =
92  dynamic_cast<KisPaletteDelegate*>(itemDelegate());
93  KIS_ASSERT_RECOVER_RETURN(delegate);
94 
95  delegate->setCrossedKeyword(value);
96 }
97 
98 bool KisPaletteView::addEntryWithDialog(KoColor color)
99 {
100  KoDialog dialog;
101  dialog.setWindowTitle(i18nc("@title:dialog", "Add a new Colorset Entry"));
102  QFormLayout *editableItems = new QFormLayout(dialog.mainWidget());
103 
104  QComboBox *cmbGroups = new QComboBox;
105  QString defaultGroupName = i18nc("Name for default group", "Default");
106  cmbGroups->addItem(defaultGroupName);
107  cmbGroups->addItems(m_d->model->colorSet()->getGroupNames());
108  QLineEdit *lnIDName = new QLineEdit;
109  QLineEdit *lnName = new QLineEdit;
110  KisColorButton *bnColor = new KisColorButton;
111  QCheckBox *chkSpot = new QCheckBox;
112  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."));
113  editableItems->addRow(i18n("Group"), cmbGroups);
114  editableItems->addRow(i18n("ID"), lnIDName);
115  editableItems->addRow(i18n("Name"), lnName);
116  editableItems->addRow(i18n("Color"), bnColor);
117  editableItems->addRow(i18nc("Spot color", "Spot"), chkSpot);
118  cmbGroups->setCurrentIndex(0);
119  lnName->setText(i18nc("Part of a default name for a color","Color")+" " + QString::number(m_d->model->colorSet()->colorCount()+1));
120  lnIDName->setText(QString::number(m_d->model->colorSet()->colorCount() + 1));
121  bnColor->setColor(color);
122  chkSpot->setChecked(false);
123 
124  if (dialog.exec() == KoDialog::Accepted) {
125  QString groupName = cmbGroups->currentText();
126  if (groupName == defaultGroupName) {
127  groupName = QString();
128  }
129  KisSwatch newEntry;
130  newEntry.setColor(bnColor->color());
131  newEntry.setName(lnName->text());
132  newEntry.setId(lnIDName->text());
133  newEntry.setSpotColor(chkSpot->isChecked());
134  m_d->model->addEntry(newEntry, groupName);
135  saveModification();
136  return true;
137  }
138 
139  return false;
140 }
141 
142 bool KisPaletteView::addGroupWithDialog()
143 {
144  KoDialog dialog;
145  dialog.setWindowTitle(i18nc("@title:dialog","Add a new group"));
146  QFormLayout *editableItems = new QFormLayout(dialog.mainWidget());
147  QLineEdit *lnName = new QLineEdit();
148  lnName->setText(i18nc("Part of default name for a new group", "Color Group")+""+QString::number(m_d->model->colorSet()->getGroupNames().size()+1));
149  editableItems->addRow(i18nc("Name for a group", "Name"), lnName);
150 
151  if (dialog.exec() == KoDialog::Accepted) {
152  KisSwatchGroup group;
153  group.setName(lnName->text());
154  m_d->model->addGroup(group);
155  saveModification();
156  return true;
157  }
158  return false;
159 }
160 
161 bool KisPaletteView::removeEntryWithDialog(QModelIndex index)
162 {
163  bool keepColors = false;
164  if (qvariant_cast<bool>(index.data(KisPaletteModel::IsGroupNameRole))) {
165  KoDialog dialog;
166  dialog.setWindowTitle(i18nc("@title:dialog","Removing Group"));
167  QFormLayout *editableItems = new QFormLayout(dialog.mainWidget());
168  QCheckBox *chkKeep = new QCheckBox();
169  editableItems->addRow(i18nc("Shows up when deleting a swatch group", "Keep the Colors"), chkKeep);
170 
171  if (dialog.exec() != KoDialog::Accepted) { return false; }
172  keepColors = chkKeep->isChecked();
173  }
174  m_d->model->removeEntry(index, keepColors);
175 
176  saveModification();
177 
178  return true;
179 }
180 
181 void KisPaletteView::selectClosestColor(const KoColor &color)
182 {
183  KoColorSetSP color_set = m_d->model->colorSet();
184  if (!color_set) {
185  return;
186  }
187  //also don't select if the color is the same as the current selection
188  if (m_d->model->getEntry(currentIndex()).color() == color) {
189  return;
190  }
191 
192  selectionModel()->clearSelection();
193  QModelIndex index = m_d->model->indexForClosest(color);
194 
195  selectionModel()->setCurrentIndex(index, QItemSelectionModel::Select);
196 }
197 
198 const KoColor KisPaletteView::closestColor(const KoColor &color) const
199 {
200  QModelIndex index = m_d->model->indexForClosest(color);
201  KisSwatch swatch = m_d->model->getEntry(index);
202  return swatch.color();
203 }
204 
205 void KisPaletteView::slotFGColorChanged(const KoColor &color)
206 {
207  selectClosestColor(color);
208 }
209 
210 void KisPaletteView::setPaletteModel(KisPaletteModel *model)
211 {
212  if (m_d->model) {
213  disconnect(m_d->model, 0, this, 0);
214  }
215  m_d->model = model;
216  setModel(model);
217  slotAdditionalGuiUpdate();
218 
219  connect(model, SIGNAL(sigPaletteModified()), SLOT(slotAdditionalGuiUpdate()));
220  connect(model, SIGNAL(sigPaletteChanged()), SLOT(slotAdditionalGuiUpdate()));
221 }
222 
223 KisPaletteModel* KisPaletteView::paletteModel() const
224 {
225  return m_d->model;
226 }
227 
228 void KisPaletteView::setAllowModification(bool allow)
229 {
230  m_d->allowPaletteModification = allow;
231  setDragEnabled(allow);
232  setAcceptDrops(allow);
233 }
234 
235 void KisPaletteView::slotHorizontalHeaderResized(int, int, int newSize)
236 {
237  resizeRows(newSize);
238  slotAdditionalGuiUpdate();
239 }
240 
241 void KisPaletteView::resizeRows(int newSize)
242 {
243  verticalHeader()->setDefaultSectionSize(newSize);
244  verticalHeader()->resizeSections(QHeaderView::Fixed);
245 }
246 
247 void KisPaletteView::saveModification()
248 {
249  qDebug() << "saving modification in palette view" << m_d->model->colorSet()->filename() << m_d->model->colorSet()->storageLocation();
250  KisResourceModel model(m_d->model->colorSet()->resourceType().first);
251  model.updateResource(m_d->model->colorSet());
252 }
253 
254 void KisPaletteView::removeSelectedEntry()
255 {
256  if (selectedIndexes().size() <= 0) {
257  return;
258  }
259  m_d->model->removeEntry(currentIndex());
260 }
261 
262 void KisPaletteView::slotAdditionalGuiUpdate()
263 {
264  clearSpans();
265  resizeRows(verticalHeader()->defaultSectionSize());
266  for (int groupNameRowNumber : m_d->model->m_rowGroupNameMap.keys()) {
267  if (groupNameRowNumber == -1) { continue; }
268  setSpan(groupNameRowNumber, 0, 1, m_d->model->columnCount());
269  setRowHeight(groupNameRowNumber, fontMetrics().lineSpacing() + 6);
270  verticalHeader()->resizeSection(groupNameRowNumber, fontMetrics().lineSpacing() + 6);
271  }
272 }
273 
274 void KisPaletteView::slotCurrentSelectionChanged(const QModelIndex &newCurrent)
275 {
276  if (!newCurrent.isValid()) { return; }
277 
278  const bool isGroupName = newCurrent.data(KisPaletteModel::IsGroupNameRole).toBool();
279  const bool isCheckSlot = newCurrent.data(KisPaletteModel::CheckSlotRole).toBool();
280 
281  const KisSwatch newEntry = m_d->model->getEntry(newCurrent);
282 
283  emit sigIndexSelected(newCurrent);
284  if (isGroupName) {
285  return;
286  }
287 
288  if (isCheckSlot) {
289  emit sigColorSelected(newEntry.color());
290  }
291 }
292 
293 void KisPaletteView::setDisplayRenderer(const KoColorDisplayRendererInterface *displayRenderer)
294 {
295  Q_ASSERT(m_d->model);
296  m_d->model->setDisplayRenderer(displayRenderer);
297 }
QPointer< KisPaletteModel >
KisPaletteDelegate
Definition: KisPaletteDelegate.h:15
KisPaletteView::addEntryWithDialog
bool addEntryWithDialog(KoColor color)
add an entry with a dialog window.
Definition: kis_palette_view.cpp:98
KisPaletteModel::IsGroupNameRole
Definition: KisPaletteModel.h:36
QItemSelectionModel::setCurrentIndex
void setCurrentIndex(const QModelIndex &index, QFlags< QItemSelectionModel::SelectionFlag > command)
QWidget::fontMetrics
QFontMetrics fontMetrics() const
QObject::disconnect
bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
QFormLayout::addRow
void addRow(QWidget *label, QWidget *field)
QString::number
QString number(int n, int base)
KisPaletteView::KisPaletteView
KisPaletteView(QWidget *parent=0)
Definition: kis_palette_view.cpp:43
QTableView::clearSpans
void clearSpans()
KisPaletteDelegate.h
QLineEdit
QHeaderView::resizeSection
void resizeSection(int logicalIndex, int size)
QAbstractItemView::model
QAbstractItemModel * model() const
QAbstractItemView::setItemDelegate
void setItemDelegate(QAbstractItemDelegate *delegate)
QTableView
QWidget
QAbstractItemView::setDragEnabled
void setDragEnabled(bool enable)
QAbstractItemView::selectionModel
QItemSelectionModel * selectionModel() const
KisPaletteView::slotScrollerStateChanged
void slotScrollerStateChanged(QScroller::State state)
Definition: kis_palette_view.h:103
QAbstractItemView::setSelectionMode
void setSelectionMode(QAbstractItemView::SelectionMode mode)
KisPaletteView::setAllowModification
void setAllowModification(bool allow)
setAllowModification Set whether doubleclick calls up a modification window.
Definition: kis_palette_view.cpp:228
KoDialog.h
QAbstractButton::setChecked
void setChecked(bool)
QAbstractItemView::itemDelegate
QAbstractItemDelegate * itemDelegate() const
KisPaletteView::closestColor
const KoColor closestColor(const KoColor &color) const
closestColor determines closest swatch in the active palette and returns it's color as KoColor
Definition: kis_palette_view.cpp:198
QHeaderView::setDefaultSectionSize
void setDefaultSectionSize(int size)
KisColorButton
A pushbutton to display or allow user selection of a color.
Definition: kis_color_button.h:26
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
KisPaletteModel.h
kis_palette_view.h
KisPaletteView::setDisplayRenderer
void setDisplayRenderer(const KoColorDisplayRendererInterface *displayRenderer)
Definition: kis_palette_view.cpp:293
KoDialog
A dialog base class with standard buttons and predefined layouts.
Definition: KoDialog.h:115
KisPaletteDelegate::setCrossedKeyword
void setCrossedKeyword(const QString &value)
Definition: KisPaletteDelegate.h:23
QWidget::setVisible
virtual void setVisible(bool visible)
KisPaletteView::sigIndexSelected
void sigIndexSelected(const QModelIndex &index)
QModelIndex::data
QVariant data(int role) const
QComboBox
KisColorButton::setColor
void setColor(const KoColor &c)
Sets the current color to c.
Definition: kis_color_button.cpp:149
KisPaletteView::removeSelectedEntry
void removeSelectedEntry()
Definition: kis_palette_view.cpp:254
kis_color_button.h
QString
QCheckBox
QLineEdit::setText
void setText(const QString &)
KisPaletteView::selectClosestColor
void selectClosestColor(const KoColor &color)
selectClosestColor select a color that's closest to parameter color
Definition: kis_palette_view.cpp:181
QWidget::setWindowTitle
void setWindowTitle(const QString &)
KisColorButton::color
KoColor color
QtCreator treats KoColor as a QColor in incorrect way, so just disable using them in QtCreator https:...
Definition: kis_color_button.h:34
KisPaletteModel
The KisPaletteModel class This, together with KisPaletteView and KisPaletteDelegate forms a mvc way t...
Definition: KisPaletteModel.h:28
QDialog::exec
int exec()
KisPaletteView::setPaletteModel
void setPaletteModel(KisPaletteModel *model)
Definition: kis_palette_view.cpp:210
QWidget::setAcceptDrops
void setAcceptDrops(bool on)
QModelIndex::isValid
bool isValid() const
QVariant::toBool
bool toBool() const
QTableView::setShowGrid
void setShowGrid(bool show)
KisPaletteModel::CheckSlotRole
Definition: KisPaletteModel.h:37
KisPaletteView::removeEntryWithDialog
bool removeEntryWithDialog(QModelIndex index)
remove entry with a dialog window.
Definition: kis_palette_view.cpp:161
QTableView::verticalHeader
QHeaderView * verticalHeader() const
QWidget::setToolTip
void setToolTip(const QString &)
KisPaletteView::setCrossedKeyword
void setCrossedKeyword(const QString &value)
setCrossedKeyword this apparently allows you to set keywords that can cross out colors.
Definition: kis_palette_view.cpp:89
QAbstractItemView::setDropIndicatorShown
void setDropIndicatorShown(bool enable)
QTableView::selectedIndexes
virtual QModelIndexList selectedIndexes() const
KoDialog::mainWidget
QWidget * mainWidget()
Definition: KoDialog.cpp:356
QTableView::horizontalHeader
QHeaderView * horizontalHeader() const
QFormLayout
QWidget::setAutoFillBackground
void setAutoFillBackground(bool enabled)
KisPaletteView::slotFGColorChanged
void slotFGColorChanged(const KoColor &)
This tries to select the closest color in the palette.
Definition: kis_palette_view.cpp:205
QModelIndex
QAbstractItemView::setDragDropMode
void setDragDropMode(DragDropMode behavior)
QTableView::setSpan
void setSpan(int row, int column, int rowSpanCount, int columnSpanCount)
KisPaletteView::~KisPaletteView
~KisPaletteView() override
Definition: kis_palette_view.cpp:85
QHeaderView::resizeSections
void resizeSections(QHeaderView::ResizeMode mode)
QTableView::setModel
virtual void setModel(QAbstractItemModel *model)
QAbstractItemView::currentIndex
QModelIndex currentIndex() const
QAbstractItemView::clicked
void clicked(const QModelIndex &index)
QItemSelectionModel::clearSelection
void clearSelection()
KisPaletteView::paletteModel
KisPaletteModel * paletteModel() const
Definition: kis_palette_view.cpp:223
QAbstractScrollArea::setVerticalScrollBarPolicy
void setVerticalScrollBarPolicy(Qt::ScrollBarPolicy)
KisPaletteView::sigColorSelected
void sigColorSelected(const KoColor &)
QWidget::size
QSize size() const
QTableView::setRowHeight
void setRowHeight(int row, int height)
QHeaderView::setMinimumSectionSize
void setMinimumSectionSize(int size)
KisPaletteView::addGroupWithDialog
bool addGroupWithDialog()
add entry with a dialog window.
Definition: kis_palette_view.cpp:142
This file is part of the KDE documentation.
Documentation copyright © 1996-2021 The KDE developers.
Generated on Tue Jan 19 2021 23:44:00 by doxygen 1.8.16 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KritaWidgets

Skip menu "KritaWidgets"
  • Main Page
  • Namespace List
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

krita API Reference

Skip menu "krita API Reference"
  • libs
  •   KritaBasicFlakes
  •   brush
  •   KritaUndo2
  •   KritaFlake
  •   image
  •   KritaPlugin
  •   Krita
  •   KritaPigment
  •   KritaResources
  •   KritaStore
  •   ui
  •   KritaWidgets
  •   KritaWidgetUtils
  • plugins
  •   Assitants
  •   Extensions
  •   Filters
  •   Generators
  •   Formats
  •           src
  •   PaintOps
  •     libpaintop

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal