Toolbar: pane toggle + tidy buttons, tooltips on every icon

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-09-08 18:25:44 +03:00
co-authored by Claude Opus 4.6
parent 1546c1c8e0
commit da0e18a9c3
2 changed files with 69 additions and 10 deletions
+1 -1
View File
@@ -8,7 +8,7 @@ so later rebinding would only ever be seen by the module that did it.
import configparser import configparser
import os import os
VERSION = "0.0.0.057" VERSION = "0.0.0.058"
PROPERTIES_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "editor.properties") PROPERTIES_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "editor.properties")
DEFAULT_GRID_SIZE = 10 DEFAULT_GRID_SIZE = 10
DEFAULT_ADD_TIMESTAMP = True DEFAULT_ADD_TIMESTAMP = True
+68 -9
View File
@@ -28,6 +28,36 @@ TREE_MIN_COLUMN_WIDTH = 40
# panes in proportion to their weights. Left at the ten-row default the palette asked for # panes in proportion to their weights. Left at the ten-row default the palette asked for
# so much that the tree, carrying the larger weight, gave up all of its height first. # so much that the tree, carrying the larger weight, gave up all of its height first.
TREE_REQUESTED_ROWS = 6 TREE_REQUESTED_ROWS = 6
class _ToolTip:
"""Minimal hover tooltip for toolbar widgets."""
def __init__(self, widget, text):
self._widget = widget
self._text = text
self._tw = None
widget.bind("<Enter>", self._show, add="+")
widget.bind("<Leave>", self._hide, add="+")
def _show(self, _event=None):
x = self._widget.winfo_rootx() + self._widget.winfo_width() // 2
y = self._widget.winfo_rooty() + self._widget.winfo_height() + 4
tw = tk.Toplevel(self._widget)
tw.wm_overrideredirect(True)
tw.wm_geometry(f"+{x}+{y}")
label = tk.Label(
tw, text=self._text, background="#ffffe0", foreground="#000000",
relief="solid", borderwidth=1, padx=4, pady=2,
font=("Segoe UI", 8),
)
label.pack()
self._tw = tw
def _hide(self, _event=None):
if self._tw:
self._tw.destroy()
self._tw = None
PALETTE_REQUESTED_ROWS = 5 PALETTE_REQUESTED_ROWS = 5
# Below this the shortfall is deep enough to shrink the tree past a usable few rows, and # Below this the shortfall is deep enough to shrink the tree past a usable few rows, and
@@ -76,6 +106,7 @@ _history_file_path = None # the file view_history was recorded against
# function that touches them checks first. # function that touches them checks first.
btn_back = None btn_back = None
btn_forward = None btn_forward = None
btn_toggle_pane = None
zoom_label = None zoom_label = None
menu_view = None menu_view = None
show_left_column_var = None show_left_column_var = None
@@ -1278,6 +1309,8 @@ def apply_left_column_visibility():
elif is_shown: elif is_shown:
paned_window.forget(left_pane) paned_window.forget(left_pane)
_sync_pane_toggle_button()
def toggle_left_column(event=None): def toggle_left_column(event=None):
"""Keyboard route to the same toggle. The menu flips the variable for itself.""" """Keyboard route to the same toggle. The menu flips the variable for itself."""
@@ -1287,6 +1320,12 @@ def toggle_left_column(event=None):
return "break" return "break"
def _sync_pane_toggle_button():
"""Update the toggle button icon to reflect the pane state."""
if btn_toggle_pane is not None and show_left_column_var is not None:
btn_toggle_pane.configure(text="◧" if show_left_column_var.get() else "▯")
# --- Sheet view history --- # --- Sheet view history ---
def _tree_item_for_element(element): def _tree_item_for_element(element):
@@ -1904,21 +1943,41 @@ app_state.status_label = status_label
toolbar = ttk.Frame(window) toolbar = ttk.Frame(window)
toolbar.pack(side=tk.TOP, fill=tk.X, padx=8, pady=(4, 0)) toolbar.pack(side=tk.TOP, fill=tk.X, padx=8, pady=(4, 0))
btn_back = ttk.Button(toolbar, text="◀", width=3, command=go_back, state="disabled") # U+25E7: a square with left half filled — suggests a visible side panel.
btn_back.pack(side=tk.LEFT) btn_toggle_pane = ttk.Button(toolbar, text="◧", width=3, command=toggle_left_column)
btn_toggle_pane.pack(side=tk.LEFT)
btn_forward = ttk.Button(toolbar, text="▶", width=3, command=go_forward, state="disabled") _ToolTip(btn_toggle_pane, "Tree / Palette (Ctrl+B)")
btn_forward.pack(side=tk.LEFT, padx=(3, 0))
ttk.Separator(toolbar, orient=tk.VERTICAL).pack(side=tk.LEFT, fill=tk.Y, padx=8, pady=2) ttk.Separator(toolbar, orient=tk.VERTICAL).pack(side=tk.LEFT, fill=tk.Y, padx=8, pady=2)
ttk.Button(toolbar, text="−", width=3, command=do_zoom_out).pack(side=tk.LEFT) btn_back = ttk.Button(toolbar, text="◀", width=3, command=go_back, state="disabled")
btn_back.pack(side=tk.LEFT)
_ToolTip(btn_back, "Back (Alt+Left)")
btn_forward = ttk.Button(toolbar, text="▶", width=3, command=go_forward, state="disabled")
btn_forward.pack(side=tk.LEFT, padx=(3, 0))
_ToolTip(btn_forward, "Forward (Alt+Right)")
ttk.Separator(toolbar, orient=tk.VERTICAL).pack(side=tk.LEFT, fill=tk.Y, padx=8, pady=2)
_btn_zoom_out = ttk.Button(toolbar, text="−", width=3, command=do_zoom_out)
_btn_zoom_out.pack(side=tk.LEFT)
_ToolTip(_btn_zoom_out, "Zoom Out (Ctrl+−)")
zoom_label = ttk.Label(toolbar, text="100%", width=6, anchor="center") zoom_label = ttk.Label(toolbar, text="100%", width=6, anchor="center")
zoom_label.pack(side=tk.LEFT, padx=1) zoom_label.pack(side=tk.LEFT, padx=1)
ttk.Button(toolbar, text="+", width=3, command=do_zoom_in).pack(side=tk.LEFT)
# U+26F6, the four-corners frame every other editor marks "fit to window" with. _btn_zoom_in = ttk.Button(toolbar, text="+", width=3, command=do_zoom_in)
ttk.Button(toolbar, text="⛶", width=3, command=do_zoom_fit).pack(side=tk.LEFT, padx=(3, 0)) _btn_zoom_in.pack(side=tk.LEFT)
_ToolTip(_btn_zoom_in, "Zoom In (Ctrl++)")
_btn_zoom_fit = ttk.Button(toolbar, text="⛶", width=3, command=do_zoom_fit)
_btn_zoom_fit.pack(side=tk.LEFT, padx=(3, 0))
_ToolTip(_btn_zoom_fit, "Zoom to Fit (Ctrl+9)")
_btn_tidy = ttk.Button(toolbar, text="⊞", width=3, command=do_tidy_layout)
_btn_tidy.pack(side=tk.LEFT, padx=(3, 0))
_ToolTip(_btn_tidy, "Tidy Layout (Ctrl+W)")
paned_window = ttk.PanedWindow(window, orient=tk.HORIZONTAL) paned_window = ttk.PanedWindow(window, orient=tk.HORIZONTAL)
paned_window.pack(fill=tk.BOTH, expand=True, padx=5, pady=5) paned_window.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)