Krita Source Code Documentation
Loading...
Searching...
No Matches
KisInfinityManager Class Reference

#include <kis_infinity_manager.h>

+ Inheritance diagram for KisInfinityManager:

Public Slots

void imagePositionChanged ()
 
- Public Slots inherited from KisCanvasDecoration
virtual void setVisible (bool v)
 
void toggleVisibility ()
 

Public Member Functions

 KisInfinityManager (QPointer< KisView >view, KisCanvas2 *canvas)
 
- Public Member Functions inherited from KisCanvasDecoration
const QString & id () const
 
 KisCanvasDecoration (const QString &id, QPointer< KisView >parent)
 
virtual void notifyWindowMinimized (bool minimized)
 
void paint (QPainter &gc, const QRectF &updateRect, const KisCoordinatesConverter *converter, KisCanvas2 *canvas)
 
int priority () const
 
void setView (QPointer< KisView > imageView)
 
bool visible () const
 
 ~KisCanvasDecoration () override
 
- Public Member Functions inherited from KisShared
bool deref ()
 
bool ref ()
 
int refCount ()
 
QAtomicInt * sharedWeakReference ()
 

Protected Member Functions

void drawDecoration (QPainter &gc, const QRectF &updateArea, const KisCoordinatesConverter *converter, KisCanvas2 *canvas) override
 
bool eventFilter (QObject *obj, QEvent *event) override
 
- Protected Member Functions inherited from KisCanvasDecoration
int decorationThickness () const
 
void setPriority (int value)
 
QPointer< KisViewview () const
 
- Protected Member Functions inherited from KisShared
 KisShared ()
 
 ~KisShared ()
 

Private Types

enum  Side {
  Right = 0 , Bottom , Left , Top ,
  NSides
}
 

Private Member Functions

void addDecoration (const QRect &areaRect, const QPointF &handlePoint, qreal angle, Side side)
 

Private Attributes

QPointer< KisCanvas2m_canvas
 
bool m_cursorSwitched
 
QPainterPath m_decorationPath
 
bool m_filteringEnabled
 
QVector< QTransform > m_handleTransform
 
QCursor m_oldCursor
 
QVector< QRect > m_sideRects
 

Additional Inherited Members

- Static Public Member Functions inherited from KisCanvasDecoration
static bool comparePriority (KisCanvasDecorationSP decoration1, KisCanvasDecorationSP decoration2)
 

Detailed Description

Definition at line 22 of file kis_infinity_manager.h.

Member Enumeration Documentation

◆ Side

Enumerator
Right 
Bottom 
Left 
Top 
NSides 

Definition at line 37 of file kis_infinity_manager.h.

Constructor & Destructor Documentation

◆ KisInfinityManager()

KisInfinityManager::KisInfinityManager ( QPointer< KisView > view,
KisCanvas2 * canvas )

Definition at line 26 of file kis_infinity_manager.cpp.

28 m_filteringEnabled(false),
29 m_cursorSwitched(false),
31 m_canvas(canvas)
32{
35}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
void sigCanvasStateChanged()
QPointer< KisView > view() const
KisCanvasDecoration(const QString &id, QPointer< KisView >parent)
QPointer< KisCanvas2 > m_canvas
QVector< QRect > m_sideRects
static const QString INFINITY_DECORATION_ID

References connect(), imagePositionChanged(), and KisCanvas2::sigCanvasStateChanged().

Member Function Documentation

◆ addDecoration()

void KisInfinityManager::addDecoration ( const QRect & areaRect,
const QPointF & handlePoint,
qreal angle,
Side side )
inlineprivate

Definition at line 37 of file kis_infinity_manager.cpp.

38{
39 QTransform t;
40 t.rotate(angle);
41 t = t * QTransform::fromTranslate(handlePoint.x(), handlePoint.y());
43
44 m_decorationPath.addRect(areaRect);
45 m_sideRects[side] = areaRect;
46}
QVector< QTransform > m_handleTransform

References m_decorationPath, m_handleTransform, and m_sideRects.

◆ drawDecoration()

void KisInfinityManager::drawDecoration ( QPainter & gc,
const QRectF & updateArea,
const KisCoordinatesConverter * converter,
KisCanvas2 * canvas )
overrideprotectedvirtual

Implements KisCanvasDecoration.

Definition at line 124 of file kis_infinity_manager.cpp.

125{
126 Q_UNUSED(updateArea);
127 Q_UNUSED(converter);
128 Q_UNUSED(canvas);
129
130 if (!m_filteringEnabled) return;
131
132 gc.save();
133 gc.setTransform(QTransform(), false);
134
135 KisConfig cfg(true);
136 QColor color = cfg.canvasBorderColor();
137 gc.fillPath(m_decorationPath, color.darker(115));
138
139 QPainterPath p = KisAlgebra2D::smallArrow();
140
141 Q_FOREACH (const QTransform &t, m_handleTransform) {
142 gc.fillPath(t.map(p), color);
143 }
144
145 gc.restore();
146}
const Params2D p
QPainterPath smallArrow()

