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

#include <kis_selection_decoration.h>

+ Inheritance diagram for KisSelectionDecoration:

Public Types

enum  Mode { Ants , Mask }
 

Public Slots

void antsAttackEvent ()
 
void selectionChanged ()
 
- Public Slots inherited from KisCanvasDecoration
void toggleVisibility ()
 

Public Member Functions

 KisSelectionDecoration (QPointer< KisView > view)
 
Mode mode () const
 
void notifyWindowMinimized (bool minimized) override
 
bool selectionVisible ()
 
void setCanvasWidget (KisCanvasWidgetBase *canvas) override
 
void setMode (Mode mode)
 
void setVisible (bool v) override
 
void toggleSelectionVisibility ()
 
 ~KisSelectionDecoration () override
 
- Public Member Functions inherited from KisCanvasDecoration
const QString & id () const
 
 KisCanvasDecoration (const QString &id, QPointer< KisView >parent)
 
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 &updateRect, const KisCoordinatesConverter *converter, KisCanvas2 *canvas) 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 Slots

void initializePens ()
 
void slotCanvasResourcesChanged (int key, const QVariant &v)
 
void slotConfigChanged ()
 
void slotStartUpdateSelection ()
 

Private Member Functions

bool selectionIsActive ()
 

Private Attributes

bool m_antialiasSelectionOutline
 
QPen m_antsPen
 
QTimer * m_antsTimer
 
QColor m_maskColor
 
Mode m_mode
 
int m_offset
 
qreal m_opacity
 
QPainterPath m_outlinePath
 
QPen m_outlinePen
 
KisSelectionActionsPanelm_selectionActionsPanel
 
bool m_selectionVisibility
 
KisSignalCompressor m_signalCompressor
 
QImage m_thumbnailImage
 
QTransform m_thumbnailImageTransform
 

Additional Inherited Members

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

Detailed Description

Definition at line 23 of file kis_selection_decoration.h.

Member Enumeration Documentation

◆ Mode

Constructor & Destructor Documentation

◆ KisSelectionDecoration()

KisSelectionDecoration::KisSelectionDecoration ( QPointer< KisView > view)

Definition at line 47 of file kis_selection_decoration.cc.

48 : KisCanvasDecoration("selection", _view),
50 m_offset(0),
52{
54 connect(this->view()->canvasBase()->resourceManager(), SIGNAL(canvasResourceChanged(int, const QVariant&)), this, SLOT(slotCanvasResourcesChanged(int, const QVariant&)));
55
56 connect(KisConfigNotifier::instance(), SIGNAL(configChanged()), SLOT(slotConfigChanged()));
57 connect(KisImageConfigNotifier::instance(), SIGNAL(configChanged()), SLOT(slotConfigChanged()));
58
59 m_antsTimer = new QTimer(this);
60 m_antsTimer->setInterval(150);
61 m_antsTimer->setSingleShot(false);
62 connect(m_antsTimer, SIGNAL(timeout()), SLOT(antsAttackEvent()));
63
64 connect(&m_signalCompressor, SIGNAL(timeout()), SLOT(slotStartUpdateSelection()));
65
66 // selections should be at the top of the stack
67 setPriority(100);
68
69 m_selectionActionsPanel = new KisSelectionActionsPanel(this->view()->viewManager());
70
72}
QPointer< KisView > view() const
KisCanvasDecoration(const QString &id, QPointer< KisView >parent)
static KisConfigNotifier * instance()
static KisImageConfigNotifier * instance()
void slotCanvasResourcesChanged(int key, const QVariant &v)
KisSignalCompressor m_signalCompressor
KisSelectionActionsPanel * m_selectionActionsPanel

References antsAttackEvent(), initializePens(), KisConfigNotifier::instance(), KisImageConfigNotifier::instance(), m_antsTimer, m_selectionActionsPanel, m_signalCompressor, KisCanvasDecoration::setPriority(), slotCanvasResourcesChanged(), slotConfigChanged(), slotStartUpdateSelection(), and KisCanvasDecoration::view().

◆ ~KisSelectionDecoration()

KisSelectionDecoration::~KisSelectionDecoration ( )
override

Definition at line 74 of file kis_selection_decoration.cc.

75{
77}

References m_selectionActionsPanel.

Member Function Documentation

◆ antsAttackEvent

void KisSelectionDecoration::antsAttackEvent ( )
slot

Definition at line 191 of file kis_selection_decoration.cc.

