-rw-r--r-- | core/applets/volumeapplet/volume.cpp | 234 | ||||
-rw-r--r-- | core/applets/volumeapplet/volume.h | 10 |
2 files changed, 200 insertions, 44 deletions
diff --git a/core/applets/volumeapplet/volume.cpp b/core/applets/volumeapplet/volume.cpp index 06eec58..e066a83 100644 --- a/core/applets/volumeapplet/volume.cpp +++ b/core/applets/volumeapplet/volume.cpp @@ -26,37 +26,38 @@ #include <qpe/qpeapplication.h> #include <qpe/config.h> #if ( defined Q_WS_QWS || defined(_WS_QWS_) ) && !defined(QT_NO_COP) #include <qpe/qcopenvelope_qws.h> #endif #include <qpainter.h> #include <qcheckbox.h> #include <qslider.h> #include <qlayout.h> #include <qframe.h> #include <qpixmap.h> +#include <qvbox.h> #include <qlabel.h> #include <qtoolbutton.h> #include <qpushbutton.h> #include <qtimer.h> #include <opie/odevice.h> #include "oledbox.h" using namespace Opie; -#define RATE_TIMER_INTERVAL 100 +#define RATE_TIMER_INTERVAL 100 // Ten times per second is fine (RATE_TIMER_INTERVAL 100). A shorter time // results in "hanging" buttons on the iPAQ due to quite high CPU consumption. /* XPM */ static const char * vol_xpm[] = { "20 20 3 1", " c None", ". c #0000FF", "+ c #000000", " ", " . ", @@ -114,24 +115,81 @@ static const char * mic_xpm[] = { " .+..]^,.. ", " .+....... ", " .%... ", " .=... ", " .+... ", " .+... ", " .... ", " .... ", " .. ", " . ", ". "}; + +static const char * bass_xpm[] = { +"20 20 3 1", +" c None", +". c #000000", +"+ c #0000FF", +" ", +" ", +" ", +"..... +++ ......", +" +++++++ ", +" ++ ++ ", +"... ++ ... ++ ++ .", +" +++ ++ ++ ", +" ++++ ++ ", +"... ++++ .. ++ .....", +" ++ ++ ", +" ++ ++ ", +"..........++ ++ .", +" ++ ", +" ++ ", +"...... ++ .........", +" + ", +" ", +" ", +" "}; + + +static const char * treble_xpm[] = { +"20 20 3 1", +" c None", +". c #0000FF", +"+ c #000000", +" .. ", +" . .. ", +" . .. ", +"++++++++ . .. ++++++", +" . . ", +" ... ", +"++++++++ . +++++++", +" .. ", +" .. . ", +"+++ .. ... +++++++", +" .. .. .. ", +" .. . . .. ", +"+++ .. . . + . +++++", +" .. . .. ", +" .. . .. ", +"++++ ...... +++++++", +" . ", +" .. . ", +" .. . ", +" .. "}; + + + + /* XPM */ static const char * alarm_xpm[] = { "20 20 33 1", " c None", ". c #080602", "+ c #AAA602", "@ c #252002", "# c #434202", "$ c #795602", "% c #C3C20D", "& c #DADAC2", "* c #826002", @@ -175,186 +233,234 @@ static const char * alarm_xpm[] = { " 42&_3'4#@>:*44 ", " 42|}}3'4#[;$)$44 ", "444{]]2^~~:!!#.@##/ ", "4444-%*:==!!=...../ ", " /:[.. ", " /@. ", " "}; VolumeControl::VolumeControl ( VolumeApplet *icon, bool /*showMic*/, QWidget *parent, const char *name ) : QFrame ( parent, name, WStyle_StaysOnTop | WType_Popup ) { m_icon = icon; - + bool has_wav_alarm = true; - + bool has_bass = true; + bool has_treble = true; + switch ( ODevice::inst ( )-> model ( )) { // we need to add other devices eventually case Model_Zaurus_SL5000: has_wav_alarm = false; //poor guys probably feeling left out... break; default: break; } - + + if ( !ODevice::series == Model_iPAQ ) { + has_bass = false; + has_treble = false; + } + setFrameStyle ( QFrame::PopupPanel | QFrame::Raised ); QGridLayout *grid = new QGridLayout ( this, 1, 1, 6, 4 ); grid-> setSpacing ( 4 ); grid-> setMargin ( 6 ); - + QVBoxLayout *vbox; QLabel *l; - + vbox = new QVBoxLayout ( ); vbox-> setSpacing ( 4 ); grid-> addLayout ( vbox, 1, 0 ); - + upButton = new QPushButton ( this ); upButton-> setSizePolicy ( QSizePolicy ( QSizePolicy::Minimum, QSizePolicy::Expanding )); upButton-> setPixmap ( Resource::loadPixmap ( "up" )); upButton-> setFocusPolicy ( QWidget::NoFocus ); vbox-> addWidget ( upButton ); - + downButton = new QPushButton ( this ); downButton-> setSizePolicy ( QSizePolicy ( QSizePolicy::Minimum, QSizePolicy::Expanding )); downButton-> setPixmap ( Resource::loadPixmap ( "down" )); downButton-> setFocusPolicy ( QWidget::NoFocus ); vbox-> addWidget ( downButton ); volSlider = new QSlider ( this ); volSlider-> setRange ( 0, 100 ); volSlider-> setTickmarks ( QSlider::Both ); volSlider-> setTickInterval ( 20 ); volSlider-> setFocusPolicy ( QWidget::NoFocus ); - + l = new QLabel ( this ); l-> setPixmap ( QPixmap ( vol_xpm )); - + grid-> addWidget ( l, 0, 1, AlignCenter ); grid-> addWidget ( volSlider, 1, 1, AlignCenter ); volLed = new OLedBox ( green, this ); volLed-> setFocusPolicy ( QWidget::NoFocus ); - volLed-> setFixedSize ( 16, 16 ); - + volLed-> setFixedSize ( 16, 16 ); + grid-> addWidget ( volLed, 2, 1, AlignCenter ); + QVBox *basstrebleBox = new QVBox( this ); + + trebleSlider = new QSlider ( basstrebleBox ); + trebleSlider-> setRange ( 0, 100 ); + trebleSlider-> setTickmarks ( QSlider::Both ); + trebleSlider-> setTickInterval ( 20 ); + trebleSlider->setMaximumHeight( 40 ); + trebleSlider-> setFocusPolicy ( QWidget::NoFocus ); + + bassSlider = new QSlider ( basstrebleBox ); + bassSlider-> setRange ( 0, 100 ); + bassSlider-> setTickmarks ( QSlider::Both ); + bassSlider-> setTickInterval ( 20 ); + bassSlider->setMaximumHeight( 40 ); + bassSlider-> setFocusPolicy ( QWidget::NoFocus ); + + QLabel *bassLabel = new QLabel ( this ); + bassLabel-> setPixmap ( QPixmap ( bass_xpm )); + + QLabel *trebleLabel = new QLabel( this ); + trebleLabel->setPixmap( QPixmap ( treble_xpm ) ); + + grid->addWidget( trebleLabel, 0, 4, AlignCenter ); + grid->addWidget( basstrebleBox, 1, 4, AlignCenter ); + grid-> addWidget ( bassLabel, 2, 4, AlignCenter ); + + if ( !has_bass ) { + bassSlider->hide(); + bassLabel->hide(); + } + + if ( !has_treble ) { + trebleSlider->hide(); + trebleLabel->hide(); + } + micSlider = new QSlider ( this ); micSlider-> setRange ( 0, 100 ); micSlider-> setTickmarks ( QSlider::Both ); micSlider-> setTickInterval ( 20 ); micSlider-> setFocusPolicy ( QWidget::NoFocus ); - + l = new QLabel ( this ); l-> setPixmap ( QPixmap ( mic_xpm )); - + grid-> addWidget ( l, 0, 2, AlignCenter ); grid-> addWidget ( micSlider, 1, 2, AlignCenter ); micLed = new OLedBox ( red, this ); micLed-> setFocusPolicy ( QWidget::NoFocus ); micLed-> setFixedSize ( 16, 16 ); - + grid-> addWidget ( micLed, 2, 2, AlignCenter ); alarmSlider = new QSlider ( this ); alarmSlider-> setRange ( 0, 100 ); alarmSlider-> setTickmarks ( QSlider::Both ); alarmSlider-> setTickInterval ( 20 ); alarmSlider-> setFocusPolicy ( QWidget::NoFocus ); QLabel *alarmLabel = new QLabel ( this ); alarmLabel-> setPixmap ( QPixmap ( alarm_xpm )); - + grid-> addWidget ( alarmLabel, 0, 3, AlignCenter ); grid-> addWidget ( alarmSlider, 1, 3, AlignCenter ); alarmLed = new OLedBox ( yellow, this ); alarmLed-> setFocusPolicy ( QWidget::NoFocus ); alarmLed-> setFixedSize ( 16, 16 ); - + grid-> addWidget ( alarmLed, 2, 3, AlignCenter ); if ( !has_wav_alarm ) { alarmSlider-> hide ( ); alarmLabel-> hide ( ); alarmLed-> hide ( ); } - - grid-> addWidget ( new QLabel ( tr( "Enable Sounds for:" ), this ), 0, 4, AlignVCenter | AlignLeft ); + + grid-> addWidget ( new QLabel ( tr( "Enable Sounds for:" ), this ), 0, 6, AlignVCenter | AlignLeft ); vbox = new QVBoxLayout ( ); vbox-> setSpacing ( 4 ); - grid-> addMultiCellLayout ( vbox, 1, 2, 4, 4 ); - + grid-> addMultiCellLayout ( vbox, 1, 2, 6, 6 ); + tapBox = new QCheckBox ( tr( "Screen Taps" ), this ); tapBox-> setFocusPolicy ( QWidget::NoFocus ); - + vbox-> addWidget ( tapBox, AlignVCenter | AlignLeft ); keyBox = new QCheckBox ( tr( "Key Clicks" ), this ); keyBox-> setFocusPolicy ( QWidget::NoFocus ); - + vbox-> addWidget ( keyBox, AlignVCenter | AlignLeft ); alarmBox = new QCheckBox ( tr( "Alarm Sound" ), this ); alarmBox-> setFocusPolicy ( QWidget::NoFocus ); - + vbox-> addWidget ( alarmBox, AlignVCenter | AlignLeft ); if ( has_wav_alarm ) { alarmBox-> hide ( ); } vbox-> addStretch ( 100 ); setFixedSize ( sizeHint ( )); setFocusPolicy ( QWidget::NoFocus ); rateTimer = new QTimer( this ); connect ( rateTimer, SIGNAL( timeout ( )), this, SLOT( rateTimerDone ( ))); - + connect ( upButton, SIGNAL( pressed ( )), this, SLOT( buttonChanged ( ))); connect ( upButton, SIGNAL( released ( )), this, SLOT( buttonChanged ( ))); connect ( downButton, SIGNAL( pressed ( )), this, SLOT( buttonChanged ( ))); connect ( downButton, SIGNAL( released ( )), this, SLOT( buttonChanged ( ))); connect ( micSlider, SIGNAL( valueChanged ( int )), this, SLOT( micMoved( int ))); connect ( volSlider, SIGNAL( valueChanged ( int )), this, SLOT( volMoved( int ))); connect ( alarmSlider, SIGNAL( valueChanged ( int )), this, SLOT( alarmMoved( int ))); - + connect ( bassSlider, SIGNAL( valueChanged ( int )), this, SLOT( bassMoved( int ))); + connect ( trebleSlider, SIGNAL( valueChanged ( int )), this, SLOT( trebleMoved( int ))); + + connect ( volLed, SIGNAL( toggled ( bool )), this, SLOT( volMuteToggled ( bool ))); connect ( micLed, SIGNAL( toggled ( bool )), this, SLOT( micMuteToggled ( bool ))); connect ( alarmLed, SIGNAL( toggled ( bool )), this, SLOT( alarmSoundToggled ( bool ))); connect ( alarmBox, SIGNAL( toggled ( bool )), this, SLOT( alarmSoundToggled ( bool ))); connect ( keyBox, SIGNAL( toggled ( bool )), this, SLOT( keyClickToggled ( bool ))); connect ( tapBox, SIGNAL( toggled ( bool )), this, SLOT( screenTapToggled ( bool ))); // initialize variables readConfig ( true ); - + // initialize the config file, in case some entries are missing - + writeConfigEntry ( "VolumePercent", m_vol_percent, UPD_None ); + writeConfigEntry ( "BassPercent", m_vol_percent, UPD_None ); + writeConfigEntry ( "TreblePercent", m_vol_percent, UPD_None ); writeConfigEntry ( "Mute", m_vol_muted, UPD_None ); writeConfigEntry ( "AlarmPercent", m_alarm_percent, UPD_None ); writeConfigEntry ( "TouchSound", m_snd_touch, UPD_None ); writeConfigEntry ( "KeySound", m_snd_key, UPD_None ); writeConfigEntry ( "AlarmSound", m_snd_alarm, UPD_Vol ); - + writeConfigEntry ( "Mic", m_mic_percent, UPD_None ); writeConfigEntry ( "MicMute", m_mic_muted, UPD_Mic ); } bool VolumeControl::volMuted ( ) const { return m_vol_muted; } int VolumeControl::volPercent ( ) const { return m_vol_percent; @@ -394,79 +500,88 @@ void VolumeControl::rateTimerDone ( ) { if ( upButton-> isDown ( )) volSlider-> setValue ( volSlider-> value ( ) - 2 ); else // if ( downButton-> isDown ( )) volSlider-> setValue ( volSlider-> value ( ) + 2 ); } void VolumeControl::show ( bool /*showMic*/ ) { readConfig ( ); QPoint curPos = m_icon-> mapToGlobal ( QPoint ( 0, 0 )); - + int w = sizeHint ( ). width ( ); int x = curPos.x ( ) - ( w / 2 ); - + if (( x + w ) > QPEApplication::desktop ( )-> width ( )) x = QPEApplication::desktop ( )-> width ( ) - w; - + move ( x, curPos. y ( ) - sizeHint ( ). height ( )); QFrame::show ( ); } void VolumeControl::readConfig ( bool force ) { Config cfg ( "qpe" ); cfg. setGroup ( "Volume" ); int old_vp = m_vol_percent; int old_mp = m_mic_percent; + int old_bass = m_bass_percent; + int old_treble = m_treble_percent; bool old_vm = m_vol_muted; bool old_mm = m_mic_muted; bool old_sk = m_snd_key; bool old_st = m_snd_touch; bool old_sa = m_snd_alarm; int old_ap = m_alarm_percent; m_vol_percent = cfg. readNumEntry ( "VolumePercent", 50 ); m_mic_percent = cfg. readNumEntry ( "Mic", 50 ); + m_bass_percent = cfg. readNumEntry ( "BassPercent", 50 ); + m_treble_percent = cfg. readNumEntry ( "TreblePercent", 50 ); m_vol_muted = cfg. readBoolEntry ( "Mute", 0 ); m_mic_muted = cfg. readBoolEntry ( "MicMute", 0 ); m_snd_key = cfg. readBoolEntry ( "KeySound", 0 ); m_snd_touch = cfg. readBoolEntry ( "TouchSound", 0 ); m_snd_alarm = cfg. readBoolEntry ( "AlarmSound", 1 ); m_alarm_percent = cfg. readNumEntry ( "AlarmPercent", 65 ); - if ( force || ( m_vol_percent != old_vp )) + if ( force || ( m_vol_percent != old_vp )) volSlider-> setValue ( 100 - m_vol_percent ); if ( force || ( m_mic_percent != old_mp )) micSlider-> setValue ( 100 - m_mic_percent ); - if ( force || ( m_alarm_percent != old_ap )) + if ( force || ( m_alarm_percent != old_ap )) alarmSlider-> setValue ( 100 - m_alarm_percent ); - + if ( force || ( m_bass_percent != old_bass )) + bassSlider-> setValue ( 100 - m_bass_percent ); + if ( force || ( m_treble_percent != old_treble )) + trebleSlider-> setValue ( 100 - m_treble_percent ); + + if ( force || ( m_vol_muted != old_vm )) volLed-> setOn ( !m_vol_muted ); if ( force || ( m_mic_muted != old_mm )) micLed-> setOn ( !m_mic_muted ); if ( force || ( m_snd_alarm != old_sa )) alarmLed-> setOn ( m_snd_alarm ); - + if ( force || ( m_snd_key != old_sk )) keyBox-> setChecked ( m_snd_key ); if ( force || ( m_snd_touch != old_st )) tapBox-> setChecked ( m_snd_touch ); if ( force || ( m_snd_alarm != old_sa )) - alarmBox-> setChecked ( m_snd_alarm ); + alarmBox-> setChecked ( m_snd_alarm ); } void VolumeControl::volumeChanged ( bool /*nowMuted*/ ) { int prevVol = m_vol_percent; bool prevMute = m_vol_muted; readConfig ( ); // Handle case where muting it toggled if ( m_vol_muted != prevMute ) @@ -494,88 +609,121 @@ void VolumeControl::keyClickToggled ( bool b ) writeConfigEntry ( "KeySound", m_snd_key, UPD_Vol ); } void VolumeControl::alarmSoundToggled ( bool b ) { m_snd_alarm = b; writeConfigEntry ( "AlarmSound", m_snd_alarm, UPD_Vol ); } void VolumeControl::volMuteToggled ( bool b ) { m_vol_muted = !b; - + m_icon-> redraw ( true ); - + writeConfigEntry ( "Mute", m_vol_muted, UPD_Vol ); } void VolumeControl::micMuteToggled ( bool b ) { - m_mic_muted = !b; + m_mic_muted = !b; writeConfigEntry ( "MicMute", m_mic_muted, UPD_Mic ); } void VolumeControl::volMoved ( int percent ) { m_vol_percent = 100 - percent; // clamp volume percent to be between 0 and 100 m_vol_percent = ( m_vol_percent < 0 ) ? 0 : (( m_vol_percent > 100 ) ? 100 : m_vol_percent ); // repaint just the little volume rectangle m_icon-> redraw ( false ); - + writeConfigEntry ( "VolumePercent", m_vol_percent, UPD_Vol ); } void VolumeControl::micMoved ( int percent ) { m_mic_percent = 100 - percent; // clamp volume percent to be between 0 and 100 m_mic_percent = ( m_mic_percent < 0 ) ? 0 : (( m_mic_percent > 100 ) ? 100 : m_mic_percent ); writeConfigEntry ( "Mic", m_mic_percent, UPD_Mic ); } void VolumeControl::alarmMoved ( int percent ) { m_alarm_percent = 100 - percent; // clamp volume percent to be between 0 and 100 m_alarm_percent = ( m_alarm_percent < 0 ) ? 0 : (( m_alarm_percent > 100 ) ? 100 : m_alarm_percent ); writeConfigEntry ( "AlarmPercent", m_alarm_percent, UPD_None ); } +void VolumeControl::bassMoved ( int percent ) +{ + m_bass_percent = 100 - percent; + + // clamp bass percent to be between 0 and 100 + m_bass_percent = ( m_bass_percent < 0 ) ? 0 : (( m_bass_percent > 100 ) ? 100 : m_bass_percent ); + + writeConfigEntry ( "BassPercent", m_bass_percent, UPD_Bass ); +} + + + +void VolumeControl::trebleMoved ( int percent ) +{ + m_treble_percent = 100 - percent; + + // clamp treble percent to be between 0 and 100 + m_treble_percent = ( m_treble_percent < 0 ) ? 0 : (( m_treble_percent > 100 ) ? 100 : m_treble_percent ); + + writeConfigEntry ( "TreblePercent", m_treble_percent, UPD_Treble ); +} + + + void VolumeControl::writeConfigEntry ( const char *entry, int val, eUpdate upd ) { Config cfg ( "qpe" ); cfg. setGroup ( "Volume" ); cfg. writeEntry ( entry, val ); // cfg. write ( ); - + #if ( defined Q_WS_QWS || defined(_WS_QWS_) ) && !defined(QT_NO_COP) switch ( upd ) { case UPD_Vol: { QCopEnvelope ( "QPE/System", "volumeChange(bool)" ) << m_vol_muted; break; } case UPD_Mic: { QCopEnvelope ( "QPE/System", "micChange(bool)" ) << m_mic_muted; break; } - case UPD_None: + case UPD_Bass: { + QCopEnvelope ( "QPE/System", "bassChange(bool)" ) << true; + break; + } + case UPD_Treble: { + QCopEnvelope ( "QPE/System", "trebleChange(bool)" ) << true; + break; + } + + case UPD_None: break; } #endif } //=========================================================================== VolumeApplet::VolumeApplet( QWidget *parent, const char *name ) : QWidget( parent, name ) { setFixedHeight ( 18 ); setFixedWidth ( 14 ); diff --git a/core/applets/volumeapplet/volume.h b/core/applets/volumeapplet/volume.h index 4d988ac..d2345b5 100644 --- a/core/applets/volumeapplet/volume.h +++ b/core/applets/volumeapplet/volume.h @@ -46,63 +46,71 @@ public: protected: virtual void keyPressEvent ( QKeyEvent * e ); protected slots: void volumeChanged ( bool muted ); void micChanged ( bool muted ); private slots: void volMoved ( int percent ); void micMoved ( int percent ); void alarmMoved ( int percent ); + void bassMoved( int percent ); + void trebleMoved( int percent ); void volMuteToggled ( bool ); void micMuteToggled ( bool ); void alarmSoundToggled ( bool ); void keyClickToggled ( bool ); void screenTapToggled ( bool ); void buttonChanged ( ); void rateTimerDone ( ); private: void readConfig ( bool force = false ); enum eUpdate { UPD_None, UPD_Vol, - UPD_Mic + UPD_Mic, + UPD_Bass, + UPD_Treble }; void writeConfigEntry ( const char *entry, int val, eUpdate upd ); private: QSlider *volSlider; + QSlider *bassSlider; + QSlider *trebleSlider; QSlider *micSlider; QSlider *alarmSlider; OLedBox *volLed; OLedBox *micLed; OLedBox *alarmLed; QCheckBox *alarmBox; QCheckBox *tapBox; QCheckBox *keyBox; QPushButton *upButton; QPushButton *downButton; QTimer *rateTimer; int m_vol_percent; int m_mic_percent; int m_alarm_percent; + int m_bass_percent; + int m_treble_percent; bool m_vol_muted; bool m_mic_muted; bool m_snd_alarm; bool m_snd_touch; bool m_snd_key; VolumeApplet *m_icon; }; class VolumeApplet : public QWidget { Q_OBJECT |