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 }