[graphics/krita/release/6.0.3] libs/ui: Fix updating positioning in SAP
Dmitry Kazakov <[email protected]>
| Newsgroups | gmane.comp.kde.cvs |
|---|---|
| Message-ID | <[email protected]> |
Git commit 858d352e52e68831693067763b9cdaf8bb9a05ce by Dmitry Kazakov, on behalf of Agata Cacko.
Committed on 26/07/2026 at 10:51.
Pushed by dkazakov into branch 'release/6.0.3'.
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/858d352e52e68831693067763b9cdaf8bb9a05ce
diff --git a/libs/ui/kis_selection_actions_panel.cpp b/libs/ui/kis_selection_actions_panel.cpp
index 8f5d41f5478..b0f74664e9f 100644
--- a/libs/ui/kis_selection_actions_panel.cpp
+++ b/libs/ui/kis_selection_actions_panel.cpp
@@ -179,11 +179,6 @@ void KisSelectionActionsPanel::draw(QPainter &painter)
return;
}
- if (d->m_viewManager->canvas()) {
- d->m_dragHandle.position = currentTopLeftPosition();
- movePanelWidgets();
- }
-
if (d->m_pressed && d->behavior == Behavior::FreeFloating) {
drawAnchorWhileMoving(painter);
}
@@ -208,11 +203,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)
@@ -320,8 +311,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);
@@ -424,6 +414,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();
@@ -715,7 +713,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;
@@ -857,26 +856,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 4d389c110c8..b4984d1c183 100644
--- a/libs/ui/kis_selection_actions_panel.h
+++ b/libs/ui/kis_selection_actions_panel.h
@@ -49,6 +49,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 85d1f4a7579..e262bd243be 100644
--- a/libs/ui/kis_selection_decoration.cc
+++ b/libs/ui/kis_selection_decoration.cc
@@ -154,6 +154,7 @@ void KisSelectionDecoration::selectionChanged()
if (!selection && !selectionIsActive()) {
m_selectionActionsPanel->setVisible(false);
}
+ m_selectionActionsPanel->updatePositioning();
}
void KisSelectionDecoration::slotStartUpdateSelection()