File indexing completed on 2024-05-26 04:32:54

0001 /*
0002  * SPDX-FileCopyrightText: 2013 Lukáš Tvrdý <lukast.dev@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "offsetimage.h"
0008 
0009 #include <cmath>
0010 
0011 #include <klocalizedstring.h>
0012 #include <kis_debug.h>
0013 #include <kpluginfactory.h>
0014 #include <kis_icon.h>
0015 #include <kis_image.h>
0016 #include <kis_types.h>
0017 #include <KisViewManager.h>
0018 #include <kis_image_manager.h>
0019 #include <kis_node_manager.h>
0020 #include <kis_canvas_resource_provider.h>
0021 #include <kis_group_layer.h>
0022 #include <kis_image_signal_router.h>
0023 #include <kis_processing_applicator.h>
0024 #include <kis_action.h>
0025 #include <kis_selection.h>
0026 
0027 #include "dlg_offsetimage.h"
0028 #include "kis_offset_processing_visitor.h"
0029 
0030 K_PLUGIN_FACTORY_WITH_JSON(OffsetImageFactory, "kritaoffsetimage.json", registerPlugin<OffsetImage>();)
0031 
0032 OffsetImage::OffsetImage(QObject *parent, const QVariantList &)
0033         : KisActionPlugin(parent)
0034 {
0035     KisAction *action  = createAction("offsetimage");
0036     connect(action, SIGNAL(triggered()), this, SLOT(slotOffsetImage()));
0037 
0038     action  = createAction("offsetlayer");
0039     connect(action, SIGNAL(triggered()), this, SLOT(slotOffsetLayer()));
0040 }
0041 
0042 
0043 OffsetImage::~OffsetImage()
0044 {
0045 }
0046 
0047 
0048 void OffsetImage::slotOffsetImage()
0049 {
0050     KisImageSP image = viewManager()->image().toStrongRef();
0051     if (image) {
0052 
0053         DlgOffsetImage * dlgOffsetImage = new DlgOffsetImage(viewManager()->mainWindowAsQWidget(), "OffsetImage", offsetWrapRect().size());
0054         Q_CHECK_PTR(dlgOffsetImage);
0055 
0056         KUndo2MagicString actionName = kundo2_i18n("Offset Image");
0057         dlgOffsetImage->setCaption(i18nc("@title:window", "Offset Image"));
0058 
0059         if (dlgOffsetImage->exec() == QDialog::Accepted) {
0060             QPoint offsetPoint = QPoint(dlgOffsetImage->offsetX(), dlgOffsetImage->offsetY());
0061             offsetImpl(actionName, image->root(), offsetPoint);
0062         }
0063         delete dlgOffsetImage;
0064     }
0065     else
0066     {
0067         dbgKrita << "KisImage not available";
0068     }
0069 }
0070 
0071 
0072 void OffsetImage::slotOffsetLayer()
0073 {
0074     KisImageSP image = viewManager()->image().toStrongRef();
0075     if (image) {
0076 
0077         DlgOffsetImage * dlgOffsetImage = new DlgOffsetImage(viewManager()->mainWindowAsQWidget(), "OffsetLayer", offsetWrapRect().size());
0078         Q_CHECK_PTR(dlgOffsetImage);
0079 
0080         KisNodeList nodes = viewManager()->nodeManager()->selectedNodes();
0081         dlgOffsetImage->setCaption(i18ncp("@title:window", "Offset Layer", "Offset %1 Layers", nodes.size()));
0082 
0083         if (dlgOffsetImage->exec() == QDialog::Accepted) {
0084             QPoint offsetPoint = QPoint(dlgOffsetImage->offsetX(), dlgOffsetImage->offsetY());
0085             KUndo2MagicString actionName = kundo2_i18np("Offset Layer", "Offset %1 Layers", nodes.size());
0086             offsetImpl(actionName, nodes, offsetPoint);
0087         }
0088         delete dlgOffsetImage;
0089     }
0090     else
0091     {
0092         dbgKrita << "KisImage not available";
0093     }
0094 }
0095 
0096 void OffsetImage::offsetImpl(const KUndo2MagicString& actionName, KisNodeSP node, const QPoint& offsetPoint)
0097 {
0098     offsetImpl(actionName, KisNodeList{node}, offsetPoint);
0099 }
0100 void OffsetImage::offsetImpl(const KUndo2MagicString& actionName, KisNodeList nodes, const QPoint& offsetPoint)
0101 {
0102     KisImageSignalVector emitSignals;
0103 
0104     KisProcessingApplicator applicator(viewManager()->image(), nodes,
0105                                        KisProcessingApplicator::RECURSIVE,
0106                                        emitSignals, actionName);
0107 
0108     QRect rc = offsetWrapRect();
0109     KisProcessingVisitorSP visitor = new KisOffsetProcessingVisitor(offsetPoint, rc);
0110     applicator.applyVisitor(visitor, KisStrokeJobData::CONCURRENT);
0111     applicator.end();
0112 }
0113 
0114 
0115 
0116 QRect OffsetImage::offsetWrapRect()
0117 {
0118     QRect offsetWrapRect;
0119     if (viewManager()->selection())
0120     {
0121         offsetWrapRect = viewManager()->selection()->selectedExactRect();
0122     }
0123     else
0124     {
0125         KisImageSP image = viewManager()->image().toStrongRef();
0126         if (image) {
0127             offsetWrapRect = image->bounds();
0128         }
0129     }
0130     return offsetWrapRect;
0131 }
0132 
0133 
0134 
0135 #include "offsetimage.moc"