You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
codeine/src/app/slider.cpp

148 lines
3.4 KiB

// (c) 2004 Max Howell (max.howell@methylblue.com)
// See COPYING file for licensing information
#include "../debug.h"
#include "slider.h"
#include <tqapplication.h>
#include <tqlabel.h>
#include <tqsize.h>
#include <tqtooltip.h>
#include <tqpainter.h>
#include "xineEngine.h"
using Codeine::Slider;
Slider *Slider::s_instance = 0;
Slider::Slider( TQWidget *parent, uint max )
: TQSlider( TQt::Horizontal, parent )
, m_sliding( false )
, m_outside( false )
, m_prevValue( 0 )
{
s_instance = this;
setRange( 0, max );
setFocusPolicy( NoFocus );
setSizePolicy( TQSizePolicy::MinimumExpanding, TQSizePolicy::MinimumExpanding );
}
void
Slider::wheelEvent( TQWheelEvent *e )
{
//if you use this class elsewhere, NOTE this is Codeine specific
e->ignore(); //pass to VideoWindow
}
void
Slider::mouseMoveEvent( TQMouseEvent *e )
{
if( m_sliding )
{
//feels better, but using set value of 20 is bad of course
TQRect rect = this->rect();
rect.addCoords( -20, -20, 20, 20 );
if( !rect.contains( e->pos() ) ) {
if( !m_outside )
TQSlider::setValue( m_prevValue );
m_outside = true;
} else {
m_outside = false;
TQSlider::setValue(
TQRangeControl::valueFromPosition(
e->pos().x() - sliderRect().width()/2,
width() - sliderRect().width() ) );
emit sliderMoved( value() );
}
}
else
TQSlider::mouseMoveEvent( e );
}
void
Slider::mousePressEvent( TQMouseEvent *e )
{
m_sliding = true;
m_prevValue = TQSlider::value();
if( !sliderRect().contains( e->pos() ) )
mouseMoveEvent( e );
}
void
Slider::mouseReleaseEvent( TQMouseEvent* )
{
if( !m_outside && TQSlider::value() != m_prevValue )
emit sliderReleased( value() );
m_sliding = false;
m_outside = false;
}
static inline TQString timeAsString( const int s )
{
#define zeroPad( n ) n < 10 ? TQString("0%1").arg( n ) : TQString::number( n )
using Codeine::engine;
const int m = s / 60;
const int h = m / 60;
TQString time;
time.prepend( zeroPad( s % 60 ) ); //seconds
time.prepend( ':' );
time.prepend( zeroPad( m % 60 ) ); //minutes
time.prepend( ':' );
time.prepend( TQString::number( h ) ); //hours
return time;
}
void
Slider::setValue( int newValue )
{
static TQLabel *w1 = 0;
static TQLabel *w2 = 0;
if (!w1) {
w1 = new TQLabel( this );
w1->setPalette( TQToolTip::palette() );
w1->setFrameStyle( TQFrame::Plain | TQFrame::Box );
w2 = new TQLabel( this );
w2->setPalette( TQToolTip::palette() );
w2->setFrameStyle( TQFrame::Plain | TQFrame::Box );
}
//TODO stupidly inefficeint! :)
w1->setShown( mainWindow()->isFullScreen() );
w2->setShown( mainWindow()->isFullScreen() );
//don't adjust the slider while the user is dragging it!
if( !m_sliding || m_outside ) {
const int l = engine()->length() / 1000;
const int left = int(l * (newValue / 65535.0));
const int right = l - left;
TQSlider::setValue( newValue );
w1->move( 0, height() - w1->height() - 1 );
w1->setText( timeAsString( left ) + ' ' );
w1->adjustSize();
w2->move( width() - w2->width(), height() - w1->height() - 1 );
w2->setText( timeAsString( right ) + ' ' );
w2->adjustSize();
}
else
m_prevValue = newValue;
}
#include "slider.moc"