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"