Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

volume.cpp

Go to the documentation of this file.
00001 /**********************************************************************
00002 ** Copyright (C) 2000 Trolltech AS.  All rights reserved.
00003 **
00004 ** This file is part of Qtopia Environment.
00005 **
00006 ** This file may be distributed and/or modified under the terms of the
00007 ** GNU General Public License version 2 as published by the Free Software
00008 ** Foundation and appearing in the file LICENSE.GPL included in the
00009 ** packaging of this file.
00010 **
00011 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
00012 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
00013 **
00014 ** See http://www.trolltech.com/gpl/ for GPL licensing information.
00015 **
00016 ** Contact info@trolltech.com if any conditions of this licensing are
00017 ** not clear to you.
00018 **
00019 **********************************************************************/
00020 
00021 #include "volume.h"
00022 
00023 /* OPIE */
00024 #include <opie2/oledbox.h>
00025 #include <opie2/odevice.h>
00026 #include <opie2/otaskbarapplet.h>
00027 #include <opie2/oresource.h>
00028 #include <qpe/applnk.h>
00029 #include <qpe/config.h>
00030 #include <qpe/qcopenvelope_qws.h>
00031 using namespace Opie::Core;
00032 using namespace Opie::Ui;
00033 
00034 /* QT */
00035 #include <qpainter.h>
00036 #include <qcheckbox.h>
00037 #include <qslider.h>
00038 #include <qlayout.h>
00039 #include <qvbox.h>
00040 #include <qlabel.h>
00041 #include <qpushbutton.h>
00042 #include <qtimer.h>
00043 
00044 /* STD */
00045 #include <stdio.h>
00046 
00047 #define RATE_TIMER_INTERVAL 100
00048 // Ten times per second is fine (RATE_TIMER_INTERVAL 100).  A shorter time
00049 // results in "hanging" buttons on the iPAQ due to quite high CPU consumption.
00050 
00051 
00052 /* XPM */
00053 using namespace Opie::Ui;
00054 static const char * vol_xpm[] = {
00055 "20 20 3 1",
00056 "   c None",
00057 ".  c #0000FF",
00058 "+  c #000000",
00059 "                    ",
00060 "        .           ",
00061 "        . . . .     ",
00062 "    . . . . . .     ",
00063 "    . . . . . . .   ",
00064 "    . . ..... . .   ",
00065 "  . ... ..... ...   ",
00066 "  ........... ....  ",
00067 "  ................. ",
00068 "++++++++++++++++++++",
00069 " .................. ",
00070 "  . ............. . ",
00071 "  . ..... .......   ",
00072 "    . ... ..... .   ",
00073 "    . ... ..... .   ",
00074 "    . ... .....     ",
00075 "    .  .  . . .     ",
00076 "       .  . .       ",
00077 "       .  . .       ",
00078 "                    "};
00079 /* XPM */
00080 static const char * mic_xpm[] = {
00081 "20 20 21 1",
00082 "   c None",
00083 ".  c #000000",
00084 "+  c #EEEEEE",
00085 "@  c #B4B6B4",
00086 "#  c #8B8D8B",
00087 "$  c #D5D6D5",
00088 "%  c #E6E6E6",
00089 "&  c #9C9D9C",
00090 "*  c #6A696A",
00091 "=  c #E6E2E6",
00092 "-  c #F6F2F6",
00093 ";  c #CDC6CD",
00094 ">  c #737573",
00095 ",  c #4A484A",
00096 "'  c #DEDEDE",
00097 ")  c #F6EEF6",
00098 "!  c #414041",
00099 "~  c #202020",
00100 "{  c #ACAEAC",
00101 "]  c #838583",
00102 "^  c #6A656A",
00103 "                    ",
00104 "            ....    ",
00105 "           .+@+#.   ",
00106 "          ..$%&%*.  ",
00107 "         .=-.;=>=,. ",
00108 "         .'+).&+!+. ",
00109 "         .+;+;.~+~. ",
00110 "         ..%{%,.... ",
00111 "         ..&=>=~..  ",
00112 "        .+..]^,..   ",
00113 "       .+.......    ",
00114 "      .%...         ",
00115 "     .=...          ",
00116 "    .+...           ",
00117 "   .+...            ",
00118 "   ....             ",
00119 "  ....              ",
00120 "  ..                ",
00121 " .                  ",
00122 ".                   "};
00123 
00124 
00125 static const char * bass_xpm[] = {
00126 "20 20 3 1",
00127 "       c None",
00128 ".      c #000000",
00129 "+      c #0000FF",
00130 "                    ",
00131 "                    ",
00132 "                    ",
00133 ".....   +++   ......",
00134 "      +++++++       ",
00135 "     ++    ++       ",
00136 "... ++ ...  ++  ++ .",
00137 "    +++     ++  ++  ",
00138 "    ++++    ++      ",
00139 "... ++++ .. ++ .....",
00140 "     ++    ++       ",
00141 "           ++   ++  ",
00142 "..........++    ++ .",
00143 "         ++         ",
00144 "        ++          ",
00145 "...... ++  .........",
00146 "       +            ",
00147 "                    ",
00148 "                    ",
00149 "                    "};
00150 
00151 
00152 static const char * treble_xpm[] = {
00153 "20 20 3 1",
00154 "       c None",
00155 ".      c #0000FF",
00156 "+      c #000000",
00157 "          ..        ",
00158 "         . ..       ",
00159 "         . ..       ",
00160 "++++++++ . .. ++++++",
00161 "         . .        ",
00162 "         ...        ",
00163 "++++++++ .   +++++++",
00164 "        ..          ",
00165 "      .. .          ",
00166 "+++  ..  ... +++++++",
00167 "    ..  .. ..       ",
00168 "    .. . .  ..      ",
00169 "+++ .. . . + . +++++",
00170 "    ..   .  ..      ",
00171 "     ..  . ..       ",
00172 "++++  ...... +++++++",
00173 "         .          ",
00174 "      .. .          ",
00175 "      .. .          ",
00176 "       ..           "};
00177 
00178 
00179 
00180 
00181 /* XPM */
00182 static const char * alarm_xpm[] = {
00183 "20 20 33 1",
00184 "   c None",
00185 ".  c #080602",
00186 "+  c #AAA602",
00187 "@  c #252002",
00188 "#  c #434202",
00189 "$  c #795602",
00190 "%  c #C3C20D",
00191 "&  c #DADAC2",
00192 "*  c #826002",
00193 "=  c #740502",
00194 "-  c #D6D602",
00195 ";  c #322E02",
00196 ">  c #826A02",
00197 ",  c #F1F195",
00198 "'  c #959215",
00199 ")  c #423602",
00200 "!  c #4B0302",
00201 "~  c #844315",
00202 "{  c #AAAA2A",
00203 "]  c #E2DE42",
00204 "^  c #BA7E04",
00205 "/  c #7F7502",
00206 "(  c #828276",
00207 "_  c #FEFE4E",
00208 ":  c #7D1902",
00209 "<  c #989656",
00210 "[  c #260B02",
00211 "}  c #F7F7D8",
00212 "|  c #DCDA5A",
00213 "1  c #823102",
00214 "2  c #B1AC6B",
00215 "3  c #F7F710",
00216 "4  c #838204",
00217 "                    ",
00218 "                    ",
00219 "        4'4/        ",
00220 "        /-^=        ",
00221 "       42{4>4       ",
00222 "      '2|+*$44      ",
00223 "     +2&3+$1*44     ",
00224 "    (%_}_+/$:>/4    ",
00225 "    4%_}3+#;>:*4    ",
00226 "    4%_}&+#[1$/4    ",
00227 "    4%_,2')[~~>4    ",
00228 "    4%33'4#@~1>4    ",
00229 "    4%3344#[:>/4    ",
00230 "   42&_3'4#@>:*44   ",
00231 "  42|}}3'4#[;$)$44  ",
00232 "444{]]2^~~:!!#.@##/ ",
00233 "4444-%*:==!!=...../ ",
00234 "       /:[..        ",
00235 "        /@.         ",
00236 "                    "};
00237 
00238 VolumeControl::VolumeControl ( VolumeApplet *icon, bool /*showMic*/, QWidget *parent, const char *name )
00239     : QFrame ( parent, name, WStyle_StaysOnTop | WType_Popup )
00240 {
00241   m_icon = icon;
00242 
00243   bool has_wav_alarm = true;
00244   bool has_bass = true;
00245   bool has_treble = true;
00246 
00247   switch ( ODevice::inst ( )-> model ( )) { // we need to add other devices eventually
00248     case Model_Zaurus_SL5000:
00249       has_wav_alarm = false; //poor guys probably feeling left out...
00250       break;
00251     default:
00252       break;
00253   }
00254 
00255   if ( !ODevice::inst()->modelString().contains( "Model_iPAQ" )) {
00256     has_bass = false;
00257     has_treble = false;
00258   }
00259 
00260   setFrameStyle ( QFrame::PopupPanel | QFrame::Raised );
00261 
00262   QGridLayout *grid = new QGridLayout ( this, 1, 1, 6, 4 );
00263   grid-> setSpacing ( 4 );
00264   grid-> setMargin ( 6 );
00265 
00266   QVBoxLayout *vbox;
00267   QLabel *l;
00268 
00269   vbox = new QVBoxLayout ( );
00270   vbox-> setSpacing ( 4 );
00271   grid-> addLayout ( vbox, 1, 0 );
00272 
00273   upButton = new QPushButton ( this );
00274   upButton-> setSizePolicy ( QSizePolicy ( QSizePolicy::Minimum, QSizePolicy::Expanding ));
00275   upButton-> setPixmap ( Opie::Core::OResource::loadPixmap( "up", Opie::Core::OResource::SmallIcon ) );
00276   upButton-> setFocusPolicy ( QWidget::NoFocus );
00277 
00278   vbox-> addWidget ( upButton );
00279 
00280   downButton = new QPushButton ( this );
00281   downButton-> setSizePolicy ( QSizePolicy ( QSizePolicy::Minimum, QSizePolicy::Expanding ));
00282   downButton-> setPixmap ( Opie::Core::OResource::loadPixmap( "down", Opie::Core::OResource::SmallIcon ) );
00283   downButton-> setFocusPolicy ( QWidget::NoFocus );
00284 
00285   vbox-> addWidget ( downButton );
00286 
00287   volSlider = new QSlider ( this );
00288   volSlider-> setRange ( 0, 100 );
00289   volSlider-> setTickmarks ( QSlider::Both );
00290   volSlider-> setTickInterval ( 20 );
00291   volSlider-> setFocusPolicy ( QWidget::NoFocus );
00292 
00293   l = new QLabel ( this );
00294   l-> setPixmap ( QPixmap ( vol_xpm ));
00295 
00296   grid-> addWidget ( l, 0, 1, AlignCenter );
00297   grid-> addWidget ( volSlider, 1, 1, AlignCenter );
00298 
00299   volLed = new OLedBox ( green, this );
00300   volLed-> setFocusPolicy ( QWidget::NoFocus );
00301   volLed-> setFixedSize ( 16, 16  );
00302 
00303   grid-> addWidget ( volLed, 2, 1, AlignCenter );
00304 
00305   QVBox *basstrebleBox = new QVBox( this );
00306 
00307   trebleSlider = new QSlider ( basstrebleBox );
00308   trebleSlider-> setRange ( 0, 100 );
00309   trebleSlider-> setTickmarks ( QSlider::Both );
00310   trebleSlider-> setTickInterval ( 20 );
00311   trebleSlider->setMaximumHeight( 40 );
00312   trebleSlider-> setFocusPolicy ( QWidget::NoFocus );
00313 
00314   bassSlider = new QSlider ( basstrebleBox );
00315   bassSlider-> setRange ( 0, 100 );
00316   bassSlider-> setTickmarks ( QSlider::Both );
00317   bassSlider-> setTickInterval ( 20 );
00318   bassSlider->setMaximumHeight( 40 );
00319   bassSlider-> setFocusPolicy ( QWidget::NoFocus );
00320 
00321   QLabel *bassLabel = new QLabel ( this );
00322   bassLabel-> setPixmap ( QPixmap ( bass_xpm ));
00323 
00324   QLabel *trebleLabel = new QLabel( this );
00325   trebleLabel->setPixmap( QPixmap ( treble_xpm ) );
00326 
00327   grid->addWidget( trebleLabel, 0, 4, AlignCenter );
00328   grid->addWidget( basstrebleBox, 1, 4, AlignCenter );
00329   grid-> addWidget ( bassLabel, 2, 4, AlignCenter );
00330 
00331   if ( !has_bass ) {
00332     bassSlider->hide();
00333     bassLabel->hide();
00334   }
00335 
00336   if ( !has_treble ) {
00337     trebleSlider->hide();
00338     trebleLabel->hide();
00339   }
00340 
00341   micSlider = new QSlider ( this );
00342   micSlider-> setRange ( 0, 100 );
00343   micSlider-> setTickmarks ( QSlider::Both );
00344   micSlider-> setTickInterval ( 20 );
00345   micSlider-> setFocusPolicy ( QWidget::NoFocus );
00346 
00347   l = new QLabel ( this );
00348   l-> setPixmap ( QPixmap ( mic_xpm ));
00349 
00350   grid-> addWidget ( l, 0, 2, AlignCenter );
00351   grid-> addWidget ( micSlider, 1, 2, AlignCenter );
00352 
00353   micLed = new OLedBox ( red, this );
00354   micLed-> setFocusPolicy ( QWidget::NoFocus );
00355   micLed-> setFixedSize ( 16, 16 );
00356 
00357   grid-> addWidget ( micLed, 2, 2, AlignCenter );
00358 
00359   alarmSlider = new QSlider ( this );
00360   alarmSlider-> setRange ( 0, 100 );
00361   alarmSlider-> setTickmarks ( QSlider::Both );
00362   alarmSlider-> setTickInterval ( 20 );
00363   alarmSlider-> setFocusPolicy ( QWidget::NoFocus );
00364 
00365   QLabel *alarmLabel = new QLabel ( this );
00366   alarmLabel-> setPixmap ( QPixmap ( alarm_xpm ));
00367 
00368   grid-> addWidget ( alarmLabel, 0, 3, AlignCenter );
00369   grid-> addWidget ( alarmSlider, 1, 3, AlignCenter );
00370 
00371   alarmLed = new OLedBox ( yellow, this );
00372   alarmLed-> setFocusPolicy ( QWidget::NoFocus );
00373   alarmLed-> setFixedSize ( 16, 16 );
00374 
00375   grid-> addWidget ( alarmLed, 2, 3, AlignCenter );
00376 
00377   if ( !has_wav_alarm ) {
00378     alarmSlider-> hide ( );
00379     alarmLabel-> hide ( );
00380     alarmLed-> hide ( );
00381   }
00382 
00383   grid-> addWidget ( new QLabel ( tr( "Enable Sounds for:" ), this ), 0, 6, AlignVCenter | AlignLeft );
00384 
00385   vbox = new QVBoxLayout ( );
00386   vbox-> setSpacing ( 4 );
00387   grid-> addMultiCellLayout ( vbox, 1, 2, 6, 6 );
00388 
00389   tapBox = new QCheckBox ( tr( "Screen Taps" ), this );
00390   tapBox-> setFocusPolicy ( QWidget::NoFocus );
00391 
00392   vbox-> addWidget ( tapBox, AlignVCenter | AlignLeft );
00393 
00394   keyBox = new QCheckBox ( tr( "Key Clicks" ), this );
00395   keyBox-> setFocusPolicy ( QWidget::NoFocus );
00396 
00397   vbox-> addWidget ( keyBox, AlignVCenter | AlignLeft );
00398 
00399   alarmBox = new QCheckBox ( tr( "Alarm Sound" ), this );
00400   alarmBox-> setFocusPolicy ( QWidget::NoFocus );
00401 
00402   vbox-> addWidget ( alarmBox, AlignVCenter | AlignLeft );
00403 
00404   if ( has_wav_alarm ) {
00405     alarmBox-> hide ( );
00406   }
00407 
00408   vbox-> addStretch ( 100 );
00409 
00410   setFixedSize ( sizeHint ( ));
00411   setFocusPolicy ( QWidget::NoFocus );
00412 
00413   rateTimer = new QTimer( this );
00414   connect ( rateTimer, SIGNAL( timeout()), this, SLOT( rateTimerDone()));
00415 
00416   connect ( upButton,   SIGNAL( pressed()),  this, SLOT( buttonChanged()));
00417   connect ( upButton,   SIGNAL( released()), this, SLOT( buttonChanged()));
00418   connect ( downButton, SIGNAL( pressed()),  this, SLOT( buttonChanged()));
00419   connect ( downButton, SIGNAL( released()), this, SLOT( buttonChanged()));
00420 
00421   connect ( micSlider, SIGNAL( valueChanged(int)), this, SLOT( micMoved(int)));
00422   connect ( volSlider, SIGNAL( valueChanged(int)), this, SLOT( volMoved(int)));
00423   connect ( alarmSlider, SIGNAL( valueChanged(int)), this, SLOT( alarmMoved(int)));
00424   connect ( bassSlider, SIGNAL( valueChanged(int)), this, SLOT( bassMoved(int)));
00425   connect ( trebleSlider, SIGNAL( valueChanged(int)), this, SLOT( trebleMoved(int)));
00426 
00427 
00428   connect ( volLed,   SIGNAL( toggled(bool)), this, SLOT( volMuteToggled(bool)));
00429   connect ( micLed,   SIGNAL( toggled(bool)), this, SLOT( micMuteToggled(bool)));
00430   connect ( alarmLed, SIGNAL( toggled(bool)), this, SLOT( alarmSoundToggled(bool)));
00431 
00432   connect ( alarmBox, SIGNAL( toggled(bool)), this, SLOT( alarmSoundToggled(bool)));
00433   connect ( keyBox,   SIGNAL( toggled(bool)), this, SLOT( keyClickToggled(bool)));
00434   connect ( tapBox,   SIGNAL( toggled(bool)), this, SLOT( screenTapToggled(bool)));
00435 
00436   // initialize variables
00437 
00438   readConfig ( true );
00439 
00440   // initialize the config file, in case some entries are missing
00441 
00442   writeConfigEntry ( "VolumePercent", m_vol_percent,   UPD_None );
00443   writeConfigEntry ( "BassPercent",   m_vol_percent,   UPD_None );
00444   writeConfigEntry ( "TreblePercent", m_vol_percent,   UPD_None );
00445   writeConfigEntry ( "Mute",          m_vol_muted,     UPD_None );
00446   writeConfigEntry ( "AlarmPercent",  m_alarm_percent, UPD_None );
00447   writeConfigEntry ( "TouchSound",    m_snd_touch,     UPD_None );
00448   writeConfigEntry ( "KeySound",      m_snd_key,       UPD_None );
00449   writeConfigEntry ( "AlarmSound",    m_snd_alarm,     UPD_Vol );
00450 
00451   writeConfigEntry ( "Mic",           m_mic_percent,   UPD_None );
00452   writeConfigEntry ( "MicMute",       m_mic_muted,     UPD_Mic );
00453 }
00454 
00455 bool VolumeControl::volMuted ( ) const
00456 {
00457   return m_vol_muted;
00458 }
00459 
00460 int VolumeControl::volPercent ( ) const
00461 {
00462   return m_vol_percent;
00463 }
00464 
00465 void VolumeControl::keyPressEvent ( QKeyEvent *e )
00466 {
00467   switch ( e-> key ( )) {
00468     case Key_Up:
00469       volSlider-> subtractStep ( );
00470       break;
00471     case Key_Down:
00472       volSlider-> addStep ( );
00473       break;
00474     case Key_Space:
00475       volLed-> toggle ( );
00476       break;
00477     case Key_Escape:
00478       hide ( );
00479       break;
00480   }
00481 }
00482 
00483 void VolumeControl::buttonChanged ( )
00484 {
00485   if ( upButton-> isDown ( ) || downButton->isDown ( )) {
00486     rateTimerDone ( ); // Call it one time manually, otherwise it wont get
00487     // called at all when a button is pressed for a time
00488     // shorter than RATE_TIMER_INTERVAL.
00489     rateTimer-> start ( RATE_TIMER_INTERVAL, false );
00490   }
00491   else
00492     rateTimer-> stop ( );
00493 }
00494 
00495 void VolumeControl::rateTimerDone ( )
00496 {
00497   if ( upButton-> isDown ( ))
00498     volSlider-> setValue ( volSlider-> value ( ) - 2 );
00499   else // if ( downButton-> isDown ( ))
00500     volSlider-> setValue ( volSlider-> value ( ) + 2 );
00501 }
00502 
00503 void VolumeControl::show ( bool /*showMic*/ )
00504 {
00505   readConfig ( );
00506 
00507   QPoint curPos = m_icon-> mapToGlobal ( QPoint ( 0, 0 ));
00508 
00509   int w = sizeHint ( ). width ( );
00510   int x = curPos.x ( ) - ( w / 2 );
00511 
00512   if (( x + w ) > QPEApplication::desktop ( )-> width ( ))
00513     x = QPEApplication::desktop ( )-> width ( ) - w;
00514 
00515   move ( QMAX(x,0), curPos. y ( ) - sizeHint ( ). height ( ));
00516   QFrame::show ( );
00517 
00518 }
00519 
00520 void VolumeControl::readConfig ( bool force )
00521 {
00522   Config cfg ( "qpe" );
00523   cfg. setGroup ( "Volume" );
00524 
00525   int old_vp = m_vol_percent;
00526   int old_mp = m_mic_percent;
00527   int old_bass = m_bass_percent;
00528   int old_treble = m_treble_percent;
00529   bool old_vm = m_vol_muted;
00530   bool old_mm = m_mic_muted;
00531   bool old_sk = m_snd_key;
00532   bool old_st = m_snd_touch;
00533   bool old_sa = m_snd_alarm;
00534   int old_ap = m_alarm_percent;
00535 
00536   m_vol_percent   = cfg. readNumEntry ( "VolumePercent", 50 );
00537   m_mic_percent   = cfg. readNumEntry ( "Mic", 50 );
00538   m_bass_percent  = cfg. readNumEntry ( "BassPercent", 50 );
00539   m_treble_percent = cfg. readNumEntry ( "TreblePercent", 50 );
00540   m_vol_muted     = cfg. readBoolEntry ( "Mute", 0 );
00541   m_mic_muted     = cfg. readBoolEntry ( "MicMute", 0 );
00542   m_snd_key       = cfg. readBoolEntry ( "KeySound", 0 );
00543   m_snd_touch     = cfg. readBoolEntry ( "TouchSound", 0 );
00544   m_snd_alarm     = cfg. readBoolEntry ( "AlarmSound", 1 );
00545   m_alarm_percent = cfg. readNumEntry ( "AlarmPercent", 65 );
00546 
00547   if ( force || ( m_vol_percent != old_vp ))
00548     volSlider-> setValue ( 100 - m_vol_percent );
00549   if ( force || ( m_mic_percent != old_mp ))
00550     micSlider-> setValue ( 100 - m_mic_percent );
00551   if ( force || ( m_alarm_percent != old_ap ))
00552     alarmSlider-> setValue ( 100 - m_alarm_percent );
00553   if ( force || ( m_bass_percent != old_bass ))
00554     bassSlider-> setValue ( 100 - m_bass_percent );
00555   if ( force || ( m_treble_percent != old_treble ))
00556     trebleSlider-> setValue ( 100 - m_treble_percent );
00557 
00558 
00559   if ( force || ( m_vol_muted != old_vm ))
00560     volLed-> setOn ( !m_vol_muted );
00561   if ( force || ( m_mic_muted != old_mm ))
00562     micLed-> setOn ( !m_mic_muted );
00563   if ( force || ( m_snd_alarm != old_sa ))
00564     alarmLed-> setOn ( m_snd_alarm );
00565 
00566   if ( force || ( m_snd_key != old_sk ))
00567     keyBox-> setChecked ( m_snd_key );
00568   if ( force || ( m_snd_touch != old_st ))
00569     tapBox-> setChecked ( m_snd_touch );
00570   if ( force || ( m_snd_alarm != old_sa ))
00571     alarmBox-> setChecked ( m_snd_alarm );
00572 }
00573 
00574 
00575 void VolumeControl::volumeChanged ( bool /*nowMuted*/ )
00576 {
00577   int prevVol = m_vol_percent;
00578   bool prevMute = m_vol_muted;
00579 
00580   readConfig ( );
00581 
00582   // Handle case where muting it toggled
00583   if ( m_vol_muted != prevMute )
00584         m_icon-> redraw ( true );
00585   else if ( prevVol != m_vol_percent ) // Avoid over repainting
00586         m_icon-> redraw ( false );
00587 }
00588 
00589 void VolumeControl::micChanged ( bool nowMuted )
00590 {
00591   if ( !nowMuted )
00592     readConfig ( );
00593   m_mic_muted = nowMuted;
00594 }
00595 
00596 void VolumeControl::screenTapToggled ( bool b )
00597 {
00598   m_snd_touch = b;
00599   writeConfigEntry ( "TouchSound", m_snd_touch, UPD_Vol );
00600 }
00601 
00602 void VolumeControl::keyClickToggled ( bool b )
00603 {
00604   m_snd_key = b;
00605   writeConfigEntry ( "KeySound", m_snd_key, UPD_Vol );
00606 }
00607 
00608 void VolumeControl::alarmSoundToggled ( bool b )
00609 {
00610   m_snd_alarm = b;
00611   writeConfigEntry ( "AlarmSound", m_snd_alarm, UPD_Vol );
00612 }
00613 
00614 void VolumeControl::volMuteToggled ( bool b )
00615 {
00616   m_vol_muted = !b;
00617 
00618   m_icon-> redraw ( true );
00619 
00620   writeConfigEntry ( "Mute", m_vol_muted, UPD_Vol );
00621 }
00622 
00623 void VolumeControl::micMuteToggled ( bool b )
00624 {
00625   m_mic_muted = !b;
00626   writeConfigEntry ( "MicMute", m_mic_muted, UPD_Mic );
00627 }
00628 
00629 
00630 void VolumeControl::volMoved ( int percent )
00631 {
00632   m_vol_percent = 100 - percent;
00633 
00634   // clamp volume percent to be between 0 and 100
00635   m_vol_percent = ( m_vol_percent < 0 ) ? 0 : (( m_vol_percent > 100 ) ? 100 : m_vol_percent );
00636   // repaint just the little volume rectangle
00637   m_icon-> redraw ( false );
00638 
00639   writeConfigEntry ( "VolumePercent", m_vol_percent, UPD_Vol );
00640 }
00641 
00642 void VolumeControl::micMoved ( int percent )
00643 {
00644   m_mic_percent = 100 - percent;
00645 
00646   // clamp volume percent to be between 0 and 100
00647   m_mic_percent = ( m_mic_percent < 0 ) ? 0 : (( m_mic_percent > 100 ) ? 100 : m_mic_percent );
00648 
00649   writeConfigEntry ( "Mic", m_mic_percent, UPD_Mic );
00650 }
00651 
00652 void VolumeControl::alarmMoved ( int percent )
00653 {
00654   m_alarm_percent = 100 - percent;
00655 
00656   // clamp volume percent to be between 0 and 100
00657   m_alarm_percent = ( m_alarm_percent < 0 ) ? 0 : (( m_alarm_percent > 100 ) ? 100 : m_alarm_percent );
00658 
00659   writeConfigEntry ( "AlarmPercent", m_alarm_percent, UPD_None );
00660 }
00661 
00662 
00663 void VolumeControl::bassMoved ( int percent )
00664 {
00665   m_bass_percent = 100 - percent;
00666 
00667   // clamp bass percent to be between 0 and 100
00668   m_bass_percent = ( m_bass_percent < 0 ) ? 0 : (( m_bass_percent > 100 ) ? 100 : m_bass_percent );
00669 
00670   writeConfigEntry ( "BassPercent", m_bass_percent, UPD_Bass );
00671 }
00672 
00673 
00674 
00675 void VolumeControl::trebleMoved ( int percent )
00676 {
00677   m_treble_percent = 100 - percent;
00678 
00679   // clamp treble percent to be between 0 and 100
00680   m_treble_percent = ( m_treble_percent < 0 ) ? 0 : (( m_treble_percent > 100 ) ? 100 : m_treble_percent );
00681 
00682   writeConfigEntry ( "TreblePercent", m_treble_percent, UPD_Treble );
00683 }
00684 
00685 
00686 
00687 void VolumeControl::writeConfigEntry ( const char *entry, int val, eUpdate upd )
00688 {
00689   Config cfg ( "qpe" );
00690   cfg. setGroup ( "Volume" );
00691   cfg. writeEntry ( entry, val );
00692 //  cfg. write ( );
00693 
00694 #if ( defined Q_WS_QWS || defined(_WS_QWS_) ) && !defined(QT_NO_COP)
00695   switch ( upd ) {
00696     case UPD_Vol: {
00697       QCopEnvelope ( "QPE/System", "volumeChange(bool)" ) << m_vol_muted;
00698       break;
00699     }
00700     case UPD_Mic: {
00701       QCopEnvelope ( "QPE/System", "micChange(bool)" ) << m_mic_muted;
00702       break;
00703     }
00704     case UPD_Bass: {
00705       QCopEnvelope ( "QPE/System", "bassChange(bool)" ) << true;
00706       break;
00707     }
00708     case UPD_Treble: {
00709       QCopEnvelope ( "QPE/System", "trebleChange(bool)" ) << true;
00710       break;
00711     }
00712 
00713     case UPD_None:
00714       break;
00715   }
00716 #endif
00717 }
00718 
00719 //===========================================================================
00720 
00721 VolumeApplet::VolumeApplet( QWidget *parent, const char *name )
00722     : QWidget( parent, name )
00723 {
00724   setFixedWidth ( AppLnk::smallIconSize()  );
00725   setFixedHeight ( AppLnk::smallIconSize()+4 );
00726 
00727   m_pixmap = new QPixmap ( Opie::Core::OResource::loadPixmap( "volume", Opie::Core::OResource::SmallIcon ) );
00728   m_dialog = new VolumeControl ( this, true, this, "volumecontrol" );
00729 
00730   connect ( qApp, SIGNAL( volumeChanged(bool)), m_dialog, SLOT( volumeChanged(bool)));
00731   connect ( qApp, SIGNAL( micChanged(bool)), m_dialog, SLOT ( micChanged(bool)));
00732 }
00733 
00734 VolumeApplet::~VolumeApplet()
00735 {
00736   delete m_pixmap;
00737 }
00738 
00739 int VolumeApplet::position()
00740 {
00741   return 6;
00742 }
00743 
00744 void VolumeApplet::mousePressEvent ( QMouseEvent * )
00745 {
00746   if ( m_dialog-> isVisible ( ))
00747     m_dialog-> hide ( );
00748   else
00749     m_dialog-> show ( true );
00750 }
00751 
00752 void VolumeApplet::redraw ( bool all )
00753 {
00754         if ( all )
00755                 repaint ( true );
00756         else
00757                 repaint ( 2, height ( ) - 3, width ( ) - 4, 2, false );
00758 }
00759 
00760 
00761 void VolumeApplet::paintEvent ( QPaintEvent * )
00762 {
00763   QPainter p ( this );
00764 
00765   p. drawPixmap ( (width()- m_pixmap->width())/2, QMAX( (height()-4-m_pixmap->height() )/2, 1), *m_pixmap );
00766   p. setPen ( darkGray );
00767   p. drawRect ( 1, height() - 4, width() - 2, 4 );
00768 
00769   int pixelsWide = m_dialog-> volPercent ( ) * ( width() - 4 ) / 100;
00770   p. fillRect ( 2, height() - 3, pixelsWide, 2, red );
00771   p. fillRect ( pixelsWide + 2, height() - 3, width() - 4 - pixelsWide, 2, lightGray );
00772 
00773   if ( m_dialog-> volMuted ( )) {
00774     p. setPen ( red );
00775     p. drawLine ( 1, 2, width() - 2, height() - 5 );
00776     p. drawLine ( 1, 3, width() - 2, height() - 4 );
00777     p. drawLine ( width() - 2, 2, 1, height() - 5 );
00778     p. drawLine ( width() - 2, 3, 1, height() - 4 );
00779   }
00780 }
00781 
00782 
00783 EXPORT_OPIE_APPLET_v1( VolumeApplet )

Generated on Sat Nov 5 16:15:25 2005 for OPIE by  doxygen 1.4.2