58 lines
1.8 KiB
Python
58 lines
1.8 KiB
Python
import tkinter as tk
|
|
from typing import TYPE_CHECKING, Dict, Iterable, Set
|
|
|
|
if TYPE_CHECKING:
|
|
from core.gui.graph.graph import CanvasGraph
|
|
|
|
|
|
class CanvasLayers:
|
|
def __init__(self, canvas: "CanvasGraph"):
|
|
self.canvas: "CanvasGraph" = canvas
|
|
self.layers: Dict[str, Set[int]] = {}
|
|
self.hidden: Set[str] = set()
|
|
|
|
def names(self) -> Iterable[str]:
|
|
return self.layers.keys()
|
|
|
|
def add_layer(self, name: str) -> bool:
|
|
if name in self.layers:
|
|
return False
|
|
else:
|
|
self.layers[name] = set()
|
|
return True
|
|
|
|
def delete_layer(self, name: str) -> None:
|
|
items = self.layers.pop(name, set())
|
|
hidden_items = self.all_hidden()
|
|
items -= hidden_items
|
|
self.canvas.config(items, state=tk.NORMAL)
|
|
|
|
def add_item(self, name: str, item: int) -> None:
|
|
if name in self.layers:
|
|
self.layers[name].add(item)
|
|
if name in self.hidden:
|
|
self.canvas.config(item, state=tk.HIDDEN)
|
|
|
|
def delete_item(self, name: str, item: int) -> None:
|
|
if name in self.layers:
|
|
self.layers[name].remove(item)
|
|
hidden_items = self.all_hidden()
|
|
if item not in hidden_items:
|
|
self.canvas.config(item, state=tk.NORMAL)
|
|
|
|
def toggle_layer(self, name: str) -> None:
|
|
items = self.layers[name]
|
|
if name in self.hidden:
|
|
self.hidden.remove(name)
|
|
hidden_items = self.all_hidden()
|
|
items -= hidden_items
|
|
self.canvas.config(items, state=tk.NORMAL)
|
|
else:
|
|
self.hidden.add(name)
|
|
self.canvas.config(items, state=tk.HIDDEN)
|
|
|
|
def all_hidden(self) -> Set[int]:
|
|
items = set()
|
|
for name in self.hidden:
|
|
items |= self.layers[name]
|
|
return items
|