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

#include <kis_selection_actions_panel.h>

+ Inheritance diagram for KisSelectionActionsPanel:

Classes

struct  Private
 

Public Member Functions

void canvasWidgetChanged (KisCanvasWidgetBase *canvas)
 
void draw (QPainter &painter, const KoColorDisplayRendererInterface *displayRendererInterface)
 
bool eventFilter (QObject *obj, QEvent *event) override
 
 KisSelectionActionsPanel ()=delete
 
 KisSelectionActionsPanel (KisViewManager *viewManager)
 
void setEnabled (bool enabled)
 
void setHandleEnabled (bool enabled)
 
void setOrientation (Orientation orientation)
 
void setVisible (bool visible)
 
void updatePositioning ()
 
 ~KisSelectionActionsPanel ()
 

Private Slots

void canvasStateChanged ()
 
void configChanged (bool skipResettingOffset=false)
 
void configureSelectionActionsPanel ()
 
void disableSelectionActionsPanel ()
 
void showContextMenu (const QPoint &pos)
 
void themeChanged ()
 

Private Member Functions

QPoint clipPositionToCanvasBoundaries (QPoint position, QWidget *canvasWidget) const
 
QPoint currentTopLeftPosition () const
 
void drawActionBarBackground (QPainter &gc, const KoColorDisplayRendererInterface *displayRendererInterface) const
 
void drawAnchorWhileMoving (QPainter &painter) const
 End of positioning ///.
 
void drawDebugRectangle (QPainter &painter, Position position)
 
void drawDebugRectanglesForFreeFloatingBehaviour (QPainter &painter)
 
QPoint freeFloatingInitialTopLeftPosition (bool calculateOnlyAnchor=false) const
 
QPoint getFixedPosition () const
 Positioning ///.
 
QRectF getWidgetSelectionRect () const
 
bool handleMove (QEvent *event, const QPoint &pos)
 
bool handlePress (QEvent *event, const QPoint &pos, Qt::MouseButton button=Qt::LeftButton)
 
bool handleRelease (QEvent *event)
 
QPoint horizontalFreeFloatingTopLeftPosition (bool calculateOnlyAnchor=false) const
 
QPoint mouseEventPos (const QMouseEvent *mouseEvent)
 
void movePanelWidgets ()
 Moves all the widgets that are a part of the panel.
 
void recalculateDimensions ()
 
QPoint tabletEventPos (const QTabletEvent *tabletEvent)
 
bool touchEventPos (const QTouchEvent *touchEvent, QPoint &outPos)
 
QPoint transformHandleCoords (QPoint pos)
 
QPoint verticalFreeFloatingTopLeftPosition (bool calculateOnlyAnchor=false) const
 

Private Attributes

QScopedPointer< Privated
 

Detailed Description

Definition at line 36 of file kis_selection_actions_panel.h.

Constructor & Destructor Documentation

◆ KisSelectionActionsPanel() [1/2]

KisSelectionActionsPanel::KisSelectionActionsPanel ( )
delete

◆ KisSelectionActionsPanel() [2/2]

KisSelectionActionsPanel::KisSelectionActionsPanel ( KisViewManager * viewManager)

Definition at line 123 of file kis_selection_actions_panel.cpp.

124 : d(new Private)
125{
126 d->m_viewManager = viewManager;
127 d->m_selectionManager = viewManager->selectionManager();
128
129
130 KisConfig kcfg(true);
131 // instead of loading the user's configuration, set it to the "old version" of the behaviour:
132 kcfg.setSelectionActionBarOrientation(KisConfig::SelectionActionsBarOrientation::Horizontal);
133 kcfg.setSelectionActionBarPosition(KisConfig::SelectionActionsBarPosition::Bottom);
134 // whether it's fixed or free-floating can be determined by the pin icon, so let's load that one correctly and don't change it
135 // TODO: remove this whole part when restoring the behaviour
136
137 // Setup buttons...
139 for (int i = 0; i < data.length(); i++) {
140 const ActionButtonData &buttonData = data[i];
142 connect(button, &QAbstractButton::clicked, d->m_selectionManager, buttonData.slot);
143 connect(button, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showContextMenu(QPoint)));
144 d->m_buttons.append(button);
145
146 if (buttonData.slot == &KisSelectionManager::toggleSAPpin) {
147 d->sapPinButtonIndex = i;
148 button->setCheckable(true);
149 }
150 }
151
152 d->m_handleWidget = new KisSelectionActionsPanelHandle(BUTTON_SIZE, d->orientation, viewManager->canvas());
153 connect(d->m_handleWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showContextMenu(QPoint)));
154
155 d->disable_action = new KisAction(i18n("Disable selection actions bar"));
156 connect(d->disable_action, SIGNAL(triggered()), SLOT(disableSelectionActionsPanel()) );
157
158 d->configure_action = viewManager->actionManager()->actionByName("configure_sap");
159 connect(d->configure_action, SIGNAL(triggered()), SLOT(configureSelectionActionsPanel()));
160
161 connect(KisConfigNotifier::instance(), SIGNAL(configChanged()), SLOT(configChanged()));
162 connect(d->m_viewManager->canvasBase()->canvasController()->proxyObject, SIGNAL(canvasStateChanged()), SLOT(canvasStateChanged()));
163
164 connect(KisPart::instance()->currentMainwindow(), SIGNAL(themeChanged()), this, SLOT(themeChanged()));
165
166 KConfigGroup cfg = KSharedConfig::openConfig()->group("");
167 d->m_dragHandle.dragOffset = cfg.readEntry(d->dragOffsetConfigName, QPoint(0, 0));
168
169 configChanged(true);
170
171}
KisAction * actionByName(const QString &name) const
static KisConfigNotifier * instance()
static KisPart * instance()
Definition KisPart.cpp:130
Custom widget for selection actions panel buttons, to prevent them being drawn over the pop-up palett...
void configChanged(bool skipResettingOffset=false)
KisActionManager * actionManager() const
QWidget * canvas() const
Return the actual widget that is displaying the current image.
KisSelectionManager * selectionManager()
static constexpr int BUTTON_SIZE
QString button(const QWheelEvent &ev)
static const QVector< ActionButtonData > & buttonData()

