added autosave + dirty status

This commit is contained in:
Louis Heredero 2024-07-02 00:00:48 +02:00
parent 691cb7da73
commit b9bcbf829d
Signed by: HEL
GPG Key ID: 8D83DE470F8544E7

View File

@ -11,10 +11,16 @@ from src.graph.graph import Graph
class Editor: class Editor:
APP_NAME: str = "lycacraft-paths"
APP_AUTHOR: str = "Lycacraft"
WIDTH: int = 800 WIDTH: int = 800
HEIGHT: int = 600 HEIGHT: int = 600
MAP_SIZE: int = 1024 MAP_SIZE: int = 1024
MAPS_DIR: str = os.path.join(platformdirs.user_cache_dir(appname="lycacraft-paths", appauthor="Lycacraft"), "maps") CACHE_DIR: str = platformdirs.user_cache_dir(appname=APP_NAME, appauthor=APP_AUTHOR)
MAPS_DIR: str = os.path.join(CACHE_DIR, "maps")
AUTOSAVE_PATH: str = os.path.join(CACHE_DIR, "AUTOSAVE.txt")
AUTOSAVE_INTERVAL: int = 5 * 60 * 1000
AUTOSAVE_EVENT: int = pygame.event.custom_type()
ZOOMS: tuple[float] = (0.25, 0.5, 1, 2, 4) ZOOMS: tuple[float] = (0.25, 0.5, 1, 2, 4)
CROSSHAIR_SIZE: int = 10 CROSSHAIR_SIZE: int = 10
@ -51,11 +57,16 @@ class Editor:
self.selection_rectangle: list[tuple[int, int], tuple[int, int]] = None self.selection_rectangle: list[tuple[int, int], tuple[int, int]] = None
self.original_move_pos: tuple[int, int] = None self.original_move_pos: tuple[int, int] = None
self.move_old_poses: dict[int, tuple[int, int]] = None self.move_old_poses: dict[int, tuple[int, int]] = None
self.dirty: bool = False
pygame.time.set_timer(self.AUTOSAVE_EVENT, self.AUTOSAVE_INTERVAL)
def mainloop(self) -> None: def mainloop(self) -> None:
self.state = State.LOADING self.state = State.LOADING
while self.state != State.STOPPING: while self.state != State.STOPPING:
pygame.display.set_caption(f"Lycacraft Map Editor - {self.clock.get_fps():.2f}fps") caption = f"Lycacraft Map Editor - {self.clock.get_fps():.2f}fps"
if self.dirty:
caption += " (unsaved)"
pygame.display.set_caption(caption)
self.process_events() self.process_events()
if self.state == State.LOADING: if self.state == State.LOADING:
self.render_loading() self.render_loading()
@ -104,9 +115,9 @@ class Editor:
elif event.key == pygame.K_BACKSPACE: elif event.key == pygame.K_BACKSPACE:
self.deleted_selected_objects() self.deleted_selected_objects()
elif event.key == pygame.K_s and event.mod & (pygame.KMOD_CTRL | pygame.KMOD_META): elif event.key == pygame.K_s and event.mod & (pygame.KMOD_CTRL | pygame.KMOD_META):
self.graph.save(input("Save as: ")) self.save()
elif event.key == pygame.K_l and event.mod & (pygame.KMOD_CTRL | pygame.KMOD_META): elif event.key == pygame.K_l and event.mod & (pygame.KMOD_CTRL | pygame.KMOD_META):
self.graph = Graph.load(input("Load from: ")) self.load()
elif event.key == pygame.K_RETURN: elif event.key == pygame.K_RETURN:
if len(self.selected_nodes) > 0: if len(self.selected_nodes) > 0:
self.typing_text = "" if len(self.selected_nodes) > 1 else self.graph.nodes[self.selected_nodes[0]].name self.typing_text = "" if len(self.selected_nodes) > 1 else self.graph.nodes[self.selected_nodes[0]].name
@ -144,6 +155,8 @@ class Editor:
self.confirm_move_poses() self.confirm_move_poses()
elif self.selection_rectangle != None: elif self.selection_rectangle != None:
self.release_selection_rect(keys[pygame.K_LSHIFT] or keys[pygame.K_RSHIFT]) self.release_selection_rect(keys[pygame.K_LSHIFT] or keys[pygame.K_RSHIFT])
elif event.type == self.AUTOSAVE_EVENT:
self.graph.save(self.AUTOSAVE_PATH)
if keys[pygame.K_LEFT]: if keys[pygame.K_LEFT]:
self.center[0] -= 4 / self.zoom self.center[0] -= 4 / self.zoom
@ -417,18 +430,21 @@ class Editor:
self.selected_edges = [] self.selected_edges = []
def rename_nodes(self) -> None: def rename_nodes(self) -> None:
self.dirty = True
for node in self.selected_nodes: for node in self.selected_nodes:
self.graph.nodes[node].rename_node(self.typing_text) self.graph.nodes[node].rename_node(self.typing_text)
self.typing_text = "" self.typing_text = ""
self.is_renaming_node = False self.is_renaming_node = False
def create_node(self, pos, typing_text = "") -> None: def create_node(self, pos, typing_text = "") -> None:
self.dirty = True
self.graph.add_node(pos[0], pos[1], typing_text) self.graph.add_node(pos[0], pos[1], typing_text)
if len(self.selected_nodes) == 1: if len(self.selected_nodes) == 1:
self.previously_created_nodes.append(self.selected_nodes[0]) self.previously_created_nodes.append(self.selected_nodes[0])
self.select_node(self.graph.number_of_nodes() - 1) self.select_node(self.graph.number_of_nodes() - 1)
def create_edge(self, node_1: int, node_2: int) -> None: def create_edge(self, node_1: int, node_2: int) -> None:
self.dirty = True
self.graph.add_edge(node_1, node_2) self.graph.add_edge(node_1, node_2)
def get_hovering_nodes(self) -> tuple[list[int], list[float]]: def get_hovering_nodes(self) -> tuple[list[int], list[float]]:
@ -505,6 +521,7 @@ class Editor:
return ((px - node_pos[0]) ** 2 + (pz - node_pos[1]) ** 2) ** 0.5 return ((px - node_pos[0]) ** 2 + (pz - node_pos[1]) ** 2) ** 0.5
def deleted_selected_objects(self): def deleted_selected_objects(self):
self.dirty = True
edges_to_delete = [self.graph.edges[i] for i in self.selected_edges] edges_to_delete = [self.graph.edges[i] for i in self.selected_edges]
nodes_to_delete = [self.graph.nodes[i] for i in self.selected_nodes] nodes_to_delete = [self.graph.nodes[i] for i in self.selected_nodes]
for edge in edges_to_delete: for edge in edges_to_delete:
@ -582,6 +599,13 @@ class Editor:
self.original_move_pos = None self.original_move_pos = None
self.move_old_poses = None self.move_old_poses = None
def save(self) -> None:
self.graph.save(input("Save as: "))
self.dirty = False
def load(self) -> None:
self.graph = Graph.load(input("Load from: "))
self.dirty = False
class State(Enum): class State(Enum):