[graphics/krita] libs/ui: Fix updating positioning in SAP
Dmitry Kazakov <[email protected]>
| Newsgroups | gmane.comp.kde.cvs |
|---|---|
| Message-ID | <[email protected]> |
Git commit c5ba1446f357222d60c518b3570d1b2be45f3b4c by Dmitry Kazakov, on behalf of Agata Cacko.
Committed on 26/07/2026 at 10:56.
Pushed by dkazakov into branch 'master'.
Fix updating positioning in SAP
Before this commit, there was an update in positioning widgets
inside the draw() call. This could cause all kinds of issues.
This commit ensures there is no update in the draw() call and cleans up
all the other mentions of movePanelWidgets().
M +15 -26 libs/ui/kis_selection_actions_panel.cpp
M +2 -0 libs/ui/kis_selection_actions_panel.h
M +1 -0 libs/ui/kis_selection_decoration.cc
https://invent.kde.org/graphics/krita/-/commit/c5ba1446f357222d60c518b3570d1b2be45f3b4c
diff --git a/libs/ui/kis_selection_actions_panel.cpp b/libs/ui/kis_selection_actions_panel.cpp
index ec8ecace909..7a34f0539c8 100644
--- a/libs/ui/kis_selection_actions_panel.cpp
+++ b/libs/ui/kis_selection_actions_panel.cpp
@@ -182,11 +182,6 @@ void KisSelectionActionsPanel::draw(QPainter &painter, const KoColorDisplayRende
return;
}
- if (d->m_viewManager->canvas()) {
- d->m_dragHandle.position = currentTopLeftPosition();
- movePanelWidgets();
- }
-
if (d->m_pressed && d->behavior == Behavior::FreeFloating) {
drawAnchorWhileMoving(painter);
}
@@ -211,11 +206,7 @@ void KisSelectionActionsPanel::setOrientation(Orientation mode)
recalculateDimensions();
//Recalcute the position of the bar to be inside the canvas
- QWidget *canvasWidget = dynamic_cast<QWidget *>(d->m_viewManager->canvas());
- if (canvasWidget) {
- d->m_dragHandle.position = clipPositionToCanvasBoundaries(d->m_dragHandle.position, canvasWidget);
- movePanelWidgets();
- }
+ updatePositioning();
}
void KisSelectionActionsPanel::setHandleEnabled(bool enabled)
@@ -323,8 +314,7 @@ void KisSelectionActionsPanel::setVisible(bool p_visible)
if (d->m_viewManager->selection() && p_visible) { // Now visible!
d->m_handleWidget->installEventFilter(this);
- d->m_dragHandle.position = currentTopLeftPosition();
- movePanelWidgets();
+ updatePositioning();
} else { // Now hidden!
d->m_handleWidget->removeEventFilter(this);
@@ -427,6 +417,14 @@ void KisSelectionActionsPanel::canvasWidgetChanged(KisCanvasWidgetBase* canvas)
}
}
+void KisSelectionActionsPanel::updatePositioning()
+{
+ if (d->m_visible) {
+ d->m_dragHandle.position = currentTopLeftPosition();
+ movePanelWidgets();
+ }
+}
+
QPoint KisSelectionActionsPanel::clipPositionToCanvasBoundaries(QPoint position, QWidget *canvasWidget) const
{
QRect canvasBounds = canvasWidget->rect();
@@ -725,7 +723,8 @@ bool KisSelectionActionsPanel::handleMove(QEvent *event, const QPoint &pos)
QPoint newPos = pos - d->m_dragHandle.dragOrigin;
d->m_dragHandle.dragOffset = newPos;
- movePanelWidgets();
+ updatePositioning();
+
canvasWidget->update();
event->accept();
return true;
@@ -867,26 +866,16 @@ void KisSelectionActionsPanel::configChanged(bool skipResettingOffset)
silentCfg.writeEntry(d->dragOffsetConfigName, QPoint());
}
- if (d->behavior == Behavior::Fixed) {
- d->m_dragHandle.position = currentTopLeftPosition();
- movePanelWidgets();
- }
-
if (d->sapPinButtonIndex >= 0 && d->m_buttons[d->sapPinButtonIndex] && d->m_buttons[d->sapPinButtonIndex]->isCheckable()) {
d->m_buttons[d->sapPinButtonIndex]->setChecked(cfg.selectionActionBarBehavior() == Behavior::Fixed);
}
+
+ updatePositioning();
}
void KisSelectionActionsPanel::canvasStateChanged()
{
- if (d->behavior == Behavior::Fixed) {
- d->m_dragHandle.position = currentTopLeftPosition();
- } else {
- d->m_dragHandle.position = currentTopLeftPosition();
- d->m_dragHandle.position = clipPositionToCanvasBoundaries(d->m_dragHandle.position, d->m_viewManager->canvas());
- }
-
- movePanelWidgets();
+ updatePositioning();
}
void KisSelectionActionsPanel::themeChanged()
diff --git a/libs/ui/kis_selection_actions_panel.h b/libs/ui/kis_selection_actions_panel.h
index 80da3c7caef..321cb9f62bb 100644
--- a/libs/ui/kis_selection_actions_panel.h
+++ b/libs/ui/kis_selection_actions_panel.h
@@ -50,6 +50,8 @@ public:
void canvasWidgetChanged(KisCanvasWidgetBase* canvas);
+ void updatePositioning();
+
private Q_SLOTS:
void showContextMenu(const QPoint& pos);
void disableSelectionActionsPanel();
diff --git a/libs/ui/kis_selection_decoration.cc b/libs/ui/kis_selection_decoration.cc
index b1120652649..c104d9673b2 100644
--- a/libs/ui/kis_selection_decoration.cc
+++ b/libs/ui/kis_selection_decoration.cc
@@ -159,6 +159,7 @@ void KisSelectionDecoration::selectionChanged()
if (!selection && !selectionIsActive()) {
m_selectionActionsPanel->setVisible(false);
}
+ m_selectionActionsPanel->updatePositioning();
}
void KisSelectionDecoration::slotStartUpdateSelection()