References KisActionManager::actionByName(), KisViewManager::actionManager(), KisConfig::Bottom, button(), BUTTON_SIZE, KisSelectionActionsPanel::Private::buttonData(), KisViewManager::canvas(), canvasStateChanged(), configChanged(), configureSelectionActionsPanel(), d, disableSelectionActionsPanel(), KisConfig::Horizontal, ActionButtonData::iconName, KisConfigNotifier::instance(), KisPart::instance(), KisViewManager::selectionManager(), KisConfig::setSelectionActionBarOrientation(), KisConfig::setSelectionActionBarPosition(), showContextMenu(), ActionButtonData::slot, themeChanged(), KisSelectionManager::toggleSAPpin(), and ActionButtonData::tooltip.

◆ ~KisSelectionActionsPanel()

KisSelectionActionsPanel::~KisSelectionActionsPanel ( )

Definition at line 173 of file kis_selection_actions_panel.cpp.

174{
175}

Member Function Documentation

◆ canvasStateChanged

void KisSelectionActionsPanel::canvasStateChanged ( )
privateslot

◆ canvasWidgetChanged()

void KisSelectionActionsPanel::canvasWidgetChanged ( KisCanvasWidgetBase * canvas)

Definition at line 404 of file kis_selection_actions_panel.cpp.

405{
406
407 Q_FOREACH(QWidget* btn, d->m_buttons) {
408 btn->setParent(canvas->widget());
409 if (d->m_visible) {
410 btn->show();
411 }
412 }
413
414 d->m_handleWidget->setParent(canvas->widget());
415 if (d->m_visible) {
416 d->m_handleWidget->show();
417 }
418}
virtual QWidget * widget()=0

References d, and KisAbstractCanvasWidget::widget().

◆ clipPositionToCanvasBoundaries()

QPoint KisSelectionActionsPanel::clipPositionToCanvasBoundaries ( QPoint position,
QWidget * canvasWidget ) const
private

Definition at line 428 of file kis_selection_actions_panel.cpp.

429{
430 QRect canvasBounds = canvasWidget->rect();
431
432 const int ACTION_BAR_WIDTH = d->m_actionBarWidth;
433 const int ACTION_BAR_HEIGHT = d->m_actionBarHeight;
434
435 int pos_x_min = canvasBounds.left() + BUFFER_SPACE;
436 int pos_x_max = canvasBounds.right() - ACTION_BAR_WIDTH - BUFFER_SPACE;
437
438 int pos_y_min = canvasBounds.top() + BUFFER_SPACE;
439 int pos_y_max = canvasBounds.bottom() - ACTION_BAR_HEIGHT - BUFFER_SPACE;
440
441 //Ensure that max is always bigger than min
442 //If the window is small enough max could be smaller than min
443 if (pos_x_max < pos_x_min) {
444 pos_x_max = pos_x_min;
445 }
446
447 //It is pretty implausible for it to happen vertically but better safe than sorry
448 if (pos_y_max < pos_y_min) {
449 pos_y_max = pos_y_min;
450 }
451
452 position.setX(qBound(pos_x_min, position.x(), pos_x_max));
453 position.setY(qBound(pos_y_min, position.y(), pos_y_max));
454
455 return position;
456}
static constexpr int BUFFER_SPACE

References BUFFER_SPACE, and d.

◆ configChanged

void KisSelectionActionsPanel::configChanged ( bool skipResettingOffset = false)
privateslot

Definition at line 845 of file kis_selection_actions_panel.cpp.

846{
847 KisConfig cfg(true);
848 KConfigGroup silentCfg = KSharedConfig::openConfig()->group("");
849
850
851 setHandleEnabled(cfg.selectionActionBarBehavior() != Behavior::Fixed);
852
853 bool resetOffset = false;
854 if (d->orientation != cfg.selectionActionBarOrientation()) {
855 resetOffset = true;
856 setOrientation(cfg.selectionActionBarOrientation());
857 }
858 d->behavior = cfg.selectionActionBarBehavior();
859 if (d->position != cfg.selectionActionBarPosition()) {
860 resetOffset = true;
861 d->position = cfg.selectionActionBarPosition();
862 }
863
864 if (resetOffset && !skipResettingOffset) {
865 d->m_dragHandle.dragOffset = QPoint();
866 silentCfg.writeEntry(d->dragOffsetConfigName, QPoint());
867 }
868
869 if (d->sapPinButtonIndex >= 0 && d->m_buttons[d->sapPinButtonIndex] && d->m_buttons[d->sapPinButtonIndex]->isCheckable()) {
870 d->m_buttons[d->sapPinButtonIndex]->setChecked(cfg.selectionActionBarBehavior() == Behavior::Fixed);
871 }
872
874}
void setOrientation(Orientation orientation)

