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

#include <kis_predefined_brush_chooser.h>

+ Inheritance diagram for KisPredefinedBrushChooser:

Classes

struct  Private
 

Public Member Functions

 KisPredefinedBrushChooser (int maxBrushSize, KisPredefinedBrushModel *model, QWidget *parent=0, const char *name=0)
 
lager::reader< bool > lightnessModeEnabled () const
 
void setBrush (KisBrushSP brush)
 
void setImage (KisImageWSP image)
 
 ~KisPredefinedBrushChooser () override
 

Private Slots

void slotBrushPropertyChanged (KoResourceSignature signature)
 
void slotBrushSelected (KoResourceSP resource)
 
void slotDeleteBrushResource ()
 
void slotImportNewBrushResource ()
 
void slotNewPredefinedBrush (KoResourceSP)
 
void slotOpenClipboardBrush ()
 
void slotOpenStampBrush ()
 
void slotResetAdjustments ()
 
void slotResetBrush ()
 

Private Attributes

KisBrushSP m_brush
 
KisClipboardBrushWidgetm_clipboardBrushWidget
 
const QScopedPointer< Privatem_d
 
KisImageWSP m_image
 
KisResourceItemChooserm_itemChooser
 
KisCustomBrushWidgetm_stampBrushWidget
 

Detailed Description

Definition at line 32 of file kis_predefined_brush_chooser.h.

Constructor & Destructor Documentation

◆ KisPredefinedBrushChooser()

KisPredefinedBrushChooser::KisPredefinedBrushChooser ( int maxBrushSize,
KisPredefinedBrushModel * model,
QWidget * parent = 0,
const char * name = 0 )

Definition at line 164 of file kis_predefined_brush_chooser.cpp.