192{
193 KisSelectionSP selection = view()->selection();
194 if (!selection) return;
195
196 if (selectionIsActive()) {
198 m_antsPen.setDashOffset(m_offset);
199 view()->canvasBase()->updateCanvas();
200 }
201}
static const unsigned int ANT_ADVANCE_WIDTH

References ANT_ADVANCE_WIDTH, m_antsPen, m_offset, selectionIsActive(), and KisCanvasDecoration::view().

◆ drawDecoration()

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

Implements KisCanvasDecoration.

Definition at line 211 of file kis_selection_decoration.cc.

212{
213 Q_UNUSED(updateRect);
214 Q_UNUSED(canvas);
215
216 // render Selection Action Bar first, so that it doesn't blink when making a new selection
217
218 if ((m_mode == Ants && m_outlinePath.isEmpty()) || (m_mode == Mask && m_thumbnailImage.isNull())
220 //The SAP needs to be drawn on top of the decoration, but to avoid the panel flashing when making a new selection, we also need to call draw here
222
223 return;
224 }
225
227 return;
228 }
229
230 QTransform transform = converter->imageToWidgetTransform();
231
232 gc.save();
233 gc.setTransform(transform, false);
234
235 if (m_mode == Mask) {
236 gc.setRenderHints(QPainter::SmoothPixmapTransform |
237 QPainter::Antialiasing, false);
238
239 gc.setTransform(m_thumbnailImageTransform, true);
240 gc.drawImage(QPoint(), m_thumbnailImage);
241
242 QRect r1 = m_thumbnailImageTransform.inverted().mapRect(view()->image()->bounds());
243 QRect r2 = m_thumbnailImage.rect();
244
245 QPainterPath p1;
246 p1.addRect(r1);
247
248 QPainterPath p2;
249 p2.addRect(r2);
250
251 KoColor c;
254 gc.setPen(Qt::NoPen);
255 gc.drawPath(p1 - p2);
256
257 } else /* if (m_mode == Ants) */ {
258
259 KoColor c;
260 c.fromQColor(Qt::white);
262 c.fromQColor(Qt::black);
264
265 gc.setRenderHints(QPainter::Antialiasing | QPainter::Antialiasing, m_antialiasSelectionOutline);
266
267 gc.setOpacity(m_opacity);
268
269 // render selection outline in white
270 gc.setPen(m_outlinePen);
271 gc.drawPath(m_outlinePath);
272
273 // render marching ants in black (above the white outline)
274 gc.setPen(m_antsPen);
275 gc.drawPath(m_outlinePath);
276 }
277
278 gc.restore();
280}
QPointF r2
QPointF r1
QPointF p2
QPointF p1
KoColorDisplayRendererInterface * displayRendererInterface() const override
displayRendererInterface The display renderer interface has a number of color conversion functions wh...
KisDisplayColorConverter displayColorConverter
QColor convertColorToDisplayColorSpace(const KoColor color, bool applyOcio=false) const
convertColorToDisplayColorSpace This applies displayfiltering to the given KoColor,...
void draw(QPainter &painter, const KoColorDisplayRendererInterface *displayRendererInterface)
void fromQColor(const QColor &c)
Convenient function for converting from a QColor.
Definition KoColor.cpp:213
#define bounds(x, a, b)

References Ants, bounds, KisDisplayColorConverter::convertColorToDisplayColorSpace(), KisCanvas2::displayColorConverter, KisCanvas2::displayRendererInterface(), KisSelectionActionsPanel::draw(), KoColor::fromQColor(), KisCoordinatesConverter::imageToWidgetTransform(), m_antialiasSelectionOutline, m_antsPen, m_maskColor, m_mode, m_opacity, m_outlinePath, m_outlinePen, m_selectionActionsPanel, m_selectionVisibility, m_thumbnailImage, m_thumbnailImageTransform, Mask, p1, p2, r1, r2, and KisCanvasDecoration::view().

◆ initializePens

void KisSelectionDecoration::initializePens ( )
privateslot

Definition at line 98 of file kis_selection_decoration.cc.

99{
100 QColor white(Qt::white);
101 QColor black(Qt::black);
102
105 black, white);
106
107 m_antsPen.setWidth(decorationThickness());
109}
static const unsigned int ANT_LENGTH
static const unsigned int ANT_SPACE
void initAntsPen(QPen *antsPen, QPen *outlinePen, int antLength, int antSpace, QColor black, QColor white)

References ANT_LENGTH, ANT_SPACE, KisCanvasDecoration::decorationThickness(), KisPaintingTweaks::initAntsPen(), m_antsPen, and m_outlinePen.

