From 9001ab70269f89780e452f86aca3e6c047255ad8 Mon Sep 17 00:00:00 2001 From: Brian Hrebec Date: Fri, 13 Mar 2026 14:40:20 -0500 Subject: [PATCH] Added mouse fader control --- main.py | 54 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/main.py b/main.py index d331268..1c094ed 100644 --- a/main.py +++ b/main.py @@ -6,6 +6,7 @@ from rich.segment import Segment from rich.style import Style from textual import events from textual.app import App, ComposeResult, Widget, RenderResult +from textual.binding import Binding from textual.color import Color from textual.containers import HorizontalScroll, Horizontal, Vertical, Container from textual.events import Event, MouseEvent @@ -230,12 +231,12 @@ class Channel(Widget): ('equals', 'move_fader(.5)'), ('plus', 'move_fader(.5)'), ('minus', 'move_fader(-.5)'), - ('m', 'mute'), - ('s', 'solo'), - ('p', 'phantom'), - ('i', 'inst'), - ('q', 'gain(-3)'), - ('e', 'gain(3)'), + Binding('m', 'mute', "Mute", show=True), + Binding('s', 'solo', "Solo", show=True), + Binding('p', 'phantom', "48v", show=True), + Binding('i', 'inst', "Inst.", show=True), + Binding('q', 'gain(-3)', "+gain", show=True), + Binding('e', 'gain(3)', "-gain", show=True), ] can_focus = True @@ -260,6 +261,13 @@ class Channel(Widget): self.change = change super().__init__() + class SetFader(Message): + def __init__(self, channel: int, output=False, val=0): + self.channel = channel + self.output = output + self.val = val + super().__init__() + class ChangeGain(MoveFader): pass @@ -296,6 +304,7 @@ class Channel(Widget): self.phantom_available = phantom self.inst_available = inst self.output = output + self.mouse_moved = False def compute_db_peak_value(self) -> float: try: @@ -420,6 +429,28 @@ class Channel(Widget): else: self.action_move_fader(-1) + def _on_mouse_down(self, event: events.MouseDown) -> None: + pass + + def _on_mouse_up(self, event: events.MouseUp) -> None: + pass + + def _set_level_from_mouse_event(self, event: events.MouseEvent): + position = 1 - (event.pointer_y / (event.widget.region.height - 1)) + db = encoding.map_range(position, 0, 1, -75, 6) + self.post_message(self.SetFader(self.channel, output=self.output, val=db)) + + def _on_mouse_move(self, event: events.MouseMove) -> None: + if event.button == 1 and event.widget == self.query_one('#level-indicator'): + self._set_level_from_mouse_event(event) + self.mouse_moved = True + + def _on_click(self, event: events.Click) -> None: + if not self.mouse_moved and event.button == 1 and event.widget == self.query_one('#level-indicator'): + self._set_level_from_mouse_event(event) + self.mouse_moved = False + + def on_button_pressed(self, event): if 'mute' == event.button.id: self.action_mute() @@ -731,10 +762,6 @@ class Mixer(App): self.query(ChannelRow)[y].query(Channel)[x].focus() self.update_mixer_display() - def _move_fader(self, dval): - - self.update_mixer_display() - def on_channel_phantom_toggle(self, message: Channel.PhantomToggle) -> None: if message.channel == 0: self.out_port.send(encode_message(3, [0x00010001 ^ self.bf_status.ch1_48v << 16])) @@ -753,6 +780,13 @@ class Mixer(App): self.mixer.matrix[message.channel][self.current_mix_out] + message.change) self.update_mixer_display() + def on_channel_set_fader(self, message: Channel.SetFader) -> None: + if message.output: + self.mixer.set_out_level(message.channel, message.val) + else: + self.mixer.set_mix_level(message.channel, self.current_mix_out, message.val) + self.update_mixer_display() + def on_channel_change_gain(self, message: Channel.ChangeGain) -> None: if message.channel > 1: return