References d, KisConfig::selectionActionBarBehavior(), KisConfig::selectionActionBarOrientation(), KisConfig::selectionActionBarPosition(), setHandleEnabled(), setOrientation(), and updatePositioning().

◆ configureSelectionActionsPanel

void KisSelectionActionsPanel::configureSelectionActionsPanel ( )
privateslot

◆ currentTopLeftPosition()

QPoint KisSelectionActionsPanel::currentTopLeftPosition ( ) const
private

Definition at line 623 of file kis_selection_actions_panel.cpp.

624{
625 if (d->behavior == Behavior::Fixed) {
626 return getFixedPosition();
627 }
628
629 QPoint widgetTopLeftPosition = freeFloatingInitialTopLeftPosition();
630 widgetTopLeftPosition += d->m_dragHandle.dragOffset;
631
632 return clipPositionToCanvasBoundaries(widgetTopLeftPosition, d->m_viewManager->canvas());
633}
QPoint getFixedPosition() const
Positioning ///.
QPoint clipPositionToCanvasBoundaries(QPoint position, QWidget *canvasWidget) const
QPoint freeFloatingInitialTopLeftPosition(bool calculateOnlyAnchor=false) const

References clipPositionToCanvasBoundaries(), d, freeFloatingInitialTopLeftPosition(), and getFixedPosition().

◆ disableSelectionActionsPanel

void KisSelectionActionsPanel::disableSelectionActionsPanel ( )
privateslot

Definition at line 829 of file kis_selection_actions_panel.cpp.

830{
831 KisConfig cfg(false);
832 cfg.setSelectionActionBar(false);
834}

References KisConfigNotifier::instance(), KisConfigNotifier::notifyConfigChanged(), and KisConfig::setSelectionActionBar().

◆ draw()

void KisSelectionActionsPanel::draw ( QPainter & painter,
const KoColorDisplayRendererInterface * displayRendererInterface )

Definition at line 177 of file kis_selection_actions_panel.cpp.

178{
179 KisSelectionSP selection = d->m_viewManager->selection();
180
181 if (!selection || !d->m_enabled || !d->m_visible) {
182 return;
183 }
184
185 if (d->m_pressed && d->behavior == Behavior::FreeFloating) {
186 drawAnchorWhileMoving(painter);
187 }
188
189 //drawDebugRectanglesForFreeFloatingBehaviour(painter);
190
191 drawActionBarBackground(painter, displayRendererInterface);
192 Q_FOREACH(KisSelectionActionsPanelButton* button, d->m_buttons){
193 button->draw(painter, displayRendererInterface);
194 }
195
196 if (d->m_handleWidget->isEnabled()) {
197 d->m_handleWidget->draw(painter, displayRendererInterface);
198 }
199
200}
void drawAnchorWhileMoving(QPainter &painter) const
End of positioning ///.
void drawActionBarBackground(QPainter &gc, const KoColorDisplayRendererInterface *displayRendererInterface) const

References button(), d, drawActionBarBackground(), and drawAnchorWhileMoving().

◆ drawActionBarBackground()

void KisSelectionActionsPanel::drawActionBarBackground ( QPainter & gc,
const KoColorDisplayRendererInterface * displayRendererInterface ) const
private

Definition at line 658 of file kis_selection_actions_panel.cpp.

659{
660 const int cornerRadius = 4;
661 QColor outlineColor = qApp->palette().window().color();
662
663 QColor bgColor = qApp->palette().window().color();
664
665 //Slightly lighten the color, to force `dragColor` to move it in the lighter direction, without this it will always darken the color
667 bgColor = bgColor.lighter(120);
668 }
669
670 KisPaintingTweaks::dragColor(&bgColor, outlineColor, 0.25);
671
672 // Manually convert here, to keep as much consistency as possible.
673 KoColor c;
674 c.fromQColor(bgColor);
675 bgColor = displayRendererInterface->convertColorToDisplayColorSpace(c);
676 c.fromQColor(outlineColor);
677 outlineColor = displayRendererInterface->convertColorToDisplayColorSpace(c);
678
679 QColor bgColorTrans = bgColor;
680 bgColorTrans.setAlpha(80);
681 const int outline_width = 4;
682
683 //an outer 1px wide outline for contrast against the background
684 QRectF contrastOutline(d->m_dragHandle.position - QPoint(outline_width + 1,outline_width + 1), QSize(d->m_actionBarWidth, d->m_actionBarHeight) +QSize(outline_width + 1,outline_width + 1) * 2);
685 QRectF midOutline(d->m_dragHandle.position - QPoint(outline_width,outline_width), QSize(d->m_actionBarWidth, d->m_actionBarHeight) +QSize(outline_width,outline_width) * 2);
686 //Add a bit of padding here for the icons
687 QRectF centerBackground(d->m_dragHandle.position - QPoint(outline_width,outline_width) / 2, QSize(d->m_innerActionBarWidth, d->m_innerActionBarHeight) +QSize(outline_width,outline_width));
688 QPainterPath bgPath;
689 QPainterPath outlinePath;
690 QPainterPath contrastOutlinePath;
691
692 bgPath.addRoundedRect(centerBackground, cornerRadius, cornerRadius);
693 outlinePath.addRoundedRect(midOutline, cornerRadius, cornerRadius);
694 contrastOutlinePath.addRoundedRect(contrastOutline, cornerRadius, cornerRadius);
695
696 painter.fillPath(contrastOutlinePath, bgColorTrans);
697 painter.fillPath(outlinePath, outlineColor);
698 painter.fillPath(bgPath, bgColor);
699}
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
void dragColor(QColor *color, const QColor &baseColor, qreal threshold)