◆ mode()

KisSelectionDecoration::Mode KisSelectionDecoration::mode ( ) const

Definition at line 79 of file kis_selection_decoration.cc.

80{
81 return m_mode;
82}

References m_mode.

◆ notifyWindowMinimized()

void KisSelectionDecoration::notifyWindowMinimized ( bool minimized)
overridevirtual

Reimplemented from KisCanvasDecoration.

Definition at line 295 of file kis_selection_decoration.cc.

296{
297 if(minimized) {
298 m_antsTimer->stop();
299 } else {
301 }
302}

References m_antsTimer, and selectionChanged().

◆ selectionChanged

void KisSelectionDecoration::selectionChanged ( )
slot

Definition at line 111 of file kis_selection_decoration.cc.

112{
113 KisSelectionMaskSP mask = qobject_cast<KisSelectionMask*>(view()->currentNode().data());
114 if (!mask || !mask->active() || !mask->visible(true)) {
115 mask = 0;
116 }
117
118 if (!view()->isCurrent() ||
119 view()->viewManager()->mainWindow() == KisPart::instance()->currentMainwindow()) {
120
121 view()->image()->setOverlaySelectionMask(mask);
122 }
123
124 KisSelectionSP selection = view()->selection();
125
126 if (!mask && selectionIsActive()) {
127 if ((m_mode == Ants && selection->outlineCacheValid()) ||
128 (m_mode == Mask && selection->thumbnailImageValid())) {
129
131
132 if (m_mode == Ants) {
133 m_outlinePath = selection->outlineCache();
134 m_antsTimer->start();
135 } else {
136 m_thumbnailImage = selection->thumbnailImage();
138 m_antsTimer->stop();
139 }
140
141 if (view() && view()->canvasBase()) {
142 view()->canvasBase()->updateCanvas();
143 }
144
145
147 } else {
149 }
150 } else {
152 m_outlinePath = QPainterPath();
153 m_thumbnailImage = QImage();
154 m_thumbnailImageTransform = QTransform();
155 view()->canvasBase()->updateCanvas();
156 m_antsTimer->stop();
157 }
158
159 if (!selection && !selectionIsActive()) {
161 }
162}
static KisPart * instance()
Definition KisPart.cpp:131
virtual bool visible(bool recursive=false) const
bool thumbnailImageValid() const
QTransform thumbnailImageTransform() const
bool outlineCacheValid() const
QImage thumbnailImage() const
QPainterPath outlineCache() const

References KisSelectionMask::active(), Ants, KisPart::instance(), m_antsTimer, m_mode, m_outlinePath, m_selectionActionsPanel, m_signalCompressor, m_thumbnailImage, m_thumbnailImageTransform, Mask, KisSelection::outlineCache(), KisSelection::outlineCacheValid(), selectionIsActive(), KisSelectionActionsPanel::setVisible(), KisSignalCompressor::start(), KisSignalCompressor::stop(), KisSelection::thumbnailImage(), KisSelection::thumbnailImageTransform(), KisSelection::thumbnailImageValid(), KisCanvasDecoration::view(), and KisBaseNode::visible().

◆ selectionIsActive()

bool KisSelectionDecoration::selectionIsActive ( )
private

Definition at line 90 of file kis_selection_decoration.cc.

91{
92 KisSelectionSP selection = view()->selection();
93 return visible() && selection &&
94 (selection->hasNonEmptyPixelSelection() || selection->hasNonEmptyShapeSelection()) &&
95 selection->isVisible();
96}
bool hasNonEmptyPixelSelection() const
bool hasNonEmptyShapeSelection() const

References KisSelection::hasNonEmptyPixelSelection(), KisSelection::hasNonEmptyShapeSelection(), KisSelection::isVisible, KisCanvasDecoration::view(), and KisCanvasDecoration::visible().

◆ selectionVisible()

bool KisSelectionDecoration::selectionVisible ( )

Definition at line 207 of file kis_selection_decoration.cc.

207 {
209}

References m_selectionVisibility.

◆ setCanvasWidget()

void KisSelectionDecoration::setCanvasWidget ( KisCanvasWidgetBase * canvas)
overridevirtual

Reimplemented from KisCanvasDecoration.

Definition at line 282 of file kis_selection_decoration.cc.

283{
285}
void canvasWidgetChanged(KisCanvasWidgetBase *canvas)

References KisSelectionActionsPanel::canvasWidgetChanged(), and m_selectionActionsPanel.

