ICRA/colorcalc/exclusions.py

58 lines
1.9 KiB
Python

"""Mouse handlers for exclusion rectangles."""
from __future__ import annotations
class ExclusionMixin:
"""Manage exclusion rectangles drawn on the preview canvas."""
def _exclude_start(self, event):
if self.preview_img is None:
return
x = max(0, min(self.preview_img.width - 1, int(event.x)))
y = max(0, min(self.preview_img.height - 1, int(event.y)))
self._rubber_start = (x, y)
if self._rubber_id:
try:
self.canvas_orig.delete(self._rubber_id)
except Exception:
pass
self._rubber_id = self.canvas_orig.create_rectangle(x, y, x, y, outline="yellow", width=2)
def _exclude_drag(self, event):
if not self._rubber_start:
return
x0, y0 = self._rubber_start
x1 = max(0, min(self.preview_img.width - 1, int(event.x)))
y1 = max(0, min(self.preview_img.height - 1, int(event.y)))
self.canvas_orig.coords(self._rubber_id, x0, y0, x1, y1)
def _exclude_end(self, event):
if not self._rubber_start:
return
x0, y0 = self._rubber_start
x1 = max(0, min(self.preview_img.width - 1, int(event.x)))
y1 = max(0, min(self.preview_img.height - 1, int(event.y)))
rx0, rx1 = sorted((x0, x1))
ry0, ry1 = sorted((y0, y1))
if (rx1 - rx0) > 0 and (ry1 - ry0) > 0:
self.exclude_rects.append((rx0, ry0, rx1, ry1))
self._rubber_start = None
self._rubber_id = None
self.update_preview()
def clear_excludes(self):
self.exclude_rects = []
self.canvas_orig.delete("all")
if self.preview_tk:
self.canvas_orig.create_image(0, 0, anchor="nw", image=self.preview_tk)
self.update_preview()
def undo_exclude(self):
if self.exclude_rects:
self.exclude_rects.pop()
self.update_preview()
__all__ = ["ExclusionMixin"]