References KisConfig::canvasBorderColor(), m_decorationPath, m_filteringEnabled, m_handleTransform, p, and KisAlgebra2D::smallArrow().

◆ eventFilter()

bool KisInfinityManager::eventFilter ( QObject * obj,
QEvent * event )
overrideprotected

We connect our event filter to the global InputManager which is shared among all the canvases. Ideally we should disconnect our event filter whin this canvas is not active, but for now we can just check the destination of the event, if it is correct.

Definition at line 203 of file kis_infinity_manager.cpp.

204{
211 if (m_canvas == NULL || obj != m_canvas->canvasWidget()) return false;
212
214
215 bool retval = false;
216
217 switch (event->type()) {
218 case QEvent::Enter:
219 case QEvent::MouseMove:
220 case QEvent::TabletMove: {
221 QPoint pos = getPointFromEvent(event);
222
223 if (m_decorationPath.contains(pos)) {
224 if (!m_cursorSwitched) {
225 m_oldCursor = m_canvas->canvasWidget()->cursor();
226 m_cursorSwitched = true;
227 }
228 m_canvas->canvasWidget()->setCursor(Qt::PointingHandCursor);
229 retval = true;
230 } else if (m_cursorSwitched) {
231 m_canvas->canvasWidget()->setCursor(m_oldCursor);
232 m_cursorSwitched = false;
233 }
234 break;
235 }
236 case QEvent::Leave: {
237 if (m_cursorSwitched) {
238 m_canvas->canvasWidget()->setCursor(m_oldCursor);
239 m_cursorSwitched = false;
240 }
241 break;
242 }
243 case QEvent::MouseButtonPress:
244 case QEvent::TabletPress: {
245 Qt::MouseButton button = getButtonFromEvent(event);
246 retval = button == Qt::LeftButton && m_cursorSwitched;
247
248 if (button == Qt::RightButton) {
250 }
251
252 break;
253 }
254 case QEvent::MouseButtonRelease:
255 case QEvent::TabletRelease: {
256 Qt::MouseButton button = getButtonFromEvent(event);
257 retval = button == Qt::LeftButton && m_cursorSwitched;
258
259 if (retval) {
260 QPoint pos = getPointFromEvent(event);
261
262 const KisCoordinatesConverter *converter = m_canvas->coordinatesConverter();
263 QRect widgetRect = converter->widgetToImage(m_canvas->canvasWidget()->rect()).toAlignedRect();
264 KisImageWSP image = view()->image();
265
266 QRect cropRect = image->bounds();
267
268 const int hLimit = cropRect.width();
269 const int vLimit = cropRect.height();
270
271 if (m_sideRects[Right].contains(pos)) {
272 cropRect.setRight(expandRight(cropRect.right(), widgetRect.right(), hLimit));
273 }
274 if (m_sideRects[Bottom].contains(pos)) {
275 cropRect.setBottom(expandRight(cropRect.bottom(), widgetRect.bottom(), vLimit));
276 }
277 if (m_sideRects[Left].contains(pos)) {
278 cropRect.setLeft(expandLeft(cropRect.left(), widgetRect.left(), hLimit));
279 }
280 if (m_sideRects[Top].contains(pos)) {
281 cropRect.setTop(expandLeft(cropRect.top(), widgetRect.top(), vLimit));
282 }
283
284 image->resizeImage(cropRect);
285
286 // since resizing the image can cause the cursor to end up on the canvas without a move event,
287 // it can get stuck in an overridden state until it is changed by another event,
288 // and we don't want that.
289 if (m_cursorSwitched) {
290 m_canvas->canvasWidget()->setCursor(m_oldCursor);
291 m_cursorSwitched = false;
292 }
293 }
294 break;
295 }
296 default:
297 break;
298 }
299
300 return !retval ? KisCanvasDecoration::eventFilter(obj, event) : true;
301}
_Private::Traits< T >::Result widgetToImage(const T &obj) const
void resizeImage(const QRect &newRect)
start asynchronous operation on resizing the image
Definition kis_image.cc:865
QRect bounds() const override
#define KIS_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:97
int expandLeft(int x0, int x1, int maxExpand)
QPoint getPointFromEvent(QEvent *event)
int expandRight(int x0, int x1, int maxExpand)
Qt::MouseButton getButtonFromEvent(QEvent *event)
QString button(const QWheelEvent &ev)

References Bottom, KisImage::bounds(), button(), expandLeft(), expandRight(), getButtonFromEvent(), getPointFromEvent(), imagePositionChanged(), KIS_ASSERT_RECOVER_NOOP, Left, m_canvas, m_cursorSwitched, m_decorationPath, m_filteringEnabled, m_oldCursor, m_sideRects, KisImage::resizeImage(), Right, Top, KisCanvasDecoration::view(), and KisCoordinatesConverter::widgetToImage().

