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/videoSettings.cpp

136 lines
4.0 KiB

// (C) 2005 Max Howell (max.howell@methylblue.com)
// See COPYING file for licensing information
#include <kwin.h>
#include "mxcl.library.h"
#include <ntqlabel.h>
#include <ntqlayout.h>
#include <ntqslider.h>
#include "videoSettings.h"
#include <xine.h>
#include "xineEngine.h"
extern "C"
{
// #include <X11/Xlib.h> is just dangerous! Here, there is a macro for Below that conflicts
// with TQSlider::Below. Stupid X11 people.
typedef unsigned long XID;
typedef XID Window;
extern int XSetTransientForHint( Display*, Window, Window );
}
//TODO update from engine when new video is played
//TODO show a warning that when paused the changes aren't updated to the display, show an unpause button too
class SnapSlider : public TQSlider
{
int m_offset;
public:
SnapSlider( const int value, TQWidget *parent, const char *name )
: TQSlider( (65536/4)-1, (3*(65536/4))-1, 1000, value, TQt::Horizontal, parent, name )
, m_offset( 0 )
{
setTickmarks( TQSlider::Below );
setTickInterval( 65536 / 4 );
setMinimumWidth( fontMetrics().width( name ) * 3 );
connect( this, SIGNAL(valueChanged( int )), Codeine::engine(), SLOT(setStreamParameter( int )) );
}
virtual void mousePressEvent( TQMouseEvent *e )
{
m_offset = e->pos().x() - (sliderStart() + (sliderRect().width()/2));
TQSlider::mousePressEvent( e );
}
virtual void mouseMoveEvent( TQMouseEvent *e )
{
const int MIDDLE = width() / 2;
const int x = e->pos().x() - m_offset;
const int F = sliderRect().width() / 2;
if( x > MIDDLE - F && x < MIDDLE + F ) {
TQMouseEvent e2( e->type(), TQPoint( MIDDLE + m_offset, e->pos().y() ), e->button(), e->state() );
TQSlider::mouseMoveEvent( &e2 );
TQRangeControl::setValue( 65536 / 2 - 1 ); // to ensure we are absolutely exact
}
else
TQSlider::mouseMoveEvent( e );
}
};
Codeine::VideoSettingsDialog::VideoSettingsDialog( TQWidget *parent )
: KDialog( parent, "video_settings_dialog", false, WType_TopLevel | WDestructiveClose )
{
XSetTransientForHint( x11Display(), winId(), parent->winId() );
KWin::setType( winId(), NET::Utility );
KWin::setState( winId(), NET::SkipTaskbar );
TQFrame *frame = new TQFrame( this );
(new TQVBoxLayout( this, 10 ))->addWidget( frame );
frame->setFrameStyle( TQFrame::StyledPanel | TQFrame::Sunken );
frame->setPaletteBackgroundColor( backgroundColor().dark( 102 ) );
TQGridLayout *grid = new TQGridLayout( frame, 4, 2, 15, 10 );
grid->setAutoAdd( true );
#define makeSlider( PARAM, name ) \
new TQLabel( name, frame ); \
new SnapSlider( xine_get_param( *Codeine::engine(), PARAM ), frame, name );
makeSlider( XINE_PARAM_VO_BRIGHTNESS, "brightness" );
makeSlider( XINE_PARAM_VO_CONTRAST, "contrast" );
makeSlider( XINE_PARAM_VO_SATURATION, "saturation" );
makeSlider( XINE_PARAM_VO_HUE, "hue" );
#undef makeSlider
setCaption( i18n("Video Settings") );
setMaximumSize( sizeHint().width() * 5, sizeHint().height() );
KDialog::show();
}
void
Codeine::VideoSettingsDialog::stateChanged( TQWidget *parent, Engine::State state ) //static
{
TQWidget *me = (TQWidget*)parent->child( "video_settings_dialog" );
if( !me )
return;
switch( state )
{
case Engine::Playing:
case Engine::Paused:
me->setEnabled( true );
break;
case Engine::Loaded:
#define update( param, name ) static_cast<TQSlider*>(me->child( name ))->setValue( xine_get_param( *Codeine::engine(), param ) );
update( XINE_PARAM_VO_BRIGHTNESS, "brightness" );
update( XINE_PARAM_VO_CONTRAST, "contrast" );
update( XINE_PARAM_VO_SATURATION, "saturation" );
update( XINE_PARAM_VO_HUE, "hue" );
#undef update
default:
me->setEnabled( false );
break;
}
}
namespace Codeine
{
void showVideoSettingsDialog( TQWidget *parent )
{
// ensure that the dialog is shown by deleting the old one
delete parent->child( "video_settings_dialog" );
new VideoSettingsDialog( parent );
}
}