diff --git a/.gitignore b/.gitignore index b9df612..73b1a3d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ # quick test -z_*.py +quick.py # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/CHANGELOG.md b/CHANGELOG.md index c47ca66..ac6292d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [ ] Add support for forest theme (should be coming soon) +## [1.6.0] - 2022-09-29 + +### Added + +- Logging module used in place of print statements across the interface. + ## [1.5.1] - 2022-09-16 ### Added @@ -20,8 +26,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - sv_ttk updated to v2.0. - event toggles used to pause updates when dragging sliders. -### Removed - ## [1.4.2] - 2022-09-03 ### Added diff --git a/poetry.lock b/poetry.lock index b30803b..8641852 100644 --- a/poetry.lock +++ b/poetry.lock @@ -84,7 +84,7 @@ python-versions = ">=3.7" [[package]] name = "vban-cmd" -version = "1.4.4" +version = "1.5.2" description = "Python interface for the VBAN RT Packet Service (Sendtext)" category = "main" optional = false @@ -95,7 +95,7 @@ tomli = {version = ">=2.0.1,<3.0.0", markers = "python_version < \"3.11\""} [[package]] name = "voicemeeter-api" -version = "0.7.0" +version = "0.8.1" description = "A Python wrapper for the Voiceemeter API" category = "main" optional = false @@ -107,7 +107,7 @@ tomli = {version = ">=2.0.1,<3.0.0", markers = "python_version < \"3.11\""} [metadata] lock-version = "1.1" python-versions = "^3.10" -content-hash = "1013fe45920526153e77b65bd21f9cdaac34841917159ea85565bec747c1e455" +content-hash = "0fc1f7b08a87f389504c898142c5a0f2ed20c8f56deabb3028fa815774b7fc98" [metadata.files] black = [] diff --git a/pyproject.toml b/pyproject.toml index 39049c8..26e24a6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "voicemeeter-compact" -version = "1.5.3" +version = "1.6.0" description = "A Compact Voicemeeter Remote App" authors = ["onyx-and-iris "] license = "MIT" @@ -16,8 +16,8 @@ include = ["vmcompact/img/cat.ico"] python = "^3.10" sv-ttk = "^2.0" tomli = { version = "^2.0.1", python = "<3.11" } -voicemeeter-api = "^0.7.0" -vban-cmd = "^1.4.4" +voicemeeter-api = "^0.8.1" +vban-cmd = "^1.5.2" [tool.poetry.dev-dependencies] black = {version = "^22.6.0", allow-prereleases = true} diff --git a/vmcompact/app.py b/vmcompact/app.py index 11a4775..4db27b7 100644 --- a/vmcompact/app.py +++ b/vmcompact/app.py @@ -35,6 +35,8 @@ class App(tk.Tk): self._vmr = vmr self._vmr.event.add("ldirty") + self._vmr.event.remove("mdirty") + self._vmr.event.remove("midi") icon_path = Path(__file__).parent.resolve() / "img" / "cat.ico" if icon_path.is_file(): self.iconbitmap(str(icon_path)) diff --git a/vmcompact/builders.py b/vmcompact/builders.py index ea93652..4188380 100644 --- a/vmcompact/builders.py +++ b/vmcompact/builders.py @@ -1,4 +1,5 @@ import abc +import logging import tkinter as tk from functools import partial from tkinter import ttk @@ -27,6 +28,8 @@ class AbstractBuilder(abc.ABC): class MainFrameBuilder(AbstractBuilder): """Responsible for building the frames that sit directly on the mainframe""" + logger = logging.getLogger("builders.mainframebuilder") + def __init__(self, app): self.kind = app.kind self.app = app @@ -39,24 +42,26 @@ class MainFrameBuilder(AbstractBuilder): if _configuration.themes_enabled: if sv_ttk.get_theme() not in ("light", "dark"): sv_ttk.set_theme(_configuration.theme_mode) - print(f"Sunvalley {sv_ttk.get_theme().capitalize()} Theme applied") - - self.app.target.event.remove("mdirty") - self.app.target.event.remove("midi") + self.logger.info( + f"Sunvalley {sv_ttk.get_theme().capitalize()} Theme applied" + ) def create_channelframe(self, type_): if type_ == "strip": self.app.strip_frame = _make_channelframe(self.app, type_) else: self.app.bus_frame = _make_channelframe(self.app, type_) + self.logger.info(f"Finished building channelframe type {type_}") def create_separator(self): self.app.sep = ttk.Separator(self.app, orient="vertical") self.app.sep.grid(row=0, column=1, sticky=(tk.N, tk.S)) self.app.columnconfigure(1, minsize=15) + self.logger.info(f"Finished building separator") def create_navframe(self): self.app.nav_frame = Navigation(self.app) + self.logger.info(f"Finished building navframe") def create_configframe(self, type_, index, id): if type_ == "strip": @@ -102,6 +107,7 @@ class MainFrameBuilder(AbstractBuilder): ) for _, frame in enumerate(self.app.bus_frame.labelframes) ] + self.logger.info(f"Finished building configframe for {type_}[{index}]") self.app.after(5, self.reset_config_frames) def reset_config_frames(self): @@ -114,6 +120,7 @@ class MainFrameBuilder(AbstractBuilder): def create_banner(self): self.app.banner = Banner(self.app) self.app.banner.grid(row=4, column=0, columnspan=3) + self.logger.info(f"Finished building banner") def teardown(self): pass diff --git a/vmcompact/configurations.py b/vmcompact/configurations.py index 460cb4a..18ec9dd 100644 --- a/vmcompact/configurations.py +++ b/vmcompact/configurations.py @@ -1,3 +1,4 @@ +import logging from pathlib import Path try: @@ -5,6 +6,8 @@ try: except ModuleNotFoundError: import tomli as tomllib +LOGGER = logging.getLogger("configurations") + configuration = {} config_path = [Path.cwd() / "configs"] @@ -21,7 +24,7 @@ for path in config_path: print(f"Invalid TOML config: configs/{filename.stem}") for name, cfg in configs.items(): - print(f"Loaded configuration configs/{name}") + LOGGER.info(f"Loaded configuration configs/{name}") configuration[name] = cfg _defaults = { diff --git a/vmcompact/menu.py b/vmcompact/menu.py index 4ba0bc1..72e0887 100644 --- a/vmcompact/menu.py +++ b/vmcompact/menu.py @@ -1,3 +1,4 @@ +import logging import tkinter as tk import webbrowser from functools import partial @@ -11,6 +12,8 @@ from .data import _base_values, _configuration, get_configuration, kind_get class Menus(tk.Menu): + logger = logging.getLogger("menu.menus") + def __init__(self, parent, vmr): super().__init__() self.parent = parent @@ -268,6 +271,9 @@ class Menus(tk.Menu): for menu in self.menu_layout.winfo_children() if isinstance(menu, tk.Menu) ] + self.logger.info( + f"Finished loading theme Sunvalley {sv_ttk.get_theme().capitalize()} theme" + ) def menu_teardown(self, i): # remove config load menus @@ -304,11 +310,14 @@ class Menus(tk.Menu): self.vban = vban_cmd.api(kind_id, **opts) # login to vban interface try: + self.logger.info(f"Attempting vban connection to {opts.get('ip')}") self.vban.login() except VBANCMDError as e: + self.vban.logout() msg = (str(e), f"Please check your connection settings") messagebox.showerror("Connection Error", "\n".join(msg)) - self.vban.logout() + msg = (str(e), f"resuming local connection") + self.logger.error(", ".join(msg)) self.after(1, self.enable_vban_menus) return self.menu_teardown(i) diff --git a/vmcompact/navigation.py b/vmcompact/navigation.py index 8e77393..aba8d40 100644 --- a/vmcompact/navigation.py +++ b/vmcompact/navigation.py @@ -1,3 +1,4 @@ +import logging import tkinter as tk from tkinter import ttk @@ -7,6 +8,8 @@ from .gainlayer import SubMixFrame class Navigation(ttk.Frame): + logger = logging.getLogger("navigation.navigation") + def __init__(self, parent): super().__init__(parent) self.parent = parent @@ -26,6 +29,9 @@ class Navigation(ttk.Frame): def show_submix(self): if self.submix.get(): self.parent.submix_frame = SubMixFrame(self.parent) + self.logger.info( + f"Finished building submixframe for submix {_configuration.submixes}" + ) else: if _configuration.extends_horizontal: self.parent.submix_frame.teardown() @@ -39,6 +45,9 @@ class Navigation(ttk.Frame): self.parent.bus_frame.grid() else: self.parent.rowconfigure(2, weight=0, minsize=0) + self.logger.info( + f"Finished tearing down submixframe for submix {_configuration.submixes}" + ) if not _configuration.themes_enabled: self.styletable.configure(