◆ imagePositionChanged

void KisInfinityManager::imagePositionChanged ( )
slot

Definition at line 48 of file kis_infinity_manager.cpp.

49{
50 const QRect imageRect = m_canvas->coordinatesConverter()->imageRectInWidgetPixels().toAlignedRect();
51 const QRect widgetRect = m_canvas->canvasWidget()->rect();
52
53 KisConfig cfg(true);
54 qreal vastScrolling = cfg.vastScrolling();
55
56 int xReserve = vastScrolling * widgetRect.width();
57 int yReserve = vastScrolling * widgetRect.height();
58
59 int xThreshold = imageRect.width() - 0.4 * xReserve;
60 int yThreshold = imageRect.height() - 0.4 * yReserve;
61
62 const int stripeWidth = 48;
63
64 int xCut = widgetRect.width() - stripeWidth;
65 int yCut = widgetRect.height() - stripeWidth;
66
67 m_decorationPath = QPainterPath();
68 m_decorationPath.setFillRule(Qt::WindingFill);
69
70 m_handleTransform.clear();
71
72 m_sideRects.clear();
73 m_sideRects.resize(NSides);
74
75 bool visible = false;
76
77 if (imageRect.x() <= -xThreshold) {
78 QRect areaRect(widgetRect.adjusted(xCut, 0, 0, 0));
79 QPointF pt = areaRect.center() + QPointF(-0.1 * stripeWidth, 0);
80 addDecoration(areaRect, pt, 0, Right);
81 visible = true;
82 }
83
84 if (imageRect.y() <= -yThreshold) {
85 QRect areaRect(widgetRect.adjusted(0, yCut, 0, 0));
86 QPointF pt = areaRect.center() + QPointF(0, -0.1 * stripeWidth);
87 addDecoration(areaRect, pt, 90, Bottom);
88 visible = true;
89 }
90
91 if (imageRect.right() > widgetRect.width() + xThreshold) {
92 QRect areaRect(widgetRect.adjusted(0, 0, -xCut, 0));
93 QPointF pt = areaRect.center() + QPointF(0.1 * stripeWidth, 0);
94 addDecoration(areaRect, pt, 180, Left);
95 visible = true;
96 }
97
98 if (imageRect.bottom() > widgetRect.height() + yThreshold) {
99 QRect areaRect(widgetRect.adjusted(0, 0, 0, -yCut));
100 QPointF pt = areaRect.center() + QPointF(0, 0.1 * stripeWidth);
101 addDecoration(areaRect, pt, 270, Top);
102 visible = true;
103 }
104
105 if (!m_filteringEnabled && visible && this->visible()) {
106 KisInputManager *inputManager = m_canvas->globalInputManager();
107 if (inputManager) {
108 inputManager->attachPriorityEventFilter(this);
109 }
110
111 m_filteringEnabled = true;
112 }
113
114 if (m_filteringEnabled && (!visible || !this->visible())) {
115 KisInputManager *inputManager = m_canvas->globalInputManager();
116 if (inputManager) {
117 inputManager->detachPriorityEventFilter(this);
118 }
119
120 m_filteringEnabled = false;
121 }
122}
void addDecoration(const QRect &areaRect, const QPointF &handlePoint, qreal angle, Side side)
Central object to manage canvas input.
void detachPriorityEventFilter(QObject *filter)
detachPriorityEventFilter
void attachPriorityEventFilter(QObject *filter, int priority=0)
attachPriorityEventFilter

References addDecoration(), KisInputManager::attachPriorityEventFilter(), Bottom, KisInputManager::detachPriorityEventFilter(), Left, m_canvas, m_decorationPath, m_filteringEnabled, m_handleTransform, m_sideRects, NSides, Right, Top, KisConfig::vastScrolling(), and KisCanvasDecoration::visible().

Member Data Documentation

◆ m_canvas

QPointer<KisCanvas2> KisInfinityManager::m_canvas
private

Definition at line 57 of file kis_infinity_manager.h.

◆ m_cursorSwitched

bool KisInfinityManager::m_cursorSwitched
private

Definition at line 51 of file kis_infinity_manager.h.

◆ m_decorationPath

QPainterPath KisInfinityManager::m_decorationPath
private

Definition at line 48 of file kis_infinity_manager.h.

◆ m_filteringEnabled

bool KisInfinityManager::m_filteringEnabled
private

Definition at line 50 of file kis_infinity_manager.h.

◆ m_handleTransform

QVector<QTransform> KisInfinityManager::m_handleTransform
private

Definition at line 53 of file kis_infinity_manager.h.

◆ m_oldCursor

QCursor KisInfinityManager::m_oldCursor
private

Definition at line 52 of file kis_infinity_manager.h.

◆ m_sideRects

QVector<QRect> KisInfinityManager::m_sideRects
private

Definition at line 55 of file kis_infinity_manager.h.


The documentation for this class was generated from the following files: