diff --git a/plugins/extensions/imagesplit/dlg_imagesplit.cpp b/plugins/extensions/imagesplit/dlg_imagesplit.cpp index 82c0cfe232..77cb357b21 100644 --- a/plugins/extensions/imagesplit/dlg_imagesplit.cpp +++ b/plugins/extensions/imagesplit/dlg_imagesplit.cpp @@ -1,115 +1,125 @@ /* * dlg_imagesplit.cc - part of KimageShop^WKrayon^WKrita * * Copyright (c) 2009 Boudewijn Rempt * 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 "dlg_imagesplit.h" #include #include #include #include #include DlgImagesplit::DlgImagesplit(KisViewManager* view, const QString &suffix, QStringList listMimeFilter, int defaultMimeIndex) : KoDialog(view->mainWindow()) { m_page = new WdgImagesplit(this); setCaption(i18n("Image Split")); setButtons(Apply | Close); setDefaultButton(Apply); connect(this, SIGNAL(applyClicked()), this, SLOT(applyClicked())); setMainWidget(m_page); m_page->lineEdit->setText(suffix); m_page->cmbFileType->clear(); m_page->cmbFileType->addItems(listMimeFilter); m_page->cmbFileType->setCurrentIndex(defaultMimeIndex); cmbIndex = defaultMimeIndex; connect(m_page->chkAutoSave, SIGNAL(stateChanged(int)), SLOT(lineEditEnable())); connect(m_page->cmbFileType, SIGNAL(activated(int)), this, SLOT(setMimeType(int))); } DlgImagesplit::~DlgImagesplit() { } void DlgImagesplit::lineEditEnable() { if (m_page->chkAutoSave->isChecked()) { m_page->lblSuffix->setEnabled(true); m_page->lineEdit->setEnabled(true); m_page->lblFileType->setEnabled(true); m_page->cmbFileType->setEnabled(true); } else { m_page->lblSuffix->setEnabled(false); m_page->lineEdit->setEnabled(false); m_page->lblFileType->setEnabled(false); m_page->cmbFileType->setEnabled(false); } } bool DlgImagesplit::autoSave() { if (m_page->chkAutoSave->isChecked()) return true; else return false; } bool DlgImagesplit::sortHorizontal() { if (m_page->chkHorizontal->isChecked()) return true; else return false; } int DlgImagesplit::horizontalLines() { return m_page->intHorizontalSplitLines->value(); } int DlgImagesplit::verticalLines() { return m_page->intVerticalSplitLines->value(); } +bool DlgImagesplit::useHorizontalGuides() +{ + return m_page->chkGuidesHorizontal->isChecked(); +} + +bool DlgImagesplit::useVerticalGuides() +{ + return m_page->chkGuidesVertical->isChecked(); +} + QString DlgImagesplit::suffix() { return m_page->lineEdit->text(); } void DlgImagesplit::setMimeType(int index) { cmbIndex = index; } void DlgImagesplit::applyClicked() { accept(); } diff --git a/plugins/extensions/imagesplit/dlg_imagesplit.h b/plugins/extensions/imagesplit/dlg_imagesplit.h index 578297f9d8..6a99508df8 100644 --- a/plugins/extensions/imagesplit/dlg_imagesplit.h +++ b/plugins/extensions/imagesplit/dlg_imagesplit.h @@ -1,59 +1,61 @@ /* * dlg_imagesplit.h -- part of KimageShop^WKrayon^WKrita * * Copyright (c) 2009 Boudewijn Rempt * 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. */ #ifndef DLG_IMAGESPLIT #define DLG_IMAGESPLIT #include #include #include "wdg_imagesplit.h" class KisViewManager; /** * This dialog allows the user to create a selection mask based * on a (range of) colors. */ class DlgImagesplit: public KoDialog { Q_OBJECT public: DlgImagesplit(KisViewManager* view, const QString &suffix, QStringList listMimeType, int defaultMimeIndex); ~DlgImagesplit() override; bool autoSave(); bool sortHorizontal(); int horizontalLines(); int verticalLines(); + bool useHorizontalGuides(); + bool useVerticalGuides(); int cmbIndex; QString suffix(); private Q_SLOTS: void applyClicked(); void lineEditEnable(); void setMimeType(int index); private: WdgImagesplit* m_page; }; #endif // DLG_IMAGESPLIT diff --git a/plugins/extensions/imagesplit/imagesplit.cpp b/plugins/extensions/imagesplit/imagesplit.cpp index 87859c8fd5..e69116d429 100644 --- a/plugins/extensions/imagesplit/imagesplit.cpp +++ b/plugins/extensions/imagesplit/imagesplit.cpp @@ -1,230 +1,273 @@ /* * imagesplit.cc -- Part of Krita * * Copyright (c) 2004 Boudewijn Rempt (boud@valdyas.org) * 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 "imagesplit.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include +#include +#include #include "dlg_imagesplit.h" K_PLUGIN_FACTORY_WITH_JSON(ImagesplitFactory, "kritaimagesplit.json", registerPlugin();) Imagesplit::Imagesplit(QObject *parent, const QVariantList &) : KisActionPlugin(parent) { KisAction *action = createAction("imagesplit"); connect(action, SIGNAL(triggered()), this, SLOT(slotImagesplit())); } Imagesplit::~Imagesplit() { } bool Imagesplit::saveAsImage(const QRect &imgSize, const QString &mimeType, const QString &url) { KisImageSP image = viewManager()->image(); KisDocument *document = KisPart::instance()->createDocument(); { // make sure dst is deleted before calling 'delete exportDocument', // since KisDocument checks that its image is properly deref()'d. KisImageSP dst = new KisImage(document->createUndoStore(), imgSize.width(), imgSize.height(), image->colorSpace(), image->objectName()); dst->setResolution(image->xRes(), image->yRes()); document->setCurrentImage(dst); KisPaintLayer* paintLayer = new KisPaintLayer(dst, dst->nextLayerName(), 255); KisPainter gc(paintLayer->paintDevice()); gc.bitBlt(QPoint(0, 0), image->projection(), imgSize); dst->addNode(paintLayer, KisNodeSP(0)); dst->refreshGraph(); } document->setFileBatchMode(true); if (!document->exportDocumentSync(QUrl::fromLocalFile(url), mimeType.toLatin1())) { if (document->errorMessage().isEmpty()) { QMessageBox::critical(0, i18nc("@title:window", "Krita"), i18n("Could not save\n%1", document->localFilePath())); } else { QMessageBox::critical(0, i18nc("@title:window", "Krita"), i18n("Could not save %1\nReason: %2", document->localFilePath(), document->errorMessage())); } return false; } delete document; return true; } void Imagesplit::slotImagesplit() { // Taking the title - url from caption function and removing file extension QStringList strList = ((viewManager()->document())->caption()).split('.'); QString suffix = strList.at(0); // Getting all mime types and converting them into names which are displayed at combo box QStringList listMimeFilter = KisImportExportManager::supportedMimeTypes(KisImportExportManager::Export); QString defaultMime = QString::fromLatin1(viewManager()->document()->mimeType()); if (defaultMime.isEmpty()) defaultMime = QString::fromLatin1(viewManager()->document()->nativeFormatMimeType()); int defaultMimeIndex = 0; listMimeFilter.sort(); QStringList filteredMimeTypes; QStringList listFileType; int i = 0; Q_FOREACH (const QString &mimeType, listMimeFilter) { listFileType.append(KisMimeDatabase::descriptionForMimeType(mimeType)); filteredMimeTypes.append(mimeType); if (mimeType == defaultMime) { defaultMimeIndex = i; } i++; } listMimeFilter = filteredMimeTypes; Q_ASSERT(listMimeFilter.size() == listFileType.size()); DlgImagesplit *dlgImagesplit = new DlgImagesplit(viewManager(), suffix, listFileType, defaultMimeIndex); dlgImagesplit->setObjectName("Imagesplit"); Q_CHECK_PTR(dlgImagesplit); KisImageWSP image = viewManager()->image(); if (dlgImagesplit->exec() == QDialog::Accepted) { int numHorizontalLines = dlgImagesplit->horizontalLines(); int numVerticalLines = dlgImagesplit->verticalLines(); + QList xGuides = viewManager()->document()->guidesConfig().verticalGuideLines(); + QList yGuides = viewManager()->document()->guidesConfig().horizontalGuideLines(); int img_width = image->width() / (numVerticalLines + 1); int img_height = image->height() / (numHorizontalLines + 1); + if (dlgImagesplit->useHorizontalGuides()) { + numHorizontalLines = yGuides.size(); + } + if (dlgImagesplit->useVerticalGuides()) { + numVerticalLines = xGuides.size(); + } + bool stop = false; QString mimeType; QString filepath; QString homepath; QString suffix; if (dlgImagesplit->autoSave()) { KoFileDialog dialog(viewManager()->mainWindow(), KoFileDialog::OpenDirectory, "OpenDocument"); dialog.setCaption(i18n("Save Image on Split")); dialog.setDefaultDir(QStandardPaths::writableLocation(QStandardPaths::PicturesLocation)); QStringList mimeFilter = viewManager()->document()->importExportManager()->supportedMimeTypes(KisImportExportManager::Export); QString defaultMime = QString::fromLatin1(viewManager()->document()->mimeType()); dialog.setMimeTypeFilters(mimeFilter, defaultMime); QUrl directory = QUrl::fromUserInput(dialog.filename()); if (directory.isEmpty()) return; mimeType = listMimeFilter.at(dlgImagesplit->cmbIndex); homepath = directory.toLocalFile(); suffix = KisMimeDatabase::suffixesForMimeType(mimeType).first(); if (suffix.startsWith("*.")) { suffix = suffix.remove(0, 1); } if (!suffix.startsWith(".")) { suffix = suffix.prepend('.'); } } int outerLoop; int innerLoop; if (dlgImagesplit->sortHorizontal()) { outerLoop = numHorizontalLines + 1; innerLoop = numVerticalLines + 1; } else { outerLoop = numVerticalLines + 1; innerLoop = numHorizontalLines + 1; } + KisCoordinatesConverter converter; + converter.setImage(image); + QTransform transform = converter.imageToDocumentTransform().inverted(); + for (int i = 0; i< xGuides.size(); i++) { + qreal line = xGuides[i]; + xGuides[i] = transform.map(QPointF(line, line)).x(); + } + for (int i = 0; i< yGuides.size(); i++) { + qreal line = yGuides[i]; + yGuides[i] = transform.map(QPointF(line, line)).y(); + } + xGuides.prepend(qreal(0)); + xGuides.append(image->width()); + yGuides.prepend(qreal(0)); + yGuides.append(image->height()); + + int currentX = 0; + int currentY = 0; for (int i = 0, k = 1; i < outerLoop; i++) { for (int j = 0; j < innerLoop; j++, k++) { int row; int column; if (dlgImagesplit->sortHorizontal()) { row = i; column = j; } else { row = j; column = i; } + if (dlgImagesplit->useVerticalGuides()) { + currentX = xGuides[column]; + img_width = xGuides[column+1]-currentX; + } else { + currentX = (column * img_width); + } + if (dlgImagesplit->useHorizontalGuides()) { + currentY = yGuides[row]; + img_height = yGuides[row+1]-currentY; + } else { + currentY = (row * img_height); + } + if (dlgImagesplit->autoSave()) { QString fileName = dlgImagesplit->suffix() + '_' + QString::number(k) + suffix; filepath = homepath + '/' + fileName; mimeType = listMimeFilter.at(dlgImagesplit->cmbIndex); } else { KoFileDialog dialog(viewManager()->mainWindow(), KoFileDialog::SaveFile, "OpenDocument"); dialog.setCaption(i18n("Save Image on Split")); dialog.setDefaultDir(QStandardPaths::writableLocation(QStandardPaths::PicturesLocation)); dialog.setMimeTypeFilters(listMimeFilter, defaultMime); QUrl url = QUrl::fromUserInput(dialog.filename()); filepath = url.toLocalFile(); mimeType = KisMimeDatabase::mimeTypeForFile(url.toLocalFile(), false); if (url.isEmpty()) return; } - if (!saveAsImage(QRect((column * img_width), (row * img_height), img_width, img_height), mimeType, filepath)) { + if (!saveAsImage(QRect(currentX, currentY, img_width, img_height), mimeType, filepath)) { stop = true; break; } + } if (stop) { break; } } } delete dlgImagesplit; } #include "imagesplit.moc" diff --git a/plugins/extensions/imagesplit/wdg_imagesplit.ui b/plugins/extensions/imagesplit/wdg_imagesplit.ui index 693bb0bc96..ca5b756452 100644 --- a/plugins/extensions/imagesplit/wdg_imagesplit.ui +++ b/plugins/extensions/imagesplit/wdg_imagesplit.ui @@ -1,156 +1,174 @@ WdgImagesplit 0 0 - 258 + 311 339 Image Size - - - - - - - + + + + + Horizontal Lines + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Vertical Lines + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Prefix + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + true + + + + + + + + + + File Type + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 12 + + + + Autosave on Split + + + + + + + Qt::Vertical + + + + 20 + 5 + + + + + + + + + 0 + 0 + + + + + + + - - - - Sort Direction: - - - - - - - 10 - - - - Hori&zontal - - - - - - - - 10 - - - - &Vertical - - - - - - - - + + - Prefix - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - true - - - - - - - - - - File Type - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - - - - - - 10 - - - - Autosave on Split + Use guides - - - - Horizontal Lines - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - + + + + + + - - + + - Vertical Lines - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Use guides - - - - Qt::Vertical + + + + Sort Direction: - - - 20 - 2 - - - + + + + + + 12 + + + + Hori&zontal + + + + + + + + 12 + + + + &Vertical + + + + + KisIntParseSpinBox QSpinBox
kis_int_parse_spin_box.h