diff --git a/plugins/extensions/imagesplit/dlg_imagesplit.cpp b/plugins/extensions/imagesplit/dlg_imagesplit.cpp index 82c0cfe232..5ee75ccbd5 100644 --- a/plugins/extensions/imagesplit/dlg_imagesplit.cpp +++ b/plugins/extensions/imagesplit/dlg_imagesplit.cpp @@ -1,115 +1,191 @@ /* * 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) +#include + +DlgImagesplit::DlgImagesplit(KisViewManager* view + , const QString &suffix + , QStringList listMimeFilter + , int defaultMimeIndex, QImage thumbnail + , QList hGuides + , QList vGuides, qreal thumbnailRatio) : KoDialog(view->mainWindow()) { m_page = new WdgImagesplit(this); + m_thumbnail = thumbnail; + m_horizontalGuides = hGuides; + m_verticalGuides = vGuides; + m_thumbnailRatio = thumbnailRatio; 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))); + connect(m_page->chkGuidesHorizontal, SIGNAL(toggled(bool)), m_page->intHorizontalSplitLines, SLOT(setDisabled(bool))); + connect(m_page->chkGuidesVertical, SIGNAL(toggled(bool)), m_page->intVerticalSplitLines, SLOT(setDisabled(bool))); + + connect(m_page->intVerticalSplitLines, SIGNAL(valueChanged(int)), SLOT(updatePreview())); + connect(m_page->intHorizontalSplitLines, SIGNAL(valueChanged(int)), SLOT(updatePreview())); + connect(m_page->chkGuidesHorizontal, SIGNAL(toggled(bool)), SLOT(updatePreview())); + connect(m_page->chkGuidesVertical, SIGNAL(toggled(bool)), SLOT(updatePreview())); + + updatePreview(); } 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::updatePreview() +{ + QImage img = QImage(200, 200, QImage::Format_RGBA8888); + QPainter painter(&img); + + img.fill(palette().background().color()); + QPoint point; + point.setX((img.width()-m_thumbnail.width())*0.5); + point.setY((img.height()-m_thumbnail.height())*0.5); + + painter.setOpacity(0.5); + painter.drawImage(point, m_thumbnail); + + painter.setOpacity(1.0); + QPen pen = QPen(palette().highlight().color()); + pen.setWidth(1); + painter.setPen(pen); + + if (useHorizontalGuides()) { + for (int i = 0; i< m_horizontalGuides.size(); i++) { + int lineY = point.y() + (m_thumbnailRatio *m_horizontalGuides[i]); + painter.drawLine(point.x(), lineY, point.x()+m_thumbnail.width(), lineY); + } + } else { + int rowHeight = m_thumbnail.height()/(horizontalLines()+1); + for (int i = 0; i< horizontalLines(); i++) { + int lineY = point.y()+(rowHeight*(i+1)); + painter.drawLine(point.x(), lineY, point.x()+m_thumbnail.width(), lineY); + } + } + + if (useVerticalGuides()) { + for (int i = 0; i< m_verticalGuides.size(); i++) { + int lineX = point.x() + (m_thumbnailRatio *m_verticalGuides[i]); + painter.drawLine(lineX, point.y(), lineX, point.y()+m_thumbnail.height()); + } + } else { + int columnWidth = m_thumbnail.width()/(verticalLines()+1); + for (int i = 0; i< verticalLines(); i++) { + int lineX = point.x()+(columnWidth*(i+1)); + painter.drawLine(lineX, point.y(), lineX, point.y()+m_thumbnail.height()); + } + } + + m_page->imagePreviewLabel->setPixmap(QPixmap::fromImage(img)); +} + void DlgImagesplit::applyClicked() { accept(); } diff --git a/plugins/extensions/imagesplit/dlg_imagesplit.h b/plugins/extensions/imagesplit/dlg_imagesplit.h index 578297f9d8..6e24a43b90 100644 --- a/plugins/extensions/imagesplit/dlg_imagesplit.h +++ b/plugins/extensions/imagesplit/dlg_imagesplit.h @@ -1,59 +1,73 @@ /* * 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(KisViewManager* view + , const QString &suffix + , QStringList listMimeType + , int defaultMimeIndex + , QImage thumbnail + , QList hGuides + , QList vGuides + , qreal thumbnailRatio); ~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); + void updatePreview(); private: WdgImagesplit* m_page; + QImage m_thumbnail; + QList m_horizontalGuides; + QList m_verticalGuides; + qreal m_thumbnailRatio; }; #endif // DLG_IMAGESPLIT diff --git a/plugins/extensions/imagesplit/imagesplit.cpp b/plugins/extensions/imagesplit/imagesplit.cpp index 87859c8fd5..458e66d3a3 100644 --- a/plugins/extensions/imagesplit/imagesplit.cpp +++ b/plugins/extensions/imagesplit/imagesplit.cpp @@ -1,230 +1,282 @@ /* * 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); + KisCoordinatesConverter converter; + QList xGuides = viewManager()->document()->guidesConfig().verticalGuideLines(); + QList yGuides = viewManager()->document()->guidesConfig().horizontalGuideLines(); + KisImageWSP image = viewManager()->image(); + + 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(); + } + + qreal thumbnailRatio = qreal(200)/qMax(image->width(), image->height()); + + DlgImagesplit *dlgImagesplit = new DlgImagesplit(viewManager() + , suffix + , listFileType + , defaultMimeIndex + , viewManager()->document()->generatePreview(QSize(200, 200)).toImage() + , yGuides, xGuides, thumbnailRatio); dlgImagesplit->setObjectName("Imagesplit"); Q_CHECK_PTR(dlgImagesplit); - KisImageWSP image = viewManager()->image(); - if (dlgImagesplit->exec() == QDialog::Accepted) { int numHorizontalLines = dlgImagesplit->horizontalLines(); int numVerticalLines = dlgImagesplit->verticalLines(); 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; } + 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..fd2515de49 100644 --- a/plugins/extensions/imagesplit/wdg_imagesplit.ui +++ b/plugins/extensions/imagesplit/wdg_imagesplit.ui @@ -1,156 +1,191 @@ WdgImagesplit 0 0 - 258 + 514 339 Image Size - + - - + + + + Horizontal Lines + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + - - + + + + + + + + + Use guides + + + + + + + + + Vertical Lines + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + Use guides + + + + - + Sort Direction: - 10 + 12 Hori&zontal - 10 + 12 &Vertical - + Prefix Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - + true - + File Type Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - + 0 0 - + - 10 + 12 Autosave on Split - - - - Horizontal Lines + + + + Qt::Vertical - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 20 + 13 + - - - - - - Vertical Lines - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - + - - - Qt::Vertical - - + + - 20 - 2 + 200 + 200 - + + + + KisIntParseSpinBox QSpinBox
kis_int_parse_spin_box.h