Added mouse fader control

This commit is contained in:
Brian Hrebec 2026-03-13 14:40:20 -05:00
parent 04060ef5a1
commit 9001ab7026

54
main.py
View file

@ -6,6 +6,7 @@ from rich.segment import Segment
from rich.style import Style from rich.style import Style
from textual import events from textual import events
from textual.app import App, ComposeResult, Widget, RenderResult from textual.app import App, ComposeResult, Widget, RenderResult
from textual.binding import Binding
from textual.color import Color from textual.color import Color
from textual.containers import HorizontalScroll, Horizontal, Vertical, Container from textual.containers import HorizontalScroll, Horizontal, Vertical, Container
from textual.events import Event, MouseEvent from textual.events import Event, MouseEvent
@ -230,12 +231,12 @@ class Channel(Widget):
('equals', 'move_fader(.5)'), ('equals', 'move_fader(.5)'),
('plus', 'move_fader(.5)'), ('plus', 'move_fader(.5)'),
('minus', 'move_fader(-.5)'), ('minus', 'move_fader(-.5)'),
('m', 'mute'), Binding('m', 'mute', "Mute", show=True),
('s', 'solo'), Binding('s', 'solo', "Solo", show=True),
('p', 'phantom'), Binding('p', 'phantom', "48v", show=True),
('i', 'inst'), Binding('i', 'inst', "Inst.", show=True),
('q', 'gain(-3)'), Binding('q', 'gain(-3)', "+gain", show=True),
('e', 'gain(3)'), Binding('e', 'gain(3)', "-gain", show=True),
] ]
can_focus = True can_focus = True
@ -260,6 +261,13 @@ class Channel(Widget):
self.change = change self.change = change
super().__init__() 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): class ChangeGain(MoveFader):
pass pass
@ -296,6 +304,7 @@ class Channel(Widget):
self.phantom_available = phantom self.phantom_available = phantom
self.inst_available = inst self.inst_available = inst
self.output = output self.output = output
self.mouse_moved = False
def compute_db_peak_value(self) -> float: def compute_db_peak_value(self) -> float:
try: try:
@ -420,6 +429,28 @@ class Channel(Widget):
else: else:
self.action_move_fader(-1) 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): def on_button_pressed(self, event):
if 'mute' == event.button.id: if 'mute' == event.button.id:
self.action_mute() self.action_mute()
@ -731,10 +762,6 @@ class Mixer(App):
self.query(ChannelRow)[y].query(Channel)[x].focus() self.query(ChannelRow)[y].query(Channel)[x].focus()
self.update_mixer_display() self.update_mixer_display()
def _move_fader(self, dval):
self.update_mixer_display()
def on_channel_phantom_toggle(self, message: Channel.PhantomToggle) -> None: def on_channel_phantom_toggle(self, message: Channel.PhantomToggle) -> None:
if message.channel == 0: if message.channel == 0:
self.out_port.send(encode_message(3, [0x00010001 ^ self.bf_status.ch1_48v << 16])) 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.mixer.matrix[message.channel][self.current_mix_out] + message.change)
self.update_mixer_display() 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: def on_channel_change_gain(self, message: Channel.ChangeGain) -> None:
if message.channel > 1: if message.channel > 1:
return return