References KoColorDisplayRendererInterface::convertColorToDisplayColorSpace(), d, KisPaintingTweaks::dragColor(), KoColor::fromQColor(), and KisIconUtils::useDarkIcons().

◆ drawAnchorWhileMoving()

void KisSelectionActionsPanel::drawAnchorWhileMoving ( QPainter & painter) const
private

End of positioning ///.

Definition at line 635 of file kis_selection_actions_panel.cpp.

636{
637 painter.save();
638
639 QPen pen = painter.pen();
640 pen.setStyle(Qt::CustomDashLine);
641 pen.setDashPattern({6, 6});
642 pen.setColor(Qt::darkGray);
643 painter.setPen(pen);
644 QPoint initial = freeFloatingInitialTopLeftPosition(true);
645 QPoint offset = QPoint(d->m_actionBarWidth/2, d->m_actionBarHeight/2);
646 painter.drawLine(QLine(initial, d->m_dragHandle.position + offset));
647
648 int xSize = 8;
649 pen.setStyle(Qt::SolidLine);
650 painter.setPen(pen);
651
652 painter.drawLine(initial + QPoint(xSize, xSize), initial - QPoint(xSize, xSize));
653 painter.drawLine(initial + QPoint(xSize, -xSize), initial + QPoint(-xSize, xSize));
654
655 painter.restore();
656}

References d, and freeFloatingInitialTopLeftPosition().

◆ drawDebugRectangle()

void KisSelectionActionsPanel::drawDebugRectangle ( QPainter & painter,
Position position )
private

Definition at line 891 of file kis_selection_actions_panel.cpp.

892{
893 d->position = position;
894 QBrush brush(Qt::cyan);
896 brush.setColor(QColor(100 + 20*(int)position, 100, 100, 150));
897 painter.setBrush(brush);
898 painter.drawRect(QRect(p, QSize(d->m_actionBarWidth, d->m_actionBarHeight)));
899 painter.drawEllipse(freeFloatingInitialTopLeftPosition(true), 10, 10);
900}
const Params2D p

References d, freeFloatingInitialTopLeftPosition(), and p.

◆ drawDebugRectanglesForFreeFloatingBehaviour()

void KisSelectionActionsPanel::drawDebugRectanglesForFreeFloatingBehaviour ( QPainter & painter)
private

Definition at line 903 of file kis_selection_actions_panel.cpp.

904{
905 painter.save();
906 Position remember = d->position;
907
908 for (int position = 0; position < 8; position++) {
909 drawDebugRectangle(painter, (Position)position);
910 }
911
912 painter.restore();
913 d->position = remember;
914
915}
SelectionActionsBarPosition
Definition kis_config.h:802
void drawDebugRectangle(QPainter &painter, Position position)

References d, and drawDebugRectangle().

◆ eventFilter()

bool KisSelectionActionsPanel::eventFilter ( QObject * obj,
QEvent * event )
override

Definition at line 344 of file kis_selection_actions_panel.cpp.

345{
346 Q_UNUSED(obj);
347
348 switch (event->type()) {
349 case QEvent::MouseButtonPress: {
350 const QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
351 return handlePress(event, mouseEventPos(mouseEvent), mouseEvent->button());
352 }
353 case QEvent::TabletPress: {
354 const QTabletEvent *tabletEvent = static_cast<QTabletEvent *>(event);
355 return handlePress(event, tabletEventPos(tabletEvent));
356 }
357 case QEvent::TouchBegin: {
358 const QTouchEvent *touchEvent = static_cast<QTouchEvent *>(event);
359 QPoint pos;
360 if (touchEventPos(touchEvent, pos)) {
361 return handlePress(event, pos);
362 }
363 break;
364 }
365
366 case QEvent::MouseMove:
367 if (d->m_pressed) {
368 const QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
369 return handleMove(event, mouseEventPos(mouseEvent));
370 }
371 break;
372 case QEvent::TabletMove:
373 if (d->m_pressed) {
374 const QTabletEvent *tabletEvent = static_cast<QTabletEvent *>(event);
375 return handleMove(event, tabletEventPos(tabletEvent));
376 }
377 break;
378 case QEvent::TouchUpdate:
379 if (d->m_pressed) {
380 const QTouchEvent *touchEvent = static_cast<QTouchEvent *>(event);
381 QPoint pos;
382 if (touchEventPos(touchEvent, pos)) {
383 return handleMove(event, pos);
384 }
385 }
386 break;
387
388 case QEvent::MouseButtonRelease:
389 case QEvent::TabletRelease:
390 case QEvent::TouchEnd:
391 case QEvent::TouchCancel:
392 if (d->m_pressed) {
393 return handleRelease(event);
394 }
395 break;
396
397 default:
398 break;
399 }
400 return false;
401}
bool handlePress(QEvent *event, const QPoint &pos, Qt::MouseButton button=Qt::LeftButton)
QPoint tabletEventPos(const QTabletEvent *tabletEvent)
bool handleMove(QEvent *event, const QPoint &pos)
QPoint mouseEventPos(const QMouseEvent *mouseEvent)
bool touchEventPos(const QTouchEvent *touchEvent, QPoint &outPos)

