13#include <QWidgetAction>
16#include <QActionGroup>
18#include <klocalizedstring.h>
42#include <ksharedconfig.h>
43#include <kconfiggroup.h>
44#include <ksqueezedtextlabel.h>
82 if (segmentedGradient) {
102 int itemSizeCustom{32};
103 static constexpr int itemSizeSmall{32};
104 static constexpr int itemSizeMedium{48};
105 static constexpr int itemSizeLarge{64};
106 static constexpr qreal itemSizeWidthFactor{2.0};
152KisGradientChooser::Private::ViewOptions KisGradientChooser::Private::globalViewOptions;
153QSet<KisGradientChooser*> KisGradientChooser::Private::globalChoosers;
164 m_d->labelName =
new KSqueezedTextLabel;
165 m_d->labelName->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed);
169 m_d->itemChooser->showTaggingBar(
true);
170 m_d->itemChooser->showViewModeBtn(
true);
173 QActionGroup *actionGroupViewMode =
new QActionGroup(
this);
174 m_d->actionViewModeIcon =
new QAction(
this);
175 m_d->actionViewModeIcon->setCheckable(
true);
176 m_d->actionViewModeIcon->setActionGroup(actionGroupViewMode);
177 m_d->actionViewModeIcon->setText(
178 i18nc(
"Set the gradient chooser to show icons instead of a list",
"Icon view")
180 m_d->actionViewModeList =
new QAction(
this);
181 m_d->actionViewModeList->setCheckable(
true);
182 m_d->actionViewModeList->setActionGroup(actionGroupViewMode);
183 m_d->actionViewModeList->setText(
184 i18nc(
"Set the gradient chooser to show a list instead of icons",
"List view")
186 QAction *separatorViewMode1 =
new QAction(
this);
187 separatorViewMode1->setSeparator(
true);
188 QActionGroup *actionGroupItemSize =
new QActionGroup(
this);
189 m_d->actionItemSizeSmall =
new QAction(
this);
190 m_d->actionItemSizeSmall->setCheckable(
true);
191 m_d->actionItemSizeSmall->setActionGroup(actionGroupItemSize);
192 m_d->actionItemSizeSmall->setText(
193 i18nc(
"Set the gradient chooser to show small items",
"Small items")
195 m_d->actionItemSizeMedium =
new QAction(
this);
196 m_d->actionItemSizeMedium->setCheckable(
true);
197 m_d->actionItemSizeMedium->setActionGroup(actionGroupItemSize);
198 m_d->actionItemSizeMedium->setText(
199 i18nc(
"Set the gradient chooser to show medium size items",
"Medium size items")
201 m_d->actionItemSizeLarge =
new QAction(
this);
202 m_d->actionItemSizeLarge->setCheckable(
true);
203 m_d->actionItemSizeLarge->setActionGroup(actionGroupItemSize);
204 m_d->actionItemSizeLarge->setText(
205 i18nc(
"Set the gradient chooser to show large items",
"Large items")
207 m_d->actionItemSizeCustom =
new QAction(
this);
208 m_d->actionItemSizeCustom->setCheckable(
true);
209 m_d->actionItemSizeCustom->setActionGroup(actionGroupItemSize);
210 m_d->actionItemSizeCustom->setText(
211 i18nc(
"Set the gradient chooser to show custom size items",
"Custom size items")
213 m_d->sliderItemSizeCustom =
new QSlider(
this);
214 m_d->sliderItemSizeCustom->setRange(16, 128);
215 m_d->sliderItemSizeCustom->setOrientation(Qt::Horizontal);
216 m_d->containerSliderItemSizeCustom =
new QWidget(
this);
217 QVBoxLayout *layoutContainerSliderItemSizeCustom =
new QVBoxLayout;
218 layoutContainerSliderItemSizeCustom->addWidget(
m_d->sliderItemSizeCustom);
219 m_d->containerSliderItemSizeCustom->setLayout(layoutContainerSliderItemSizeCustom);
220 QWidgetAction *widgetActionSliderItemSizeCustom =
new QWidgetAction(
this);
221 widgetActionSliderItemSizeCustom->setDefaultWidget(
m_d->containerSliderItemSizeCustom);
222 QMenu* menu =
new QMenu(
this);
223 menu->setStyleSheet(
"margin: 6px");
224 menu->addActions(actionGroupViewMode->actions());
225 menu->addAction(separatorViewMode1);
226 menu->addActions(actionGroupItemSize->actions());
227 menu->addAction(widgetActionSliderItemSizeCustom);
228 KisPopupButton *toolButtonItemChooserViewMode =
m_d->itemChooser->viewModeButton();
233 QHBoxLayout* layoutEditWidgets =
new QHBoxLayout;
234 layoutEditWidgets->setContentsMargins(0, 0, 0, 0);
235 m_d->containerEditWidgets =
new QWidget(
this);
237 m_d->buttonAddGradient =
new QToolButton(
this);
238 m_d->buttonAddGradient->setText(i18n(
"Add..."));
239 m_d->buttonAddGradient->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
240 layoutEditWidgets->addWidget(
m_d->buttonAddGradient);
242 QMenu *menuAddGradient =
new QMenu(
m_d->buttonAddGradient);
248 m_d->buttonAddGradient->setMenu(menuAddGradient);
249 m_d->buttonAddGradient->setPopupMode(QToolButton::MenuButtonPopup);
251 m_d->buttonEditGradient =
new QPushButton();
252 m_d->buttonEditGradient->setText(i18n(
"Edit..."));
253 m_d->buttonEditGradient->setEnabled(
false);
254 layoutEditWidgets->addWidget(
m_d->buttonEditGradient);
256 layoutEditWidgets->addStretch(0);
258 m_d->containerEditWidgets->setLayout(layoutEditWidgets);
261 QVBoxLayout *mainLayout =
new QVBoxLayout(
this);
262 mainLayout->setObjectName(
"main layout");
263 mainLayout->setContentsMargins(0, 0, 0, 0);
264 mainLayout->addWidget(
m_d->labelName);
265 mainLayout->addWidget(
m_d->itemChooser);
266 mainLayout->addWidget(
m_d->containerEditWidgets);
267 setLayout(mainLayout);
278 connect(actionGroupViewMode, SIGNAL(triggered(QAction*)),
280 connect(actionGroupItemSize, SIGNAL(triggered(QAction*)),
282 connect(
m_d->sliderItemSizeCustom, SIGNAL(valueChanged(
int)),
290 m_d->isNameLabelVisible =
true;
291 m_d->areEditOptionsVisible =
true;
296 m_d->viewOptions = &(
m_d->globalViewOptions);
297 if (
m_d->globalChoosers.size() == 0) {
300 m_d->globalChoosers.insert(
this);
302 m_d->viewOptions =
new Private::ViewOptions;
304 m_d->updatePresetChooser();
305 m_d->updateContainerSliderItemSizeCustom();
310 if (
m_d->useGlobalViewOptions) {
311 m_d->globalChoosers.remove(
this);
312 if (
m_d->globalChoosers.size() == 0) {
316 delete m_d->viewOptions;
327 return m_d->canvasResourcesInterface;
332 return m_d->itemChooser->currentResource(includeHidden);
337 m_d->itemChooser->setCurrentResource(resource);
342 m_d->itemChooser->setCurrentItem(row);
349 KConfigGroup configGroup(KSharedConfig::openConfig(),
"GradientChooser");
350 const QString pfx = prefix.isEmpty() ? QString(
"global/") : prefix +
"/";
352 QString strViewMode = configGroup.readEntry(pfx +
"viewMode", QString());
353 if (strViewMode ==
"icon") {
355 }
else if (strViewMode ==
"list") {
358 QString strItemSize = configGroup.readEntry(pfx +
"itemSize", QString());
359 if (strItemSize ==
"small") {
361 }
else if (strItemSize ==
"medium") {
363 }
else if (strItemSize ==
"large") {
365 }
else if (strItemSize ==
"custom") {
368 m_d->viewOptions->itemSizeCustom = configGroup.readEntry(pfx +
"itemSizeCustom",
m_d->viewOptions->itemSizeCustom);
370 m_d->updatePresetChooser();
375 KConfigGroup configGroup(KSharedConfig::openConfig(),
"GradientChooser");
376 const QString pfx = prefix.isEmpty() ? QString(
"global/") : prefix +
"/";
379 configGroup.writeEntry(pfx +
"viewMode",
"icon");
381 configGroup.writeEntry(pfx +
"viewMode",
"list");
384 configGroup.writeEntry(pfx +
"itemSize",
"small");
386 configGroup.writeEntry(pfx +
"itemSize",
"medium");
388 configGroup.writeEntry(pfx +
"itemSize",
"large");
390 configGroup.writeEntry(pfx +
"itemSize",
"custom");
392 configGroup.writeEntry(pfx +
"itemSizeCustom",
m_d->viewOptions->itemSizeCustom);
397 return m_d->viewOptions->viewMode;
402 return m_d->viewOptions->itemSize;
407 return m_d->viewOptions->itemSizeCustom;
412 return m_d->itemChooser;
417 return m_d->isNameLabelVisible;
422 return m_d->areEditOptionsVisible;
427 m_d->viewOptions->viewMode = newViewMode;
428 m_d->updatePresetChooser();
433 m_d->viewOptions->itemSize = newItemSize;
434 m_d->updatePresetChooser();
439 if (newSize ==
m_d->viewOptions->itemSizeCustom) {
443 m_d->viewOptions->itemSizeCustom = newSize;
444 m_d->updatePresetChooser();
449 m_d->isNameLabelVisible = newNameLabelVisible;
450 m_d->labelName->setVisible(newNameLabelVisible);
455 m_d->areEditOptionsVisible = newEditOptionsVisible;
456 m_d->containerEditWidgets->setVisible(newEditOptionsVisible);
462 if (
m_d->buttonAddGradient &&
m_d->buttonEditGradient) {
469 if (e->type() == QEvent::StyleChange) {
470 m_d->updateContainerSliderItemSizeCustom();
475void KisGradientChooser::Private::update(
KoResourceSP resource)
478 labelName->setText(gradient ? i18n(gradient->name().toUtf8().data()) :
"");
479 buttonEditGradient->setEnabled(
true);
482void KisGradientChooser::Private::addStopGradient()
489 gradient->setType(QGradient::LinearGradient);
490 gradient->setName(i18n(
"unnamed"));
491 gradient->setStops(stops);
492 addGradient(gradient);
495void KisGradientChooser::Private::addSegmentedGradient()
499 gradient->setName(i18n(
"unnamed"));
500 addGradient(gradient);
505 if (!gradient)
return;
507 gradient->updateVariableColors(canvasResourcesInterface);
513 if (
dialog.exec() == KoDialog::Accepted) {
514 if (newGradient->name().isEmpty()) {
520 buf.open(QIODevice::ReadWrite);
521 src->saveToDevice(&buf);
531 copyGradientResource(gradient, newGradient);
532 gradient->setFilename(gradient->name().split(
" ").join(
"_") + gradient->defaultFileExtension());
533 gradient->setValid(
true);
534 gradient->updatePreview();
540 copyGradientResource(gradient, originalGradient);
546 copyGradientResource(gradient, originalGradient);
550 itemChooser->tagFilterModel()->sort(Qt::DisplayRole);
551 itemChooser->setCurrentResource(gradient);
552 Q_EMIT q->gradientEdited(gradient);
556void KisGradientChooser::Private::editGradient()
558 if (!(q->currentResource())) {
559 itemChooser->setCurrentItem(0);
561 Q_ASSERT(q->currentResource());
565void KisGradientChooser::Private::on_actionGroupViewMode_triggered(QAction *triggeredAction)
567 if (triggeredAction == actionViewModeIcon) {
568 q->setViewMode(ViewMode_Icon);
570 q->setViewMode(ViewMode_List);
574void KisGradientChooser::Private::on_actionGroupItemSize_triggered(QAction *triggeredAction)
576 if (triggeredAction == actionItemSizeSmall) {
577 q->setItemSize(ItemSize_Small);
578 }
else if (triggeredAction == actionItemSizeMedium) {
579 q->setItemSize(ItemSize_Medium);
580 }
else if (triggeredAction == actionItemSizeLarge) {
581 q->setItemSize(ItemSize_Large);
583 q->setItemSize(ItemSize_Custom);
587void KisGradientChooser::Private::on_sliderItemSizeCustom_valueChanged(
int newValue)
589 q->setItemSizeCustom(newValue);
590 q->setItemSize(ItemSize_Custom);
593void KisGradientChooser::Private::updatePresetChooser(
bool globalUpdate)
595 if (useGlobalViewOptions && globalUpdate) {
597 chooser->m_d->updatePresetChooser(
false);
602 itemChooser->itemView()->setViewMode(
603 viewOptions->viewMode == ViewMode_Icon
604 ? QListView::IconMode
605 : QListView::ListMode
608 updatePresetChooserIcons();
610 if (viewOptions->viewMode == ViewMode_Icon) {
611 actionViewModeIcon->setChecked(
true);
613 actionViewModeList->setChecked(
true);
615 if (viewOptions->itemSize == ItemSize_Small) {
616 actionItemSizeSmall->setChecked(
true);
617 }
else if (viewOptions->itemSize == ItemSize_Medium) {
618 actionItemSizeMedium->setChecked(
true);
619 }
else if (viewOptions->itemSize == ItemSize_Large) {
620 actionItemSizeLarge->setChecked(
true);
622 actionItemSizeCustom->setChecked(
true);
626 sliderItemSizeCustom->setValue(viewOptions->itemSizeCustom);
630void KisGradientChooser::Private::updatePresetChooserIcons()
633 if (viewOptions->itemSize == ItemSize_Small) {
634 itemHeight = viewOptions->itemSizeSmall;
635 }
else if (viewOptions->itemSize == ItemSize_Medium) {
636 itemHeight = viewOptions->itemSizeMedium;
637 }
else if (viewOptions->itemSize == ItemSize_Large) {
638 itemHeight = viewOptions->itemSizeLarge;
640 itemHeight = viewOptions->itemSizeCustom;
642 itemChooser->setRowHeight(itemHeight);
643 itemChooser->setColumnWidth(
644 static_cast<int>(qRound(itemHeight * viewOptions->itemSizeWidthFactor))
648void KisGradientChooser::Private::updateContainerSliderItemSizeCustom()
650 const int marginSize = q->style()->pixelMetric(QStyle::PM_ButtonMargin);
651 const int indicatorSize = q->style()->pixelMetric(QStyle::PM_ExclusiveIndicatorWidth);
652 const int spacingSize = q->style()->pixelMetric(QStyle::PM_RadioButtonLabelSpacing);
653 containerSliderItemSizeCustom->layout()->setContentsMargins(
654 indicatorSize + spacingSize, marginSize, marginSize, marginSize
658#include "KisGradientChooser.moc"
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
KisCustomGradientDialog(KoAbstractGradientSP gradient, QWidget *parent, const char *name, KoCanvasResourcesInterfaceSP canvasResourcesInterface)
static KisResourcesInterfaceSP instance()
bool event(QEvent *e) override
void on_actionGroupItemSize_triggered(QAction *triggeredAction)
QAction * actionViewModeList
QScopedPointer< Private > m_d
void on_sliderItemSizeCustom_valueChanged(int newValue)
KisResourceItemChooser * resourceItemChooser() const
Get a pointer to the item chooser being used.
void on_actionGroupViewMode_triggered(QAction *triggeredAction)
bool useGlobalViewOptions
void loadViewSettings(const QString &prefix=QString())
Load the view settings from the configuration.
static QSet< KisGradientChooser * > globalChoosers
QWidget * containerEditWidgets
void setItemSize(ItemSize newItemSize)
Set the size of the gradient preset chooser items.
void update(KoResourceSP resource)
QAction * actionItemSizeMedium
QAction * actionItemSizeSmall
QPushButton * buttonEditGradient
void updateContainerSliderItemSizeCustom()
int itemSizeCustom() const
Tell the size (height) in pixels used when KisGradientChooser::ItemSize_Custom is used as the item si...
void setViewMode(ViewMode newViewMode)
Set if the gradient preset chooser must show the items as a grid of icons or as a list.
QAction * actionViewModeIcon
void setCurrentItem(int row)
void setCanvasResourcesInterface(KoCanvasResourcesInterfaceSP canvasResourcesInterface)
@ ItemSize_Small
Show small items.
@ ItemSize_Large
Show large items.
@ ItemSize_Custom
Show items with a custom size.
@ ItemSize_Medium
Show medium size items.
ViewOptions * viewOptions
static ViewOptions globalViewOptions
KSqueezedTextLabel * labelName
QAction * actionItemSizeLarge
void addGradient(KoAbstractGradientSP gradient, bool editGradient=false)
void setCurrentResource(KoResourceSP resource)
KoCanvasResourcesInterfaceSP canvasResourcesInterface
void updatePresetChooser(bool globalUpdate=true)
KoResourceSP currentResource(bool includeHidden=false)
void setEditOptionsVisible(bool newEditOptionsVisible)
Set if the widgets with options to edit the gradient are visible.
void updatePresetChooserIcons()
void addSegmentedGradient()
KisGradientChooser(QWidget *parent=0, const char *name=0, bool useGlobalViewOptions=true)
void resourceClicked(KoResourceSP resource)
Emitted when a resource was clicked.
void saveViewSettings(const QString &prefix=QString())
Save the view settings to the configuration.
ItemSize itemSize() const
Tell the size of the gradient preset chooser items.
void setItemSizeCustom(int newSize)
Set the size (height) in pixels used when KisGradientChooser::ItemSize_Custom is used as the item siz...
ViewMode viewMode() const
Tell if the gradient preset chooser is showing the items as a grid of icons or as a list.
void resourceSelected(KoResourceSP resource)
Emitted when a resource was selected.
QSlider * sliderItemSizeCustom
KisResourceItemChooser * itemChooser
@ ViewMode_List
Show the items as a list.
@ ViewMode_Icon
Show the items as a grid of icons.
QWidget * containerSliderItemSizeCustom
QToolButton * buttonAddGradient
~KisGradientChooser() override
QAction * actionItemSizeCustom
void setNameLabelVisible(bool newNameLabelVisible)
Set if the label showing the gradient name is visible.
bool areEditOptionsVisible
static bool addResourceWithUserInput(QWidget *widgetParent, KoResourceSP resource, QString storageLocation="")
static bool updateResourceWithUserInput(QWidget *widgetParent, KoResourceSP resource)
A dialog base class with standard buttons and predefined layouts.
void setMainWidget(QWidget *widget)
virtual void setCaption(const QString &caption)
void setButtons(ButtonCodes buttonMask)
void setDefaultButton(ButtonCode id)
@ Ok
Show Ok button. (this button accept()s the dialog; result set to QDialog::Accepted)
@ Cancel
Show Cancel-button. (this button reject()s the dialog; result set to QDialog::Rejected)
QIcon loadIcon(const QString &name)
static KoColorSpaceRegistry * instance()