summaryrefslogtreecommitdiff
path: root/core/multimedia/opieplayer/videowidget.cpp
authorllornkcor <llornkcor>2003-04-20 02:30:43 (UTC)
committer llornkcor <llornkcor>2003-04-20 02:30:43 (UTC)
commit845c8a880a2ff701f21c2845674e97a2493499f4 (patch) (unidiff)
treec91b65869022c2628f509cb27685e45dfb199679 /core/multimedia/opieplayer/videowidget.cpp
parentb62c40465c917e4952651b6f359e5ec76b340d3f (diff)
downloadopie-845c8a880a2ff701f21c2845674e97a2493499f4.zip
opie-845c8a880a2ff701f21c2845674e97a2493499f4.tar.gz
opie-845c8a880a2ff701f21c2845674e97a2493499f4.tar.bz2
add video skin support *finally*, fixed widget for landscape/sizing
Diffstat (limited to 'core/multimedia/opieplayer/videowidget.cpp') (more/less context) (show whitespace changes)
-rw-r--r--core/multimedia/opieplayer/videowidget.cpp449
1 files changed, 348 insertions, 101 deletions
diff --git a/core/multimedia/opieplayer/videowidget.cpp b/core/multimedia/opieplayer/videowidget.cpp
index 97997f9..1b38206 100644
--- a/core/multimedia/opieplayer/videowidget.cpp
+++ b/core/multimedia/opieplayer/videowidget.cpp
@@ -11,123 +11,236 @@
11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 11** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 12** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13** 13**
14** See http://www.trolltech.com/gpl/ for GPL licensing information. 14** See http://www.trolltech.com/gpl/ for GPL licensing information.
15** 15**
16** Contact info@trolltech.com if any conditions of this licensing are 16** Contact info@trolltech.com if any conditions of this licensing are
17** not clear to you. 17** not clear to you.
18** 18**
19**********************************************************************/ 19**********************************************************************/
20#include <qpe/resource.h> 20#include <qpe/resource.h>
21#include <qpe/mediaplayerplugininterface.h> 21#include <qpe/mediaplayerplugininterface.h>
22#include <qpe/config.h> 22#include <qpe/config.h>
23#include <qpe/qpeapplication.h>
23 24
25#include <qdir.h>
24#include <qwidget.h> 26#include <qwidget.h>
25#include <qpainter.h> 27#include <qpainter.h>
26#include <qpixmap.h> 28#include <qpixmap.h>
27#include <qslider.h> 29#include <qslider.h>
28#include <qdrawutil.h> 30#include <qdrawutil.h>
29#include "videowidget.h" 31#include "videowidget.h"
30#include "mediaplayerstate.h" 32#include "mediaplayerstate.h"
31 33
32 34
33#ifdef Q_WS_QWS 35#ifdef Q_WS_QWS
34# define USE_DIRECT_PAINTER 36# define USE_DIRECT_PAINTER
35# include <qdirectpainter_qws.h> 37# include <qdirectpainter_qws.h>
36# include <qgfxraster_qws.h> 38# include <qgfxraster_qws.h>
37#endif 39#endif
38 40
39 41
40extern MediaPlayerState *mediaPlayerState; 42extern MediaPlayerState *mediaPlayerState;
41 43
42 44
43static const int xo = 2; // movable x offset 45static const int xo = 2; // movable x offset
44static const int yo = 0; // movable y offset 46static const int yo = 0; // movable y offset
45 47
46 48
47struct MediaButton { 49struct MediaButton {
48 int xPos, yPos; 50// int xPos, yPos;
49 bool isToggle, isHeld, isDown; 51 bool isToggle, isHeld, isDown;
50 int controlType; 52// int controlType;
51}; 53};
52 54
53 55
54// Layout information for the videoButtons (and if it is a toggle button or not) 56// Layout information for the videoButtons (and if it is a toggle button or not)
55MediaButton videoButtons[] = { 57MediaButton videoButtons[] = {
56 { 5+0*32+xo, 200+yo, FALSE, FALSE, FALSE, 4 }, // previous 58 { FALSE, FALSE, FALSE }, // stop
57 { 5+1*32+xo, 200+yo, FALSE, FALSE, FALSE, 1 }, // stop 59 { TRUE, FALSE, FALSE }, // play
58 { 5+2*32+xo, 200+yo, TRUE, FALSE, FALSE, 0 }, // play 60 { FALSE, FALSE, FALSE }, // previous
59 { 5+3*32+xo, 200+yo, TRUE, FALSE, FALSE, 2 }, // pause 61 { FALSE, FALSE, FALSE }, // next
60 { 5+4*32+xo, 200+yo, FALSE, FALSE, FALSE, 3 }, // next 62 { FALSE, FALSE, FALSE }, // volUp
61 { 5+5*32+xo, 200+yo, FALSE, FALSE, FALSE, 8 }, // playlist 63 { FALSE, FALSE, FALSE }, // volDown
62 { 5+6*32+xo, 200+yo, TRUE, FALSE, FALSE, 9 } // fullscreen 64 { TRUE, FALSE, FALSE } // fullscreen
63}; 65};
64 66
67//static const int numButtons = (sizeof(videoButtons)/sizeof(MediaButton));
65 68
66static const int numButtons = (sizeof(videoButtons)/sizeof(MediaButton)); 69const char *skinV_mask_file_names[7] = {
70 "stop","play","back","fwd","up","down","full"
71};
67 72
73static const int numVButtons = (sizeof(videoButtons)/sizeof(MediaButton));
68 74
69VideoWidget::VideoWidget(QWidget* parent, const char* name, WFlags f) : 75VideoWidget::VideoWidget(QWidget* parent, const char* name, WFlags f) :
70 QWidget( parent, name, f ), scaledWidth( 0 ), scaledHeight( 0 ) { 76 QWidget( parent, name, f ), scaledWidth( 0 ), scaledHeight( 0 )
77{
71 setCaption( tr("OpiePlayer") ); 78 setCaption( tr("OpiePlayer") );
72 Config cfg("OpiePlayer"); 79 Config cfg("OpiePlayer");
73 cfg.setGroup("VideoWidget"); 80
74 81 cfg.setGroup("Options");
75 QString backgroundPix, Button0aPix, Button0bPix, controlsPix; 82 skin = cfg.readEntry("Skin","default");
76 backgroundPix=cfg.readEntry( "backgroundPix", "opieplayer/metalFinish"); 83
77 Button0aPix=cfg.readEntry( "Button0aPix", "opieplayer/mediaButton0a"); 84 QString skinPath;
78 Button0bPix=cfg.readEntry( "Button0bPix","opieplayer/mediaButton0b"); 85 skinPath = "opieplayer2/skins/" + skin;
79 controlsPix=cfg.readEntry( "controlsPix","opieplayer/mediaControls0" ); 86 if(!QDir(QString(getenv("OPIEDIR")) +"/pics/"+skinPath).exists())
80 87 skinPath = "opieplayer2/skins/default";
81 setBackgroundPixmap( Resource::loadPixmap( backgroundPix) ); 88
82 pixmaps[0] = new QPixmap( Resource::loadPixmap( Button0aPix ) ); 89 qDebug("skin path " + skinPath);
83 pixmaps[1] = new QPixmap( Resource::loadPixmap( Button0bPix ) ); 90
84 pixmaps[2] = new QPixmap( Resource::loadPixmap( controlsPix) ); 91// QString skinPath = "opieplayer2/skins/" + skin;
92
93 pixBg = new QPixmap( Resource::loadPixmap( QString("%1/background").arg(skinPath) ) );
94 imgUp = new QImage( Resource::loadImage( QString("%1/skinV_up").arg(skinPath) ) );
95 imgDn = new QImage( Resource::loadImage( QString("%1/skinV_down").arg(skinPath) ) );
96
97 imgButtonMask = new QImage( imgUp->width(), imgUp->height(), 8, 255 );
98 imgButtonMask->fill( 0 );
99
100 for ( int i = 0; i < 7; i++ )
101 {
102 QString filename = QString( QPEApplication::qpeDir() + "/pics/" + skinPath +
103 "/skinV_mask_" + skinV_mask_file_names[i] + ".png" );
104 qDebug("loading "+filename);
105 masks[i] = new QBitmap( filename );
106
107 if ( !masks[i]->isNull() )
108 {
109 QImage imgMask = masks[i]->convertToImage();
110 uchar **dest = imgButtonMask->jumpTable();
111 for ( int y = 0; y < imgUp->height(); y++ )
112 {
113 uchar *line = dest[y];
114 for ( int x = 0; x < imgUp->width(); x++ )
115 {
116 if ( !qRed( imgMask.pixel( x, y ) ) )
117 line[x] = i + 1;
118 }
119 }
120 }
121 }
122 qDebug("finished loading first pics");
123 for ( int i = 0; i < 7; i++ )
124 {
125 buttonPixUp[i] = NULL;
126 buttonPixDown[i] = NULL;
127 }
128
129 setBackgroundPixmap( *pixBg );
130
85 currentFrame = new QImage( 220 + 2, 160, (QPixmap::defaultDepth() == 16) ? 16 : 32 ); 131 currentFrame = new QImage( 220 + 2, 160, (QPixmap::defaultDepth() == 16) ? 16 : 32 );
86 132
87 slider = new QSlider( Qt::Horizontal, this ); 133 slider = new QSlider( Qt::Horizontal, this );
88 slider->setMinValue( 0 ); 134 slider->setMinValue( 0 );
89 slider->setMaxValue( 1 ); 135 slider->setMaxValue( 1 );
90 slider->setBackgroundPixmap( Resource::loadPixmap( backgroundPix ) ); 136 slider->setBackgroundPixmap( Resource::loadPixmap( backgroundPix ) );
91 slider->setFocusPolicy( QWidget::NoFocus ); 137 slider->setFocusPolicy( QWidget::NoFocus );
92 slider->setGeometry( QRect( 7, 250, 220, 20 ) ); 138// slider->setGeometry( QRect( 7, 250, 220, 20 ) );
93 139
94 connect( slider, SIGNAL( sliderPressed() ), this, SLOT( sliderPressed() ) ); 140 connect( slider, SIGNAL( sliderPressed() ), this, SLOT( sliderPressed() ) );
95 connect( slider, SIGNAL( sliderReleased() ), this, SLOT( sliderReleased() ) ); 141 connect( slider, SIGNAL( sliderReleased() ), this, SLOT( sliderReleased() ) );
96 142
97 connect( mediaPlayerState, SIGNAL( lengthChanged(long) ), this, SLOT( setLength(long) ) ); 143 connect( mediaPlayerState, SIGNAL( lengthChanged(long) ), this, SLOT( setLength(long) ) );
98 connect( mediaPlayerState, SIGNAL( positionChanged(long) ),this, SLOT( setPosition(long) ) ); 144 connect( mediaPlayerState, SIGNAL( positionChanged(long) ),this, SLOT( setPosition(long) ) );
99 connect( mediaPlayerState, SIGNAL( positionUpdated(long) ),this, SLOT( setPosition(long) ) ); 145 connect( mediaPlayerState, SIGNAL( positionUpdated(long) ),this, SLOT( setPosition(long) ) );
100 connect( mediaPlayerState, SIGNAL( viewChanged(char) ), this, SLOT( setView(char) ) ); 146 connect( mediaPlayerState, SIGNAL( viewChanged(char) ), this, SLOT( setView(char) ) );
101 connect( mediaPlayerState, SIGNAL( pausedToggled(bool) ), this, SLOT( setPaused(bool) ) ); 147 connect( mediaPlayerState, SIGNAL( pausedToggled(bool) ), this, SLOT( setPaused(bool) ) );
102 connect( mediaPlayerState, SIGNAL( playingToggled(bool) ), this, SLOT( setPlaying(bool) ) ); 148 connect( mediaPlayerState, SIGNAL( playingToggled(bool) ), this, SLOT( setPlaying(bool) ) );
103 149
104 // Intialise state 150 // Intialise state
105 setLength( mediaPlayerState->length() ); 151 setLength( mediaPlayerState->length() );
106 setPosition( mediaPlayerState->position() ); 152 setPosition( mediaPlayerState->position() );
107 setFullscreen( mediaPlayerState->fullscreen() ); 153 setFullscreen( mediaPlayerState->fullscreen() );
108 setPaused( mediaPlayerState->paused() ); 154 setPaused( mediaPlayerState->paused() );
109 setPlaying( mediaPlayerState->playing() ); 155 setPlaying( mediaPlayerState->playing() );
110} 156}
111 157
112 158
113VideoWidget::~VideoWidget() { 159VideoWidget::~VideoWidget() {
114 for ( int i = 0; i < 3; i++ ) 160
115 delete pixmaps[i]; 161 for ( int i = 0; i < 7; i++ )
116 delete currentFrame; 162 {
163 delete buttonPixUp[i];
164 delete buttonPixDown[i];
165 }
166
167 delete pixBg;
168 delete imgUp;
169 delete imgDn;
170 delete imgButtonMask;
171 for ( int i = 0; i < 7; i++ )
172 {
173 delete masks[i];
174 }
175
176// for ( int i = 0; i < 3; i++ )
177// delete pixmaps[i];
178// delete currentFrame;
117} 179}
118 180
119 181
120static bool videoSliderBeingMoved = FALSE; 182static bool videoSliderBeingMoved = FALSE;
121 183
184QPixmap *combineVImageWithBackground( QImage img, QPixmap bg, QPoint offset ) {
185 QPixmap pix( img.width(), img.height() );
186 QPainter p( &pix );
187 p.drawTiledPixmap( pix.rect(), bg, offset );
188 p.drawImage( 0, 0, img );
189 return new QPixmap( pix );
190}
191
192QPixmap *maskVPixToMask( QPixmap pix, QBitmap mask ) {
193 QPixmap *pixmap = new QPixmap( pix );
194 pixmap->setMask( mask );
195 return pixmap;
196}
197
198void VideoWidget::resizeEvent( QResizeEvent * ) {
199 int h = height();
200 int w = width();
201 //int Vh = 160;
202 //int Vw = 220;
203
204 slider->setFixedWidth( w - 20 );
205 slider->setGeometry( QRect( 15, h - 22, w - 90, 20 ) );
206 slider->setBackgroundOrigin( QWidget::ParentOrigin );
207 slider->setFocusPolicy( QWidget::NoFocus );
208 slider->setBackgroundPixmap( *pixBg );
209
210 xoff = 0;// ( imgUp->width() ) / 2;
211 if(w>h)
212 yoff = 0;
213 else
214 yoff = 185;//(( Vh - imgUp->height() ) / 2) - 10;
215 QPoint p( xoff, yoff );
216
217 QPixmap *pixUp = combineVImageWithBackground( *imgUp, *pixBg, p );
218 QPixmap *pixDn = combineVImageWithBackground( *imgDn, *pixBg, p );
219
220 for ( int i = 0; i < 7; i++ )
221 {
222 if ( !masks[i]->isNull() )
223 {
224 delete buttonPixUp[i];
225 delete buttonPixDown[i];
226 buttonPixUp[i] = maskVPixToMask( *pixUp, *masks[i] );
227 buttonPixDown[i] = maskVPixToMask( *pixDn, *masks[i] );
228 }
229 }
230
231 delete pixUp;
232 delete pixDn;
233}
234
122 235
123void VideoWidget::sliderPressed() { 236void VideoWidget::sliderPressed() {
124 videoSliderBeingMoved = TRUE; 237 videoSliderBeingMoved = TRUE;
125} 238}
126 239
127 240
128void VideoWidget::sliderReleased() { 241void VideoWidget::sliderReleased() {
129 videoSliderBeingMoved = FALSE; 242 videoSliderBeingMoved = FALSE;
130 if ( slider->width() == 0 ) 243 if ( slider->width() == 0 )
131 return; 244 return;
132 long val = long((double)slider->value() * mediaPlayerState->length() / slider->width()); 245 long val = long((double)slider->value() * mediaPlayerState->length() / slider->width());
133 mediaPlayerState->setPosition( val ); 246 mediaPlayerState->setPosition( val );
@@ -136,334 +249,468 @@ void VideoWidget::sliderReleased() {
136 249
137void VideoWidget::setPosition( long i ) { 250void VideoWidget::setPosition( long i ) {
138 updateSlider( i, mediaPlayerState->length() ); 251 updateSlider( i, mediaPlayerState->length() );
139} 252}
140 253
141 254
142void VideoWidget::setLength( long max ) { 255void VideoWidget::setLength( long max ) {
143 updateSlider( mediaPlayerState->position(), max ); 256 updateSlider( mediaPlayerState->position(), max );
144} 257}
145 258
146 259
147void VideoWidget::setView( char view ) { 260void VideoWidget::setView( char view ) {
148 if ( view == 'v' ) { 261 if ( view == 'v' )
262 {
149 makeVisible(); 263 makeVisible();
150 } else { 264 }
265 else
266 {
151 // Effectively blank the view next time we show it so it looks nicer 267 // Effectively blank the view next time we show it so it looks nicer
152 scaledWidth = 0; 268 scaledWidth = 0;
153 scaledHeight = 0; 269 scaledHeight = 0;
154 hide(); 270 hide();
155 } 271 }
156} 272}
157 273
158 274
159void VideoWidget::updateSlider( long i, long max ) { 275void VideoWidget::updateSlider( long i, long max ) {
160 // Will flicker too much if we don't do this 276 // Will flicker too much if we don't do this
161 if ( max == 0 ) 277 if ( max == 0 )
162 return; 278 return;
163 int width = slider->width(); 279 int width = slider->width();
164 int val = int((double)i * width / max); 280 int val = int((double)i * width / max);
165 if ( !mediaPlayerState->fullscreen() && !videoSliderBeingMoved ) { 281 if ( !mediaPlayerState->fullscreen() && !videoSliderBeingMoved )
282 {
166 if ( slider->value() != val ) 283 if ( slider->value() != val )
167 slider->setValue( val ); 284 slider->setValue( val );
168 if ( slider->maxValue() != width ) 285 if ( slider->maxValue() != width )
169 slider->setMaxValue( width ); 286 slider->setMaxValue( width );
170 } 287 }
171} 288}
172 289
173 290
174void VideoWidget::setToggleButton( int i, bool down ) { 291void VideoWidget::setToggleButton( int i, bool down ) {
175 if ( down != videoButtons[i].isDown ) 292 if ( down != videoButtons[i].isDown )
176 toggleButton( i ); 293 toggleButton( i );
177} 294}
178 295
179 296
180void VideoWidget::toggleButton( int i ) { 297void VideoWidget::toggleButton( int i ) {
181 videoButtons[i].isDown = !videoButtons[i].isDown; 298 videoButtons[i].isDown = !videoButtons[i].isDown;
182 QPainter p(this); 299 QPainter p(this);
183 paintButton ( &p, i ); 300 paintButton ( &p, i );
184} 301}
185 302
186 303
187void VideoWidget::paintButton( QPainter *p, int i ) { 304void VideoWidget::paintButton( QPainter *p, int i ) {
188 int x = videoButtons[i].xPos; 305 if ( videoButtons[i].isDown )
189 int y = videoButtons[i].yPos; 306 {
190 int offset = 10 + videoButtons[i].isDown; 307 p->drawPixmap( xoff, yoff, *buttonPixDown[i] );
191 p->drawPixmap( x, y, *pixmaps[videoButtons[i].isDown] ); 308 }
192 p->drawPixmap( x + 1 + offset, y + offset, *pixmaps[2], 9 * videoButtons[i].controlType, 0, 9, 9 ); 309 else
310 {
311 p->drawPixmap( xoff, yoff, *buttonPixUp[i] );
312 }
313// int x = videoButtons[i].xPos;
314// int y = videoButtons[i].yPos;
315// int offset = 10 + videoButtons[i].isDown;
316// p->drawPixmap( x, y, *pixmaps[videoButtons[i].isDown] );
317// p->drawPixmap( x + 1 + offset, y + offset, *pixmaps[2], 9 * videoButtons[i].controlType, 0, 9, 9 );
193} 318}
194 319
195 320
196void VideoWidget::mouseMoveEvent( QMouseEvent *event ) { 321void VideoWidget::mouseMoveEvent( QMouseEvent *event ) {
197 for ( int i = 0; i < numButtons; i++ ) { 322
198 int x = videoButtons[i].xPos; 323 for ( int i = 0; i < numVButtons; i++ )
199 int y = videoButtons[i].yPos; 324 {
200 if ( event->state() == QMouseEvent::LeftButton ) { 325 if ( event->state() == QMouseEvent::LeftButton )
201 // The test to see if the mouse click is inside the circular button or not 326 {
202 // (compared with the radius squared to avoid a square-root of our distance) 327 // The test to see if the mouse click is inside the button or not
203 int radius = 16; 328 int x = event->pos().x() - xoff;
204 QPoint center = QPoint( x + radius, y + radius ); 329 int y = event->pos().y() - yoff;
205 QPoint dXY = center - event->pos(); 330
206 int dist = dXY.x() * dXY.x() + dXY.y() * dXY.y(); 331 bool isOnButton = ( x > 0 && y > 0 && x < imgButtonMask->width()
207 bool isOnButton = dist <= (radius * radius); 332 && y < imgButtonMask->height()
208 if ( isOnButton != videoButtons[i].isHeld ) { 333 && imgButtonMask->pixelIndex( x, y ) == i + 1 );
209 videoButtons[i].isHeld = isOnButton; 334
335 if ( isOnButton && !videoButtons[i].isHeld )
336 {
337 videoButtons[i].isHeld = TRUE;
210 toggleButton(i); 338 toggleButton(i);
339
340// switch (i) {
341// case VideoVolUp:
342// emit moreClicked();
343// return;
344// case VideoVolDown:
345// emit lessClicked();
346// return;
347// }
211 } 348 }
212 } else { 349 else if ( !isOnButton && videoButtons[i].isHeld )
213 if ( videoButtons[i].isHeld ) { 350 {
351 videoButtons[i].isHeld = FALSE;
352 toggleButton(i);
353 }
354 }
355 else
356 {
357
358 if ( videoButtons[i].isHeld )
359 {
214 videoButtons[i].isHeld = FALSE; 360 videoButtons[i].isHeld = FALSE;
215 if ( !videoButtons[i].isToggle ) 361 if ( !videoButtons[i].isToggle )
362 {
216 setToggleButton( i, FALSE ); 363 setToggleButton( i, FALSE );
217 } 364 }
218 } 365 qDebug("key %d", i);
219 switch (i) { 366 switch(i)
367 {
368// case VideoPlay:
369// {
370// if( mediaPlayerState->isPaused )
371// {
372// setToggleButton( i, FALSE );
373// mediaPlayerState->setPaused( FALSE );
374// return;
375// }
376// else if( !mediaPlayerState->isPaused )
377// {
378// setToggleButton( i, TRUE );
379// mediaPlayerState->setPaused( TRUE );
380// return;
381// }
382// else
383// {
384// return;
385// }
386// }
387
220 case VideoPlay: mediaPlayerState->setPlaying(videoButtons[i].isDown); return; 388 case VideoPlay: mediaPlayerState->setPlaying(videoButtons[i].isDown); return;
221 case VideoStop: mediaPlayerState->setPlaying(FALSE); return; 389 case VideoStop: mediaPlayerState->setPlaying(FALSE); return;
222 case VideoPause: mediaPlayerState->setPaused(videoButtons[i].isDown); return; 390// case VideoPause: mediaPlayerState->setPaused(videoButtons[i].isDown); return;
223 case VideoNext: mediaPlayerState->setNext(); return; 391 case VideoNext: mediaPlayerState->setNext(); return;
224 case VideoPrevious: mediaPlayerState->setPrev(); return; 392 case VideoPrevious: mediaPlayerState->setPrev(); return;
225 case VideoPlayList: mediaPlayerState->setList(); return; 393// case VideoPlayList: mediaPlayerState->setList(); return;
226 case VideoFullscreen: mediaPlayerState->setFullscreen( TRUE ); makeVisible(); return; 394 case VideoFullscreen: mediaPlayerState->setFullscreen( TRUE ); makeVisible(); return;
227 }
228 395
396// case VideoStop: mediaPlayerState->setPlaying( FALSE ); return;
397// case VideoNext: if(playList->whichList() ==0) mediaPlayerState->setNext(); return;
398// case VideoPrevious: if(playList->whichList() ==0) mediaPlayerState->setPrev(); return;
399// case VideoVolUp: emit moreReleased(); return;
400// case VideoVolDown: emit lessReleased(); return;
401// case VideoFullscreen: mediaPlayerState->setFullscreen( TRUE ); makeVisible(); return;
402 }
403 }
229 } 404 }
230} 405}
231 406
232 407
408
409
410
411
412// for ( int i = 0; i < numButtons; i++ ) {
413// int x = videoButtons[i].xPos;
414// int y = videoButtons[i].yPos;
415// if ( event->state() == QMouseEvent::LeftButton ) {
416// // The test to see if the mouse click is inside the circular button or not
417// // (compared with the radius squared to avoid a square-root of our distance)
418// int radius = 16;
419// QPoint center = QPoint( x + radius, y + radius );
420// QPoint dXY = center - event->pos();
421// int dist = dXY.x() * dXY.x() + dXY.y() * dXY.y();
422// bool isOnButton = dist <= (radius * radius);
423// if ( isOnButton != videoButtons[i].isHeld ) {
424// videoButtons[i].isHeld = isOnButton;
425// toggleButton(i);
426// }
427// } else {
428// if ( videoButtons[i].isHeld ) {
429// videoButtons[i].isHeld = FALSE;
430// if ( !videoButtons[i].isToggle )
431// setToggleButton( i, FALSE );
432// }
433// }
434
435// switch (i) {
436// case VideoPlay: mediaPlayerState->setPlaying(videoButtons[i].isDown); return;
437// case VideoStop: mediaPlayerState->setPlaying(FALSE); return;
438// case VideoPause: mediaPlayerState->setPaused(videoButtons[i].isDown); return;
439// case VideoNext: mediaPlayerState->setNext(); return;
440// case VideoPrevious: mediaPlayerState->setPrev(); return;
441// case VideoPlayList: mediaPlayerState->setList(); return;
442// case VideoFullscreen: mediaPlayerState->setFullscreen( TRUE ); makeVisible(); return;
443// }
444
445// }
446}
447
448
233void VideoWidget::mousePressEvent( QMouseEvent *event ) { 449void VideoWidget::mousePressEvent( QMouseEvent *event ) {
234 mouseMoveEvent( event ); 450 mouseMoveEvent( event );
235} 451}
236 452
237 453
238void VideoWidget::mouseReleaseEvent( QMouseEvent *event ) { 454void VideoWidget::mouseReleaseEvent( QMouseEvent *event ) {
239 if ( mediaPlayerState->fullscreen() ) { 455 if ( mediaPlayerState->fullscreen() )
456 {
240 mediaPlayerState->setFullscreen( FALSE ); 457 mediaPlayerState->setFullscreen( FALSE );
241 makeVisible(); 458 makeVisible();
242 459
243 mouseMoveEvent( event ); 460 mouseMoveEvent( event );
244 } 461 }
245} 462}
246 463
247 464
248void VideoWidget::makeVisible() { 465void VideoWidget::makeVisible() {
249 if ( mediaPlayerState->fullscreen() ) { 466 if ( mediaPlayerState->fullscreen() )
467 {
250 setBackgroundMode( QWidget::NoBackground ); 468 setBackgroundMode( QWidget::NoBackground );
251 showFullScreen(); 469 showFullScreen();
252 resize( qApp->desktop()->size() ); 470 resize( qApp->desktop()->size() );
253 slider->hide(); 471 slider->hide();
254 } else { 472 }
255 setBackgroundPixmap( Resource::loadPixmap( "opieplayer/metalFinish" ) ); 473 else
474 {
475 setBackgroundPixmap( *pixBg );
256 showNormal(); 476 showNormal();
257 showMaximized(); 477 showMaximized();
258 slider->show(); 478 slider->show();
259 } 479 }
260} 480}
261 481
262 482
263void VideoWidget::paintEvent( QPaintEvent * ) { 483void VideoWidget::paintEvent( QPaintEvent * pe) {
264 QPainter p( this ); 484 QPainter p( this );
265 485
266 if ( mediaPlayerState->fullscreen() ) { 486 if ( mediaPlayerState->fullscreen() ) {
267 // Clear the background 487 // Clear the background
268 p.setBrush( QBrush( Qt::black ) ); 488 p.setBrush( QBrush( Qt::black ) );
269 p.drawRect( rect() ); 489 p.drawRect( rect() );
270
271 // Draw the current frame
272 //p.drawImage( ); // If using directpainter we won't have a copy except whats on the screen
273 } else { 490 } else {
274 // draw border 491 if ( !pe->erased() ) {
275 qDrawShadePanel( &p, 4, 15, 230, 170, colorGroup(), TRUE, 5, NULL ); 492 // Combine with background and double buffer
276 493 QPixmap pix( pe->rect().size() );
277 // Clear the movie screen first 494 QPainter p( &pix );
278 p.setBrush( QBrush( Qt::black ) ); 495 p.translate( -pe->rect().topLeft().x(), -pe->rect().topLeft().y() );
279 p.drawRect( 9, 20, 220, 160 ); 496 p.drawTiledPixmap( pe->rect(), *pixBg, pe->rect().topLeft() );
280 497 for ( int i = 0; i < numVButtons; i++ ) {
281 // draw current frame (centrally positioned from scaling to maintain aspect ratio)
282 p.drawImage( 9 + (220 - scaledWidth) / 2, 20 + (160 - scaledHeight) / 2, *currentFrame, 0, 0, scaledWidth, scaledHeight );
283
284 // draw the buttons
285 for ( int i = 0; i < numButtons; i++ )
286 paintButton( &p, i ); 498 paintButton( &p, i );
287 499 }
288 // draw the slider 500 QPainter p2( this );
501 p2.drawPixmap( pe->rect().topLeft(), pix );
502 } else {
503 QPainter p( this );
504 for ( int i = 0; i < numVButtons; i++ )
505 paintButton( &p, i );
506 }
289 slider->repaint( TRUE ); 507 slider->repaint( TRUE );
290 } 508 }
291} 509}
292 510
293 511
294void VideoWidget::closeEvent( QCloseEvent* ) { 512void VideoWidget::closeEvent( QCloseEvent* ) {
295 mediaPlayerState->setList(); 513 mediaPlayerState->setList();
296} 514}
297 515
298 516
299bool VideoWidget::playVideo() { 517bool VideoWidget::playVideo() {
300 bool result = FALSE; 518 bool result = FALSE;
301 519// qDebug("<<<<<<<<<<<<<<<< play video");
302 int stream = 0; 520 int stream = 0;
303 521
304 int sw = mediaPlayerState->curDecoder()->videoWidth( stream ); 522 int sw = mediaPlayerState->curDecoder()->videoWidth( stream );
305 int sh = mediaPlayerState->curDecoder()->videoHeight( stream ); 523 int sh = mediaPlayerState->curDecoder()->videoHeight( stream );
306 int dd = QPixmap::defaultDepth(); 524 int dd = QPixmap::defaultDepth();
307 int w = height(); 525 int w = height();
308 int h = width(); 526 int h = width();
309 527
310 ColorFormat format = (dd == 16) ? RGB565 : BGRA8888; 528 ColorFormat format = (dd == 16) ? RGB565 : BGRA8888;
311 529
312 if ( mediaPlayerState->fullscreen() ) { 530 if ( mediaPlayerState->fullscreen() )
531 {
313#ifdef USE_DIRECT_PAINTER 532#ifdef USE_DIRECT_PAINTER
314 QDirectPainter p(this); 533 QDirectPainter p(this);
315 534
316 if ( ( qt_screen->transformOrientation() == 3 ) && 535 if ( ( qt_screen->transformOrientation() == 3 ) &&
317 ( ( dd == 16 ) || ( dd == 32 ) ) && ( p.numRects() == 1 ) ) { 536 ( ( dd == 16 ) || ( dd == 32 ) ) && ( p.numRects() == 1 ) )
537 {
318 538
319 w = 320; 539 w = 320;
320 h = 240; 540 h = 240;
321 541
322 if ( mediaPlayerState->scaled() ) { 542 if ( mediaPlayerState->scaled() )
543 {
323 // maintain aspect ratio 544 // maintain aspect ratio
324 if ( w * sh > sw * h ) 545 if ( w * sh > sw * h )
325 w = sw * h / sh; 546 w = sw * h / sh;
326 else 547 else
327 h = sh * w / sw; 548 h = sh * w / sw;
328 } else { 549 }
550 else
551 {
329 w = sw; 552 w = sw;
330 h = sh; 553 h = sh;
331 } 554 }
332 555
333 w--; // we can't allow libmpeg to overwrite. 556 w--; // we can't allow libmpeg to overwrite.
334 QPoint roff = qt_screen->mapToDevice( p.offset(), QSize( qt_screen->width(), qt_screen->height() ) ); 557 QPoint roff = qt_screen->mapToDevice( p.offset(), QSize( qt_screen->width(), qt_screen->height() ) );
335 558
336 int ox = roff.x() - height() + 2 + (height() - w) / 2; 559 int ox = roff.x() - height() + 2 + (height() - w) / 2;
337 int oy = roff.y() + (width() - h) / 2; 560 int oy = roff.y() + (width() - h) / 2;
338 int sx = 0, sy = 0; 561 int sx = 0, sy = 0;
339 562
340 uchar* fp = p.frameBuffer() + p.lineStep() * oy; 563 uchar* fp = p.frameBuffer() + p.lineStep() * oy;
341 fp += dd * ox / 8; 564 fp += dd * ox / 8;
342 uchar **jt = new uchar*[h]; 565 uchar **jt = new uchar*[h];
343 for ( int i = h; i; i-- ) { 566
567 for ( int i = h; i; i-- )
568 {
344 jt[h - i] = fp; 569 jt[h - i] = fp;
345 fp += p.lineStep(); 570 fp += p.lineStep();
346 } 571 }
347 572
348 result = mediaPlayerState->curDecoder()->videoReadScaledFrame( jt, sx, sy, sw, sh, w, h, format, 0) == 0; 573 result = mediaPlayerState->curDecoder()->videoReadScaledFrame( jt, sx, sy, sw, sh, w, h, format, 0) == 0;
349 574
350 delete [] jt; 575 delete [] jt;
351 } else { 576 }
577 else
578 {
352#endif 579#endif
353 QPainter p(this); 580 QPainter p(this);
354 581
355 w = 320; 582 w = 320;
356 h = 240; 583 h = 240;
357 584
358 if ( mediaPlayerState->scaled() ) { 585 if ( mediaPlayerState->scaled() )
586 {
359 // maintain aspect ratio 587 // maintain aspect ratio
360 if ( w * sh > sw * h ) 588 if ( w * sh > sw * h )
361 w = sw * h / sh; 589 w = sw * h / sh;
362 else 590 else
363 h = sh * w / sw; 591 h = sh * w / sw;
364 } else { 592 }
593 else
594 {
365 w = sw; 595 w = sw;
366 h = sh; 596 h = sh;
367 } 597 }
368 598
369 int bytes = ( dd == 16 ) ? 2 : 4; 599 int bytes = ( dd == 16 ) ? 2 : 4;
370 QImage tempFrame( w, h, bytes << 3 ); 600 QImage tempFrame( w, h, bytes << 3 );
371 result = mediaPlayerState->curDecoder()->videoReadScaledFrame( tempFrame.jumpTable(), 601 result = mediaPlayerState->curDecoder()->videoReadScaledFrame( tempFrame.jumpTable(),
372 0, 0, sw, sh, w, h, format, 0) == 0; 602 0, 0, sw, sh, w, h, format, 0) == 0;
373 if ( result && mediaPlayerState->fullscreen() ) { 603
604 if ( result && mediaPlayerState->fullscreen() )
605 {
374 606
375 int rw = h, rh = w; 607 int rw = h, rh = w;
376 QImage rotatedFrame( rw, rh, bytes << 3 ); 608 QImage rotatedFrame( rw, rh, bytes << 3 );
377 609
378 ushort* in = (ushort*)tempFrame.bits(); 610 ushort* in = (ushort*)tempFrame.bits();
379 ushort* out = (ushort*)rotatedFrame.bits(); 611 ushort* out = (ushort*)rotatedFrame.bits();
380 int spl = rotatedFrame.bytesPerLine() / bytes; 612 int spl = rotatedFrame.bytesPerLine() / bytes;
381 for (int x=0; x<h; x++) { 613
382 if ( bytes == 2 ) { 614 for (int x=0; x<h; x++)
615 {
616 if ( bytes == 2 )
617 {
383 ushort* lout = out++ + (w - 1)*spl; 618 ushort* lout = out++ + (w - 1)*spl;
384 for (int y=0; y<w; y++) { 619 for (int y=0; y<w; y++) {
385 *lout=*in++; 620 *lout=*in++;
386 lout-=spl; 621 lout-=spl;
387 } 622 }
388 } else { 623 }
624 else
625 {
389 ulong* lout = ((ulong *)out)++ + (w - 1)*spl; 626 ulong* lout = ((ulong *)out)++ + (w - 1)*spl;
390 for (int y=0; y<w; y++) { 627 for (int y=0; y<w; y++)
628 {
391 *lout=*((ulong*)in)++; 629 *lout=*((ulong*)in)++;
392 lout-=spl; 630 lout-=spl;
393 } 631 }
394 } 632 }
395 } 633 }
396 634
397 p.drawImage( (240 - rw) / 2, (320 - rh) / 2, rotatedFrame, 0, 0, rw, rh ); 635 p.drawImage( (240 - rw) / 2, (320 - rh) / 2, rotatedFrame, 0, 0, rw, rh );
398 } 636 }
399#ifdef USE_DIRECT_PAINTER 637#ifdef USE_DIRECT_PAINTER
400 } 638 }
401#endif 639#endif
402 } else { 640 }
641 else
642 {
403 643
404 w = 220; 644 w = 220;
405 h = 160; 645 h = 160;
406 646
407 // maintain aspect ratio 647 // maintain aspect ratio
408 if ( w * sh > sw * h ) 648 if ( w * sh > sw * h )
409 w = sw * h / sh; 649 w = sw * h / sh;
410 else 650 else
411 h = sh * w / sw; 651 h = sh * w / sw;
412 652
413 result = mediaPlayerState->curDecoder()->videoReadScaledFrame( currentFrame->jumpTable(), 0, 0, sw, sh, w, h, format, 0) == 0; 653 result = mediaPlayerState->curDecoder()->videoReadScaledFrame( currentFrame->jumpTable(), 0, 0, sw, sh, w, h, format, 0) == 0;
414 654
415 QPainter p( this ); 655 QPainter p( this );
416 656 int deskW = qApp->desktop()->width();
417 // Image changed size, therefore need to blank the possibly unpainted regions first 657 // Image changed size, therefore need to blank the possibly unpainted regions first
418 if ( scaledWidth != w || scaledHeight != h ) { 658 if ( scaledWidth != w || scaledHeight != h )
659 {
419 p.setBrush( QBrush( Qt::black ) ); 660 p.setBrush( QBrush( Qt::black ) );
420 p.drawRect( 9, 20, 220, 160 ); 661 p.drawRect( ( deskW -scaledWidth)/2, 20, scaledWidth, 160 );
421 } 662 }
422 663
423 scaledWidth = w; 664 scaledWidth = w;
424 scaledHeight = h; 665 scaledHeight = h;
425 666
426 if ( result ) { 667 if ( result )
427 p.drawImage( 9 + (220 - scaledWidth) / 2, 20 + (160 - scaledHeight) / 2, *currentFrame, 0, 0, scaledWidth, scaledHeight ); 668 {
669 p.drawImage( (deskW - scaledWidth) / 2, 20 + (160 - scaledHeight) / 2, *currentFrame, 0, 0, scaledWidth, scaledHeight );
428 } 670 }
429 671
430 } 672 }
431 673
432 return result; 674 return result;
433} 675}
434 676
435 677
436 678
437void VideoWidget::keyReleaseEvent( QKeyEvent *e) 679void VideoWidget::keyReleaseEvent( QKeyEvent *e)
438{ 680{
439 switch ( e->key() ) { 681 switch ( e->key() )
682 {
440////////////////////////////// Zaurus keys 683////////////////////////////// Zaurus keys
441 case Key_Home: 684 case Key_Home:
442 break; 685 break;
443 case Key_F9: //activity 686 case Key_F9: //activity
444 break; 687 break;
445 case Key_F10: //contacts 688 case Key_F10: //contacts
446// hide(); 689// hide();
447 break; 690 break;
448 case Key_F11: //menu 691 case Key_F11: //menu
449 break; 692 break;
450 case Key_F12: //home 693 case Key_F12: //home
451 break; 694 break;
452 case Key_F13: //mail 695 case Key_F13: //mail
453 break; 696 break;
454 case Key_Space: { 697 case Key_Space:
455 if(mediaPlayerState->playing()) { 698 {
699 if(mediaPlayerState->playing())
700 {
456 mediaPlayerState->setPlaying(FALSE); 701 mediaPlayerState->setPlaying(FALSE);
457 } else { 702 }
703 else
704 {
458 mediaPlayerState->setPlaying(TRUE); 705 mediaPlayerState->setPlaying(TRUE);
459 } 706 }
460 } 707 }
461 break; 708 break;
462 case Key_Down: 709 case Key_Down:
463// toggleButton(6); 710// toggleButton(6);
464// emit lessClicked(); 711// emit lessClicked();
465// emit lessReleased(); 712// emit lessReleased();
466// toggleButton(6); 713// toggleButton(6);
467 break; 714 break;
468 case Key_Up: 715 case Key_Up:
469// toggleButton(5); 716// toggleButton(5);