mirror of
https://github.com/onyx-and-iris/voicemeeter-compact.git
synced 2026-04-08 17:03:32 +00:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d4b2b90fc0 | ||
|
|
6de79977cc | ||
|
|
2c290e2632 |
16
CHANGELOG.md
16
CHANGELOG.md
@@ -9,11 +9,25 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
|
||||
- [ ] Add support for forest theme (should be coming soon)
|
||||
|
||||
## [1.4.0] - 2022-09-03
|
||||
## [1.5.1] - 2022-09-16
|
||||
|
||||
### Added
|
||||
|
||||
- 1.5.1 binary to releases
|
||||
|
||||
### Changed
|
||||
|
||||
- sv_ttk updated to v2.0.
|
||||
- event toggles used to pause updates when dragging sliders.
|
||||
|
||||
### Removed
|
||||
|
||||
## [1.4.2] - 2022-09-03
|
||||
|
||||
### Added
|
||||
|
||||
- tomli/tomllib compatibility layer to support python 3.10
|
||||
- 1.4.2 binary to releases
|
||||
|
||||
## [1.3.0] - 2022-07-14
|
||||
|
||||
|
||||
29
poetry.lock
generated
29
poetry.lock
generated
@@ -84,7 +84,7 @@ python-versions = ">=3.7"
|
||||
|
||||
[[package]]
|
||||
name = "vban-cmd"
|
||||
version = "1.4.2"
|
||||
version = "1.4.4"
|
||||
description = "Python interface for the VBAN RT Packet Service (Sendtext)"
|
||||
category = "main"
|
||||
optional = false
|
||||
@@ -107,31 +107,16 @@ tomli = {version = ">=2.0.1,<3.0.0", markers = "python_version < \"3.11\""}
|
||||
[metadata]
|
||||
lock-version = "1.1"
|
||||
python-versions = "^3.10"
|
||||
content-hash = "738f40473a635574dc00427d128af1c3bf45f4290aca9b4d8ae78b6992a486c7"
|
||||
content-hash = "1013fe45920526153e77b65bd21f9cdaac34841917159ea85565bec747c1e455"
|
||||
|
||||
[metadata.files]
|
||||
black = []
|
||||
click = [
|
||||
{file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"},
|
||||
{file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"},
|
||||
]
|
||||
colorama = [
|
||||
{file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"},
|
||||
{file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"},
|
||||
]
|
||||
mypy-extensions = [
|
||||
{file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"},
|
||||
{file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"},
|
||||
]
|
||||
click = []
|
||||
colorama = []
|
||||
mypy-extensions = []
|
||||
pathspec = []
|
||||
platformdirs = [
|
||||
{file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"},
|
||||
{file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"},
|
||||
]
|
||||
platformdirs = []
|
||||
sv-ttk = []
|
||||
tomli = [
|
||||
{file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"},
|
||||
{file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"},
|
||||
]
|
||||
tomli = []
|
||||
vban-cmd = []
|
||||
voicemeeter-api = []
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[tool.poetry]
|
||||
name = "voicemeeter-compact"
|
||||
version = "1.5.0"
|
||||
version = "1.5.3"
|
||||
description = "A Compact Voicemeeter Remote App"
|
||||
authors = ["onyx-and-iris <code@onyxandiris.online>"]
|
||||
license = "MIT"
|
||||
@@ -17,7 +17,7 @@ python = "^3.10"
|
||||
sv-ttk = "^2.0"
|
||||
tomli = { version = "^2.0.1", python = "<3.11" }
|
||||
voicemeeter-api = "^0.7.0"
|
||||
vban-cmd = "^1.4.2"
|
||||
vban-cmd = "^1.4.4"
|
||||
|
||||
[tool.poetry.dev-dependencies]
|
||||
black = {version = "^22.6.0", allow-prereleases = true}
|
||||
|
||||
@@ -93,8 +93,7 @@ class App(tk.Tk):
|
||||
def on_update(self, subject):
|
||||
"""called whenever notified of update"""
|
||||
|
||||
if not _base_values.in_scale_button_1:
|
||||
if subject == "pdirty":
|
||||
if subject == "pdirty" and _base_values.run_update:
|
||||
self.after(1, self.subject.notify, "pdirty")
|
||||
elif subject == "ldirty" and not _base_values.dragging:
|
||||
self.after(1, self.subject.notify, "ldirty")
|
||||
@@ -118,16 +117,14 @@ class App(tk.Tk):
|
||||
def dragging(self, event, *args):
|
||||
if event.widget is self:
|
||||
if self.drag_id == "":
|
||||
_base_values.in_scale_button_1 = True
|
||||
_base_values.dragging = True
|
||||
else:
|
||||
self.after_cancel(self.drag_id)
|
||||
self.drag_id = self.after(100, self.stop_drag)
|
||||
|
||||
def stop_drag(self):
|
||||
_base_values.dragging = False
|
||||
_base_values.in_scale_button_1 = False
|
||||
self.drag_id = ""
|
||||
_base_values.dragging = False
|
||||
|
||||
|
||||
_apps = {kind.name: App.make(kind) for kind in _kinds_all}
|
||||
|
||||
@@ -41,6 +41,9 @@ class MainFrameBuilder(AbstractBuilder):
|
||||
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")
|
||||
|
||||
def create_channelframe(self, type_):
|
||||
if type_ == "strip":
|
||||
self.app.strip_frame = _make_channelframe(self.app, type_)
|
||||
|
||||
@@ -64,15 +64,29 @@ class ChannelLabelFrame(ttk.LabelFrame):
|
||||
def reset_gain(self, *args):
|
||||
self.setter("gain", 0)
|
||||
self.gain.set(0)
|
||||
self.gainlabel.set(self.gain.get())
|
||||
|
||||
def scale_press(self, *args):
|
||||
_base_values.in_scale_button_1 = True
|
||||
self.after(1, self.remove_events)
|
||||
|
||||
def remove_events(self):
|
||||
self.parent.target.event.remove("pdirty")
|
||||
self.parent.target.event.remove("ldirty")
|
||||
|
||||
def scale_release(self, *args):
|
||||
_base_values.in_scale_button_1 = False
|
||||
_base_values.run_update = False
|
||||
self.after(1, self.add_events)
|
||||
|
||||
def add_events(self):
|
||||
self.parent.target.event.add("pdirty")
|
||||
self.parent.target.event.add("ldirty")
|
||||
self.after(500, self.resume_updates)
|
||||
|
||||
def resume_updates(self):
|
||||
_base_values.run_update = True
|
||||
|
||||
def _on_mousewheel(self, event):
|
||||
_base_values.in_scale_button_1 = True
|
||||
_base_values.run_update = False
|
||||
self.gain.set(
|
||||
self.gain.get()
|
||||
+ (
|
||||
@@ -86,7 +100,7 @@ class ChannelLabelFrame(ttk.LabelFrame):
|
||||
elif self.gain.get() < -60:
|
||||
self.gain.set(-60)
|
||||
self.setter("gain", self.gain.get())
|
||||
_base_values.in_scale_button_1 = False
|
||||
self.after(1, self.resume_updates)
|
||||
|
||||
def open_config(self):
|
||||
if self.conf.get():
|
||||
|
||||
@@ -37,10 +37,23 @@ class Config(ttk.Frame):
|
||||
setattr(self.target, param, value)
|
||||
|
||||
def scale_press(self, *args):
|
||||
_base_values.in_scale_button_1 = True
|
||||
self.after(1, self.remove_events)
|
||||
|
||||
def remove_events(self):
|
||||
self.parent.target.event.remove("pdirty")
|
||||
self.parent.target.event.remove("ldirty")
|
||||
|
||||
def scale_release(self, *args):
|
||||
_base_values.in_scale_button_1 = False
|
||||
_base_values.run_update = False
|
||||
self.after(1, self.add_events)
|
||||
|
||||
def add_events(self):
|
||||
self.parent.target.event.add("pdirty")
|
||||
self.parent.target.event.add("ldirty")
|
||||
self.after(350, self.resume_updates)
|
||||
|
||||
def resume_updates(self):
|
||||
_base_values.run_update = True
|
||||
|
||||
def scale_enter(self, param, *args):
|
||||
val = self.slider_vars[self.slider_params.index(param)].get()
|
||||
|
||||
@@ -45,8 +45,8 @@ class Configurations(metaclass=SingletonMeta):
|
||||
|
||||
@dataclass
|
||||
class BaseValues(metaclass=SingletonMeta):
|
||||
# are we dragging a scale with mouse 1
|
||||
in_scale_button_1: bool = False
|
||||
# pause updates after releasing scale
|
||||
run_update: bool = True
|
||||
# are we dragging main window with mouse 1
|
||||
dragging: bool = False
|
||||
# a vban connection established
|
||||
|
||||
@@ -52,7 +52,7 @@ class GainLayer(ttk.LabelFrame):
|
||||
def reset_gain(self, *args):
|
||||
self.setter("gain", 0)
|
||||
self.gain.set(0)
|
||||
self.gainlabel.set(0)
|
||||
self.gainlabel.set(self.gain.get())
|
||||
|
||||
def scale_callback(self, *args):
|
||||
"""callback function for scale widget"""
|
||||
@@ -61,12 +61,26 @@ class GainLayer(ttk.LabelFrame):
|
||||
self.gainlabel.set(round(self.gain.get(), 1))
|
||||
|
||||
def scale_press(self, *args):
|
||||
_base_values.in_scale_button_1 = True
|
||||
self.after(1, self.remove_events)
|
||||
|
||||
def remove_events(self):
|
||||
self.parent.target.event.remove("pdirty")
|
||||
self.parent.target.event.remove("ldirty")
|
||||
|
||||
def scale_release(self, *args):
|
||||
_base_values.in_scale_button_1 = False
|
||||
_base_values.run_update = False
|
||||
self.after(1, self.add_events)
|
||||
|
||||
def add_events(self):
|
||||
self.parent.target.event.add("pdirty")
|
||||
self.parent.target.event.add("ldirty")
|
||||
self.after(500, self.resume_updates)
|
||||
|
||||
def resume_updates(self):
|
||||
_base_values.run_update = True
|
||||
|
||||
def _on_mousewheel(self, event):
|
||||
_base_values.run_update = False
|
||||
self.gain.set(
|
||||
self.gain.get()
|
||||
+ (
|
||||
@@ -80,6 +94,7 @@ class GainLayer(ttk.LabelFrame):
|
||||
elif self.gain.get() < -60:
|
||||
self.gain.set(-60)
|
||||
self.setter("gain", self.gain.get())
|
||||
self.after(1, self.resume_updates)
|
||||
|
||||
def set_on(self):
|
||||
"""enables a gainlayer. sets its button colour"""
|
||||
|
||||
@@ -5,6 +5,7 @@ from tkinter import messagebox, ttk
|
||||
|
||||
import sv_ttk
|
||||
import vban_cmd
|
||||
from vban_cmd.error import VBANCMDError
|
||||
|
||||
from .data import _base_values, _configuration, get_configuration, kind_get
|
||||
|
||||
@@ -268,11 +269,11 @@ class Menus(tk.Menu):
|
||||
if isinstance(menu, tk.Menu)
|
||||
]
|
||||
|
||||
def vban_connect(self, i):
|
||||
def menu_teardown(self, i):
|
||||
# remove config load menus
|
||||
[
|
||||
self.menu_configs_load.delete(key)
|
||||
for key in self.vmr.configs.keys()
|
||||
for key in self.target.configs.keys()
|
||||
if key not in self.config_defaults
|
||||
]
|
||||
|
||||
@@ -282,12 +283,35 @@ class Menus(tk.Menu):
|
||||
if j != i
|
||||
]
|
||||
|
||||
def menu_setup(self):
|
||||
if len(self.target.configs) > len(self.config_defaults) and all(
|
||||
key in self.target.configs for key in self.config_defaults
|
||||
):
|
||||
[
|
||||
self.menu_configs_load.add_command(
|
||||
label=profile, command=partial(self.load_profile, profile)
|
||||
)
|
||||
for profile in self.target.configs.keys()
|
||||
if profile not in self.config_defaults
|
||||
]
|
||||
else:
|
||||
self.menu_configs.entryconfig(0, state="disabled")
|
||||
|
||||
def vban_connect(self, i):
|
||||
opts = {}
|
||||
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.vban.login()
|
||||
except VBANCMDError as e:
|
||||
msg = (str(e), f"Please check your connection settings")
|
||||
messagebox.showerror("Connection Error", "\n".join(msg))
|
||||
self.vban.logout()
|
||||
self.after(1, self.enable_vban_menus)
|
||||
return
|
||||
self.menu_teardown(i)
|
||||
self.vban.event.add("ldirty")
|
||||
# destroy the current App frames
|
||||
self.parent._destroy_top_level_frames()
|
||||
@@ -303,27 +327,10 @@ class Menus(tk.Menu):
|
||||
self.menu_layout.entryconfig(
|
||||
0, state=f"{'normal' if kind.name == 'potato' else 'disabled'}"
|
||||
)
|
||||
# rebuild config load menus
|
||||
if len(self.target.configs) > len(self.config_defaults) and all(
|
||||
key in self.target.configs for key in self.config_defaults
|
||||
):
|
||||
[
|
||||
self.menu_configs_load.add_command(
|
||||
label=profile, command=partial(self.load_profile, profile)
|
||||
)
|
||||
for profile in self.target.configs.keys()
|
||||
if profile not in self.config_defaults
|
||||
]
|
||||
else:
|
||||
self.menu_configs.entryconfig(0, state="disabled")
|
||||
self.menu_setup()
|
||||
|
||||
def vban_disconnect(self, i):
|
||||
# remove config load menus
|
||||
[
|
||||
self.menu_configs_load.delete(key)
|
||||
for key in self.vban.configs.keys()
|
||||
if key not in self.config_defaults
|
||||
]
|
||||
self.menu_teardown(i)
|
||||
|
||||
# destroy the current App frames
|
||||
self.parent._destroy_top_level_frames()
|
||||
@@ -340,19 +347,7 @@ class Menus(tk.Menu):
|
||||
self.menu_layout.entryconfig(
|
||||
0, state=f"{'normal' if kind.name == 'potato' else 'disabled'}"
|
||||
)
|
||||
# rebuild config load menus
|
||||
if len(self.target.configs) > len(self.config_defaults) and all(
|
||||
key in self.target.configs for key in self.config_defaults
|
||||
):
|
||||
[
|
||||
self.menu_configs_load.add_command(
|
||||
label=profile, command=partial(self.load_profile, profile)
|
||||
)
|
||||
for profile in self.target.configs.keys()
|
||||
if profile not in self.config_defaults
|
||||
]
|
||||
else:
|
||||
self.menu_configs.entryconfig(0, state="disabled")
|
||||
self.menu_setup()
|
||||
|
||||
self.after(15000, self.enable_vban_menus)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user