File indexing completed on 2024-05-26 04:34:49
0001 /* 0002 * SPDX-FileCopyrightText: 2013 Dmitry Kazakov <dimula73@gmail.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #ifndef __TRANSFORM_TRANSACTION_PROPERTIES_H 0008 #define __TRANSFORM_TRANSACTION_PROPERTIES_H 0009 0010 #include <QRectF> 0011 #include <QPointF> 0012 #include "kis_node.h" 0013 #include "kis_layer_utils.h" 0014 #include "kis_external_layer_iface.h" 0015 0016 class ToolTransformArgs; 0017 0018 class TransformTransactionProperties 0019 { 0020 public: 0021 TransformTransactionProperties() 0022 { 0023 } 0024 0025 TransformTransactionProperties(const QRectF &originalRect, 0026 ToolTransformArgs *currentConfig, 0027 KisNodeList rootNodes, 0028 const QList<KisNodeSP> &transformedNodes) 0029 : m_originalRect(originalRect), 0030 m_currentConfig(currentConfig), 0031 m_rootNodes(rootNodes), 0032 m_transformedNodes(transformedNodes), 0033 m_shouldAvoidPerspectiveTransform(false) 0034 { 0035 m_hasInvisibleNodes = false; 0036 Q_FOREACH (KisNodeSP node, transformedNodes) { 0037 if (KisExternalLayer *extLayer = dynamic_cast<KisExternalLayer*>(node.data())) { 0038 if (!extLayer->supportsPerspectiveTransform()) { 0039 m_shouldAvoidPerspectiveTransform = true; 0040 break; 0041 } 0042 } 0043 0044 m_hasInvisibleNodes |= !node->visible(false); 0045 } 0046 } 0047 0048 qreal originalHalfWidth() const { 0049 return m_originalRect.width() / 2.0; 0050 } 0051 0052 qreal originalHalfHeight() const { 0053 return m_originalRect.height() / 2.0; 0054 } 0055 0056 QRectF originalRect() const { 0057 return m_originalRect; 0058 } 0059 0060 QPointF originalCenterGeometric() const { 0061 return m_originalRect.center(); 0062 } 0063 0064 QPointF originalTopLeft() const { 0065 return m_originalRect.topLeft(); 0066 } 0067 0068 QPointF originalBottomLeft() const { 0069 return m_originalRect.bottomLeft(); 0070 } 0071 0072 QPointF originalBottomRight() const { 0073 return m_originalRect.bottomRight(); 0074 } 0075 0076 QPointF originalTopRight() const { 0077 return m_originalRect.topRight(); 0078 } 0079 0080 QPointF originalMiddleLeft() const { 0081 return QPointF(m_originalRect.left(), (m_originalRect.top() + m_originalRect.bottom()) / 2.0); 0082 } 0083 0084 QPointF originalMiddleRight() const { 0085 return QPointF(m_originalRect.right(), (m_originalRect.top() + m_originalRect.bottom()) / 2.0); 0086 } 0087 0088 QPointF originalMiddleTop() const { 0089 return QPointF((m_originalRect.left() + m_originalRect.right()) / 2.0, m_originalRect.top()); 0090 } 0091 0092 QPointF originalMiddleBottom() const { 0093 return QPointF((m_originalRect.left() + m_originalRect.right()) / 2.0, m_originalRect.bottom()); 0094 } 0095 0096 QPoint originalTopLeftAligned() const { 0097 return m_originalRect.toAlignedRect().topLeft(); 0098 } 0099 0100 QPoint originalBottomRightAligned() const { 0101 return m_originalRect.toAlignedRect().bottomRight(); 0102 } 0103 0104 ToolTransformArgs* currentConfig() const { 0105 return m_currentConfig; 0106 } 0107 0108 KisNodeList rootNodes() const { 0109 return m_rootNodes; 0110 } 0111 0112 KisNodeList transformedNodes() const { 0113 return m_transformedNodes; 0114 } 0115 0116 qreal basePreviewOpacity() const { 0117 // Todo: this doesn't work for multiple layers 0118 return 0.9 * qreal(m_rootNodes[0]->opacity()) / 255.0; 0119 } 0120 0121 bool shouldAvoidPerspectiveTransform() const { 0122 return m_shouldAvoidPerspectiveTransform; 0123 } 0124 0125 bool hasInvisibleNodes() const { 0126 return m_hasInvisibleNodes; 0127 } 0128 0129 void setCurrentConfigLocation(ToolTransformArgs *config) { 0130 m_currentConfig = config; 0131 } 0132 0133 private: 0134 /** 0135 * Information about the original selected rect 0136 * (before any transformations) 0137 */ 0138 QRectF m_originalRect; 0139 ToolTransformArgs *m_currentConfig {0}; 0140 KisNodeList m_rootNodes; 0141 KisNodeList m_transformedNodes; 0142 bool m_shouldAvoidPerspectiveTransform {false}; 0143 bool m_hasInvisibleNodes {false}; 0144 }; 0145 0146 #endif /* __TRANSFORM_TRANSACTION_PROPERTIES_H */