Quellcode für miniworlds.actors.widgets.save
from __future__ import annotations
import logging
import tkinter as tk
from tkinter import filedialog
from typing import TYPE_CHECKING
import miniworlds.actors.widgets.button as widget
if TYPE_CHECKING:
from miniworlds.worlds.world import World
logger = logging.getLogger(__name__)
[Doku]
class SaveButton(widget.Button):
"""Button widget that saves the active world to a sqlite database file."""
def __init__(
self,
world: "World",
text: str,
filename: str | None = None,
img_path: str | None = None,
) -> None:
super().__init__()
if img_path:
self.set_image(img_path)
self.set_text(text)
self.event = "label"
self.data = text
self.world_reference = world
self.app = world.app
self.file = filename
self.actors = None
[Doku]
def on_mouse_left_down(self, mouse_pos: tuple[int, int]) -> None:
"""Open a save dialog if needed and store the active world in a database file."""
current_world = self.app.get_running_world()
if self.file is None:
# Keep the file dialog usable without showing a separate Tk root window.
dialog_root = tk.Tk()
dialog_root.withdraw()
try:
self.file = filedialog.asksaveasfilename(
initialdir="./",
title="Select file",
filetypes=(("db files", "*.db"), ("all files", "*.*")),
)
finally:
dialog_root.destroy()
if not self.file or current_world is None:
return
current_world.save_to_db(self.file)
current_world.send_message("Saved new world", self.file)
logger.info("Saved active world to database file %s", self.file)