diff options
| author | Calvin Morrison <calvin@pobox.com> | 2026-05-12 21:32:53 -0400 |
|---|---|---|
| committer | Calvin Morrison <calvin@pobox.com> | 2026-05-12 21:32:53 -0400 |
| commit | f6f7c36909fa161efe53c40e9b4c34856e751536 (patch) | |
| tree | eff44527b0be61eb2e19c9f483ed38b72879af11 /src/ui/mixerwindow.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/mixerwindow.cpp')
| -rw-r--r-- | src/ui/mixerwindow.cpp | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/src/ui/mixerwindow.cpp b/src/ui/mixerwindow.cpp new file mode 100644 index 0000000..91cea65 --- /dev/null +++ b/src/ui/mixerwindow.cpp @@ -0,0 +1,85 @@ +#include "mixerwindow.h" +#include "../model/pulsemodel.h" + +#include <tqlayout.h> +#include <tqscrollview.h> +#include <ktabwidget.h> +#include <tdelocale.h> + +static MixerWindow::Tab makeTab( KTabWidget *tabs, const TQString &label ) +{ + MixerWindow::Tab t; + TQScrollView *scroll = new TQScrollView( tabs ); + scroll->setResizePolicy( TQScrollView::AutoOneFit ); + scroll->setHScrollBarMode( TQScrollView::Auto ); + scroll->setVScrollBarMode( TQScrollView::AlwaysOff ); + scroll->setFrameStyle( TQFrame::NoFrame ); + + t.page = new TQWidget( scroll->viewport() ); + scroll->addChild( t.page ); + t.layout = new TQHBoxLayout( t.page, 6, 4 ); + + tabs->addTab( scroll, label ); + return t; +} + +MixerWindow::MixerWindow( PulseModel *model, TQWidget *parent ) + : TQWidget(parent), m_model(model) +{ + setCaption( i18n("TMix") ); + + TQVBoxLayout *top = new TQVBoxLayout( this, 4, 0 ); + m_tabs = new KTabWidget( this ); + top->addWidget( m_tabs ); + + m_output = makeTab( m_tabs, i18n("Output") ); + m_input = makeTab( m_tabs, i18n("Input") ); + m_playback = makeTab( m_tabs, i18n("Playback") ); + m_recording = makeTab( m_tabs, i18n("Recording") ); + + connect( model, TQ_SIGNAL(deviceAdded(AudioDevice*)), this, TQ_SLOT(onDeviceAdded(AudioDevice*)) ); + connect( model, TQ_SIGNAL(deviceRemoved(AudioDevice*)), this, TQ_SLOT(onDeviceRemoved(AudioDevice*)) ); + + // Populate with any devices already known at construction time. + AudioDevice::Category cats[] = { + AudioDevice::Output, AudioDevice::Input, + AudioDevice::Playback, AudioDevice::Recording + }; + for ( int i = 0; i < 4; i++ ) { + TQPtrList<AudioDevice> devs = model->devices( cats[i] ); + for ( TQPtrListIterator<AudioDevice> it(devs); *it; ++it ) + onDeviceAdded( *it ); + } +} + +MixerWindow::Tab &MixerWindow::tabForCategory( AudioDevice::Category cat ) +{ + switch ( cat ) { + case AudioDevice::Output: return m_output; + case AudioDevice::Input: return m_input; + case AudioDevice::Playback: return m_playback; + case AudioDevice::Recording: return m_recording; + } + return m_output; +} + +void MixerWindow::onDeviceAdded( AudioDevice *dev ) +{ + Tab &t = tabForCategory( dev->category() ); + TQWidget *w = dev->createWidget( t.page ); + t.layout->addWidget( w ); + w->show(); + m_widgets.insert( dev, w ); +} + +void MixerWindow::onDeviceRemoved( AudioDevice *dev ) +{ + TQWidget *w = m_widgets[dev]; + if ( !w ) return; + Tab &t = tabForCategory( dev->category() ); + t.layout->remove( w ); + m_widgets.remove( dev ); + delete w; +} + +#include "mixerwindow.moc" |
