summaryrefslogtreecommitdiff
path: root/src/ui/devicewidget.cpp
diff options
context:
space:
mode:
authorCalvin Morrison <calvin@pobox.com>2026-05-12 21:32:53 -0400
committerCalvin Morrison <calvin@pobox.com>2026-05-12 21:32:53 -0400
commitf6f7c36909fa161efe53c40e9b4c34856e751536 (patch)
treeeff44527b0be61eb2e19c9f483ed38b72879af11 /src/ui/devicewidget.cpp
Initial tmix skeleton — model layer + basic UI
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 <noreply@anthropic.com>
Diffstat (limited to 'src/ui/devicewidget.cpp')
-rw-r--r--src/ui/devicewidget.cpp69
1 files changed, 69 insertions, 0 deletions
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 <tqlabel.h>
+#include <tqlayout.h>
+#include <tqslider.h>
+#include <tqtoolbutton.h>
+
+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"