References d, handleMove(), handlePress(), handleRelease(), mouseEventPos(), tabletEventPos(), and touchEventPos().

◆ freeFloatingInitialTopLeftPosition()

QPoint KisSelectionActionsPanel::freeFloatingInitialTopLeftPosition ( bool calculateOnlyAnchor = false) const
private

Definition at line 614 of file kis_selection_actions_panel.cpp.

615{
616 if (d->orientation == Orientation::Horizontal) {
617 return horizontalFreeFloatingTopLeftPosition(calculateOnlyAnchor);
618 } else {
619 return verticalFreeFloatingTopLeftPosition(calculateOnlyAnchor);
620 }
621}
QPoint verticalFreeFloatingTopLeftPosition(bool calculateOnlyAnchor=false) const
QPoint horizontalFreeFloatingTopLeftPosition(bool calculateOnlyAnchor=false) const

References d, horizontalFreeFloatingTopLeftPosition(), and verticalFreeFloatingTopLeftPosition().

◆ getFixedPosition()

QPoint KisSelectionActionsPanel::getFixedPosition ( ) const
private

Positioning ///.

Definition at line 226 of file kis_selection_actions_panel.cpp.

227{
228 QWidget *canvasWidget = dynamic_cast<QWidget *>(d->m_viewManager->canvas());
229 if (!canvasWidget) {
230 return QPoint();
231 }
232
233 QRect canvasBounds = canvasWidget->rect();
234 QPoint result = QPoint();
235
236 switch (d->position) {
238 result.setY(canvasBounds.bottom());
239 result.setX((canvasBounds.width() - d->m_actionBarWidth) / 2);
240 break;
242 result.setY(canvasBounds.bottom());
243 result.setX(canvasBounds.left());
244 break;
246 result.setY(canvasBounds.bottom());
247 result.setX(canvasBounds.right());
248 break;
249 case KisConfig::Left:
250 result.setY((canvasBounds.height() - d->m_actionBarHeight) / 2);
251 result.setX(canvasBounds.left());
252 break;
253 case KisConfig::Right:
254 result.setY((canvasBounds.height() - d->m_actionBarHeight) / 2);
255 result.setX(canvasBounds.right());
256 break;
257 case KisConfig::Top:
258 result.setY(canvasBounds.top());
259 result.setX((canvasBounds.width() - d->m_actionBarWidth) / 2);
260 break;
262 result.setY(canvasBounds.top());
263 result.setX(canvasBounds.left());
264 break;
266 result.setY(canvasBounds.top());
267 result.setX(canvasBounds.right());
268 break;
269 }
270
271 return clipPositionToCanvasBoundaries(result, canvasWidget);
272}

References KisConfig::Bottom, KisConfig::BottomLeft, KisConfig::BottomRight, clipPositionToCanvasBoundaries(), d, KisConfig::Left, KisConfig::Right, KisConfig::Top, KisConfig::TopLeft, and KisConfig::TopRight.

◆ getWidgetSelectionRect()

QRectF KisSelectionActionsPanel::getWidgetSelectionRect ( ) const
private

Definition at line 589 of file kis_selection_actions_panel.cpp.

590{
591 if (!d->m_viewManager) {
592 return QRectF();
593 }
594
595 KisSelectionSP selection = d->m_viewManager->selection();
596 KisCanvasWidgetBase *canvas = dynamic_cast<KisCanvasWidgetBase*>(d->m_viewManager->canvas());
597
598 if (!canvas || !selection) {
599 return QRectF();
600 }
601
602 QPainterPath selectionOutline = selection->outlineCache();
603 const KisCoordinatesConverter *converter = canvas->coordinatesConverter();
604
605 if (!converter) {
606 return QRectF();
607 }
608
609 QRectF selectionBoundsWidget = converter->imageToWidget(selectionOutline).boundingRect();
610
611 return selectionBoundsWidget;
612}
KisCoordinatesConverter * coordinatesConverter() const
_Private::Traits< T >::Result imageToWidget(const T &obj) const
QPainterPath outlineCache() const

References KisCanvasWidgetBase::coordinatesConverter(), d, KisCoordinatesConverter::imageToWidget(), and KisSelection::outlineCache().

◆ handleMove()

bool KisSelectionActionsPanel::handleMove ( QEvent * event,
const QPoint & pos )
private