167 : QWidget(parent),
168 m_d(new Private(model)),
171{
172 setObjectName(name);
173
174 setupUi(this);
175
176 brushSizeSpinBox->setRange(0, maxBrushSize, 2);
177 brushSizeSpinBox->setValue(5);
178 brushSizeSpinBox->setExponentRatio(3.0);
179 brushSizeSpinBox->setSuffix(i18n(" px"));
180 brushSizeSpinBox->setExponentRatio(3.0);
181
182 connect(m_d->model, &KisPredefinedBrushModel::brushNameChanged,
183 brushTipNameLabel, &KSqueezedTextLabel::setText);
184 m_d->model->LAGER_QT(brushName).nudge();
185
186 connect(m_d->model, &KisPredefinedBrushModel::brushDetailsChanged,
187 brushDetailsLabel, &QLabel::setText);
188 m_d->model->LAGER_QT(brushDetails).nudge();
189
190 connectControl(brushSizeSpinBox, m_d->model, "brushSize");
191
192 brushRotationAngleSelector->setDecimals(0);
193
194 connectControl(brushRotationAngleSelector, m_d->model, "angle");
195
196 brushSpacingSelectionWidget->setSpacing(true, 1.0);
197
198 connectControl(brushSpacingSelectionWidget, m_d->model, "aggregatedSpacing");
199
201 m_itemChooser->setObjectName("brush_selector");
202
208 m_itemChooser->setMinimumWidth(100);
209 m_itemChooser->setMinimumHeight(150);
210 m_itemChooser->showImportExportBtns(false); // turn the import and delete buttons since we want control over them
211
212 presetsLayout->addWidget(m_itemChooser);
213
216 connect(m_d->model, &KisPredefinedBrushModel::resourceSignatureChanged,
218
219 slotBrushPropertyChanged(m_d->model->resourceSignature());
220
221
222 addPresetButton->setIcon(KisIconUtils::loadIcon("list-add"));
223 deleteBrushTipButton->setIcon(KisIconUtils::loadIcon("edit-delete"));
224
225 connect(addPresetButton, SIGNAL(clicked(bool)), this, SLOT(slotImportNewBrushResource()));
226 connect(deleteBrushTipButton, SIGNAL(clicked(bool)), this, SLOT(slotDeleteBrushResource()));
227
228 stampButton->setIcon(KisIconUtils::loadIcon("list-add"));
229 stampButton->setToolTip(i18n("Creates a brush tip from the current image selection."
230 "\n If no selection is present the whole image will be used."));
231
232 clipboardButton->setIcon(KisIconUtils::loadIcon("list-add"));
233 clipboardButton->setToolTip(i18n("Creates a brush tip from the image in the clipboard."));
234
235 connect(stampButton, SIGNAL(clicked()), this, SLOT(slotOpenStampBrush()));
236 connect(clipboardButton, SIGNAL(clicked()), SLOT(slotOpenClipboardBrush()));
237
238 resetBrushButton->setToolTip(i18n("Reloads Spacing from file\nSets Scale to 1.0\nSets Rotation to 0.0"));
239 connect(resetBrushButton, SIGNAL(clicked()), SLOT(slotResetBrush()));
240
241 intAdjustmentMidPoint->setRange(0, 255);
242 intAdjustmentMidPoint->setPageStep(10);
243 intAdjustmentMidPoint->setSingleStep(1);
244 intAdjustmentMidPoint->setPrefix(i18nc("@label:slider", "Neutral point: "));
245 connectControl(intAdjustmentMidPoint, m_d->model, "adjustmentMidPoint");
246 connectControl(chkAutoMidPoint, m_d->model, "autoAdjustMidPoint");
247
248 intBrightnessAdjustment->setRange(-100, 100);
249 intBrightnessAdjustment->setPageStep(10);
250 intBrightnessAdjustment->setSingleStep(1);
251 intBrightnessAdjustment->setSuffix("%");
252 intBrightnessAdjustment->setPrefix(i18nc("@label:slider", "Brightness: "));
253 connectControl(intBrightnessAdjustment, m_d->model, "brightnessAdjustment");
254
255 intContrastAdjustment->setRange(-100, 100);
256 intContrastAdjustment->setPageStep(10);
257 intContrastAdjustment->setSingleStep(1);
258 intContrastAdjustment->setSuffix("%");
259 intContrastAdjustment->setPrefix(i18nc("@label:slider", "Contrast: "));
260 connectControl(intContrastAdjustment, m_d->model, "contrastAdjustment");
261
262 btnResetAdjustments->setToolTip(i18nc("@info:tooltip", "Resets all the adjustments to default values:\n Neutral Point: 127\n Brightness: 0%\n Contrast: 0%"));
263 connect(btnResetAdjustments, SIGNAL(clicked()), SLOT(slotResetAdjustments()));
264
265 connectControlState(cmbBrushMode, m_d->model, "applicationSwitchState", "application");
266
267 connect(m_d->model, &KisPredefinedBrushModel::adjustmentsEnabledChanged,
268 intAdjustmentMidPoint, &KisSliderSpinBox::setEnabled);
269 connect(m_d->model, &KisPredefinedBrushModel::adjustmentsEnabledChanged,
270 intBrightnessAdjustment, &KisSliderSpinBox::setEnabled);
271 connect(m_d->model, &KisPredefinedBrushModel::adjustmentsEnabledChanged,
272 intContrastAdjustment, &KisSliderSpinBox::setEnabled);
273 connect(m_d->model, &KisPredefinedBrushModel::adjustmentsEnabledChanged,
274 chkAutoMidPoint, &KisSliderSpinBox::setEnabled);
275 connect(m_d->model, &KisPredefinedBrushModel::adjustmentsEnabledChanged,
276 btnResetAdjustments, &KisSliderSpinBox::setEnabled);
277
278 m_d->model->LAGER_QT(adjustmentsEnabled).nudge();
279}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
The resource item delegate for rendering the resource preview.
KisResourceItemChooser * m_itemChooser
void slotBrushPropertyChanged(KoResourceSignature signature)
void slotBrushSelected(KoResourceSP resource)
KisCustomBrushWidget * m_stampBrushWidget
const QScopedPointer< Private > m_d
KisClipboardBrushWidget * m_clipboardBrushWidget
void resourceSelected(KoResourceSP resource)
Emitted when a resource was selected.
void setRowHeight(int rowHeight)
Sets the height of the view rows.
void setItemDelegate(QAbstractItemDelegate *delegate)
Sets a custom delegate for the view.
static KisResourceMetaDataModel * resourceMetadataModel()
QIcon loadIcon(const QString &name)
void connectControl(KisCompositeOpListWidget *widget, QObject *source, const char *property)
void connectControlState(QSpinBox *spinBox, QObject *source, const char *readStateProperty, const char *writeProperty)
const QString Brushes

References ResourceType::Brushes, connect(), KisWidgetConnectionUtils::connectControl(), KisWidgetConnectionUtils::connectControlState(), KisIconUtils::loadIcon(), m_d, m_itemChooser, KisResourceModelProvider::resourceMetadataModel(), KisResourceItemChooser::resourceSelected(), KisResourceItemChooser::setCurrentItem(), KisResourceItemChooser::setItemDelegate(), KisResourceItemChooser::setRowHeight(), KisResourceItemChooser::setSynced(), KisResourceItemChooser::showImportExportBtns(), KisResourceItemChooser::showTaggingBar(), slotBrushPropertyChanged(), slotBrushSelected(), slotDeleteBrushResource(), slotImportNewBrushResource(), slotOpenClipboardBrush(), slotOpenStampBrush(), slotResetAdjustments(), and slotResetBrush().

◆ ~KisPredefinedBrushChooser()

KisPredefinedBrushChooser::~KisPredefinedBrushChooser ( )
override

Definition at line 281 of file kis_predefined_brush_chooser.cpp.

282{
283}

Member Function Documentation

◆ lightnessModeEnabled()

lager::reader< bool > KisPredefinedBrushChooser::lightnessModeEnabled ( ) const

Definition at line 394 of file kis_predefined_brush_chooser.cpp.

395{
396 return m_d->model->LAGER_QT(lightnessModeEnabled);
397}
lager::reader< bool > lightnessModeEnabled() const

References lightnessModeEnabled(), and m_d.

◆ setBrush()

void KisPredefinedBrushChooser::setBrush ( KisBrushSP brush)

◆ setImage()

void KisPredefinedBrushChooser::setImage ( KisImageWSP image)

Definition at line 389 of file kis_predefined_brush_chooser.cpp.

390{
391 m_image = image;
392}

References m_image.

◆ slotBrushPropertyChanged

void KisPredefinedBrushChooser::slotBrushPropertyChanged ( KoResourceSignature signature)
privateslot

Definition at line 363 of file kis_predefined_brush_chooser.cpp.

364{
366 m_itemChooser->setCurrentResource(source.bestMatch(signature.md5sum, signature.filename, signature.name));
367}
KisMagneticGraph::vertex_descriptor source(typename KisMagneticGraph::edge_descriptor e, KisMagneticGraph g)
static KisResourcesInterfaceSP instance()
void setCurrentResource(KoResourceSP resource)
Sets the item representing the resource as selected.

References ResourceType::Brushes, KoResourceSignature::filename, KisGlobalResourcesInterface::instance(), m_itemChooser, KoResourceSignature::md5sum, KoResourceSignature::name, KisResourceItemChooser::setCurrentResource(), and source().

◆ slotBrushSelected

void KisPredefinedBrushChooser::slotBrushSelected ( KoResourceSP resource)
privateslot

Definition at line 337 of file kis_predefined_brush_chooser.cpp.

338{
340
341 KisBrushModel::PredefinedBrushData predefinedBrushData = m_d->model->bakedOptionData();
342 if (resource->signature() == predefinedBrushData.resourceSignature) return;
343
344 KisBrushModel::CommonData commonBrushData;
345 KisPredefinedBrushFactory::loadFromBrushResource(commonBrushData, predefinedBrushData, resource.dynamicCast<KisBrush>());
346
347 predefinedBrushData.scale = 1.0;
348 predefinedBrushData.application = KisPredefinedBrushModel::effectiveBrushApplication(predefinedBrushData, m_d->model->m_supportsHSLBrushTips.get());
349
350 // TODO: check what happens when we add a new brush
351 if (this->preserveBrushPresetSettings->isChecked()) {
352 commonBrushData.spacing = m_d->model->spacing();
353 commonBrushData.useAutoSpacing = m_d->model->useAutoSpacing();
354 commonBrushData.autoSpacingCoeff = m_d->model->autoSpacingCoeff();
355 } else {
356 m_d->model->m_commonBrushSizeData.set(predefinedBrushData.baseSize.width());
357 }
358
359 m_d->model->m_commonData.set(commonBrushData);
360 m_d->model->m_predefinedBrushData.set(predefinedBrushData);
361}
static void loadFromBrushResource(KisBrushModel::CommonData &commonData, KisBrushModel::PredefinedBrushData &predefinedBrushData, KisBrushSP brushResource)
static enumBrushApplication effectiveBrushApplication(PredefinedBrushData predefinedData, bool supportsHSLBrushTips)
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
KoResourceSignature resourceSignature

References KisBrushModel::PredefinedBrushData::application, KisBrushModel::CommonData::autoSpacingCoeff, KisBrushModel::PredefinedBrushData::baseSize, KisPredefinedBrushModel::effectiveBrushApplication(), KIS_SAFE_ASSERT_RECOVER_RETURN, KisPredefinedBrushFactory::loadFromBrushResource(), m_d, KisBrushModel::PredefinedBrushData::resourceSignature, KisBrushModel::PredefinedBrushData::scale, KisBrushModel::CommonData::spacing, and KisBrushModel::CommonData::useAutoSpacing.

◆ slotDeleteBrushResource

◆ slotImportNewBrushResource

void KisPredefinedBrushChooser::slotImportNewBrushResource ( )
privateslot

Definition at line 399 of file kis_predefined_brush_chooser.cpp.

399 {
400 // reflects m_itemChooser->slotButtonClicked(KisResourceItemChooser::Button_Import)
401 // but adds the .abr files support, as it was in Krita 4
403 QString abrMimeType = "image/x-adobe-brushlibrary";
404 mimeTypes.append(abrMimeType);
405 KoFileDialog dialog(0, KoFileDialog::OpenFiles, "OpenDocument");
406 dialog.setMimeTypeFilters(mimeTypes);
407 dialog.setCaption(i18nc("@title:window", "Choose File to Add"));
408 Q_FOREACH(const QString &filename, dialog.filenames()) {
409 if (QFileInfo(filename).exists() && QFileInfo(filename).isReadable()) {
410 if (KisMimeDatabase::mimeTypeForFile(filename).contains(abrMimeType)) {
412 } else {
414 }
415 }
416 }
417 m_itemChooser->tagFilterModel()->sort(Qt::DisplayRole);
418}
static QString mimeTypeForFile(const QString &file, bool checkExistingFiles=true)
Find the mimetype for the given filename. The filename must include a suffix.
KisTagFilterResourceProxyModel * tagFilterModel() const
static KisResourceLoaderRegistry * instance()
QStringList mimeTypes(const QString &resourceType) const
static KoResourceSP importResourceFileWithUserInput(QWidget *widgetParent, QString storageLocation, QString resourceType, QString resourceFilepath)
static KisStorageModel * instance()
bool importStorage(QString filename, StorageImportOption importOption) const

References ResourceType::Brushes, KisResourceUserOperations::importResourceFileWithUserInput(), KisStorageModel::importStorage(), KisResourceLoaderRegistry::instance(), KisStorageModel::instance(), m_itemChooser, KisMimeDatabase::mimeTypeForFile(), KisResourceLoaderRegistry::mimeTypes(), KisStorageModel::None, KoFileDialog::OpenFiles, and KisResourceItemChooser::tagFilterModel().

◆ slotNewPredefinedBrush

void KisPredefinedBrushChooser::slotNewPredefinedBrush ( KoResourceSP resource)
privateslot

◆ slotOpenClipboardBrush

void KisPredefinedBrushChooser::slotOpenClipboardBrush ( )
privateslot

Definition at line 321 of file kis_predefined_brush_chooser.cpp.

322{
324 m_clipboardBrushWidget = new KisClipboardBrushWidget(this, i18n("Clipboard"), m_image);
325 m_clipboardBrushWidget->setModal(true);
326 connect(m_clipboardBrushWidget, SIGNAL(sigNewPredefinedBrush(KoResourceSP )),
328 }
329
330 QDialog::DialogCode result = (QDialog::DialogCode)m_clipboardBrushWidget->exec();
331
332 if(result) {
333 // noop
334 }
335}

References connect(), m_clipboardBrushWidget, m_image, and slotNewPredefinedBrush().

◆ slotOpenStampBrush

void KisPredefinedBrushChooser::slotOpenStampBrush ( )
privateslot

Definition at line 304 of file kis_predefined_brush_chooser.cpp.

305{
306 if(!m_stampBrushWidget) {
307 m_stampBrushWidget = new KisCustomBrushWidget(this, i18n("Stamp"), m_image);
308 m_stampBrushWidget->setModal(false);
309 connect(m_stampBrushWidget, SIGNAL(sigNewPredefinedBrush(KoResourceSP )),
311 } else {
313 }
314
315 QDialog::DialogCode result = (QDialog::DialogCode)m_stampBrushWidget->exec();
316
317 if(result) {
318 // noop
319 }
320}
void setImage(KisImageWSP image)

References connect(), m_image, m_stampBrushWidget, KisCustomBrushWidget::setImage(), and slotNewPredefinedBrush().

◆ slotResetAdjustments

◆ slotResetBrush

void KisPredefinedBrushChooser::slotResetBrush ( )
privateslot

Definition at line 285 of file kis_predefined_brush_chooser.cpp.

286{
287 KisBrushSP brush = m_itemChooser->currentResource().dynamicCast<KisBrush>();
288 if (brush) {
289 KisBrushModel::CommonData commonData;
291
292 KisPredefinedBrushFactory::loadFromBrushResource(commonData, predefinedData, brush);
293
294 if (m_d->model->applicationSwitchState().items.size() >= LIGHTNESSMAP) {
295 predefinedData.application = LIGHTNESSMAP;
296 }
297
298 m_d->model->m_commonData.set(commonData);
299 m_d->model->m_predefinedBrushData.set(predefinedData);
300 m_d->model->m_commonBrushSizeData.set(KisPredefinedBrushModel::effectiveBrushSize(predefinedData));
301 }
302}
static qreal effectiveBrushSize(PredefinedBrushData predefinedData)
@ LIGHTNESSMAP
Definition kis_brush.h:41

References KisBrushModel::PredefinedBrushData::application, KisResourceItemChooser::currentResource, KisPredefinedBrushModel::effectiveBrushSize(), LIGHTNESSMAP, KisPredefinedBrushFactory::loadFromBrushResource(), m_d, and m_itemChooser.

Member Data Documentation

◆ m_brush

KisBrushSP KisPredefinedBrushChooser::m_brush
private

Definition at line 64 of file kis_predefined_brush_chooser.h.

◆ m_clipboardBrushWidget

KisClipboardBrushWidget* KisPredefinedBrushChooser::m_clipboardBrushWidget
private

Definition at line 68 of file kis_predefined_brush_chooser.h.

◆ m_d

const QScopedPointer<Private> KisPredefinedBrushChooser::m_d
private

Definition at line 62 of file kis_predefined_brush_chooser.h.

◆ m_image

KisImageWSP KisPredefinedBrushChooser::m_image
private

Definition at line 66 of file kis_predefined_brush_chooser.h.

◆ m_itemChooser

KisResourceItemChooser* KisPredefinedBrushChooser::m_itemChooser
private

Definition at line 65 of file kis_predefined_brush_chooser.h.

◆ m_stampBrushWidget

KisCustomBrushWidget* KisPredefinedBrushChooser::m_stampBrushWidget
private

Definition at line 67 of file kis_predefined_brush_chooser.h.


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