diff --git a/libs/ui/widgets/kis_gradient_chooser.cc b/libs/ui/widgets/kis_gradient_chooser.cc index ef22b5ecc9..a97dffb294 100644 --- a/libs/ui/widgets/kis_gradient_chooser.cc +++ b/libs/ui/widgets/kis_gradient_chooser.cc @@ -1,205 +1,239 @@ /* * Copyright (c) 2004 Adrian Page * Copyright (C) 2011 Srikanth Tiyyagura * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "widgets/kis_gradient_chooser.h" #include #include #include #include #include +#include #include #include #include #include #include #include #include #include #include #include #include #include #include "KisViewManager.h" #include "kis_global.h" #include "kis_autogradient.h" #include "kis_canvas_resource_provider.h" #include "kis_stopgradient_editor.h" KisCustomGradientDialog::KisCustomGradientDialog(KoAbstractGradientSP gradient, QWidget *parent, const char *name) : KoDialog(parent, Qt::Dialog) { - setButtons(Close); - setDefaultButton(Close); + setButtons(Ok|Cancel); + setDefaultButton(Ok); setObjectName(name); setModal(false); + connect(this, SIGNAL(okClicked()), this, SLOT(accept())); + connect(this, SIGNAL(cancelClicked()), this, SLOT(reject())); + KoStopGradientSP stopGradient = gradient.dynamicCast(); if (stopGradient) { m_page = new KisStopGradientEditor(stopGradient, this, "autogradient", i18n("Custom Stop Gradient")); } else { KoSegmentGradientSP segmentedGradient = gradient.dynamicCast(); if (segmentedGradient) { m_page = new KisAutogradientEditor(segmentedGradient, this, "autogradient", i18n("Custom Segmented Gradient")); } } setCaption(m_page->windowTitle()); setMainWidget(m_page); } KisGradientChooser::KisGradientChooser(QWidget *parent, const char *name) : QFrame(parent) { setObjectName(name); m_lbName = new QLabel(); m_itemChooser = new KisResourceItemChooser(ResourceType::Gradients, false, this); m_itemChooser->showTaggingBar(true); m_itemChooser->setFixedSize(250, 250); m_itemChooser->itemView()->setViewMode(QListView::ListMode); connect(m_itemChooser, SIGNAL(resourceSelected(KoResourceSP )), this, SLOT(update(KoResourceSP ))); connect(m_itemChooser, SIGNAL(resourceSelected(KoResourceSP )), this, SIGNAL(resourceSelected(KoResourceSP ))); QWidget* buttonWidget = new QWidget(this); QHBoxLayout* buttonLayout = new QHBoxLayout(buttonWidget); m_addGradient = new QToolButton(this); m_addGradient->setText(i18n("Add...")); m_addGradient->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); connect(m_addGradient, SIGNAL(clicked()), this, SLOT(addStopGradient())); buttonLayout->addWidget(m_addGradient); QMenu *menuAddGradient = new QMenu(m_addGradient); QAction* addStopGradient = new QAction(i18n("Stop gradient"), this); connect(addStopGradient, SIGNAL(triggered(bool)), this, SLOT(addStopGradient())); menuAddGradient->addAction(addStopGradient); QAction* addSegmentedGradient = new QAction(i18n("Segmented gradient"), this); connect(addSegmentedGradient, SIGNAL(triggered(bool)), this, SLOT(addSegmentedGradient())); menuAddGradient->addAction(addSegmentedGradient); m_addGradient->setMenu(menuAddGradient); m_addGradient->setPopupMode(QToolButton::MenuButtonPopup); m_editGradient = new QPushButton(); m_editGradient->setText(i18n("Edit...")); m_editGradient->setEnabled(false); connect(m_editGradient, SIGNAL(clicked()), this, SLOT(editGradient())); buttonLayout->addWidget(m_editGradient); QVBoxLayout *mainLayout = new QVBoxLayout(this); mainLayout->setObjectName("main layout"); mainLayout->setMargin(2); mainLayout->addWidget(m_lbName); mainLayout->addWidget(m_itemChooser, 10); mainLayout->addWidget(buttonWidget); slotUpdateIcons(); setLayout(mainLayout); } KisGradientChooser::~KisGradientChooser() { } KoResourceSP KisGradientChooser::currentResource() { return m_itemChooser->currentResource(); } void KisGradientChooser::setCurrentResource(KoResourceSP resource) { m_itemChooser->setCurrentResource(resource); } void KisGradientChooser::setCurrentItem(int row) { m_itemChooser->setCurrentItem(row); if (currentResource()) update(currentResource()); } void KisGradientChooser::slotUpdateIcons() { if (m_addGradient && m_editGradient) { m_addGradient->setIcon(KisIconUtils::loadIcon("list-add")); m_editGradient->setIcon(KisIconUtils::loadIcon("configure")); } } void KisGradientChooser::update(KoResourceSP resource) { KoAbstractGradientSP gradient = resource.staticCast(); m_lbName->setText(gradient ? i18n(gradient->name().toUtf8().data()) : ""); m_editGradient->setEnabled(true); } void KisGradientChooser::addStopGradient() { KoStopGradientSP gradient(new KoStopGradient("")); QList stops; stops << KoGradientStop(0.0, KoColor(QColor(250, 250, 0), KoColorSpaceRegistry::instance()->rgb8())) << KoGradientStop(1.0, KoColor(QColor(255, 0, 0, 255), KoColorSpaceRegistry::instance()->rgb8())); gradient->setType(QGradient::LinearGradient); gradient->setName(i18n("unnamed")); gradient->setStops(stops); addGradient(gradient); } void KisGradientChooser::addSegmentedGradient() { KoSegmentGradientSP gradient(new KoSegmentGradient("")); gradient->createSegment(INTERP_LINEAR, COLOR_INTERP_RGB, 0.0, 1.0, 0.5, Qt::black, Qt::white); gradient->setName(i18n("unnamed")); addGradient(gradient); } -void KisGradientChooser::addGradient(KoAbstractGradientSP gradient) +void KisGradientChooser::addGradient(KoAbstractGradientSP gradient, bool editGradient) { KoResourceServer * rserver = KoResourceServerProvider::instance()->gradientServer(); QString saveLocation = rserver->saveLocation(); KisCustomGradientDialog dialog(gradient, this, "KisCustomGradientDialog"); - dialog.exec(); + QFileInfo fileInfo(saveLocation + gradient->name().split(" ").join("_") + gradient->defaultFileExtension()); + + bool fileOverwriteAccepted = false; + + QString oldname = gradient->name(); + + while(!fileOverwriteAccepted) { + if (dialog.exec() == KoDialog::Accepted) { + + if (gradient->name().isEmpty()) { + return; + } + + if (editGradient && oldname == gradient->name()) { + fileOverwriteAccepted = true; + continue; + } + + fileInfo = QFileInfo(saveLocation + gradient->name().split(" ").join("_") + gradient->defaultFileExtension()); + if (fileInfo.exists()) { + int res = QMessageBox::warning(this, i18nc("@title:window", "Name Already Exists") + , i18n("The name '%1' already exists, do you wish to overwrite it?", gradient->name()) + , QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); + if (res == QMessageBox::Yes) fileOverwriteAccepted = true; + } else { + fileOverwriteAccepted = true; + } + } else { + return; + } + } gradient->setFilename(gradient->name() + gradient->defaultFileExtension()); gradient->setValid(true); rserver->addResource(gradient); - m_itemChooser->setCurrentResource(gradient); + //TODO: select the right gradient from the resource server. Right now this is not possible :( + m_itemChooser->setCurrentItem(0); } void KisGradientChooser::editGradient() { - KisCustomGradientDialog dialog(currentResource().staticCast(), this, "KisCustomGradientDialog"); - dialog.exec(); + addGradient(currentResource().staticCast(), true); } diff --git a/libs/ui/widgets/kis_gradient_chooser.h b/libs/ui/widgets/kis_gradient_chooser.h index f417b456cb..d5d33ed9cf 100644 --- a/libs/ui/widgets/kis_gradient_chooser.h +++ b/libs/ui/widgets/kis_gradient_chooser.h @@ -1,94 +1,94 @@ /* * Copyright (c) 2004 Adrian Page * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef KIS_GRADIENT_CHOOSER_H_ #define KIS_GRADIENT_CHOOSER_H_ #include #include #include #include #include #include #include #include class KisViewManager; class QLabel; class QPushButton; class KisResourceItemChooser; class KisAutogradientEditor; class KoResource; class KisCustomGradientDialog : public KoDialog { Q_OBJECT public: KisCustomGradientDialog(KoAbstractGradientSP gradient, QWidget *parent, const char *name); private: QWidget * m_page; }; class KRITAUI_EXPORT KisGradientChooser : public QFrame { Q_OBJECT public: KisGradientChooser(QWidget *parent = 0, const char *name = 0); ~KisGradientChooser() override; /// Gets the currently selected resource /// @returns the selected resource, 0 is no resource is selected KoResourceSP currentResource(); void setCurrentResource(KoResourceSP resource); void setCurrentItem(int row); Q_SIGNALS: /// Emitted when a resource was selected void resourceSelected(KoResourceSP resource); public Q_SLOTS: void slotUpdateIcons(); private Q_SLOTS: virtual void update(KoResourceSP resource); void addStopGradient(); void addSegmentedGradient(); void editGradient(); private: - void addGradient(KoAbstractGradientSP gradient); + void addGradient(KoAbstractGradientSP gradient, bool editGradient = false); private: QLabel *m_lbName; KisResourceItemChooser * m_itemChooser; QToolButton* m_addGradient; QPushButton* m_editGradient; }; #endif // KIS_GRADIENT_CHOOSER_H_