114 lines
4.0 KiB
Python
114 lines
4.0 KiB
Python
# target_simulator/gui/scenario_controls_frame.py
|
|
|
|
"""
|
|
A frame containing widgets for managing scenarios.
|
|
"""
|
|
|
|
import tkinter as tk
|
|
from tkinter import ttk, simpledialog, messagebox
|
|
from typing import Callable, List
|
|
|
|
class ScenarioControlsFrame(ttk.LabelFrame):
|
|
"""Frame for scenario management controls."""
|
|
|
|
def __init__(self, master, *,
|
|
load_scenario_command: Callable[[str], None],
|
|
save_as_command: Callable[[str], None],
|
|
update_command: Callable[[str], None],
|
|
delete_command: Callable[[str], None]):
|
|
super().__init__(master, text="Scenario Controls")
|
|
|
|
self._load_scenario_command = load_scenario_command
|
|
self._save_as_command = save_as_command
|
|
self._update_command = update_command
|
|
self._delete_command = delete_command
|
|
|
|
self.current_scenario = tk.StringVar()
|
|
|
|
# --- Widgets ---
|
|
top_frame = ttk.Frame(self)
|
|
top_frame.pack(fill=tk.X, padx=5, pady=(5, 2))
|
|
|
|
scenario_label = ttk.Label(top_frame, text="Scenario:")
|
|
scenario_label.pack(side=tk.LEFT, padx=(0, 5))
|
|
|
|
self.scenario_combobox = ttk.Combobox(
|
|
top_frame,
|
|
textvariable=self.current_scenario,
|
|
state="readonly"
|
|
)
|
|
self.scenario_combobox.pack(side=tk.LEFT, expand=True, fill=tk.X)
|
|
self.scenario_combobox.bind("<<ComboboxSelected>>", self._on_scenario_select)
|
|
|
|
button_frame = ttk.Frame(self)
|
|
button_frame.pack(fill=tk.X, padx=5, pady=5)
|
|
|
|
self.save_as_button = ttk.Button(
|
|
button_frame, text="Save As...", command=self._on_save_as
|
|
)
|
|
self.save_as_button.pack(side=tk.LEFT, padx=(0, 5))
|
|
|
|
self.update_button = ttk.Button(
|
|
button_frame, text="Update", command=self._on_update
|
|
)
|
|
self.update_button.pack(side=tk.LEFT, padx=5)
|
|
|
|
self.delete_button = ttk.Button(
|
|
button_frame, text="Delete", command=self._on_delete
|
|
)
|
|
self.delete_button.pack(side=tk.LEFT, padx=5)
|
|
|
|
def _on_scenario_select(self, event):
|
|
"""Callback for when a scenario is selected from the combobox."""
|
|
scenario_name = self.current_scenario.get()
|
|
if scenario_name:
|
|
self._load_scenario_command(scenario_name)
|
|
|
|
def _on_save_as(self):
|
|
"""Handle the 'Save As' button click."""
|
|
scenario_name = simpledialog.askstring(
|
|
"Save Scenario As",
|
|
"Enter a name for the new scenario:",
|
|
parent=self
|
|
)
|
|
if scenario_name:
|
|
self._save_as_command(scenario_name)
|
|
|
|
def _on_update(self):
|
|
"""Handle the 'Update' button click."""
|
|
scenario_name = self.current_scenario.get()
|
|
if not scenario_name:
|
|
messagebox.showwarning("No Scenario Selected", "Please select a scenario to update.", parent=self)
|
|
return
|
|
self._update_command(scenario_name)
|
|
|
|
def _on_delete(self):
|
|
"""Handle the 'Delete' button click."""
|
|
scenario_name = self.current_scenario.get()
|
|
if not scenario_name:
|
|
messagebox.showwarning("No Scenario Selected", "Please select a scenario to delete.", parent=self)
|
|
return
|
|
|
|
if messagebox.askyesno(
|
|
"Confirm Delete",
|
|
f"Are you sure you want to delete the scenario '{scenario_name}'?",
|
|
parent=self
|
|
):
|
|
self._delete_command(scenario_name)
|
|
|
|
def update_scenario_list(self, scenarios: List[str], select_scenario: str = None):
|
|
"""
|
|
Updates the list of scenarios in the combobox.
|
|
|
|
Args:
|
|
scenarios: A list of scenario names.
|
|
select_scenario: The name of the scenario to select after updating, if any.
|
|
"""
|
|
self.scenario_combobox['values'] = scenarios
|
|
if select_scenario and select_scenario in scenarios:
|
|
self.current_scenario.set(select_scenario)
|
|
elif scenarios:
|
|
self.current_scenario.set(scenarios[0]) # Select the first one
|
|
else:
|
|
self.current_scenario.set("")
|