import json
import logging
from pathlib import Path
from typing import List, Optional
from jdxi_editor.jdxi.program.program import JDXiProgram
from jdxi_editor.project import __package_name__
[docs]
log = logging.getLogger(__name__)
[docs]
class JDXiProgramManager:
[docs]
USER_PROGRAMS_FILE = None
[docs]
ROM_PROGRAMS = [] # Assuming ROM_PROGRAMS is defined elsewhere
@classmethod
[docs]
def setup(cls) -> None:
json_folder = Path.home() / f".{__package_name__}"
json_folder.mkdir(parents=True, exist_ok=True)
cls.USER_PROGRAMS_FILE = str(json_folder / "user_programs.json")
@classmethod
[docs]
def _load_programs(cls) -> List:
try:
with open(cls.USER_PROGRAMS_FILE, "r") as f:
data = json.load(f)
return [JDXiProgram.from_dict(d) for d in data]
except FileNotFoundError:
log.error("User programs file not found, starting with ROM programs only.")
return []
@property
[docs]
def PROGRAM_LIST(cls) -> List:
return cls.ROM_PROGRAMS + cls._load_programs()
@classmethod
[docs]
def add_program(cls, program: JDXiProgram) -> None:
programs = cls._load_programs()
programs.append(program)
cls.save_to_file()
@classmethod
[docs]
def save_to_file(cls, filepath: Optional[str] = None) -> None:
filepath = filepath or cls.USER_PROGRAMS_FILE
with open(filepath, "w") as f:
json.dump([p.to_dict() for p in cls._load_programs()], f, indent=2)
@classmethod
[docs]
def load_from_file(
cls, filepath: Optional[str] = None, append: bool = True
) -> None:
filepath = filepath or cls.USER_PROGRAMS_FILE
with open(filepath, "r") as f:
data = json.load(f)
new_programs = [JDXiProgram.from_dict(d) for d in data]
if append:
cls.ROM_PROGRAMS += new_programs