19#include <QFontDatabase>
20#include <QWidgetAction>
23#include <QActionGroup>
26#include <klocalizedstring.h>
38#include <ui_wdgpaintopsettings.h>
54#include <lager/state.hpp>
86 setObjectName(
"KisPaintOpPresetsEditor");
102 m_d->
uiWdgPaintOpPresetSettings.dirtyPresetIndicatorButton->setToolTip(i18n(
"The settings for this preset have changed from their default."));
130 containerLayout->setAlignment(Qt::AlignmentFlag::AlignTop);
147 QMenu* viewModeMenu =
new QMenu(
this);
149 viewModeMenu->setStyleSheet(
"margin: 6px");
152 viewModeMenu->addSection(i18nc(
"@title Which elements to display (e.g., thumbnails or details)",
"Display"));
154 QActionGroup *actionGroup =
new QActionGroup(
this);
157 action->setCheckable(
true);
159 action->setActionGroup(actionGroup);
161 connect(action, &QAction::triggered,
165 action->setCheckable(
true);
167 action->setActionGroup(actionGroup);
169 connect(action, &QAction::triggered,
173 viewModeMenu->addSection(i18n(
"Icon Size"));
175 QSlider* iconSizeSlider =
new QSlider(
this);
176 iconSizeSlider->setOrientation(Qt::Horizontal);
177 iconSizeSlider->setRange(30, 80);
179 iconSizeSlider->setMinimumHeight(20);
180 iconSizeSlider->setMinimumWidth(40);
181 iconSizeSlider->setTickInterval(10);
183 connect(iconSizeSlider, &QSlider::valueChanged,
186 connect(iconSizeSlider, &QSlider::sliderReleased,
189 QWidgetAction *sliderAction=
new QWidgetAction(
this);
190 sliderAction->setDefaultWidget(iconSizeSlider);
192 viewModeMenu->addAction(sliderAction);
208 QMenu *viewOptionsMenu =
new QMenu(
this);
209 QAction *detachBrushEditorAction = viewOptionsMenu->addAction(i18n(
"Detach Brush Editor"));
210 detachBrushEditorAction->setCheckable(
true);
235 connect(detachBrushEditorAction, SIGNAL(toggled(
bool)),
379 int currentPresetResourceId = curPreset->resourceId();
384 if (currentPresetResourceId < 0) {
385 curPreset->setName(renamedPresetName);
398 properCleanResource.dynamicCast<
KisPaintOpPreset>()->setSettings(prevSettings);
471 widget, SIGNAL(sigConfigurationItemChanged()));
521 QString currentBrushEngineName;
522 QPixmap currentBrushEngineIcon = QPixmap(26, 26);
523 currentBrushEngineIcon.fill(Qt::transparent);
533 QString formattedBrushName = resource->name().replace(
"_",
" ");
536 formattedBrushName = this->fontMetrics().elidedText(formattedBrushName, Qt::ElideRight,
m_d->
uiWdgPaintOpPresetSettings.currentBrushNameLabel->width());
538 m_d->
uiWdgPaintOpPresetSettings.currentBrushEngineLabel->setText(i18nc(
"%1 is the name of a brush engine",
"%1 Engine", currentBrushEngineName));
543 QSize thumbSize = QSize(55, 55)*devicePixelRatioF();
544 QImage thumbImage = resource->image();
549 if (!thumbImage.isNull()) {
550 thumbnail = QPixmap::fromImage(thumbImage.scaled(thumbSize, Qt::KeepAspectRatio, Qt::SmoothTransformation));
552 thumbnail = QPixmap();
555 thumbnail.setDevicePixelRatio(devicePixelRatioF());
575 for(
int i=0; i < list.length(); i++) {
577 paintOpInfo.
id = list.at(i)->id();
578 paintOpInfo.
name = list.at(i)->name();
579 paintOpInfo.
icon = list.at(i)->icon();
580 paintOpInfo.
priority = list.at(i)->priority();
588 QPixmap emptyPixmap = QPixmap(22,22);
589 emptyPixmap.fill(Qt::transparent);
640 cfg.
writeList<
int>(
"brushEditorSplitterSizes", splitterSizes);
642 QWidget *frame = this->parentWidget();
643 cfg.
writeEntry(
"brushEditorWindowGeometry", frame->saveGeometry());
645 QWidget::hideEvent(event);
660 splitterSizes[0] = 0;
663 splitterSizes[2] = 0;
666 QWidget *frame = this->parentWidget();
667 QByteArray frameGeometry = cfg.
readEntry(
"brushEditorWindowGeometry", QByteArray());
668 if (!frameGeometry.isEmpty()) {
669 frame->restoreGeometry(frameGeometry);
673 int scratchPanelWidth =
675 const QMargins margins =
m_d->
layout->contentsMargins();
676 int width = presetPanelWidth + splitterSizes[1] + scratchPanelWidth +
677 margins.bottom() + margins.left() + margins.top() + margins.right();
678 QRect defaultGeometry = QRect(frame->geometry().x(), frame->geometry().y(), width, frame->geometry().height());
679 frame->setGeometry(defaultGeometry);
688 QWidget::resizeEvent(event);
689 if (parentWidget()) {
691 QRect screenRect = this->screen()->availableGeometry();
692 QRect newPositionRect =
kisEnsureInRect(parentWidget()->geometry(), screenRect);
693 parentWidget()->setGeometry(newPositionRect);
710 if (sameVisibility) {
717 const QMargins margins =
m_d->
layout->contentsMargins();
718 int emptyContainerWidth = showBtn->width() + margins.left() + margins.right();
724 container->setMaximumWidth(0xFF'FFFF);
728 QWidget *frame = this->parentWidget();
729 QRect currentGeometry = frame->geometry();
730 currentGeometry.setRight(currentGeometry.right() + (splitterSizes[2] - emptyContainerWidth));
731 frame->setGeometry(currentGeometry);
736 container->setMinimumWidth(emptyContainerWidth);
737 container->setMaximumWidth(emptyContainerWidth);
741 QWidget *frame = this->parentWidget();
742 QRect currentGeometry = frame->geometry();
743 currentGeometry.setRight(currentGeometry.right() - (
m_d->
scratchPanelWidth - emptyContainerWidth));
744 frame->setGeometry(currentGeometry);
746 splitterSizes[1] = 0xFF'FFFF;
747 splitterSizes[2] = emptyContainerWidth;
770 if (sameVisibility) {
777 const QMargins margins =
m_d->
layout->contentsMargins();
778 int emptyContainerWidth = showBtn->width() + margins.left() + margins.right();
784 container->setMaximumWidth(0xFF'FFFF);
788 QWidget *frame = this->parentWidget();
789 QRect currentGeometry = frame->geometry();
790 currentGeometry.setLeft(currentGeometry.left() - (splitterSizes[0] - emptyContainerWidth));
791 frame->setGeometry(currentGeometry);
796 container->setMinimumWidth(emptyContainerWidth);
797 container->setMaximumWidth(emptyContainerWidth);
801 QWidget *frame = this->parentWidget();
802 QRect currentGeometry = frame->geometry();
803 currentGeometry.setLeft(currentGeometry.left() + (
m_d->
presetPanelWidth - emptyContainerWidth));
804 frame->setGeometry(currentGeometry);
806 splitterSizes[0] = emptyContainerWidth;
807 splitterSizes[1] = 0xFF'FFFF;
817 QString filterPaintOpId = userData.toString();
819 if (filterPaintOpId ==
"all_options") {
820 filterPaintOpId =
"";
832 saveDialog->brushPresetThumbnailWidget->setPresetImage(thumbImage);
845 saveDialog->brushPresetThumbnailWidget->setPresetImage(thumbImage);
944 bool isBroken =
false;
945 QString brokenReason;
947 if (resourceId >= 0) {
950 if (index.isValid()) {
954 "<html><body style=\"margin: 20px;\"><h3>%1</h3>"
957 .arg(i18n(
"Resource is broken!"),
float value(const T *src, size_t ch)
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
@ BrokenStatus
Whether the resource is broken (bool)
KoCanvasResourceProvider * resourceManager()
KisPaintOpPresetSP currentPreset() const
void writeList(const QString &name, const QList< T > &value)
QList< T > readList(const QString &name, const QList< T > &defaultValue=QList< T >())
bool useDirtyPresets(bool defaultValue=false) const
void writeEntry(const QString &name, const T &value)
void setScratchpadVisible(bool visible)
void setPresetStripVisible(bool visible)
bool paintopPopupDetached(bool defaultValue=false) const
bool scratchpadVisible(bool defaultValue=false) const
int presetChooserViewMode(bool defaultValue=false) const
bool useEraserBrushOpacity(bool defaultValue=false) const
T readEntry(const QString &name, const T &defaultValue=T())
void setPaintopPopupDetached(bool detached) const
bool useEraserBrushSize(bool defaultValue=false) const
bool presetStripVisible(bool defaultValue=false) const
void updateFavoritePresets()
bool read(const KisPropertiesConfiguration *setting)
const int scratchPadPanelInitWidth
void setCreatingBrushFromScratch(bool enable)
const int brushPresetsPanelMinWidth
void createPresetFromScratch(const QString &paintOpName)
void slotSaveBrushPreset()
void slotSwitchScratchpad(bool visible)
void slotSwitchShowEditor(bool visible)
QList< KisPaintOpInfo > sortedBrushEnginesList
void setPaintOpList(const QList< KisPaintOpFactory * > &list)
void slotSaveRenameCurrentBrush()
void slotToggleDetach(bool detach)
void writeOptionSetting(KisPropertiesConfigurationSP setting) const
void toggleDetachState(bool detach)
QString currentPaintOpId()
returns the internal ID for the paint op (brush engine)
void slotSaveNewBrushPreset()
QList< QAction * > newBrushEngineOptions
void showEvent(QShowEvent *) override
void eraserBrushSizeToggled(bool value)
void resourceSelected(KoResourceSP resource)
void updateViewSettings()
const int brushPresetsPanelInitWidth
void eraserBrushOpacityToggled(bool value)
void slotUpdateEffectiveLodAvailable(bool value)
QString current_paintOpId
~KisPaintOpPresetsEditor() override
void reloadPresetClicked()
void slotCreateNewBrushPresetEngine()
void slotSwitchShowPresets(bool visible)
void slotUpdatePaintOpFilter()
void setCurrentPaintOpId(const QString &paintOpId)
void slotRenameBrushActivated()
const int scratchPadPanelMinWidth
void currentPresetChanged(KisPaintOpPresetSP preset)
void slotRenameBrushDeactivated()
void readOptionSetting(const KisPropertiesConfigurationSP setting)
QMenu * newPresetBrushEnginesMenu
void slotBlackListCurrentPreset()
we do not delete brush presets, but blacklist them so they disappear from the interface
void contextMenuEvent(QContextMenuEvent *) override
void signalResourceSelected(KoResourceSP resource)
void toggleBrushRenameUIActive(bool isRenaming)
void setPaintOpSettingsWidget(QWidget *widget)
void hideEvent(QHideEvent *) override
void resizeEvent(QResizeEvent *) override
KisPaintOpPresetsEditor(KisCanvasResourceProvider *resourceProvider, KisFavoriteResourceManager *favoriteResourceManager, KisPresetSaveWidget *savePresetWidget, QWidget *parent=0)
void dirtyPresetToggled(bool value)
void slotUpdatePresetSettings()
KisPresetSaveWidget * saveDialog
@ DETAIL
Shows thumbnails.
void saveIconSize()
saves the icon size for the presets. called by the horizontal slider release event.
void setIconSize(int newSize)
sets the icon size. Used by slider in view menu
void setViewModeToDetail()
void setViewModeToThumbnail()
void showTaggingBar(bool show)
Sets the visibility of tagging klineEdits.
KisResourceItemChooser * itemChooser()
KisPopupButton * viewModeButton
The KisResourceModel class provides the main access to resources. It is possible to filter the resour...
KoResourceSP resourceForId(int id) const
QModelIndex indexForResourceId(int resourceId) const override
indexFromResource
static KisResourceServerProvider * instance()
KisPaintOpPresetResourceServer * paintOpPresetServer()
static bool renameResourceWithUserInput(QWidget *widgetParent, KoResourceSP resource, QString resourceName)
void addConnection(Sender sender, Signal signal, Receiver receiver, Method method, Qt::ConnectionType type=Qt::AutoConnection)
void setResource(int key, const QVariant &value)
bool removeResourceFromServer(QSharedPointer< T > resource)
Remove a resource from Resource Server but not from a file.
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
#define KIS_ASSERT_RECOVER_RETURN(cond)
QRect kisEnsureInRect(QRect rc, const QRect &bounds)
bool variantLessThan(const KisPaintOpInfo v1, const KisPaintOpInfo v2)
QIcon loadIcon(const QString &name)
@ EffectiveLodAvailability
const QString PaintOpPresets
lager::state< KisLodAvailabilityData, lager::automatic_tag > lodAvailabilityData
KisFavoriteResourceManager * favoriteResManager
KisPaintOpConfigWidget * settingsWidget
KisCanvasResourceProvider * resourceProvider
KisSignalAutoConnectionsStore widgetConnections
bool isCreatingBrushFromScratch
Ui_WdgPaintOpSettings uiWdgPaintOpPresetSettings
QList< int > defaultSplitterSizes