3 Commits

Author SHA1 Message Date
6d46d9a9a5 userconfigs now returns target.configs
patch bump
2023-07-08 00:22:07 +01:00
e4068277f7 ensure we don't attempt to delete a menu key twice
patch bump
2023-07-07 03:37:06 +01:00
674999a461 remove callbacks instead
patch bump
2023-06-30 04:27:10 +01:00
4 changed files with 62 additions and 77 deletions

View File

@@ -1,6 +1,6 @@
[tool.poetry] [tool.poetry]
name = "voicemeeter-compact" name = "voicemeeter-compact"
version = "1.8.1" version = "1.8.4"
description = "A Compact Voicemeeter Remote App" description = "A Compact Voicemeeter Remote App"
authors = ["onyx-and-iris <code@onyxandiris.online>"] authors = ["onyx-and-iris <code@onyxandiris.online>"]
license = "MIT" license = "MIT"

View File

@@ -123,7 +123,7 @@ class App(tk.Tk):
Destroy all top level frames. Destroy all top level frames.
""" """
self.target.subject.remove(self) self.target.subject.remove([self.on_pdirty, self.on_ldirty])
self.subject.clear() self.subject.clear()
[ [
frame.destroy() frame.destroy()
@@ -145,7 +145,7 @@ class App(tk.Tk):
@cached_property @cached_property
def userconfigs(self): def userconfigs(self):
self._configs = loader(self.kind.name) self._configs = loader(self.kind.name, self.target)
return self._configs return self._configs

View File

@@ -10,28 +10,32 @@ logger = logging.getLogger(__name__)
configuration = {} configuration = {}
configpaths = [
Path.cwd() / "configs",
Path.home() / ".config" / "vm-compact" / "configs",
Path.home() / "Documents" / "Voicemeeter" / "configs",
]
for configpath in configpaths:
if configpath.is_dir():
filepaths = list(configpath.glob("*.toml"))
if any(f.stem in ("app", "vban") for f in filepaths):
configs = {}
for filepath in filepaths:
filename = filepath.with_suffix("").stem
if filename in ("app", "vban"):
try:
with open(filepath, "rb") as f:
configs[filename] = tomllib.load(f)
logger.info(f"configuration: {filename} loaded into memory")
except tomllib.TOMLDecodeError:
logger.error(f"Invalid TOML config: configs/{filename.stem}")
configuration |= configs def get_configpath():
break configpaths = [
Path.cwd() / "configs",
Path.home() / ".config" / "vm-compact" / "configs",
Path.home() / "Documents" / "Voicemeeter" / "configs",
]
for configpath in configpaths:
if configpath.exists():
return configpath
if configpath := get_configpath():
filepaths = list(configpath.glob("*.toml"))
if any(f.stem in ("app", "vban") for f in filepaths):
configs = {}
for filepath in filepaths:
filename = filepath.with_suffix("").stem
if filename in ("app", "vban"):
try:
with open(filepath, "rb") as f:
configs[filename] = tomllib.load(f)
logger.info(f"configuration: {filename} loaded into memory")
except tomllib.TOMLDecodeError:
logger.error(f"Invalid TOML config: configs/{filename.stem}")
configuration |= configs
_defaults = { _defaults = {
"configs": { "configs": {
@@ -75,17 +79,20 @@ def get_configuration(key):
return configuration[key] return configuration[key]
def loader(kind_id): def loader(kind_id, target):
configs = {} configs = {"reset": target.configs["reset"]}
userconfigpath = Path.home() / ".config" / "vm-compact" / "configs" / kind_id if configpath := get_configpath():
if userconfigpath.exists(): userconfigpath = configpath / kind_id
filepaths = list(userconfigpath.glob("*.toml")) if userconfigpath.exists():
for filepath in filepaths: filepaths = list(userconfigpath.glob("*.toml"))
identifier = filepath.with_suffix("").stem for filepath in filepaths:
try: identifier = filepath.with_suffix("").stem
with open(filepath, "rb") as f: try:
configs[identifier] = tomllib.load(f) with open(filepath, "rb") as f:
logger.info(f"loader: {identifier} loaded into memory") configs[identifier] = tomllib.load(f)
except tomllib.TOMLDecodeError: logger.info(f"loader: {identifier} loaded into memory")
logger.error(f"Invalid TOML config: configs/{filename.stem}") except tomllib.TOMLDecodeError:
return configs logger.error(f"Invalid TOML config: configs/{filename.stem}")
target.configs = configs
return target.configs

View File

@@ -85,24 +85,16 @@ class Menus(tk.Menu):
self.menu_configs_load = tk.Menu(self.menu_configs, tearoff=0) self.menu_configs_load = tk.Menu(self.menu_configs, tearoff=0)
self.menu_configs.add_cascade(menu=self.menu_configs_load, label="Load config") self.menu_configs.add_cascade(menu=self.menu_configs_load, label="Load config")
self.config_defaults = {"reset"} self.config_defaults = {"reset"}
if len(self.target.configs) > len(self.config_defaults) and all( if len(self.parent.userconfigs) > len(self.config_defaults) and all(
key in self.target.configs for key in self.config_defaults key in self.parent.userconfigs for key in self.config_defaults
): ):
[ [
self.menu_configs_load.add_command( self.menu_configs_load.add_command(
label=profile, command=partial(self.load_profile, profile) label=profile, command=partial(self.load_profile, profile)
) )
for profile in self.target.configs.keys() for profile in self.parent.userconfigs.keys()
if profile not in self.config_defaults if profile not in self.config_defaults
] ]
elif self.parent.userconfigs:
[
self.menu_configs_load.add_command(
label=name, command=partial(self.load_custom_profile, data)
)
for name, data in self.parent.userconfigs.items()
if name not in self.config_defaults
]
else: else:
self.menu_configs.entryconfig(0, state="disabled") self.menu_configs.entryconfig(0, state="disabled")
self.menu_configs.add_command( self.menu_configs.add_command(
@@ -315,16 +307,13 @@ class Menus(tk.Menu):
def menu_teardown(self, i): def menu_teardown(self, i):
# remove config load menus # remove config load menus
[ if len(self.parent.userconfigs) > len(self.config_defaults):
self.menu_configs_load.delete(key) for profile in self.parent.userconfigs:
for key in self.target.configs.keys() if profile not in self.config_defaults:
if key not in self.config_defaults try:
] self.menu_configs_load.delete(profile)
[ except tk._tkinter.tclError as e:
self.menu_configs_load.delete(key) self.logger.warning(f"{type(e).__name__}: {e}")
for key in self.parent.userconfigs.keys()
if key not in self.config_defaults
]
[ [
self.menu_vban.entryconfig(j, state="disabled") self.menu_vban.entryconfig(j, state="disabled")
@@ -333,24 +322,13 @@ class Menus(tk.Menu):
] ]
def menu_setup(self): def menu_setup(self):
if len(self.target.configs) > len(self.config_defaults) and all( if len(self.parent.userconfigs) > len(self.config_defaults):
key in self.target.configs for key in self.config_defaults for profile in self.parent.userconfigs:
): if profile not in self.config_defaults:
[ self.menu_configs_load.add_command(
self.menu_configs_load.add_command( label=profile, command=partial(self.load_profile, profile)
label=profile, command=partial(self.load_profile, profile) )
) self.menu_configs.entryconfig(0, state="normal")
for profile in self.target.configs.keys()
if profile not in self.config_defaults
]
elif self.parent.userconfigs:
[
self.menu_configs_load.add_command(
label=name, command=partial(self.load_custom_profile, data)
)
for name, data in self.parent.userconfigs.items()
if name not in self.config_defaults
]
else: else:
self.menu_configs.entryconfig(0, state="disabled") self.menu_configs.entryconfig(0, state="disabled")