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
 
virtual void setCanvasWidget (KisCanvasWidgetBase *canvas)
 
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 27 of file kis_infinity_manager.cpp.

29 m_filteringEnabled(false),
30 m_cursorSwitched(false),
32 m_canvas(canvas)
33{
34 connect(canvas, &KisCanvas2::sigCanvasStateChanged,
36}
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 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 38 of file kis_infinity_manager.cpp.

39{
40 QTransform t;
41 t.rotate(angle);
42 t = t * QTransform::fromTranslate(handlePoint.x(), handlePoint.y());
44
45 m_decorationPath.addRect(areaRect);
46 m_sideRects[side] = areaRect;
47}
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 125 of file kis_infinity_manager.cpp.

126{
127 Q_UNUSED(updateArea);
128 Q_UNUSED(converter);
129 Q_UNUSED(canvas);
130
131 if (!m_filteringEnabled) return;
132
133 gc.save();
134 gc.setTransform(QTransform(), false);
135
136 KisConfig cfg(true);
137 QColor color = cfg.canvasBorderColor();
138 KoColor c;
139 c.fromQColor(color.darker(115));
140 QColor darkerColor = canvas->displayRendererInterface()->convertColorToDisplayColorSpace(c);
141 gc.fillPath(m_decorationPath, darkerColor);
142 c.fromQColor(color);
144
145 QPainterPath p = KisAlgebra2D::smallArrow();
146
147 Q_FOREACH (const QTransform &t, m_handleTransform) {
148 gc.fillPath(t.map(p), color);
149 }
150
151 gc.restore();
152}
const Params2D p
KoColorDisplayRendererInterface * displayRendererInterface() const override
displayRendererInterface The display renderer interface has a number of color conversion functions wh...
virtual QColor convertColorToDisplayColorSpace(const KoColor color) const =0
convertColorToDisplayColorSpace
void fromQColor(const QColor &c)
Convenient function for converting from a QColor.
Definition KoColor.cpp:213
QPainterPath smallArrow()

References KisConfig::canvasBorderColor(), KoColorDisplayRendererInterface::convertColorToDisplayColorSpace(), KisCanvas2::displayRendererInterface(), KoColor::fromQColor(), 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 209 of file kis_infinity_manager.cpp.

210{
217 if (m_canvas == NULL || obj != m_canvas->canvasWidget()) return false;
218
220
221 bool retval = false;
222
223 switch (event->type()) {
224 case QEvent::Enter:
225 case QEvent::MouseMove:
226 case QEvent::TabletMove: {
227 QPoint pos = getPointFromEvent(event);
228
229 if (m_decorationPath.contains(pos)) {
230 if (!m_cursorSwitched) {
231 m_oldCursor = m_canvas->canvasWidget()->cursor();
232 m_cursorSwitched = true;
233 }
234 m_canvas->canvasWidget()->setCursor(Qt::PointingHandCursor);
235 retval = true;
236 } else if (m_cursorSwitched) {
237 m_canvas->canvasWidget()->setCursor(m_oldCursor);
238 m_cursorSwitched = false;
239 }
240 break;
241 }
242 case QEvent::Leave: {
243 if (m_cursorSwitched) {
244 m_canvas->canvasWidget()->setCursor(m_oldCursor);
245 m_cursorSwitched = false;
246 }
247 break;
248 }
249 case QEvent::MouseButtonPress:
250 case QEvent::TabletPress: {
251 Qt::MouseButton button = getButtonFromEvent(event);
252 retval = button == Qt::LeftButton && m_cursorSwitched;
253
254 if (button == Qt::RightButton) {
256 }
257
258 break;
259 }
260 case QEvent::MouseButtonRelease:
261 case QEvent::TabletRelease: {
262 Qt::MouseButton button = getButtonFromEvent(event);
263 retval = button == Qt::LeftButton && m_cursorSwitched;
264
265 if (retval) {
266 QPoint pos = getPointFromEvent(event);
267
268 const KisCoordinatesConverter *converter = m_canvas->coordinatesConverter();
269 QRect widgetRect = converter->widgetToImage(m_canvas->canvasWidget()->rect()).toAlignedRect();
270 KisImageWSP image = view()->image();
271
272 QRect cropRect = image->bounds();
273
274 const int hLimit = cropRect.width();
275 const int vLimit = cropRect.height();
276
277 if (m_sideRects[Right].contains(pos)) {
278 cropRect.setRight(expandRight(cropRect.right(), widgetRect.right(), hLimit));
279 }
280 if (m_sideRects[Bottom].contains(pos)) {
281 cropRect.setBottom(expandRight(cropRect.bottom(), widgetRect.bottom(), vLimit));
282 }
283 if (m_sideRects[Left].contains(pos)) {
284 cropRect.setLeft(expandLeft(cropRect.left(), widgetRect.left(), hLimit));
285 }
286 if (m_sideRects[Top].contains(pos)) {
287 cropRect.setTop(expandLeft(cropRect.top(), widgetRect.top(), vLimit));
288 }
289
290 image->resizeImage(cropRect);
291
292 // since resizing the image can cause the cursor to end up on the canvas without a move event,
293 // it can get stuck in an overridden state until it is changed by another event,
294 // and we don't want that.
295 if (m_cursorSwitched) {
296 m_canvas->canvasWidget()->setCursor(m_oldCursor);
297 m_cursorSwitched = false;
298 }
299 }
300 break;
301 }
302 default:
303 break;
304 }
305
306 return !retval ? KisCanvasDecoration::eventFilter(obj, event) : true;
307}
_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:866
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 49 of file kis_infinity_manager.cpp.

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