summaryrefslogtreecommitdiffstats
path: root/src/app/volumeAction.cpp
blob: e48dc27163b873876ca017518ed2a7bbaddb9fff (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// (C) 2005 Max Howell ([email protected])
// See COPYING file for licensing information

#include <tdelocale.h>
#include <tdetoolbar.h>
#include <tqevent.h>
#include <tqlabel.h>
#include <tqlayout.h>
#include <tqslider.h>

#include "../debug.h"
#include "volumeAction.h"

#include "xineEngine.h"


class VolumeSlider : public TQFrame
{
public:
   VolumeSlider( TQWidget *parent )
         : TQFrame( parent )
   {
      slider = new TQSlider( TQt::Vertical, this, "volume" );
      label = new TQLabel( this );

      TQBoxLayout *lay = new TQVBoxLayout( this );
      lay->addWidget( slider, 0, TQt::AlignHCenter );
      lay->addWidget( label, 0, TQt::AlignHCenter );
      lay->setMargin( 4 );

      slider->setRange( 0, 100 );

      setFrameStyle( TQFrame::Plain | TQFrame::Box );
      setSizePolicy( TQSizePolicy::Preferred, TQSizePolicy::Preferred );

      // Calculate width required for max label size
      label->setText( "100%" );
      adjustSize();
      requiredWidth = width();

      hide();
   }

   TQLabel *label;
   TQSlider *slider;
   int requiredWidth;
};


VolumeAction::VolumeAction( TDEToolBar *bar, TDEActionCollection *ac )
      : TDEToggleAction( i18n("Volume"), "volume", TQt::Key_1, 0, 0, ac, "volume" )
      , m_anchor( 0 )
{
   m_widget = new VolumeSlider( bar->topLevelWidget() );

   connect( this, TQ_SIGNAL(toggled( bool )), TQ_SLOT(toggled( bool )) );
   connect( m_widget->slider, TQ_SIGNAL(sliderMoved( int )), TQ_SLOT(sliderMoved( int )) );
   connect( m_widget->slider, TQ_SIGNAL(sliderMoved( int )), Codeine::engine(), TQ_SLOT(setStreamParameter( int )) );
   connect( m_widget->slider, TQ_SIGNAL(sliderReleased()), TQ_SLOT(sliderReleased()) );
}

int
VolumeAction::plug( TQWidget *bar, int index )
{
   DEBUG_BLOCK

   int const id = TDEAction::plug( bar, index );

   m_anchor = (TQWidget*)bar->child( "toolbutton_volume" ); //TDEAction creates it with this name
   m_anchor->installEventFilter( this ); //so we can keep m_widget anchored

   return id;
}

void
VolumeAction::toggled( bool const b )
{
   DEBUG_BLOCK

   TQString t = TQString::number(100 - m_widget->slider->value()) + "%";
   setToolTip( i18n( "Volume: %1" ).arg( t ) );
   m_widget->label->setText( t );

   m_widget->raise();
   m_widget->setShown( b );
}

void
VolumeAction::sliderMoved( int v )
{
   v = 100 - v; //TQt sliders are wrong way round when vertical

   TQString t = TQString::number( v ) + '%';

   setToolTip( i18n( "Volume: %1" ).arg( t ) );
   m_widget->label->setText( t );
}

bool
VolumeAction::eventFilter( TQObject *o, TQEvent *e )
{
   switch (e->type()) {
      case TQEvent::Move:
      case TQEvent::Resize: {
         TQWidget const * const &a = m_anchor;

         m_widget->resize( m_widget->requiredWidth, m_widget->sizeHint().height() );
         m_widget->move( a->mapTo( m_widget->parentWidget(), TQPoint( a->width() - m_widget->width(), a->height() ) ) );
         return false;
      }

      //TODO one click method, flawed currently in fullscreen mode by palette change in mainwindow.cpp
/*      case TQEvent::MouseButtonPress:
         m_widget->show();
         break;

      case TQEvent::MouseButtonRelease:
         m_widget->hide();
         break;*/

      default:
         return false;
   }
}

#include "volumeAction.moc"