Definition at line 720 of file kis_selection_actions_panel.cpp.

721{
722 QWidget *canvasWidget = d->m_viewManager->canvas();
723 QPoint newPos = pos - d->m_dragHandle.dragOrigin;
724 d->m_dragHandle.dragOffset = newPos;
725
727
728 canvasWidget->update();
729 event->accept();
730 return true;
731}

References d, and updatePositioning().

◆ handlePress()

bool KisSelectionActionsPanel::handlePress ( QEvent * event,
const QPoint & pos,
Qt::MouseButton button = Qt::LeftButton )
private

Definition at line 701 of file kis_selection_actions_panel.cpp.

702{
703 if (d->m_pressed) {
704 event->accept();
705 return true;
706 }
707
708 if (button == Qt::LeftButton) {
709 d->m_pressed = true;
710 d->m_dragHandle.dragOrigin = pos - d->m_dragHandle.dragOffset;
711 d->m_handleWidget->set_held(true);
712
713 event->accept();
714 return true;
715 }
716
717 return false;
718}

References button(), and d.

◆ handleRelease()

bool KisSelectionActionsPanel::handleRelease ( QEvent * event)
private

Definition at line 733 of file kis_selection_actions_panel.cpp.

734{
735 d->m_handleWidget->set_held(false);
736 d->m_pressed = false;
737 event->accept();
738
739 KConfigGroup cfg = KSharedConfig::openConfig()->group("");
740 cfg.writeEntry(d->dragOffsetConfigName, d->m_dragHandle.dragOffset);
741
742 return true;
743}

References d.

◆ horizontalFreeFloatingTopLeftPosition()

QPoint KisSelectionActionsPanel::horizontalFreeFloatingTopLeftPosition ( bool calculateOnlyAnchor = false) const
private

Definition at line 458 of file kis_selection_actions_panel.cpp.

459{
460 Position position = d->position;
461 QRect selection = getWidgetSelectionRect().toRect();
462 QPoint anchor = selection.center();
463 QPoint offsetted = selection.center();
464 qreal barHorizontalOffset = d->m_actionBarWidth;
465 qreal barVerticalOffset = d->m_actionBarHeight;
466
467 switch (position) {
468 case Position::Top:
469 case Position::Bottom:
470 anchor = QPoint(selection.center().x(), 0);
471 offsetted = anchor - QPoint(barHorizontalOffset/2, 0);
472 break;
473 case Position::TopLeft:
474 case Position::BottomLeft:
475 anchor = QPoint(selection.left(), 0);
476 offsetted = anchor;
477 break;
478 case Position::TopRight:
479 case Position::BottomRight:
480 anchor = QPoint(selection.right(), 0);
481 offsetted = anchor - QPoint(barHorizontalOffset, 0);
482 break;
483
484
485 case Position::Left:
486 anchor = QPoint(selection.left(), 0);
487 offsetted = anchor - QPoint(barHorizontalOffset + BIG_BUFFER_SPACE_X, 0);
488 break;
489
490 case Position::Right:
491 anchor = QPoint(selection.right(), 0);
492 offsetted = anchor + QPoint(BIG_BUFFER_SPACE_X, 0);
493 break;
494 }
495
496 switch (position) {
497 case Position::Top:
498 case Position::TopLeft:
499 case Position::TopRight:
500 anchor += QPoint(0, selection.top());
501 offsetted += QPoint(0, selection.top() - BIG_BUFFER_SPACE_Y - barVerticalOffset);
502 break;
503 case Position::Bottom:
504 case Position::BottomLeft:
505 case Position::BottomRight:
506 anchor += QPoint(0, selection.bottom());
507 offsetted += QPoint(0, selection.bottom() + BIG_BUFFER_SPACE_Y);
508 break;
509
510 case Position::Left:
511 case Position::Right:
512 anchor += QPoint(0, selection.center().y());
513 offsetted += QPoint(0, selection.center().y() - barVerticalOffset/2);
514 break;
515
516 }
517
518 if (calculateOnlyAnchor) {
519 return anchor;
520 }
521 return offsetted;
522
523}
static constexpr int BIG_BUFFER_SPACE_X
static constexpr int BIG_BUFFER_SPACE_Y

References BIG_BUFFER_SPACE_X, BIG_BUFFER_SPACE_Y, d, and getWidgetSelectionRect().

◆ mouseEventPos()

QPoint KisSelectionActionsPanel::mouseEventPos ( const QMouseEvent * mouseEvent)
private

Definition at line 779 of file kis_selection_actions_panel.cpp.

780{
781#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
782 return transformHandleCoords(mouseEvent->position().toPoint());
783#else
784 return transformHandleCoords(mouseEvent->pos());
785#endif
786}

References transformHandleCoords().

◆ movePanelWidgets()

void KisSelectionActionsPanel::movePanelWidgets ( )
private

Moves all the widgets that are a part of the panel.

Definition at line 745 of file kis_selection_actions_panel.cpp.

