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

videowidget.cpp

Go to the documentation of this file.
00001 /*
00002                             This file is part of the Opie Project
00003 
00004                              Copyright (c)  2002 Max Reiss <harlekin@handhelds.org>
00005                              Copyright (c)  2002 L. Potter <ljp@llornkcor.com>
00006                              Copyright (c)  2002 Holger Freyther <zecke@handhelds.org>
00007               =.
00008             .=l.
00009            .>+-=
00010  _;:,     .>    :=|.         This program is free software; you can
00011 .> <`_,   >  .   <=          redistribute it and/or  modify it under
00012 :`=1 )Y*s>-.--   :           the terms of the GNU General Public
00013 .="- .-=="i,     .._         License as published by the Free Software
00014  - .   .-<_>     .<>         Foundation; either version 2 of the License,
00015      ._= =}       :          or (at your option) any later version.
00016     .%`+i>       _;_.
00017     .i_,=:_.      -<s.       This program is distributed in the hope that
00018      +  .  -:.       =       it will be useful,  but WITHOUT ANY WARRANTY;
00019     : ..    .:,     . . .    without even the implied warranty of
00020     =_        +     =;=|`    MERCHANTABILITY or FITNESS FOR A
00021   _.=:.       :    :=>`:     PARTICULAR PURPOSE. See the GNU
00022 ..}^=.=       =       ;      Library General Public License for more
00023 ++=   -.     .`     .:       details.
00024  :     =  ...= . :.=-
00025  -.   .:....=;==+<;          You should have received a copy of the GNU
00026   -_. . .   )=.  =           Library General Public License along with
00027     --        :-=`           this library; see the file COPYING.LIB.
00028                              If not, write to the Free Software Foundation,
00029                              Inc., 59 Temple Place - Suite 330,
00030                              Boston, MA 02111-1307, USA.
00031 
00032 */
00033 
00034 #include "videowidget.h"
00035 
00036 
00037 #ifdef Q_WS_QWS
00038 # define USE_DIRECT_PAINTER
00039 # include <qdirectpainter_qws.h>
00040 # include <qgfxraster_qws.h>
00041 #endif
00042 
00043 
00044 namespace
00045 {
00046 
00047 const int xo = 2; // movable x offset
00048 const int yo = 0; // movable y offset
00049 
00050 const MediaWidget::SkinButtonInfo skinInfo[] =
00051 {
00052     { MediaWidget::Play, "play", MediaWidget::ToggleButton },
00053     { MediaWidget::Stop, "stop", MediaWidget::NormalButton },
00054     { MediaWidget::Next, "fwd", MediaWidget::NormalButton },
00055     { MediaWidget::Previous, "back", MediaWidget::NormalButton },
00056     { MediaWidget::VolumeUp, "up", MediaWidget::NormalButton },
00057     { MediaWidget::VolumeDown, "down", MediaWidget::NormalButton },
00058     { MediaWidget::FullScreen, "full", MediaWidget::ToggleButton }
00059 };
00060 
00061 const uint buttonCount = sizeof( skinInfo ) / sizeof( skinInfo[ 0 ] );
00062 
00063 }
00064 
00065 VideoWidget::VideoWidget( PlayListWidget &playList, MediaPlayerState &mediaPlayerState, QWidget* parent, const char* name )
00066     : MediaWidget( playList, mediaPlayerState, parent, name ), scaledWidth( 0 ), scaledHeight( 0 ), videoSliderBeingMoved( false )
00067 {
00068     setCaption( tr("OpiePlayer - Video") );
00069 
00070     videoFrame = new XineVideoWidget ( this, "Video frame" );
00071 
00072     connect ( videoFrame, SIGNAL( videoResized(const QSize&)), this, SIGNAL( videoResized(const QSize&)));
00073     connect ( videoFrame,  SIGNAL( clicked() ),  this,  SLOT ( backToNormal() ) );
00074 
00075     slider = 0;
00076 
00077     loadSkin();
00078 
00079     setLength( mediaPlayerState.length() );
00080     setPosition( mediaPlayerState.position() );
00081     setFullscreen( mediaPlayerState.isFullscreen() );
00082     setPlaying( mediaPlayerState.isPlaying() );
00083 }
00084 
00085 
00086 VideoWidget::~VideoWidget()
00087 {
00088 }
00089 
00090 MediaWidget::GUIInfo VideoWidget::guiInfo()
00091 {
00092     return GUIInfo( "V" /* infix */, ::skinInfo, ::buttonCount );
00093 }
00094 
00095 void VideoWidget::resizeEvent( QResizeEvent *e ) {
00096     int h = height();
00097     int w = width();
00098     //int Vh = 160;
00099     //int Vw = 220;
00100 
00101     slider->setFixedWidth( w - 20 );
00102     slider->setGeometry( QRect( 15, h - 22, w - 90, 20 ) );
00103     slider->setBackgroundOrigin( QWidget::ParentOrigin );
00104     slider->setFocusPolicy( QWidget::NoFocus );
00105     slider->setBackgroundPixmap( backgroundPixmap );
00106 
00107     upperLeftOfButtonMask.rx() = 0;// ( imgUp->width() ) / 2;
00108     if(w>h)
00109         upperLeftOfButtonMask.ry() = 0;
00110     else
00111         upperLeftOfButtonMask.ry() = 185;//(( Vh  - imgUp->height() ) / 2) - 10;
00112 
00113     MediaWidget::resizeEvent( e );
00114 }
00115 
00116 void VideoWidget::sliderPressed() {
00117     videoSliderBeingMoved = TRUE;
00118 }
00119 
00120 void VideoWidget::sliderReleased() {
00121     videoSliderBeingMoved = FALSE;
00122     if ( slider->width() == 0 ) {
00123         return;
00124     }
00125     long val = long((double)slider->value() * mediaPlayerState.length() / slider->width());
00126     mediaPlayerState.setPosition( val );
00127 }
00128 
00129 void VideoWidget::setPosition( long i ) {
00130     updateSlider( i, mediaPlayerState.length() );
00131 }
00132 
00133 
00134 void VideoWidget::setLength( long max ) {
00135     updateSlider( mediaPlayerState.position(), max );
00136 }
00137 
00138 void VideoWidget::setDisplayType( MediaPlayerState::DisplayType displayType )
00139 {
00140     if ( displayType == MediaPlayerState::Video ) {
00141         makeVisible();
00142         return;
00143     }
00144 
00145     // Effectively blank the view next time we show it so it looks nicer
00146     scaledWidth = 0;
00147     scaledHeight = 0;
00148     videoFrame->hide();
00149     hide();
00150 }
00151 
00152 void VideoWidget::loadSkin()
00153 {
00154     loadDefaultSkin( guiInfo() );
00155 
00156     delete slider;
00157     slider = new QSlider( Qt::Horizontal, this );
00158     slider->setMinValue( 0 );
00159     slider->setMaxValue( 1 );
00160     slider->setBackgroundPixmap( backgroundPixmap );
00161     //slider->setFocusPolicy( QWidget::NoFocus );
00162 
00163     resizeEvent( 0 );
00164 }
00165 
00166 void VideoWidget::updateSlider( long i, long max ) {
00167     // Will flicker too much if we don't do this
00168     if ( max == 0 ) {
00169         return;
00170     }
00171     int width = slider->width();
00172     int val = int((double)i * width / max);
00173     if ( !mediaPlayerState.isFullscreen() && !videoSliderBeingMoved ) {
00174         if ( slider->value() != val ) {
00175             slider->setValue( val );
00176         }
00177         if ( slider->maxValue() != width ) {
00178             slider->setMaxValue( width );
00179         }
00180     }
00181 }
00182 
00183 void VideoWidget::mouseReleaseEvent( QMouseEvent *event ) {
00184     if ( mediaPlayerState.isFullscreen() ) {
00185         mediaPlayerState.setFullscreen( FALSE );
00186         makeVisible();
00187     }
00188     MediaWidget::mouseReleaseEvent( event );
00189 }
00190 
00191 void VideoWidget::backToNormal() {
00192      mediaPlayerState.setFullscreen( FALSE );
00193      makeVisible();
00194      setToggleButton( FullScreen, false );
00195 }
00196 
00197 void VideoWidget::makeVisible() {
00198     videoFrame->show();
00199     if ( mediaPlayerState.isFullscreen() ) {
00200         showFullScreen();
00201         resize( qApp->desktop()->size() );
00202         videoFrame-> setGeometry ( 0, 0, width ( ), height ( ));
00203 
00204         slider->hide();
00205         disconnect( &mediaPlayerState, SIGNAL( positionChanged(long) ),this, SLOT( setPosition(long) ) );
00206         disconnect( &mediaPlayerState, SIGNAL( positionUpdated(long) ),this, SLOT( setPosition(long) ) );
00207         disconnect( slider, SIGNAL( sliderPressed() ), this, SLOT( sliderPressed() ) );
00208         disconnect( slider, SIGNAL( sliderReleased() ), this, SLOT( sliderReleased() ) );
00209     } else {
00210         showNormal();
00211         showMaximized();
00212         QWidget *d = QApplication::desktop();
00213         int w = d->width();
00214         int h = d->height();
00215 
00216         if(w>h) {
00217             int newW=(w/2)-(246/2); //this will only work with 320x240
00218             videoFrame->setGeometry( QRect( newW, 4, 240, 170  ) );
00219         } else {
00220             videoFrame->setGeometry( QRect( 0, 30, 240, 170  ) );
00221         }
00222 
00223         if ( !mediaPlayerState.isSeekable()  ) {
00224             if( !slider->isHidden()) {
00225                 slider->hide();
00226             }
00227             disconnect( &mediaPlayerState, SIGNAL( positionChanged(long) ),this, SLOT( setPosition(long) ) );
00228             disconnect( &mediaPlayerState, SIGNAL( positionUpdated(long) ),this, SLOT( setPosition(long) ) );
00229             disconnect( slider, SIGNAL( sliderPressed() ), this, SLOT( sliderPressed() ) );
00230             disconnect( slider, SIGNAL( sliderReleased() ), this, SLOT( sliderReleased() ) );
00231         } else {
00232             slider->show();
00233             connect( &mediaPlayerState, SIGNAL( positionChanged(long) ),this, SLOT( setPosition(long) ) );
00234             connect( &mediaPlayerState, SIGNAL( positionUpdated(long) ),this, SLOT( setPosition(long) ) );
00235             connect( slider, SIGNAL( sliderPressed() ), this, SLOT( sliderPressed() ) );
00236             connect( slider, SIGNAL( sliderReleased() ), this, SLOT( sliderReleased() ) );
00237         }
00238     }
00239 }
00240 
00241 void VideoWidget::keyReleaseEvent( QKeyEvent *e) {
00242     switch ( e->key() ) {
00244       case Key_Home:
00245           break;
00246       case Key_F9: //activity
00247           break;
00248       case Key_F10: //contacts
00249 //           hide();
00250           break;
00251       case Key_F11: //menu
00252           break;
00253       case Key_F12: //home
00254           break;
00255       case Key_F13: //mail
00256           break;
00257       case Key_Space: {
00258           if(mediaPlayerState.isPlaying()) {
00259               mediaPlayerState.setPlaying(FALSE);
00260           } else {
00261               mediaPlayerState.setPlaying(TRUE);
00262           }
00263       }
00264           break;
00265       case Key_Down:
00266 //            toggleButton(6);
00267             emit lessClicked();
00268             emit lessReleased();
00269 //            toggleButton(6);
00270           break;
00271       case Key_Up:
00272 //             toggleButton(5);
00273              emit moreClicked();
00274              emit moreReleased();
00275 //             toggleButton(5);
00276            break;
00277       case Key_Right:
00278           mediaPlayerState.setNext();
00279           break;
00280       case Key_Left:
00281           mediaPlayerState.setPrev();
00282           break;
00283       case Key_Escape:
00284           break;
00285 
00286     };
00287 }
00288 
00289 XineVideoWidget* VideoWidget::vidWidget() {
00290     return videoFrame;
00291 }
00292 
00293 
00294 void VideoWidget::setFullscreen ( bool b ) {
00295     setToggleButton( FullScreen, b );
00296 }
00297 
00298 
00299 void VideoWidget::setPlaying( bool b) {
00300     setToggleButton( Play, b );
00301 }
00302 

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