1 /*
2 * Copyright (C) 2018 Damir Porobic <damir.porobic@gmx.com>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License as published by
6 * the Free Software Foundation; either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18 */
19
20 #include "AnnotationItemResizer.h"
21
22 namespace kImageAnnotator {
23
AnnotationItemResizer(AbstractAnnotationItem * item,ZoomValueProvider * zoomValueProvider)24 AnnotationItemResizer::AnnotationItemResizer(AbstractAnnotationItem *item, ZoomValueProvider *zoomValueProvider) :
25 mAnnotationItem(item),
26 mZoomValueProvider(zoomValueProvider),
27 mCurrentHandle(-1)
28 {
29 mResizeHandles = ResizeHandlesFactory::createResizeHandles(item, zoomValueProvider->zoomValue());
30 connect(zoomValueProvider, &ZoomValueProvider::zoomValueChanged, this, &AnnotationItemResizer::applyZoomValue);
31 prepareGeometryChange();
32 }
33
~AnnotationItemResizer()34 AnnotationItemResizer::~AnnotationItemResizer()
35 {
36 mAnnotationItem = nullptr;
37 delete mResizeHandles;
38 }
39
boundingRect() const40 QRectF AnnotationItemResizer::boundingRect() const
41 {
42 auto size = mResizeHandles->handleSize() / 2;
43 return mAnnotationItem->boundingRect().normalized().adjusted(-size, -size, size, size);
44 }
45
grabHandle(const QPointF & pos)46 void AnnotationItemResizer::grabHandle(const QPointF &pos)
47 {
48 mCurrentHandle = mResizeHandles->indexOfHandleAt(pos);
49 if (mCurrentHandle != -1) {
50 mClickOffset = pos - mResizeHandles->handle(mCurrentHandle).anchor();
51 }
52 }
53
moveHandle(const QPointF & pos,bool isCtrlPressed)54 void AnnotationItemResizer::moveHandle(const QPointF &pos, bool isCtrlPressed)
55 {
56 if (mCurrentHandle != -1) {
57 emit newCommand(new ResizeCommand(mAnnotationItem, mCurrentHandle, pos - mClickOffset, isCtrlPressed));
58 }
59 }
60
releaseHandle()61 void AnnotationItemResizer::releaseHandle()
62 {
63 mCurrentHandle = -1;
64 }
65
isResizing() const66 bool AnnotationItemResizer::isResizing() const
67 {
68 return mCurrentHandle != -1;
69 }
70
refresh()71 void AnnotationItemResizer::refresh()
72 {
73 prepareGeometryChange();
74 mResizeHandles->update();
75 }
76
isItemVisible() const77 bool AnnotationItemResizer::isItemVisible() const
78 {
79 return mAnnotationItem != nullptr && mAnnotationItem->isVisible();
80 }
81
cursorForPos(const QPointF & pos)82 Qt::CursorShape AnnotationItemResizer::cursorForPos(const QPointF &pos)
83 {
84 return mResizeHandles->cursorForPos(pos);
85 }
86
cursorForCurrentHandle()87 Qt::CursorShape AnnotationItemResizer::cursorForCurrentHandle()
88 {
89 return mResizeHandles->cursorForHandle(mCurrentHandle);
90 }
91
paint(QPainter * painter,const QStyleOptionGraphicsItem *,QWidget *)92 void AnnotationItemResizer::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
93 {
94 painter->setPen(QPen(Qt::white, 1.0 / mZoomValueProvider->zoomValue()));
95 painter->setBrush(Qt::gray);
96 auto handles = mResizeHandles->handles();
97 for (auto &handle : handles) {
98 painter->drawRect(handle);
99 }
100 }
101
applyZoomValue(double value)102 void AnnotationItemResizer::applyZoomValue(double value)
103 {
104 mResizeHandles->applyZoomValue(value);
105 }
106
107 } // namespace kImageAnnotator
108