746{
747 //This function gets called on panel creation, when dragHandle is not initialized, so we need to handle that
748 if (!d->m_handleWidget)
749 return;
750
751 // don't show the widgets if the panel is hidden
752 if (!d->m_visible)
753 return;
754
755 if (d->orientation == Orientation::Vertical) {
756 d->m_handleWidget->move(d->m_dragHandle.position.x(),
757 d->m_dragHandle.position.y() + d->m_buttons.size() * BUTTON_SIZE);
758 } else if (d->orientation == Orientation::Horizontal) {
759 d->m_handleWidget->move(d->m_dragHandle.position.x() + d->m_buttons.size() * BUTTON_SIZE,
760 d->m_dragHandle.position.y());
761 }
762 d->m_handleWidget->show();
763
764 int i = 0;
765 Q_FOREACH (KisSelectionActionsPanelButton *button, d->m_buttons) {
766 int buttonPosition = i * BUTTON_SIZE;
767
768 if (d->orientation == Orientation::Vertical) {
769 button->move(d->m_dragHandle.position.x(), d->m_dragHandle.position.y() + buttonPosition);
770 } else if (d->orientation == Orientation::Horizontal) {
771 button->move(d->m_dragHandle.position.x() + buttonPosition, d->m_dragHandle.position.y());
772 }
773 button->show();
774
775 i++;
776 }
777}

References button(), BUTTON_SIZE, and d.

◆ recalculateDimensions()

void KisSelectionActionsPanel::recalculateDimensions ( )
private

Definition at line 274 of file kis_selection_actions_panel.cpp.

275{
276 if (!d->m_handleWidget) return;
277
278 if (d->orientation == Orientation::Horizontal) {
279 d->m_innerActionBarHeight = d->m_actionBarHeight = BUTTON_SIZE;
280 d->m_innerActionBarWidth = d->m_actionBarWidth = BUTTON_SIZE * d->m_buttonCount;
281 if (d->m_handleWidget->isEnabled()) {
282 d->m_innerActionBarWidth = BUTTON_SIZE * (d->m_buttonCount - 1);
283 }
284 } else if (d->orientation == Orientation::Vertical) {
285 d->m_innerActionBarHeight = d->m_actionBarHeight = BUTTON_SIZE * d->m_buttonCount;
286 d->m_innerActionBarWidth = d->m_actionBarWidth = BUTTON_SIZE;
287 if (d->m_handleWidget->isEnabled()) {
288 d->m_innerActionBarHeight = BUTTON_SIZE * (d->m_buttonCount - 1);
289 }
290 }
291
293}
void movePanelWidgets()
Moves all the widgets that are a part of the panel.

References BUTTON_SIZE, d, and movePanelWidgets().

◆ setEnabled()

void KisSelectionActionsPanel::setEnabled ( bool enabled)

Definition at line 330 of file kis_selection_actions_panel.cpp.

331{
332
333 bool configurationChanged = enabled != d->m_enabled;
334
335 d->configure_action->setVisible(enabled && d->m_viewManager->selection());
336
337 d->m_enabled = enabled;
338 if (configurationChanged) {
339 // Reset visibility when configuration changes
340 setVisible(enabled);
341 }
342}

References d, and setVisible().

◆ setHandleEnabled()

void KisSelectionActionsPanel::setHandleEnabled ( bool enabled)

Definition at line 212 of file kis_selection_actions_panel.cpp.

213{
214 if (enabled && !d->m_handleWidget->isEnabled()) {
215 d->m_handleWidget->setEnabled(enabled);
216 d->m_buttonCount++;
217 }
218
219 if (!enabled && d->m_handleWidget->isEnabled()) {
220 d->m_handleWidget->setEnabled(enabled);
221 d->m_buttonCount--;
222 }
224}

References d, and recalculateDimensions().

◆ setOrientation()

void KisSelectionActionsPanel::setOrientation ( Orientation orientation)

Definition at line 202 of file kis_selection_actions_panel.cpp.

203{
204 d->orientation = mode;
205 d->m_handleWidget->setOrientation(mode);
207
208 //Recalcute the position of the bar to be inside the canvas
210}

References d, recalculateDimensions(), and updatePositioning().

◆ setVisible()

void KisSelectionActionsPanel::setVisible ( bool visible)

Definition at line 295 of file kis_selection_actions_panel.cpp.

296{
297 QWidget *canvasWidget = dynamic_cast<QWidget *>(d->m_viewManager->canvas());
298 if (!canvasWidget) {
299 return;
300 }
301
302 p_visible &= d->m_enabled;
303
304 const bool VISIBILITY_CHANGED = d->m_visible != p_visible;
305 if (!VISIBILITY_CHANGED) {
306 return;
307 }
308
309 d->configure_action->setVisible(p_visible && d->m_viewManager->selection());
310
311 // movePanelWidgets() uses d->m_visible to decide whether to make the widgets
312 // visible or not
313 d->m_visible = p_visible;
314
315 if (d->m_viewManager->selection() && p_visible) { // Now visible!
316 d->m_handleWidget->installEventFilter(this);
318 } else { // Now hidden!
319 d->m_handleWidget->removeEventFilter(this);
320
321 for (KisSelectionActionsPanelButton *button : d->m_buttons) {
322 button->hide();
323 }
324 d->m_handleWidget->hide();
325
326 d->m_pressed = false;
327 }
328}

References button(), d, and updatePositioning().

◆ showContextMenu

void KisSelectionActionsPanel::showContextMenu ( const QPoint & pos)
privateslot

