Properly completed drag to paint (no more just clicking points).

The most important thing to make it work is actually notifying the scene that something has changed -- the rest are just refactorings and (hopefully) optimizations.

part of CURA-12543
This commit is contained in:
Remco Burema 2025-05-27 17:03:38 +02:00
parent 33b5918acd
commit 704f9453f0
2 changed files with 26 additions and 24 deletions

View File

@ -1,11 +1,10 @@
# Copyright (c) 2025 UltiMaker # Copyright (c) 2025 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher. # Cura is released under the terms of the LGPLv3 or higher.
from copy import deepcopy
from typing import cast, Optional
import numpy import numpy
from PyQt6.QtCore import Qt from PyQt6.QtCore import Qt
from typing import Dict, List, Tuple from typing import cast, Dict, List, Optional, Tuple
from UM.Application import Application from UM.Application import Application
from UM.Event import Event, MouseEvent, KeyEvent from UM.Event import Event, MouseEvent, KeyEvent
@ -14,6 +13,7 @@ from UM.Scene.SceneNode import SceneNode
from UM.Scene.Selection import Selection from UM.Scene.Selection import Selection
from UM.Tool import Tool from UM.Tool import Tool
from UM.View.View import View from UM.View.View import View
from cura.PickingPass import PickingPass from cura.PickingPass import PickingPass
@ -44,7 +44,7 @@ class PaintTool(Tool):
self._brush_shape: str = "A" self._brush_shape: str = "A"
self._mouse_held: bool = False self._mouse_held: bool = False
self._mouse_drags: List[Tuple[int, int]] = [] self._last_mouse_drag: Optional[Tuple[int, int]] = None
def setPaintType(self, paint_type: str) -> None: def setPaintType(self, paint_type: str) -> None:
Logger.warning(f"TODO: Implement paint-types ({paint_type}).") Logger.warning(f"TODO: Implement paint-types ({paint_type}).")
@ -52,7 +52,6 @@ class PaintTool(Tool):
def setBrushSize(self, brush_size: float) -> None: def setBrushSize(self, brush_size: float) -> None:
self._brush_size = int(brush_size) self._brush_size = int(brush_size)
print(self._brush_size)
def setBrushColor(self, brush_color: str) -> None: def setBrushColor(self, brush_color: str) -> None:
self._brush_color = brush_color self._brush_color = brush_color
@ -89,8 +88,8 @@ class PaintTool(Tool):
def _getBrushPixels(self, mid_x: float, mid_y: float, w: float, h: float) -> List[Tuple[float, float]]: def _getBrushPixels(self, mid_x: float, mid_y: float, w: float, h: float) -> List[Tuple[float, float]]:
res = [] res = []
include = False include = False
for y in range(-self._brush_size, self._brush_size + 1): for y in range(-self._brush_size//2, (self._brush_size + 1)//2):
for x in range(-self._brush_size, self._brush_size + 1): for x in range(-self._brush_size//2, (self._brush_size + 1)//2):
match self._brush_shape: match self._brush_shape:
case "A": case "A":
include = True include = True
@ -160,10 +159,24 @@ class PaintTool(Tool):
if event.type == Event.MouseReleaseEvent and self._controller.getToolsEnabled(): if event.type == Event.MouseReleaseEvent and self._controller.getToolsEnabled():
if MouseEvent.LeftButton not in cast(MouseEvent, event).buttons: if MouseEvent.LeftButton not in cast(MouseEvent, event).buttons:
return False return False
self._mouse_held = False self._mouse_held = False
drags = self._mouse_drags.copy() self._last_mouse_drag = None
self._mouse_drags.clear() return True
is_moved = event.type == Event.MouseMoveEvent
is_pressed = event.type == Event.MousePressEvent
if (is_moved or is_pressed) and self._controller.getToolsEnabled():
if is_moved and not self._mouse_held:
return False
evt = cast(MouseEvent, event)
if is_pressed:
if MouseEvent.LeftButton not in evt.buttons:
return False
else:
self._mouse_held = True
drags = ([self._last_mouse_drag] if self._last_mouse_drag else []) + [(evt.x, evt.y)]
self._last_mouse_drag = (evt.x, evt.y)
paintview = controller.getActiveView() paintview = controller.getActiveView()
if paintview is None or paintview.getPluginId() != "PaintTool": if paintview is None or paintview.getPluginId() != "PaintTool":
@ -203,19 +216,8 @@ class PaintTool(Tool):
res = False res = False
for (x, y) in drags: for (x, y) in drags:
res |= self._handleMouseAction(node, paintview, x, y) res |= self._handleMouseAction(node, paintview, x, y)
if res:
Application.getInstance().getController().getScene().sceneChanged.emit(node)
return res return res
if event.type == Event.MousePressEvent and self._controller.getToolsEnabled():
if MouseEvent.LeftButton not in cast(MouseEvent, event).buttons:
return False
self._mouse_held = True
return True
if event.type == Event.MouseMoveEvent:
if not self._mouse_held:
return False
evt = cast(MouseEvent, event)
self._mouse_drags.append((evt.x, evt.y))
return True
return False return False

View File

@ -164,7 +164,7 @@ Item
id: shapeSizeSlider id: shapeSizeSlider
from: 1 from: 1
to: 50 to: 40
value: 10 value: 10
onPressedChanged: function(pressed) onPressedChanged: function(pressed)