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