Definition at line 821 of file kis_selection_actions_panel.cpp.

822{
823 QMenu menu = QMenu();
824 menu.addAction(d->disable_action);
825 menu.addAction(d->configure_action);
826 menu.exec(pos);
827}

References d.

◆ tabletEventPos()

QPoint KisSelectionActionsPanel::tabletEventPos ( const QTabletEvent * tabletEvent)
private

Definition at line 788 of file kis_selection_actions_panel.cpp.

789{
790#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
791 return transformHandleCoords(tabletEvent->position().toPoint());
792#else
793 return transformHandleCoords(tabletEvent->pos());
794#endif
795}

References transformHandleCoords().

◆ themeChanged

void KisSelectionActionsPanel::themeChanged ( )
privateslot

Definition at line 881 of file kis_selection_actions_panel.cpp.

882{
883 Q_FOREACH(KisSelectionActionsPanelButton* button, d->m_buttons) {
885 }
886 d->m_handleWidget->themeChanged();
887}
void updateIcon(QAbstractButton *button)

References button(), d, and KisIconUtils::updateIcon().

◆ touchEventPos()

bool KisSelectionActionsPanel::touchEventPos ( const QTouchEvent * touchEvent,
QPoint & outPos )
private

Definition at line 797 of file kis_selection_actions_panel.cpp.

798{
799#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
800 if (touchEvent->pointCount() < 1) {
801 return false;
802 } else {
803 outPos = transformHandleCoords(touchEvent->points().first().position().toPoint());
804 return true;
805 }
806#else
807 const QList<QTouchEvent::TouchPoint> &touchPoints = touchEvent->touchPoints();
808 if (touchPoints.isEmpty()) {
809 return false;
810 } else {
811 outPos = transformHandleCoords(touchPoints.first().pos().toPoint());
812 return true;
813 }
814#endif
815}

References transformHandleCoords().

◆ transformHandleCoords()

QPoint KisSelectionActionsPanel::transformHandleCoords ( QPoint pos)
private

Definition at line 817 of file kis_selection_actions_panel.cpp.

817 {
818 return d->m_dragHandle.position + pos;
819}

References d.

◆ updatePositioning()

void KisSelectionActionsPanel::updatePositioning ( )

Definition at line 420 of file kis_selection_actions_panel.cpp.

421{
422 if (d->m_visible) {
423 d->m_dragHandle.position = currentTopLeftPosition();
425 }
426}

References currentTopLeftPosition(), d, and movePanelWidgets().

◆ verticalFreeFloatingTopLeftPosition()

QPoint KisSelectionActionsPanel::verticalFreeFloatingTopLeftPosition ( bool calculateOnlyAnchor = false) const
private

Definition at line 525 of file kis_selection_actions_panel.cpp.

526{
527 Position position = d->position;
528 QRect selection = getWidgetSelectionRect().toRect();
529 QPoint anchor = selection.center();
530 QPoint offsetted = selection.center();
531 qreal barVerticalOffset = d->m_actionBarHeight;
532 qreal barHorizontalOffset = d->m_actionBarWidth;
533
534 switch (position) {
535 case Position::Left:
536 case Position::Right:
537 anchor = QPoint(0, selection.center().y());
538 offsetted = -QPoint(0, barVerticalOffset/2);
539 break;
540 case Position::TopLeft:
541 case Position::TopRight:
542 anchor = QPoint(0, selection.top());
543 offsetted = QPoint();
544 break;
545 case Position::BottomLeft:
546 case Position::BottomRight:
547 anchor = QPoint(0, selection.bottom());
548 offsetted = -QPoint(0, barVerticalOffset);
549 break;
550
551 case Position::Top:
552 anchor = QPoint(0, selection.top());
553 offsetted = -QPoint(0, barVerticalOffset + BIG_BUFFER_SPACE_Y);
554 break;
555
556 case Position::Bottom:
557 anchor = QPoint(0, selection.bottom());
558 offsetted = QPoint(0, BIG_BUFFER_SPACE_Y);
559 break;
560 }
561
562 switch (position) {
563 case Position::Left:
564 case Position::TopLeft:
565 case Position::BottomLeft:
566 anchor += QPoint(selection.left(), 0);
567 offsetted += QPoint(- BIG_BUFFER_SPACE_X - barHorizontalOffset, 0);
568 break;
569 case Position::Right:
570 case Position::TopRight:
571 case Position::BottomRight:
572 anchor += QPoint(selection.right(), 0);
573 offsetted += QPoint(BIG_BUFFER_SPACE_X, 0);
574 break;
575
576 case Position::Top:
577 case Position::Bottom:
578 anchor += QPoint(selection.center().x(), 0);
579 offsetted += QPoint(- barHorizontalOffset/2, 0);
580 break;
581 }
582
583 if (calculateOnlyAnchor) {
584 return anchor;
585 }
586 return anchor + offsetted;
587}

References BIG_BUFFER_SPACE_X, BIG_BUFFER_SPACE_Y, d, and getWidgetSelectionRect().

Member Data Documentation

◆ d

QScopedPointer<Private> KisSelectionActionsPanel::d
private

Definition at line 103 of file kis_selection_actions_panel.h.


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