diff --git a/plugins/impex/brush/CMakeLists.txt b/plugins/impex/brush/CMakeLists.txt index 3f44e9e589..b0343eddd4 100644 --- a/plugins/impex/brush/CMakeLists.txt +++ b/plugins/impex/brush/CMakeLists.txt @@ -1,28 +1,29 @@ add_subdirectory(tests) set(kritabrushexport_PART_SRCS kis_brush_export.cpp + KisWdgOptionsBrush.cpp KisAnimatedBrushAnnotation.cpp ) ki18n_wrap_ui(kritabrushexport_PART_SRCS wdg_export_gih.ui) add_library(kritabrushexport MODULE ${kritabrushexport_PART_SRCS}) target_link_libraries(kritabrushexport kritalibbrush kritalibpaintop kritaui kritaimpex) install(TARGETS kritabrushexport DESTINATION ${KRITA_PLUGIN_INSTALL_DIR}) set(kritabrushimport_PART_SRCS kis_brush_import.cpp KisAnimatedBrushAnnotation.cpp ) ki18n_wrap_ui(kritabrushimport_PART_SRCS ) add_library(kritabrushimport MODULE ${kritabrushimport_PART_SRCS}) target_link_libraries(kritabrushimport kritalibbrush kritaui) install(TARGETS kritabrushimport DESTINATION ${KRITA_PLUGIN_INSTALL_DIR}) install( PROGRAMS krita_brush.desktop DESTINATION ${XDG_APPS_INSTALL_DIR}) diff --git a/plugins/impex/brush/KisWdgOptionsBrush.cpp b/plugins/impex/brush/KisWdgOptionsBrush.cpp new file mode 100644 index 0000000000..c565d57604 --- /dev/null +++ b/plugins/impex/brush/KisWdgOptionsBrush.cpp @@ -0,0 +1,179 @@ +/* + * Copyright (c) 2016 Boudewijn Rempt + * Copyright (c) 2019 Iván SantaMaría + * + * 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 "KisWdgOptionsBrush.h" + +#include +#include +#include +#include + +KisWdgOptionsBrush::KisWdgOptionsBrush(QWidget *parent) + : KisConfigWidget(parent) + , currentDimensions(0) + , m_layersCount(0) + , m_view(0) +{ + setupUi(this); + connect(this->brushStyle, SIGNAL(currentIndexChanged(int)), SLOT(slotEnableSelectionMethod(int))); + connect(this->dimensionSpin, SIGNAL(valueChanged(int)), SLOT(slotActivateDimensionRanks())); + + slotEnableSelectionMethod(brushStyle->currentIndex()); + + BrushPipeSelectionModeHelper *bp; + for (int i = 0; i < this->dimensionSpin->maximum(); i++) { + bp = new BrushPipeSelectionModeHelper(0, i); + connect(bp, SIGNAL(sigRankChanged(int)), SLOT(slotRecalculateRanks(int))); + dimRankLayout->addWidget(bp); + } + + slotActivateDimensionRanks(); +} + + + +void KisWdgOptionsBrush::setConfiguration(const KisPropertiesConfigurationSP cfg) +{ + spacingWidget->setSpacing(false, cfg->getDouble("spacing")); + if(nameLineEdit->text().isEmpty()){ + nameLineEdit->setText(cfg->getString("name")); + } + colorAsMask->setChecked(cfg->getBool("mask")); + brushStyle->setCurrentIndex(cfg->getInt("brushStyle")); + dimensionSpin->setValue(cfg->getInt("dimensions")); + + QLayoutItem *item; + BrushPipeSelectionModeHelper *bp; + for (int i = 0; i < dimensionSpin->maximum(); ++i) { + if((item = dimRankLayout->itemAt(i)) != 0) { + bp = dynamic_cast(item->widget()); + bp->cmbSelectionMode.setCurrentIndex(cfg->getInt("selectionMode" + QString::number(i))); + bp->rankSpinBox.setValue(cfg->getInt("rank" + QString::number(i))); + } + } +} + +KisPropertiesConfigurationSP KisWdgOptionsBrush::configuration() const +{ + KisPropertiesConfigurationSP cfg = new KisPropertiesConfiguration(); + cfg->setProperty("spacing", spacingWidget->spacing()); + cfg->setProperty("name", nameLineEdit->text()); + cfg->setProperty("mask", colorAsMask->isChecked()); + cfg->setProperty("brushStyle", brushStyle->currentIndex()); + cfg->setProperty("dimensions", dimensionSpin->value()); + + QLayoutItem *item; + BrushPipeSelectionModeHelper *bp; + for (int i = 0; i < dimensionSpin->maximum(); ++i) { + if((item = dimRankLayout->itemAt(i)) != 0) { + bp = dynamic_cast(item->widget()); + cfg->setProperty("selectionMode" + QString::number(i), bp->cmbSelectionMode.currentIndex()); + cfg->setProperty("rank" + QString::number(i), bp->rankSpinBox.value()); + } + } + + return cfg; +} + + +void KisWdgOptionsBrush::setView(KisViewManager *view) +{ + if (view) { + m_view = view; + KoProperties properties; + properties.setProperty("visible", true); + m_layersCount = m_view->image()->root()->childNodes(QStringList("KisLayer"), properties).count(); + + slotRecalculateRanks(); + } +} + +void KisWdgOptionsBrush::slotEnableSelectionMethod(int value) { + if (value == 0) { + animStyleGroup->setEnabled(false); + } else { + animStyleGroup->setEnabled(true); + } +} + +void KisWdgOptionsBrush::slotActivateDimensionRanks() +{ + QLayoutItem *item; + BrushPipeSelectionModeHelper *bp; + int dim = this->dimensionSpin->value(); + if(dim >= currentDimensions) { + for (int i = currentDimensions; i < dim; ++i) { + if((item = dimRankLayout->itemAt(i)) != 0) { + bp = dynamic_cast(item->widget()); + bp->setEnabled(true); + bp->show(); + } + } + } + else { + for (int i = currentDimensions -1; i >= dim; --i) { + if((item = dimRankLayout->itemAt(i)) != 0) { + bp = dynamic_cast(item->widget()); + bp->setEnabled(false); + bp->hide(); + } + } + } + currentDimensions = dim; +} + +void KisWdgOptionsBrush::slotRecalculateRanks(int rankDimension) { +// currentDimensions; + int rankSum = 0; + int maxDim = this->dimensionSpin->maximum(); + + QVector bp; + QLayoutItem *item; + + for (int i = 0; i < maxDim; ++i) { + if((item = dimRankLayout->itemAt(i)) != 0) { + bp.push_back(dynamic_cast(item->widget())); + rankSum += bp.at(i)->rankSpinBox.value(); + } + } + + BrushPipeSelectionModeHelper *currentBrushHelper; + BrushPipeSelectionModeHelper *callerBrushHelper = bp.at(rankDimension); + QVectorIterator bpIterator(bp); + + while (rankSum > m_layersCount && bpIterator.hasNext()) { + currentBrushHelper = bpIterator.next(); + + if(currentBrushHelper != callerBrushHelper) { + int currentValue = currentBrushHelper->rankSpinBox.value(); + currentBrushHelper->rankSpinBox.setValue(currentValue -1); + rankSum -= currentValue; + } + } + + if (rankSum > m_layersCount) { + callerBrushHelper->rankSpinBox.setValue(m_layersCount); + } + + if (rankSum == 0) { + bp.at(0)->rankSpinBox.setValue(m_layersCount); + return; + } +} diff --git a/plugins/impex/brush/KisWdgOptionsBrush.h b/plugins/impex/brush/KisWdgOptionsBrush.h new file mode 100644 index 0000000000..e5831d1115 --- /dev/null +++ b/plugins/impex/brush/KisWdgOptionsBrush.h @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2016 Boudewijn Rempt + * Copyright (c) 2019 Iván SantaMaría + * + * 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 KISWDGOPTIONSBRUSH_H +#define KISWDGOPTIONSBRUSH_H + +#include +#include +#include + +#include +#include +#include +#include + +class BrushPipeSelectionModeHelper : public QWidget +{ + Q_OBJECT + +public: + BrushPipeSelectionModeHelper(QWidget *parent, int dimension) + : QWidget(parent) + , cmbSelectionMode(this) + , rankSpinBox(this) + , rankLbl(this) + , horizLayout(this) + , dimension(dimension) + { + cmbSelectionMode.addItem(i18n("Constant")); + cmbSelectionMode.addItem(i18n("Random")); + cmbSelectionMode.addItem(i18n("Incremental")); + cmbSelectionMode.addItem(i18n("Pressure")); + cmbSelectionMode.addItem(i18n("Angular")); + cmbSelectionMode.addItem(i18n("Velocity")); + + horizLayout.setSpacing(6); + horizLayout.setMargin(0); + + QSizePolicy sizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed)); + sizePolicy.setHorizontalStretch(1); + sizePolicy.setVerticalStretch(0); + + this->setSizePolicy(sizePolicy); + + cmbSelectionMode.setSizePolicy(sizePolicy); + cmbSelectionMode.setCurrentIndex(2); + + rankSpinBox.setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred)); + rankLbl.setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred)); + + rankLbl.setText(i18n("Rank")); + horizLayout.addWidget(&rankLbl); + horizLayout.addWidget(&rankSpinBox); + horizLayout.addWidget(&cmbSelectionMode); + + connect(&rankSpinBox, SIGNAL(valueChanged(int)), this, SLOT(slotRankChanged())); + + this->hide(); + this->setEnabled(false); + } + + QComboBox cmbSelectionMode; + QSpinBox rankSpinBox; + QLabel rankLbl; + QHBoxLayout horizLayout; + + int dimension; + + +Q_SIGNALS: + void sigRankChanged(int rankEmitter); + +public Q_SLOTS: + void slotRankChanged() + { + emit sigRankChanged(dimension); + } + +}; + +class KisWdgOptionsBrush : public KisConfigWidget, public Ui::WdgExportGih +{ + Q_OBJECT + +public: + KisWdgOptionsBrush(QWidget *parent); + + void setConfiguration(const KisPropertiesConfigurationSP cfg) override; + KisPropertiesConfigurationSP configuration() const override; + + void setView(KisViewManager *view) override; + +public Q_SLOTS: + + void slotEnableSelectionMethod(int value); + void slotActivateDimensionRanks(); + void slotRecalculateRanks(int rankDimension = 0); + +private: + int currentDimensions; + int m_layersCount; + KisViewManager *m_view; +}; + +#endif // KISWDGOPTIONSBRUSH_H diff --git a/plugins/impex/brush/kis_brush_export.cpp b/plugins/impex/brush/kis_brush_export.cpp index 0a28862b41..732201040f 100644 --- a/plugins/impex/brush/kis_brush_export.cpp +++ b/plugins/impex/brush/kis_brush_export.cpp @@ -1,292 +1,252 @@ /* * Copyright (c) 2016 Boudewijn Rempt * * 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 "kis_brush_export.h" #include #include #include #include #include #include #include #include #include +#include +#include +#include #include #include #include #include #include #include #include #include +#include #include #include struct KisBrushExportOptions { qreal spacing; bool mask; int brushStyle; int dimensions; qint32 ranks[KisPipeBrushParasite::MaxDim]; qint32 selectionModes[KisPipeBrushParasite::MaxDim]; QString name; }; K_PLUGIN_FACTORY_WITH_JSON(KisBrushExportFactory, "krita_brush_export.json", registerPlugin();) KisBrushExport::KisBrushExport(QObject *parent, const QVariantList &) : KisImportExportFilter(parent) { } KisBrushExport::~KisBrushExport() { } KisImportExportErrorCode KisBrushExport::convert(KisDocument *document, QIODevice *io, KisPropertiesConfigurationSP configuration) { // XXX: Loading the parasite itself was commented out -- needs investigation // KisAnnotationSP annotation = document->savingImage()->annotation("ImagePipe Parasite"); // KisPipeBrushParasite parasite; // if (annotation) { // QBuffer buf(const_cast(&annotation->annotation())); // buf.open(QBuffer::ReadOnly); // parasite.loadFromDevice(&buf); // buf.close(); // } KisBrushExportOptions exportOptions; if (document->savingImage()->dynamicPropertyNames().contains("brushspacing")) { exportOptions.spacing = document->savingImage()->property("brushspacing").toFloat(); } else { exportOptions.spacing = configuration->getInt("spacing"); } if (!configuration->getString("name").isEmpty()) { exportOptions.name = configuration->getString("name"); } else { exportOptions.name = document->savingImage()->objectName(); } exportOptions.mask = configuration->getBool("mask"); exportOptions.brushStyle = configuration->getInt("brushStyle"); exportOptions.dimensions = configuration->getInt("dimensions"); for (int i = 0; i < KisPipeBrushParasite::MaxDim; ++i) { exportOptions.selectionModes[i] = configuration->getInt("selectionMode" + QString::number(i)); exportOptions.ranks[i] = configuration->getInt("rank" + QString::number(i)); } KisGbrBrush *brush = 0; if (mimeType() == "image/x-gimp-brush") { brush = new KisGbrBrush(filename()); } else if (mimeType() == "image/x-gimp-brush-animated") { brush = new KisImagePipeBrush(filename()); } else { return ImportExportCodes::FileFormatIncorrect; } qApp->processEvents(); // For vector layers to be updated QRect rc = document->savingImage()->bounds(); brush->setSpacing(exportOptions.spacing); KisImagePipeBrush *pipeBrush = dynamic_cast(brush); if (pipeBrush) { // Create parasite. XXX: share with KisCustomBrushWidget QVector< QVector > devices; devices.push_back(QVector()); KoProperties properties; properties.setProperty("visible", true); QList layers = document->savingImage()->root()->childNodes(QStringList("KisLayer"), properties); Q_FOREACH (KisNodeSP node, layers) { // push_front to behave exactly as gimp for gih creation devices[0].push_front(node->projection().data()); } QVector modes; for (int i = 0; i < KisPipeBrushParasite::MaxDim; ++i) { switch (exportOptions.selectionModes[i]) { case 0: modes.push_back(KisParasite::Constant); break; case 1: modes.push_back(KisParasite::Random); break; case 2: modes.push_back(KisParasite::Incremental); break; case 3: modes.push_back(KisParasite::Pressure); break; case 4: modes.push_back(KisParasite::Angular); break; case 5: modes.push_back(KisParasite::Velocity); break; default: modes.push_back(KisParasite::Incremental); } } KisPipeBrushParasite parasite; parasite.dim = exportOptions.dimensions; parasite.ncells = devices.at(0).count(); int maxRanks = 0; for (int i = 0; i < KisPipeBrushParasite::MaxDim; ++i) { // ### This can mask some bugs, be careful here in the future parasite.rank[i] = exportOptions.ranks[i]; parasite.selection[i] = modes.at(i); maxRanks += exportOptions.ranks[i]; } if (maxRanks > layers.count()) { return ImportExportCodes::FileFormatIncorrect; } // XXX needs movement! parasite.setBrushesCount(); pipeBrush->setParasite(parasite); pipeBrush->setDevices(devices, rc.width(), rc.height()); if(exportOptions.mask) { QVector brushes = pipeBrush->brushes(); Q_FOREACH(KisGbrBrush* brush, brushes) { brush->setHasColor(false); } } } else { if (exportOptions.mask){ QImage image = document->savingImage()->projection()->convertToQImage(0, 0, 0, rc.width(), rc.height(), KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::internalConversionFlags()); brush->setImage(image); brush->setBrushTipImage(image); } else { brush->initFromPaintDev(document->savingImage()->projection(),0,0,rc.width(), rc.height()); } } brush->setName(exportOptions.name); // brushes are created after devices are loaded, mask mode must b after that brush->setUseColorAsMask(exportOptions.mask); brush->setWidth(rc.width()); brush->setHeight(rc.height()); if (brush->saveToDevice(io)) { return ImportExportCodes::OK; } else { return ImportExportCodes::Failure; } } KisPropertiesConfigurationSP KisBrushExport::defaultConfiguration(const QByteArray &/*from*/, const QByteArray &/*to*/) const { KisPropertiesConfigurationSP cfg = new KisPropertiesConfiguration(); cfg->setProperty("spacing", 1.0); cfg->setProperty("name", ""); cfg->setProperty("mask", true); cfg->setProperty("brushStyle", 0); cfg->setProperty("dimensions", 1); for (int i = 0; i < KisPipeBrushParasite::MaxDim; ++i) { cfg->setProperty("selectionMode" + QString::number(i), 2); cfg->getInt("rank" + QString::number(i), 0); } return cfg; } KisConfigWidget *KisBrushExport::createConfigurationWidget(QWidget *parent, const QByteArray &/*from*/, const QByteArray &to) const { KisWdgOptionsBrush *wdg = new KisWdgOptionsBrush(parent); if (to == "image/x-gimp-brush") { wdg->groupBox->setVisible(false); wdg->animStyleGroup->setVisible(false); } else if (to == "image/x-gimp-brush-animated") { wdg->groupBox->setVisible(true); wdg->animStyleGroup->setVisible(true); } // preload gih name with chosen filename QFileInfo fileLocation(filename()); wdg->nameLineEdit->setText(fileLocation.baseName()); return wdg; } void KisBrushExport::initializeCapabilities() { QList > supportedColorModels; supportedColorModels << QPair() << QPair(RGBAColorModelID, Integer8BitsColorDepthID) << QPair(GrayAColorModelID, Integer8BitsColorDepthID); addSupportedColorModels(supportedColorModels, "Gimp Brushes"); if (mimeType() == "image/x-gimp-brush-animated") { addCapability(KisExportCheckRegistry::instance()->get("MultiLayerCheck")->create(KisExportCheckBase::SUPPORTED)); } } -void KisWdgOptionsBrush::setConfiguration(const KisPropertiesConfigurationSP cfg) -{ - spacingWidget->setSpacing(false, cfg->getDouble("spacing")); - if(nameLineEdit->text().isEmpty()){ - nameLineEdit->setText(cfg->getString("name")); - } - colorAsMask->setChecked(cfg->getBool("mask")); - brushStyle->setCurrentIndex(cfg->getInt("brushStyle")); - dimensionSpin->setValue(cfg->getInt("dimensions")); - - QLayoutItem *item; - BrushPipeSelectionModeHelper *bp; - for (int i = 0; i < dimensionSpin->maximum(); ++i) { - if((item = dimRankLayout->itemAt(i)) != 0) { - bp = dynamic_cast(item->widget()); - bp->cmbSelectionMode.setCurrentIndex(cfg->getInt("selectionMode" + QString::number(i))); - bp->rank.setValue(cfg->getInt("rank" + QString::number(i))); - } - } -} - -KisPropertiesConfigurationSP KisWdgOptionsBrush::configuration() const -{ - KisPropertiesConfigurationSP cfg = new KisPropertiesConfiguration(); - cfg->setProperty("spacing", spacingWidget->spacing()); - cfg->setProperty("name", nameLineEdit->text()); - cfg->setProperty("mask", colorAsMask->isChecked()); - cfg->setProperty("brushStyle", brushStyle->currentIndex()); - cfg->setProperty("dimensions", dimensionSpin->value()); - - QLayoutItem *item; - BrushPipeSelectionModeHelper *bp; - for (int i = 0; i < dimensionSpin->maximum(); ++i) { - if((item = dimRankLayout->itemAt(i)) != 0) { - bp = dynamic_cast(item->widget()); - cfg->setProperty("selectionMode" + QString::number(i), bp->cmbSelectionMode.currentIndex()); - cfg->setProperty("rank" + QString::number(i), bp->rank.value()); - } - } - - return cfg; -} - - #include "kis_brush_export.moc" diff --git a/plugins/impex/brush/kis_brush_export.h b/plugins/impex/brush/kis_brush_export.h index 063499b412..14eeed9d6a 100644 --- a/plugins/impex/brush/kis_brush_export.h +++ b/plugins/impex/brush/kis_brush_export.h @@ -1,250 +1,45 @@ /* * Copyright (c) 2016 Boudewijn Rempt * * 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_Brush_EXPORT_H_ #define _KIS_Brush_EXPORT_H_ #include #include #include #include -#include #include #include -class SelectionModeComboBox : public QComboBox -{ - Q_OBJECT - -public: - SelectionModeComboBox(QWidget *parent) - : QComboBox(parent) - { - this->addItem(i18n("Constant")); - this->addItem(i18n("Random")); - this->addItem(i18n("Incremental")); - this->addItem(i18n("Pressure")); - this->addItem(i18n("Angular")); - this->addItem(i18n("Velocity")); - } - -}; - -class BrushPipeSelectionModeHelper : public QWidget -{ - Q_OBJECT - -public: - BrushPipeSelectionModeHelper(QWidget *parent, int dimension) - : QWidget(parent) - , cmbSelectionMode(this) - , rank(this) - , rankLbl(this) - , horizLayout(this) - , dimension(dimension) - { - horizLayout.setSpacing(6); - horizLayout.setMargin(0); - - QSizePolicy sizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed)); - sizePolicy.setHorizontalStretch(1); - sizePolicy.setVerticalStretch(0); - - this->setSizePolicy(sizePolicy); - - cmbSelectionMode.setSizePolicy(sizePolicy); - cmbSelectionMode.setCurrentIndex(2); - - rank.setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred)); - rankLbl.setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred)); - - rankLbl.setText(i18n("Rank")); - horizLayout.addWidget(&rankLbl); - horizLayout.addWidget(&rank); - horizLayout.addWidget(&cmbSelectionMode); - - connect(&rank, SIGNAL(valueChanged(int)), this, SLOT(slotRankChanged())); - - this->hide(); - this->setEnabled(false); - } - - SelectionModeComboBox cmbSelectionMode; - QSpinBox rank; - QLabel rankLbl; - QHBoxLayout horizLayout; - - int dimension; - - -Q_SIGNALS: - void rankChanged(int rankEmitter); - -public Q_SLOTS: - void slotRankChanged() - { - emit rankChanged(dimension); - } - -}; - -#include -#include -#include - -class KisWdgOptionsBrush : public KisConfigWidget, public Ui::WdgExportGih -{ - Q_OBJECT - -public: - KisWdgOptionsBrush(QWidget *parent) - : KisConfigWidget(parent) - , currentDimensions(0) - , m_layersCount(0) - , m_view(0) - { - setupUi(this); - connect(this->brushStyle, SIGNAL(currentIndexChanged(int)), SLOT(enableSelectionMethod(int))); - connect(this->dimensionSpin, SIGNAL(valueChanged(int)), SLOT(activateDimensionRanks())); - - enableSelectionMethod(brushStyle->currentIndex()); - - BrushPipeSelectionModeHelper *bp; - for (int i = 0; i < this->dimensionSpin->maximum(); i++) { - bp = new BrushPipeSelectionModeHelper(0, i); - connect(bp, SIGNAL(rankChanged(int)), SLOT(recalculateRanks(int))); - dimRankLayout->addWidget(bp); - } - - activateDimensionRanks(); - } - - void setConfiguration(const KisPropertiesConfigurationSP cfg) override; - KisPropertiesConfigurationSP configuration() const override; - -public Q_SLOTS: - - void enableSelectionMethod(int value) { - if (value == 0) { - animStyleGroup->setEnabled(false); - } else { - animStyleGroup->setEnabled(true); - } - } - - void activateDimensionRanks() - { - QLayoutItem *item; - BrushPipeSelectionModeHelper *bp; - int dim = this->dimensionSpin->value(); - if(dim >= currentDimensions) { - for (int i = currentDimensions; i < dim; ++i) { - if((item = dimRankLayout->itemAt(i)) != 0) { - bp = dynamic_cast(item->widget()); - bp->setEnabled(true); - bp->show(); - } - } - } - else { - for (int i = currentDimensions -1; i >= dim; --i) { - if((item = dimRankLayout->itemAt(i)) != 0) { - bp = dynamic_cast(item->widget()); - bp->setEnabled(false); - bp->hide(); - } - } - } - currentDimensions = dim; - } - - void recalculateRanks(int rankDimension = 0) { -// currentDimensions; - int rankSum = 0; - int maxDim = this->dimensionSpin->maximum(); - - QVector bp; - QLayoutItem *item; - - for (int i = 0; i < maxDim; ++i) { - if((item = dimRankLayout->itemAt(i)) != 0) { - bp.push_back(dynamic_cast(item->widget())); - rankSum += bp.at(i)->rank.value(); - } - } - - BrushPipeSelectionModeHelper *currentBrushHelper; - BrushPipeSelectionModeHelper *callerBrushHelper = bp.at(rankDimension); - QVectorIterator bpIterator(bp); - - while (rankSum > m_layersCount && bpIterator.hasNext()) { - currentBrushHelper = bpIterator.next(); - - if(currentBrushHelper != callerBrushHelper) { - int currentValue = currentBrushHelper->rank.value(); - currentBrushHelper->rank.setValue(currentValue -1); - rankSum -= currentValue; - } - } - - if (rankSum > m_layersCount) { - callerBrushHelper->rank.setValue(m_layersCount); - } - - if (rankSum == 0) { - bp.at(0)->rank.setValue(m_layersCount); - return; - } - } - - void setView(KisViewManager *view) override - { - if (view) { - m_view = view; - KoProperties properties; - properties.setProperty("visible", true); - m_layersCount = m_view->image()->root()->childNodes(QStringList("KisLayer"), properties).count(); - - recalculateRanks(); - } - } - - -private: - int currentDimensions; - int m_layersCount; - KisViewManager *m_view; -}; - class KisBrushExport : public KisImportExportFilter { Q_OBJECT public: KisBrushExport(QObject *parent, const QVariantList &); ~KisBrushExport() override; KisImportExportErrorCode convert(KisDocument *document, QIODevice *io, KisPropertiesConfigurationSP configuration = 0) override; KisPropertiesConfigurationSP defaultConfiguration(const QByteArray& from = "", const QByteArray& to = "") const override; KisConfigWidget *createConfigurationWidget(QWidget *parent, const QByteArray& from = "", const QByteArray& to = "") const override; void initializeCapabilities() override; }; #endif