mirror of
https://github.com/onyx-and-iris/voicemeeter-compact.git
synced 2026-04-18 05:23:31 +00:00
re-run through ruff formatter
This commit is contained in:
@@ -4,11 +4,10 @@ import webbrowser
|
||||
from functools import partial
|
||||
from tkinter import messagebox
|
||||
|
||||
import sv_ttk
|
||||
import vban_cmd
|
||||
from vban_cmd.error import VBANCMDConnectionError
|
||||
|
||||
import sv_ttk
|
||||
|
||||
from .data import _base_values, _configuration, get_configuration, kind_get
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -20,8 +19,8 @@ class Menus(tk.Menu):
|
||||
self.parent = parent
|
||||
self.vmr = vmr
|
||||
self.logger = logger.getChild(self.__class__.__name__)
|
||||
self.vban_config = get_configuration("vban")
|
||||
self.app_config = get_configuration("app")
|
||||
self.vban_config = get_configuration('vban')
|
||||
self.app_config = get_configuration('app')
|
||||
self._is_topmost = tk.BooleanVar()
|
||||
self._lock = tk.BooleanVar()
|
||||
self._unlock = tk.BooleanVar()
|
||||
@@ -31,9 +30,9 @@ class Menus(tk.Menu):
|
||||
|
||||
# voicemeeter menu
|
||||
self.menu_voicemeeter = tk.Menu(self, tearoff=0)
|
||||
self.add_cascade(menu=self.menu_voicemeeter, label="Voicemeeter")
|
||||
self.add_cascade(menu=self.menu_voicemeeter, label='Voicemeeter')
|
||||
self.menu_voicemeeter.add_checkbutton(
|
||||
label="Always On Top",
|
||||
label='Always On Top',
|
||||
onvalue=1,
|
||||
offvalue=0,
|
||||
variable=self._is_topmost,
|
||||
@@ -41,51 +40,51 @@ class Menus(tk.Menu):
|
||||
)
|
||||
self.menu_voicemeeter.add_separator()
|
||||
self.menu_voicemeeter.add_command(
|
||||
label="Show",
|
||||
label='Show',
|
||||
underline=0,
|
||||
command=partial(self.action_invoke_voicemeeter, "show"),
|
||||
command=partial(self.action_invoke_voicemeeter, 'show'),
|
||||
)
|
||||
self.menu_voicemeeter.add_command(
|
||||
label="Hide",
|
||||
label='Hide',
|
||||
underline=0,
|
||||
command=partial(self.action_invoke_voicemeeter, "hide"),
|
||||
command=partial(self.action_invoke_voicemeeter, 'hide'),
|
||||
)
|
||||
self.menu_voicemeeter.add_command(
|
||||
label="Restart",
|
||||
label='Restart',
|
||||
underline=0,
|
||||
command=partial(self.action_invoke_voicemeeter, "restart"),
|
||||
command=partial(self.action_invoke_voicemeeter, 'restart'),
|
||||
)
|
||||
self.menu_voicemeeter.add_command(
|
||||
label="Shutdown",
|
||||
label='Shutdown',
|
||||
underline=0,
|
||||
command=partial(self.action_invoke_voicemeeter, "shutdown"),
|
||||
command=partial(self.action_invoke_voicemeeter, 'shutdown'),
|
||||
)
|
||||
self.menu_voicemeeter.add_separator()
|
||||
self.menu_lock = tk.Menu(self.menu_voicemeeter, tearoff=0)
|
||||
self.menu_voicemeeter.add_cascade(
|
||||
menu=self.menu_lock, label="GUI Lock", underline=0
|
||||
menu=self.menu_lock, label='GUI Lock', underline=0
|
||||
)
|
||||
self.menu_lock.add_checkbutton(
|
||||
label="Lock",
|
||||
label='Lock',
|
||||
onvalue=1,
|
||||
offvalue=0,
|
||||
variable=self._lock,
|
||||
command=partial(self.action_set_voicemeeter, "lock"),
|
||||
command=partial(self.action_set_voicemeeter, 'lock'),
|
||||
)
|
||||
self.menu_lock.add_checkbutton(
|
||||
label="Unlock",
|
||||
label='Unlock',
|
||||
onvalue=1,
|
||||
offvalue=0,
|
||||
variable=self._unlock,
|
||||
command=partial(self.action_set_voicemeeter, "lock", False),
|
||||
command=partial(self.action_set_voicemeeter, 'lock', False),
|
||||
)
|
||||
|
||||
# configs menu
|
||||
self.menu_configs = tk.Menu(self, tearoff=0)
|
||||
self.add_cascade(menu=self.menu_configs, label="Configs")
|
||||
self.add_cascade(menu=self.menu_configs, label='Configs')
|
||||
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.config_defaults = {"reset"}
|
||||
self.menu_configs.add_cascade(menu=self.menu_configs_load, label='Load config')
|
||||
self.config_defaults = {'reset'}
|
||||
if len(self.parent.userconfigs) > len(self.config_defaults) and all(
|
||||
key in self.parent.userconfigs for key in self.config_defaults
|
||||
):
|
||||
@@ -97,22 +96,24 @@ class Menus(tk.Menu):
|
||||
if profile not in self.config_defaults
|
||||
]
|
||||
else:
|
||||
self.menu_configs.entryconfig(0, state="disabled")
|
||||
self.menu_configs.entryconfig(0, state='disabled')
|
||||
self.menu_configs.add_command(
|
||||
label="Reset to defaults", command=self.load_defaults
|
||||
label='Reset to defaults', command=self.load_defaults
|
||||
)
|
||||
|
||||
# layout menu
|
||||
self.menu_layout = tk.Menu(self, tearoff=0)
|
||||
self.add_cascade(menu=self.menu_layout, label="Layout")
|
||||
self.add_cascade(menu=self.menu_layout, label='Layout')
|
||||
# layout/submixes
|
||||
# here we build menu regardless of kind but disable if not potato
|
||||
buses = tuple(f"A{i+1}" for i in range(5)) + tuple(f"B{i+1}" for i in range(3))
|
||||
buses = tuple(f'A{i + 1}' for i in range(5)) + tuple(
|
||||
f'B{i + 1}' for i in range(3)
|
||||
)
|
||||
self.menu_submixes = tk.Menu(self.menu_layout, tearoff=0)
|
||||
self.menu_layout.add_cascade(menu=self.menu_submixes, label="Submixes")
|
||||
self.menu_layout.add_cascade(menu=self.menu_submixes, label='Submixes')
|
||||
[
|
||||
self.menu_submixes.add_checkbutton(
|
||||
label=f"Bus {buses[i]}",
|
||||
label=f'Bus {buses[i]}',
|
||||
underline=0,
|
||||
onvalue=1,
|
||||
offvalue=0,
|
||||
@@ -122,94 +123,94 @@ class Menus(tk.Menu):
|
||||
for i in range(8)
|
||||
]
|
||||
self._selected_bus[_configuration.submixes].set(True)
|
||||
if self.parent.kind.name != "potato":
|
||||
self.menu_layout.entryconfig(0, state="disabled")
|
||||
if self.parent.kind.name != 'potato':
|
||||
self.menu_layout.entryconfig(0, state='disabled')
|
||||
# layout/extends
|
||||
self.menu_extends = tk.Menu(self.menu_layout, tearoff=0)
|
||||
self.menu_layout.add_cascade(
|
||||
menu=self.menu_extends, label="Extends", underline=0
|
||||
menu=self.menu_extends, label='Extends', underline=0
|
||||
)
|
||||
self.menu_extends.add_command(
|
||||
label="horizontal",
|
||||
label='horizontal',
|
||||
underline=0,
|
||||
command=partial(self.switch_orientation, extends_horizontal=True),
|
||||
)
|
||||
self.menu_extends.add_command(
|
||||
label="vertical",
|
||||
label='vertical',
|
||||
underline=0,
|
||||
command=partial(self.switch_orientation, extends_horizontal=False),
|
||||
)
|
||||
self.menu_extends.entryconfig(
|
||||
0 if _configuration.extends_horizontal else 1, state="disabled"
|
||||
0 if _configuration.extends_horizontal else 1, state='disabled'
|
||||
)
|
||||
# layout/themes
|
||||
self.menu_themes = tk.Menu(self.menu_layout, tearoff=0)
|
||||
self.menu_layout.add_cascade(menu=self.menu_themes, label="Themes")
|
||||
self.menu_layout.add_cascade(menu=self.menu_themes, label='Themes')
|
||||
self.menu_themes.add_command(
|
||||
label="light", command=partial(self.load_theme, "light")
|
||||
label='light', command=partial(self.load_theme, 'light')
|
||||
)
|
||||
self.menu_themes.add_command(
|
||||
label="dark", command=partial(self.load_theme, "dark")
|
||||
label='dark', command=partial(self.load_theme, 'dark')
|
||||
)
|
||||
self.menu_themes.entryconfig(
|
||||
0 if self.app_config["theme"]["mode"] == "light" else 1,
|
||||
state="disabled",
|
||||
0 if self.app_config['theme']['mode'] == 'light' else 1,
|
||||
state='disabled',
|
||||
)
|
||||
if not _configuration.themes_enabled:
|
||||
self.menu_layout.entryconfig(2, state="disabled")
|
||||
self.menu_layout.entryconfig(2, state='disabled')
|
||||
# layout/navigation
|
||||
self.menu_navigation = tk.Menu(self.menu_layout, tearoff=0)
|
||||
self.menu_layout.add_cascade(menu=self.menu_navigation, label="Navigation")
|
||||
self.menu_layout.add_cascade(menu=self.menu_navigation, label='Navigation')
|
||||
self.menu_navigation.add_checkbutton(
|
||||
label="show",
|
||||
label='show',
|
||||
onvalue=1,
|
||||
offvalue=0,
|
||||
variable=self._navigation_show,
|
||||
command=partial(self.toggle_navigation, "show"),
|
||||
command=partial(self.toggle_navigation, 'show'),
|
||||
)
|
||||
self.menu_navigation.add_checkbutton(
|
||||
label="hide",
|
||||
label='hide',
|
||||
onvalue=1,
|
||||
offvalue=0,
|
||||
variable=self._navigation_hide,
|
||||
command=partial(self.toggle_navigation, "hide"),
|
||||
command=partial(self.toggle_navigation, 'hide'),
|
||||
)
|
||||
|
||||
# vban connect menu
|
||||
self.menu_vban = tk.Menu(self, tearoff=0)
|
||||
self.add_cascade(menu=self.menu_vban, label="VBAN")
|
||||
self.add_cascade(menu=self.menu_vban, label='VBAN')
|
||||
if self.vban_config:
|
||||
for i, _ in enumerate(self.vban_config):
|
||||
setattr(self, f"menu_vban_{i+1}", tk.Menu(self.menu_vban, tearoff=0))
|
||||
target_menu = getattr(self, f"menu_vban_{i+1}")
|
||||
setattr(self, f'menu_vban_{i + 1}', tk.Menu(self.menu_vban, tearoff=0))
|
||||
target_menu = getattr(self, f'menu_vban_{i + 1}')
|
||||
self.menu_vban.add_cascade(
|
||||
menu=target_menu,
|
||||
label=f"{self.vban_config[f'connection-{i+1}']['streamname']}",
|
||||
label=f'{self.vban_config[f"connection-{i + 1}"]["streamname"]}',
|
||||
underline=0,
|
||||
)
|
||||
target_menu.add_command(
|
||||
label="Connect", command=partial(self.vban_connect, i)
|
||||
label='Connect', command=partial(self.vban_connect, i)
|
||||
)
|
||||
target_menu.add_command(
|
||||
label="Disconnect", command=partial(self.vban_disconnect, i)
|
||||
label='Disconnect', command=partial(self.vban_disconnect, i)
|
||||
)
|
||||
target_menu.entryconfig(1, state="disabled")
|
||||
target_menu.entryconfig(1, state='disabled')
|
||||
else:
|
||||
self.entryconfig(4, state="disabled")
|
||||
self.entryconfig(4, state='disabled')
|
||||
|
||||
# Help menu
|
||||
self.menu_help = tk.Menu(self, tearoff=0)
|
||||
self.add_cascade(menu=self.menu_help, label="Help")
|
||||
self.add_cascade(menu=self.menu_help, label='Help')
|
||||
self.menu_help.add_command(
|
||||
label="Voicemeeter Site",
|
||||
label='Voicemeeter Site',
|
||||
command=self.documentation,
|
||||
)
|
||||
self.menu_help.add_command(
|
||||
label="Source Code",
|
||||
label='Source Code',
|
||||
command=self.github,
|
||||
)
|
||||
self.menu_help.add_command(
|
||||
label="App Creator",
|
||||
label='App Creator',
|
||||
command=self.onyxandiris,
|
||||
)
|
||||
|
||||
@@ -220,56 +221,56 @@ class Menus(tk.Menu):
|
||||
|
||||
def enable_vban_menus(self):
|
||||
[
|
||||
self.menu_vban.entryconfig(j, state="normal")
|
||||
self.menu_vban.entryconfig(j, state='normal')
|
||||
for j, _ in enumerate(self.menu_vban.winfo_children())
|
||||
]
|
||||
|
||||
def action_invoke_voicemeeter(self, cmd):
|
||||
if fn := getattr(self.target.command, cmd):
|
||||
fn()
|
||||
if cmd == "shutdown":
|
||||
if cmd == 'shutdown':
|
||||
self.parent.on_close_window()
|
||||
|
||||
def action_set_voicemeeter(self, cmd, val=True):
|
||||
if cmd == "lock":
|
||||
if cmd == 'lock':
|
||||
self._lock.set(val)
|
||||
self._unlock.set(not self._lock.get())
|
||||
setattr(self.target.command, cmd, val)
|
||||
|
||||
def load_custom_profile(self, profile):
|
||||
self.logger.info(f"loading user profile {profile}")
|
||||
self.logger.info(f'loading user profile {profile}')
|
||||
self.target.apply(profile)
|
||||
if not _base_values.run_update:
|
||||
self.parent.subject.notify("pdirty")
|
||||
self.parent.subject.notify('pdirty')
|
||||
|
||||
def load_profile(self, profile):
|
||||
self.logger.info(f"loading user profile {profile}")
|
||||
self.logger.info(f'loading user profile {profile}')
|
||||
self.target.apply_config(profile)
|
||||
if not _base_values.run_update:
|
||||
self.parent.subject.notify("pdirty")
|
||||
self.parent.subject.notify('pdirty')
|
||||
|
||||
def load_defaults(self):
|
||||
msg = (
|
||||
"Are you sure you want to Reset values to defaults?",
|
||||
"Physical strips B1, Virtual strips A1",
|
||||
"Mono, Solo, Mute, EQ all OFF",
|
||||
"Gain sliders for Strip/Bus at 0.0",
|
||||
'Are you sure you want to Reset values to defaults?',
|
||||
'Physical strips B1, Virtual strips A1',
|
||||
'Mono, Solo, Mute, EQ all OFF',
|
||||
'Gain sliders for Strip/Bus at 0.0',
|
||||
)
|
||||
resp = messagebox.askyesno(message="\n".join(msg))
|
||||
resp = messagebox.askyesno(message='\n'.join(msg))
|
||||
if resp:
|
||||
self.load_profile("reset")
|
||||
self.load_profile('reset')
|
||||
|
||||
def always_on_top(self):
|
||||
self.parent.attributes("-topmost", self._is_topmost.get())
|
||||
self.parent.attributes('-topmost', self._is_topmost.get())
|
||||
|
||||
def switch_orientation(self, extends_horizontal: bool = True, *args):
|
||||
_configuration.extends_horizontal = extends_horizontal
|
||||
if extends_horizontal:
|
||||
self.menu_extends.entryconfig(0, state="disabled")
|
||||
self.menu_extends.entryconfig(1, state="normal")
|
||||
self.menu_extends.entryconfig(0, state='disabled')
|
||||
self.menu_extends.entryconfig(1, state='normal')
|
||||
else:
|
||||
self.menu_extends.entryconfig(1, state="disabled")
|
||||
self.menu_extends.entryconfig(0, state="normal")
|
||||
self.menu_extends.entryconfig(1, state='disabled')
|
||||
self.menu_extends.entryconfig(0, state='normal')
|
||||
|
||||
def set_submix(self, i):
|
||||
if _configuration.submixes != i:
|
||||
@@ -279,38 +280,38 @@ class Menus(tk.Menu):
|
||||
self.parent.nav_frame.show_submix()
|
||||
for j, var in enumerate(self._selected_bus):
|
||||
var.set(i == j)
|
||||
self.parent.subject.notify("submix")
|
||||
self.parent.subject.notify('submix')
|
||||
|
||||
def load_theme(self, theme):
|
||||
sv_ttk.set_theme(theme)
|
||||
_configuration.theme_mode = theme
|
||||
self.menu_themes.entryconfig(
|
||||
0,
|
||||
state=f"{'disabled' if theme == 'light' else 'normal'}",
|
||||
state=f'{"disabled" if theme == "light" else "normal"}',
|
||||
)
|
||||
self.menu_themes.entryconfig(
|
||||
1,
|
||||
state=f"{'disabled' if theme == 'dark' else 'normal'}",
|
||||
state=f'{"disabled" if theme == "dark" else "normal"}',
|
||||
)
|
||||
[
|
||||
menu.config(bg=f"{'black' if theme == 'dark' else 'white'}")
|
||||
menu.config(bg=f'{"black" if theme == "dark" else "white"}')
|
||||
for menu in self.winfo_children()
|
||||
if isinstance(menu, tk.Menu)
|
||||
]
|
||||
self.menu_lock.config(bg=f"{'black' if theme == 'dark' else 'white'}")
|
||||
self.menu_configs_load.config(bg=f"{'black' if theme == 'dark' else 'white'}")
|
||||
self.menu_lock.config(bg=f'{"black" if theme == "dark" else "white"}')
|
||||
self.menu_configs_load.config(bg=f'{"black" if theme == "dark" else "white"}')
|
||||
[
|
||||
menu.config(bg=f"{'black' if theme == 'dark' else 'white'}")
|
||||
menu.config(bg=f'{"black" if theme == "dark" else "white"}')
|
||||
for menu in self.menu_vban.winfo_children()
|
||||
if isinstance(menu, tk.Menu)
|
||||
]
|
||||
[
|
||||
menu.config(bg=f"{'black' if theme == 'dark' else 'white'}")
|
||||
menu.config(bg=f'{"black" if theme == "dark" else "white"}')
|
||||
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"
|
||||
f'Finished loading theme Sunvalley {sv_ttk.get_theme().capitalize()} theme'
|
||||
)
|
||||
|
||||
def menu_teardown(self, i):
|
||||
@@ -321,10 +322,10 @@ class Menus(tk.Menu):
|
||||
try:
|
||||
self.menu_configs_load.delete(profile)
|
||||
except tk._tkinter.tclError as e:
|
||||
self.logger.warning(f"{type(e).__name__}: {e}")
|
||||
self.logger.warning(f'{type(e).__name__}: {e}')
|
||||
|
||||
[
|
||||
self.menu_vban.entryconfig(j, state="disabled")
|
||||
self.menu_vban.entryconfig(j, state='disabled')
|
||||
for j, _ in enumerate(self.menu_vban.winfo_children())
|
||||
if j != i
|
||||
]
|
||||
@@ -336,44 +337,44 @@ class Menus(tk.Menu):
|
||||
self.menu_configs_load.add_command(
|
||||
label=profile, command=partial(self.load_profile, profile)
|
||||
)
|
||||
self.menu_configs.entryconfig(0, state="normal")
|
||||
self.menu_configs.entryconfig(0, state='normal')
|
||||
else:
|
||||
self.menu_configs.entryconfig(0, state="disabled")
|
||||
self.menu_configs.entryconfig(0, state='disabled')
|
||||
|
||||
def toggle_navigation(self, cmd=None):
|
||||
if cmd == "show":
|
||||
self.logger.debug("show navframe")
|
||||
if cmd == 'show':
|
||||
self.logger.debug('show navframe')
|
||||
self.parent.nav_frame.grid()
|
||||
self._navigation_show.set(True)
|
||||
self._navigation_hide.set(not self._navigation_show.get())
|
||||
else:
|
||||
self.logger.debug("hide navframe")
|
||||
self.logger.debug('hide navframe')
|
||||
self.parent.nav_frame.grid_remove()
|
||||
self._navigation_hide.set(True)
|
||||
self._navigation_show.set(not self._navigation_hide.get())
|
||||
|
||||
def vban_connect(self, i):
|
||||
opts = {}
|
||||
opts |= self.vban_config[f"connection-{i+1}"]
|
||||
kind_id = opts.pop("kind")
|
||||
opts |= self.vban_config[f'connection-{i + 1}']
|
||||
kind_id = opts.pop('kind')
|
||||
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.logger.info(f'Attempting vban connection to {opts.get("ip")}')
|
||||
self.vban.login()
|
||||
except VBANCMDConnectionError as e:
|
||||
self.vban.logout()
|
||||
msg = (
|
||||
f"Timeout attempting to establish connection to {opts.get('ip')}",
|
||||
f"Please check your connection settings",
|
||||
f'Timeout attempting to establish connection to {opts.get("ip")}',
|
||||
'Please check your connection settings',
|
||||
)
|
||||
messagebox.showerror("Connection Error", "\n".join(msg))
|
||||
msg = (str(e), f"resuming local connection")
|
||||
self.logger.error(", ".join(msg))
|
||||
messagebox.showerror('Connection Error', '\n'.join(msg))
|
||||
msg = (str(e), 'resuming local connection')
|
||||
self.logger.error(', '.join(msg))
|
||||
self.after(1, self.enable_vban_menus)
|
||||
return
|
||||
self.menu_teardown(i)
|
||||
self.vban.event.add(["pdirty", "ldirty"])
|
||||
self.vban.event.add(['pdirty', 'ldirty'])
|
||||
# destroy the current App frames
|
||||
self.parent._destroy_top_level_frames()
|
||||
_base_values.vban_connected = True
|
||||
@@ -382,17 +383,17 @@ class Menus(tk.Menu):
|
||||
# build new app frames according to a kind
|
||||
kind = kind_get(kind_id)
|
||||
self.parent.build_app(kind, self.vban)
|
||||
target_menu = getattr(self, f"menu_vban_{i+1}")
|
||||
target_menu.entryconfig(0, state="disabled")
|
||||
target_menu.entryconfig(1, state="normal")
|
||||
target_menu = getattr(self, f'menu_vban_{i + 1}')
|
||||
target_menu.entryconfig(0, state='disabled')
|
||||
target_menu.entryconfig(1, state='normal')
|
||||
self.menu_layout.entryconfig(
|
||||
0, state=f"{'normal' if kind.name == 'potato' else 'disabled'}"
|
||||
0, state=f'{"normal" if kind.name == "potato" else "disabled"}'
|
||||
)
|
||||
# ensure the configs are reloaded into memory
|
||||
if "config" in self.parent.target.__dict__:
|
||||
del self.parent.target.__dict__["config"]
|
||||
if "userconfigs" in self.parent.__dict__:
|
||||
del self.parent.__dict__["userconfigs"]
|
||||
if 'config' in self.parent.target.__dict__:
|
||||
del self.parent.target.__dict__['config']
|
||||
if 'userconfigs' in self.parent.__dict__:
|
||||
del self.parent.__dict__['userconfigs']
|
||||
self.menu_setup()
|
||||
|
||||
def vban_disconnect(self, i):
|
||||
@@ -407,26 +408,26 @@ class Menus(tk.Menu):
|
||||
# build new app frames according to a kind
|
||||
kind = kind_get(self.vmr.type)
|
||||
self.parent.build_app(kind)
|
||||
target_menu = getattr(self, f"menu_vban_{i+1}")
|
||||
target_menu.entryconfig(0, state="normal")
|
||||
target_menu.entryconfig(1, state="disabled")
|
||||
target_menu = getattr(self, f'menu_vban_{i + 1}')
|
||||
target_menu.entryconfig(0, state='normal')
|
||||
target_menu.entryconfig(1, state='disabled')
|
||||
self.menu_layout.entryconfig(
|
||||
0, state=f"{'normal' if kind.name == 'potato' else 'disabled'}"
|
||||
0, state=f'{"normal" if kind.name == "potato" else "disabled"}'
|
||||
)
|
||||
# ensure the configs are reloaded into memory
|
||||
if "config" in self.parent.target.__dict__:
|
||||
del self.parent.target.__dict__["config"]
|
||||
if "userconfigs" in self.parent.__dict__:
|
||||
del self.parent.__dict__["userconfigs"]
|
||||
if 'config' in self.parent.target.__dict__:
|
||||
del self.parent.target.__dict__['config']
|
||||
if 'userconfigs' in self.parent.__dict__:
|
||||
del self.parent.__dict__['userconfigs']
|
||||
self.menu_setup()
|
||||
|
||||
self.after(15000, self.enable_vban_menus)
|
||||
|
||||
def documentation(self):
|
||||
webbrowser.open_new(r"https://voicemeeter.com/")
|
||||
webbrowser.open_new(r'https://voicemeeter.com/')
|
||||
|
||||
def github(self):
|
||||
webbrowser.open_new(r"https://github.com/onyx-and-iris/voicemeeter-compact")
|
||||
webbrowser.open_new(r'https://github.com/onyx-and-iris/voicemeeter-compact')
|
||||
|
||||
def onyxandiris(self):
|
||||
webbrowser.open_new(r"https://onyxandiris.online")
|
||||
webbrowser.open_new(r'https://onyxandiris.online')
|
||||
|
||||
Reference in New Issue
Block a user