File indexing completed on 2024-05-12 16:01:24
0001 /* 0002 * 0003 * SPDX-FileCopyrightText: 2009 Edward Apap <schumifer@hotmail.com> 0004 * 0005 * SPDX-License-Identifier: GPL-2.0-or-later 0006 */ 0007 0008 #include "kcanvaspreview.h" 0009 0010 #include <QMouseEvent> 0011 #include <QPainter> 0012 #include <QCursor> 0013 0014 KCanvasPreview::KCanvasPreview(QWidget * parent) : QWidget(parent), m_dragging(false) 0015 { 0016 setMouseTracking(true); 0017 } 0018 0019 KCanvasPreview::~KCanvasPreview() 0020 { 0021 } 0022 0023 void KCanvasPreview::paintEvent(QPaintEvent *) 0024 { 0025 QPainter p(this); 0026 0027 double scale = scalingFactor(); 0028 0029 m_xCanvasOffset = (width() - scale * m_width) / 2.0; 0030 m_yCanvasOffset = (height() - scale * m_height) / 2.0; 0031 0032 p.fillRect(m_xCanvasOffset, m_yCanvasOffset, m_width * scale, m_height * scale, QBrush(Qt::white)); 0033 p.setPen(QPen(Qt::red)); 0034 p.drawRect(m_xCanvasOffset + m_xOffset * scale, m_yCanvasOffset + m_yOffset * scale, m_imageWidth * scale, m_imageHeight * scale); 0035 } 0036 0037 void KCanvasPreview::mousePressEvent(QMouseEvent *event) 0038 { 0039 if (isInRegion(event->pos())) { 0040 m_dragging = true; 0041 m_prevDragPoint = event->pos(); 0042 } 0043 } 0044 0045 void KCanvasPreview::mouseReleaseEvent(QMouseEvent *) 0046 { 0047 m_dragging = false; 0048 } 0049 0050 void KCanvasPreview::mouseMoveEvent(QMouseEvent *event) 0051 { 0052 if (m_dragging) { 0053 // calculate new image offset 0054 double scale = scalingFactor(); 0055 int newXOffset , newYOffset; 0056 if(!xOffsetLocked()) { 0057 newXOffset = ((event->pos().x() - m_prevDragPoint.x()) / scale) + m_xOffset; 0058 } 0059 if(!yOffsetLocked()) { 0060 newYOffset = ((event->pos().y() - m_prevDragPoint.y()) / scale) + m_yOffset; 0061 } 0062 m_prevDragPoint = event->pos(); 0063 if(!xOffsetLocked()) { 0064 emit sigModifiedXOffset(newXOffset); 0065 } 0066 if(!yOffsetLocked()) { 0067 emit sigModifiedYOffset(newYOffset); 0068 } 0069 } else { 0070 QCursor cursor; 0071 0072 if (isInRegion(event->pos())) { 0073 cursor.setShape(Qt::SizeAllCursor); 0074 } else { 0075 cursor.setShape(Qt::ArrowCursor); 0076 } 0077 0078 setCursor(cursor); 0079 } 0080 } 0081 0082 bool KCanvasPreview::isInRegion(QPoint point) 0083 { 0084 double scale = scalingFactor(); 0085 0086 if ((point.x() >= (m_xOffset * scale) + m_xCanvasOffset) && (point.x() < ((m_xOffset + m_imageWidth) * scale) + m_xCanvasOffset) && 0087 (point.y() >= (m_yOffset * scale) + m_yCanvasOffset) && (point.y() < ((m_yOffset + m_imageHeight) * scale) + m_yCanvasOffset)) { 0088 return true; 0089 } 0090 0091 return false; 0092 } 0093 0094 double KCanvasPreview::scalingFactor() 0095 { 0096 // take into account offset frame size to show when the canvas has been shrunk 0097 const int maxHeight = (m_height > m_imageHeight) ? m_height : m_imageHeight; 0098 const int maxWidth = (m_width > m_imageWidth) ? m_width : m_imageWidth; 0099 0100 const double xScale = (double)(height() - 1) / maxHeight; 0101 const double yScale = (double)(width() - 1) / maxWidth; 0102 0103 return (xScale < yScale) ? xScale : yScale; 0104 } 0105 0106 void KCanvasPreview::setImageSize(qint32 w, qint32 h) 0107 { 0108 m_imageWidth = w; 0109 m_imageHeight = h; 0110 0111 update(); 0112 } 0113 0114 void KCanvasPreview::setCanvasSize(qint32 w, qint32 h) 0115 { 0116 m_width = w; 0117 m_height = h; 0118 0119 update(); 0120 } 0121 0122 void KCanvasPreview::setImageOffset(qint32 x, qint32 y) 0123 { 0124 m_xOffset = x; 0125 m_yOffset = y; 0126 0127 update(); 0128 } 0129 bool KCanvasPreview::xOffsetLocked() const 0130 { 0131 return m_xOffsetLocked; 0132 } 0133 void KCanvasPreview::setxOffsetLock(bool value) 0134 { 0135 m_xOffsetLocked = value; 0136 } 0137 bool KCanvasPreview::yOffsetLocked() const 0138 { 0139 return m_yOffsetLocked; 0140 } 0141 void KCanvasPreview::setyOffsetLock(bool value) 0142 { 0143 m_yOffsetLocked = value; 0144 }