diff options
Diffstat (limited to 'src/ui')
| -rw-r--r-- | src/ui/devicewidget.cpp | 69 | ||||
| -rw-r--r-- | src/ui/devicewidget.h | 34 | ||||
| -rw-r--r-- | src/ui/mixerwindow.cpp | 85 | ||||
| -rw-r--r-- | src/ui/mixerwindow.h | 43 |
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; +}; |
