From f6f7c36909fa161efe53c40e9b4c34856e751536 Mon Sep 17 00:00:00 2001 From: Calvin Morrison Date: Tue, 12 May 2026 21:32:53 -0400 Subject: Initial tmix skeleton — model layer + basic UI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PulseModel: stable PulseDevice objects keyed by PA index, updated in-place via postEvent reconciliation. No bulk rebuilds. Three signals: deviceAdded, deviceRemoved (device changed handled per-device via volumeChanged/muteChanged/nameChanged). MixerWindow: four-tab layout (Output/Input/Playback/Recording), adds and removes individual DeviceWidgets in response to model signals. Builds and links cleanly against TQt3/TDE + libpulse. Co-Authored-By: Claude Sonnet 4.6 --- src/ui/devicewidget.cpp | 69 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 src/ui/devicewidget.cpp (limited to 'src/ui/devicewidget.cpp') diff --git a/src/ui/devicewidget.cpp b/src/ui/devicewidget.cpp new file mode 100644 index 0000000..420d5fd --- /dev/null +++ b/src/ui/devicewidget.cpp @@ -0,0 +1,69 @@ +#include "devicewidget.h" +#include "../model/audiodevice.h" + +#include +#include +#include +#include + +DeviceWidget::DeviceWidget( AudioDevice *device, TQWidget *parent ) + : TQWidget(parent), m_device(device) +{ + TQVBoxLayout *layout = new TQVBoxLayout( this, 4, 2 ); + + m_label = new TQLabel( device->name(), this ); + m_label->setAlignment( TQLabel::AlignHCenter ); + + m_slider = new TQSlider( 0, 100, 5, device->volume(), TQt::Vertical, this ); + m_slider->setTickmarks( TQSlider::NoMarks ); + + m_muteButton = new TQToolButton( this ); + m_muteButton->setToggleButton( true ); + m_muteButton->setTextLabel( "M" ); + m_muteButton->setOn( device->muted() ); + + layout->addWidget( m_label ); + layout->addWidget( m_slider, 1 ); + layout->addWidget( m_muteButton, 0, TQt::AlignHCenter ); + + // slider → device + connect( m_slider, TQ_SIGNAL(valueChanged(int)), this, TQ_SLOT(onVolumeChanged(int)) ); + connect( m_muteButton, TQ_SIGNAL(clicked()), this, TQ_SLOT(onMuteToggled()) ); + + // device → widget + connect( device, TQ_SIGNAL(volumeChanged(int)), this, TQ_SLOT(onDeviceVolume(int)) ); + connect( device, TQ_SIGNAL(muteChanged(bool)), this, TQ_SLOT(onDeviceMute(bool)) ); + connect( device, TQ_SIGNAL(nameChanged(const TQString&)), this, TQ_SLOT(onDeviceName(const TQString&)) ); +} + +void DeviceWidget::onVolumeChanged( int v ) +{ + m_device->setVolume( v ); +} + +void DeviceWidget::onMuteToggled() +{ + m_device->setMuted( !m_device->muted() ); +} + +void DeviceWidget::onDeviceVolume( int v ) +{ + // Block signal to avoid feedback loop back to device. + m_slider->blockSignals( true ); + m_slider->setValue( v ); + m_slider->blockSignals( false ); +} + +void DeviceWidget::onDeviceMute( bool m ) +{ + m_muteButton->blockSignals( true ); + m_muteButton->setOn( m ); + m_muteButton->blockSignals( false ); +} + +void DeviceWidget::onDeviceName( const TQString &name ) +{ + m_label->setText( name ); +} + +#include "devicewidget.moc" -- cgit v1.2.3