67 lines
2.4 KiB
Python
67 lines
2.4 KiB
Python
"""Image picker widget for macro image selection."""
|
|
|
|
import tkinter as tk
|
|
from tkinter import filedialog
|
|
from utils.image_converter import copy_image_to_appdata, create_preview
|
|
|
|
|
|
class ImagePicker(tk.Frame):
|
|
"""Widget for selecting and previewing a macro image."""
|
|
|
|
def __init__(self, parent, on_change=None):
|
|
super().__init__(parent, bg="#2D2D3D")
|
|
self.on_change = on_change
|
|
self.image_path = None
|
|
self._preview = None
|
|
|
|
self._build_ui()
|
|
|
|
def _build_ui(self):
|
|
tk.Label(self, text="Routine Image:", bg="#2D2D3D", fg="white",
|
|
font=("Segoe UI", 9, "bold")).pack(anchor="w", padx=8, pady=(8, 2))
|
|
|
|
self.preview_label = tk.Label(self, bg="#1E1E2E", width=128, height=128,
|
|
relief="sunken", borderwidth=1)
|
|
self.preview_label.pack(padx=8, pady=4)
|
|
|
|
btn_frame = tk.Frame(self, bg="#2D2D3D")
|
|
btn_frame.pack(fill="x", padx=8, pady=4)
|
|
|
|
tk.Button(btn_frame, text="Choose Image", bg="#3D3D5C", fg="white",
|
|
font=("Segoe UI", 8), relief="flat",
|
|
command=self._choose_image).pack(side="left", fill="x", expand=True, padx=2)
|
|
tk.Button(btn_frame, text="Clear", bg="#7F8C8D", fg="white",
|
|
font=("Segoe UI", 8), relief="flat",
|
|
command=self._clear_image).pack(side="left", padx=2)
|
|
|
|
def set_image(self, path):
|
|
self.image_path = path
|
|
if path:
|
|
try:
|
|
self._preview = create_preview(path)
|
|
self.preview_label.config(image=self._preview, text="")
|
|
except Exception:
|
|
self.preview_label.config(image="", text="Error loading image",
|
|
fg="#FF4444")
|
|
else:
|
|
self._preview = None
|
|
self.preview_label.config(image="", text="No image", fg="#666666")
|
|
|
|
def _choose_image(self):
|
|
path = filedialog.askopenfilename(
|
|
title="Select Routine Image",
|
|
filetypes=[("Images", "*.png *.jpg *.jpeg *.bmp *.gif"), ("All", "*.*")],
|
|
)
|
|
if path:
|
|
saved = copy_image_to_appdata(path)
|
|
self.image_path = saved
|
|
self.set_image(saved)
|
|
if self.on_change:
|
|
self.on_change(saved)
|
|
|
|
def _clear_image(self):
|
|
self.image_path = None
|
|
self.set_image(None)
|
|
if self.on_change:
|
|
self.on_change(None)
|