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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user