summaryrefslogtreecommitdiff
path: root/src/ui
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/devicewidget.cpp69
-rw-r--r--src/ui/devicewidget.h34
-rw-r--r--src/ui/mixerwindow.cpp85
-rw-r--r--src/ui/mixerwindow.h43
4 files changed, 231 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"
diff --git a/src/ui/devicewidget.h b/src/ui/devicewidget.h
new file mode 100644
index 0000000..4a6cead
--- /dev/null
+++ b/src/ui/devicewidget.h
@@ -0,0 +1,34 @@
+#pragma once
+
+#include <tqwidget.h>
+#include <tqstring.h>
+
+class AudioDevice;
+class TQSlider;
+class TQToolButton;
+class TQLabel;
+class TQVBoxLayout;
+
+class DeviceWidget : public TQWidget
+{
+ TQ_OBJECT
+
+public:
+ DeviceWidget( AudioDevice *device, TQWidget *parent = 0 );
+ ~DeviceWidget() {}
+
+ AudioDevice *device() const { return m_device; }
+
+private slots:
+ void onVolumeChanged( int v ); // slider → device
+ void onMuteToggled(); // button → device
+ void onDeviceVolume( int v ); // device → slider
+ void onDeviceMute( bool m ); // device → button
+ void onDeviceName( const TQString &name );
+
+private:
+ AudioDevice *m_device;
+ TQSlider *m_slider;
+ TQToolButton *m_muteButton;
+ TQLabel *m_label;
+};
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"
diff --git a/src/ui/mixerwindow.h b/src/ui/mixerwindow.h
new file mode 100644
index 0000000..f6b7be8
--- /dev/null
+++ b/src/ui/mixerwindow.h
@@ -0,0 +1,43 @@
+#pragma once
+
+#include <tqwidget.h>
+#include <tqmap.h>
+
+#include "../model/audiodevice.h"
+
+class PulseModel;
+class KTabWidget;
+class TQHBoxLayout;
+
+class MixerWindow : public TQWidget
+{
+ TQ_OBJECT
+
+public:
+ explicit MixerWindow( PulseModel *model, TQWidget *parent = 0 );
+ ~MixerWindow() {}
+
+private slots:
+ void onDeviceAdded( AudioDevice *dev );
+ void onDeviceRemoved( AudioDevice *dev );
+
+public:
+ struct Tab {
+ TQWidget *page;
+ TQHBoxLayout *layout;
+ };
+
+private:
+
+ Tab &tabForCategory( AudioDevice::Category cat );
+
+ PulseModel *m_model;
+ KTabWidget *m_tabs;
+
+ Tab m_output;
+ Tab m_input;
+ Tab m_playback;
+ Tab m_recording;
+
+ TQMap<AudioDevice*, TQWidget*> m_widgets;
+};