Add zoom support to OxPage editor with 50% default

Toolbar zoom buttons (in/out/reset/fit) and Ctrl+MouseWheel now
control the page editor canvas when it is active. Frame image is
scaled via PIL for smooth rendering at any zoom level.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-09-22 23:19:13 +03:00
co-authored by Claude Opus 4.6
parent 74c169a401
commit b0eb859f32
3 changed files with 148 additions and 25 deletions
+28 -3
View File
@@ -366,6 +366,7 @@ def show_ox_page_view(comp):
)
ox_page_panel.frame.pack(fill=tk.BOTH, expand=True)
record_visit(VIEW_PAGE, comp)
update_zoom_label()
app_state.set_status(f"Page Editor: {comp.get('name', '?')}")
@@ -377,6 +378,7 @@ def dismiss_ox_page_view(restore_canvas=True):
ox_page_panel.destroy()
ox_page_panel = None
update_zoom_label()
if restore_canvas:
_give_editor_pane_back()
@@ -617,7 +619,11 @@ def do_tidy_layout(event=None):
def update_zoom_label():
"""Puts the painted scale on the toolbar as a percentage."""
if zoom_label is not None:
if zoom_label is None:
return
if ox_page_panel is not None:
zoom_label.config(text=f"{round(ox_page_panel.zoom * 100)}%")
else:
zoom_label.config(text=f"{round(app_state.zoom * 100)}%")
@@ -655,16 +661,28 @@ def zoom_to(level, anchor=None):
def do_zoom_in(event=None):
if ox_page_panel is not None:
ox_page_panel.set_zoom(ox_page_panel.zoom_step(1))
update_zoom_label()
return "break"
zoom_to(wiresheet.zoom_step(1))
return "break"
def do_zoom_out(event=None):
if ox_page_panel is not None:
ox_page_panel.set_zoom(ox_page_panel.zoom_step(-1))
update_zoom_label()
return "break"
zoom_to(wiresheet.zoom_step(-1))
return "break"
def do_zoom_reset(event=None):
if ox_page_panel is not None:
ox_page_panel.set_zoom(1.0)
update_zoom_label()
return "break"
zoom_to(1.0)
return "break"
@@ -675,6 +693,15 @@ def do_zoom_fit(event=None):
The fitted scale is not one of the ladder's, so the percentage on the toolbar is
where it is read off; stepping in or out from there rejoins the ladder.
"""
if ox_page_panel is not None:
level = ox_page_panel.fit_zoom_level()
if level is None:
app_state.set_status("Cannot fit — page editor canvas not ready.")
return "break"
ox_page_panel.set_zoom(level)
update_zoom_label()
return "break"
canvas = app_state.canvas
level = wiresheet.fit_zoom_level()
bounds = wiresheet.sheet_content_bounds()
@@ -686,8 +713,6 @@ def do_zoom_fit(event=None):
applied = wiresheet.set_zoom(level)
update_zoom_label()
# Bring the sheet's own top-left corner to the top-left of the view, since a fitted
# sheet is measured from there rather than from the canvas origin.
region = str(canvas.cget("scrollregion")).split()
if len(region) == 4:
span_x = float(region[2]) or 1.0