58 lines
1.9 KiB
Python
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"]
|