◆ setMode()

void KisSelectionDecoration::setMode ( Mode mode)

Definition at line 84 of file kis_selection_decoration.cc.

References m_mode, mode(), and selectionChanged().

◆ setVisible()

void KisSelectionDecoration::setVisible ( bool v)
overridevirtual

◆ slotCanvasResourcesChanged

void KisSelectionDecoration::slotCanvasResourcesChanged ( int key,
const QVariant & v )
privateslot

Definition at line 183 of file kis_selection_decoration.cc.

184{
185 Q_UNUSED(v);
188 }
189}
@ DecorationThickness
Integer, the thickness of single px decorations, will be adjusted by HiDPI settings....

References KoCanvasResource::DecorationThickness, initializePens(), and v.

◆ slotConfigChanged

void KisSelectionDecoration::slotConfigChanged ( )
privateslot

Definition at line 172 of file kis_selection_decoration.cc.

173{
174 KisImageConfig imageConfig(true);
175 KisConfig cfg(true);
176
177 m_opacity = imageConfig.selectionOutlineOpacity();
178 m_maskColor = imageConfig.selectionOverlayMaskColor();
179 m_antialiasSelectionOutline = cfg.antialiasSelectionOutline();
180 m_selectionActionsPanel->setEnabled(cfg.selectionActionBar());
181}

References KisConfig::antialiasSelectionOutline(), m_antialiasSelectionOutline, m_maskColor, m_opacity, m_selectionActionsPanel, KisConfig::selectionActionBar(), KisImageConfig::selectionOutlineOpacity(), KisImageConfig::selectionOverlayMaskColor(), and KisSelectionActionsPanel::setEnabled().

◆ slotStartUpdateSelection

void KisSelectionDecoration::slotStartUpdateSelection ( )
privateslot

Definition at line 164 of file kis_selection_decoration.cc.

165{
166 KisSelectionSP selection = view()->selection();
167 if (!selection) return;
168
169 view()->image()->addSpontaneousJob(new KisUpdateOutlineJob(selection, m_mode == Mask, m_maskColor));
170}

References m_maskColor, m_mode, Mask, and KisCanvasDecoration::view().

◆ toggleSelectionVisibility()

void KisSelectionDecoration::toggleSelectionVisibility ( )

Definition at line 203 of file kis_selection_decoration.cc.

References m_selectionVisibility.

Member Data Documentation

◆ m_antialiasSelectionOutline

bool KisSelectionDecoration::m_antialiasSelectionOutline
private

Definition at line 76 of file kis_selection_decoration.h.

◆ m_antsPen

QPen KisSelectionDecoration::m_antsPen
private

Definition at line 69 of file kis_selection_decoration.h.

◆ m_antsTimer

QTimer* KisSelectionDecoration::m_antsTimer
private

Definition at line 66 of file kis_selection_decoration.h.

◆ m_maskColor

QColor KisSelectionDecoration::m_maskColor
private

Definition at line 75 of file kis_selection_decoration.h.

◆ m_mode

Mode KisSelectionDecoration::m_mode
private

Definition at line 71 of file kis_selection_decoration.h.

◆ m_offset

int KisSelectionDecoration::m_offset
private

Definition at line 67 of file kis_selection_decoration.h.

◆ m_opacity

qreal KisSelectionDecoration::m_opacity
private

Definition at line 73 of file kis_selection_decoration.h.

◆ m_outlinePath

QPainterPath KisSelectionDecoration::m_outlinePath
private

Definition at line 63 of file kis_selection_decoration.h.

◆ m_outlinePen

QPen KisSelectionDecoration::m_outlinePen
private

Definition at line 70 of file kis_selection_decoration.h.

◆ m_selectionActionsPanel

KisSelectionActionsPanel* KisSelectionDecoration::m_selectionActionsPanel
private

Definition at line 77 of file kis_selection_decoration.h.

◆ m_selectionVisibility

bool KisSelectionDecoration::m_selectionVisibility
private

Definition at line 79 of file kis_selection_decoration.h.

◆ m_signalCompressor

KisSignalCompressor KisSelectionDecoration::m_signalCompressor
private

Definition at line 62 of file kis_selection_decoration.h.

◆ m_thumbnailImage

QImage KisSelectionDecoration::m_thumbnailImage
private

Definition at line 64 of file kis_selection_decoration.h.

◆ m_thumbnailImageTransform

QTransform KisSelectionDecoration::m_thumbnailImageTransform
private

Definition at line 65 of file kis_selection_decoration.h.


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