1 /**
2 * Copyright (C) 2005 by Koos Vriezen <koos ! vriezen ? gmail ! com>
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License version 2 as published by the Free Software Foundation.
7 *
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * Library General Public License for more details.
12 *
13 * You should have received a copy of the GNU Library General Public License
14 * along with this library; see the file COPYING.LIB. If not, write to
15 * the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
16 * Boston, MA 02110-1301, USA.
17 **/
18
19 #include <qicon.h>
20 #include <qlayout.h>
21 #include <qpixmap.h>
22 #include <qslider.h>
23 #include <qlabel.h>
24 #include <qpainter.h>
25 #include <qstringlist.h>
26 #include <QCursor>
27 #include <QPalette>
28 #include <QSlider>
29 #include <QLabel>
30 #include <QWheelEvent>
31 #include <QWidgetAction>
32
33 #include <kiconloader.h>
34 #include <klocale.h>
35 #include <kdebug.h>
36
37 #include "kmplayerview.h"
38 #include "kmplayercontrolpanel.h"
39
40 static const int button_height_with_slider = 16;
41 static const int button_height_only_buttons = 16;
42 static float dpi_scale = 1.0;
43 #include "kmplayerview.h"
44 #include "kmplayercontrolpanel.h"
45
46 using namespace KMPlayer;
47
48 static char xpm_fg_color [32] = ". c #000000";
49
50 static const char * stop_xpm[] = {
51 "5 7 2 1",
52 " c None",
53 xpm_fg_color,
54 " ",
55 ".....",
56 ".....",
57 ".....",
58 ".....",
59 ".....",
60 " "};
61
62 static const char * play_xpm[] = {
63 "5 9 2 1",
64 " c None",
65 xpm_fg_color,
66 ". ",
67 ".. ",
68 "... ",
69 ".... ",
70 ".....",
71 ".... ",
72 "... ",
73 ".. ",
74 ". "};
75
76 static const char * pause_xpm[] = {
77 "7 9 2 1",
78 " c None",
79 xpm_fg_color,
80 " ",
81 ".. ..",
82 ".. ..",
83 ".. ..",
84 ".. ..",
85 ".. ..",
86 ".. ..",
87 ".. ..",
88 " "};
89
90 static const char * forward_xpm[] = {
91 "11 9 2 1",
92 " c None",
93 xpm_fg_color,
94 ". . ",
95 ".. .. ",
96 "... ... ",
97 ".... .... ",
98 "..... .....",
99 ".... .... ",
100 "... ... ",
101 ".. .. ",
102 ". . "};
103
104 static const char * back_xpm[] = {
105 "11 9 2 1",
106 " c None",
107 xpm_fg_color,
108 " . .",
109 " .. ..",
110 " ... ...",
111 " .... ....",
112 "..... .....",
113 " .... ....",
114 " ... ...",
115 " .. ..",
116 " . ."};
117
118 static const char * config_xpm[] = {
119 "11 8 2 1",
120 " c None",
121 xpm_fg_color,
122 " ",
123 " ",
124 "...........",
125 " ......... ",
126 " ....... ",
127 " ..... ",
128 " ... ",
129 " . "};
130
131 static const char *playlist_xpm[] = {
132 "8 9 2 1",
133 " c None",
134 xpm_fg_color,
135 " ",
136 " ",
137 "........",
138 "........",
139 " ",
140 " ",
141 "........",
142 "........",
143 " "};
144
145 static const char *normal_window_xpm[] = {
146 "7 9 2 1",
147 " c None",
148 xpm_fg_color,
149 " ",
150 ".......",
151 ".......",
152 ". .",
153 ". .",
154 ". .",
155 ". .",
156 ".......",
157 " "};
158
159 static const char * record_xpm[] = {
160 "7 7 3 1",
161 " c None",
162 xpm_fg_color,
163 "+ c #FF0000",
164 " ",
165 ".......",
166 ".+++++.",
167 ".+++++.",
168 ".+++++.",
169 ".......",
170 " "};
171
172 static const char * broadcast_xpm[] = {
173 "21 9 2 1",
174 " c None",
175 xpm_fg_color,
176 " ",
177 " .. .. .. .. ",
178 ".. .. ... .. ..",
179 ".. .. ..... .. ..",
180 ".. .. ..... .. ..",
181 ".. .. ..... .. ..",
182 ".. .. ... .. ..",
183 " .. .. .. .. ",
184 " "};
185
186 static const char * language_xpm [] = {
187 "12 9 2 1",
188 " c None",
189 xpm_fg_color,
190 " ",
191 " ",
192 " ",
193 " ",
194 " ",
195 ".... ......",
196 ".... ......",
197 ".... ......",
198 " "};
199
200 static const char * red_xpm[] = {
201 "7 9 3 1",
202 " c None",
203 xpm_fg_color,
204 "+ c #FF0000",
205 " ",
206 ".......",
207 ".+++++.",
208 ".+++++.",
209 ".+++++.",
210 ".+++++.",
211 ".+++++.",
212 ".......",
213 " "};
214
215 static const char * green_xpm[] = {
216 "7 9 3 1",
217 " c None",
218 xpm_fg_color,
219 "+ c #00FF00",
220 " ",
221 ".......",
222 ".+++++.",
223 ".+++++.",
224 ".+++++.",
225 ".+++++.",
226 ".+++++.",
227 ".......",
228 " "};
229
230 static const char * yellow_xpm[] = {
231 "7 9 3 1",
232 " c None",
233 xpm_fg_color,
234 "+ c #FFFF00",
235 " ",
236 ".......",
237 ".+++++.",
238 ".+++++.",
239 ".+++++.",
240 ".+++++.",
241 ".+++++.",
242 ".......",
243 " "};
244
245 static const char * blue_xpm[] = {
246 "7 9 3 1",
247 " c None",
248 xpm_fg_color,
249 "+ c #0080FF00",
250 " ",
251 ".......",
252 ".+++++.",
253 ".+++++.",
254 ".+++++.",
255 ".+++++.",
256 ".+++++.",
257 ".......",
258 " "};
259
260 //-----------------------------------------------------------------------------
261
makeIcon(const char ** xpm)262 static QIcon makeIcon(const char** xpm) {
263 QPixmap pix(xpm);
264 if (dpi_scale > 1.01)
265 pix = pix.scaledToHeight(pix.height() * dpi_scale, Qt::SmoothTransformation);
266 return QIcon(pix);
267 }
268
ctrlButton(QBoxLayout * l,const char ** p,int key=0)269 static QPushButton *ctrlButton(QBoxLayout* l, const char **p, int key = 0) {
270 QPushButton* b = new QPushButton(makeIcon(p), QString());
271 b->setFocusPolicy (Qt::NoFocus);
272 b->setFlat (true);
273 b->setAutoFillBackground (true);
274 if (key)
275 b->setShortcut (QKeySequence (key));
276 l->addWidget (b);
277 return b;
278 }
279
280 KDE_NO_CDTOR_EXPORT
KMPlayerMenuButton(QWidget *,QBoxLayout * l,const char ** p,int key)281 KMPlayerMenuButton::KMPlayerMenuButton(QWidget*, QBoxLayout * l, const char ** p, int key)
282 : QPushButton(makeIcon(p), QString()) {
283 setFocusPolicy (Qt::NoFocus);
284 setFlat (true);
285 setAutoFillBackground (true);
286 if (key)
287 setShortcut (QKeySequence (key));
288 l->addWidget (this);
289 }
290
enterEvent(QEvent *)291 KDE_NO_EXPORT void KMPlayerMenuButton::enterEvent (QEvent *) {
292 emit mouseEntered ();
293 }
294
295 //-----------------------------------------------------------------------------
296
297 KDE_NO_CDTOR_EXPORT
KMPlayerPopupMenu(QWidget * parent,const QString & title)298 KMPlayerPopupMenu::KMPlayerPopupMenu (QWidget *parent, const QString &title)
299 : QMenu(title, parent) {}
300
leaveEvent(QEvent *)301 KDE_NO_EXPORT void KMPlayerPopupMenu::leaveEvent (QEvent *) {
302 emit mouseLeft ();
303 }
304
305 //-----------------------------------------------------------------------------
306
VolumeBar(QWidget *,View * view)307 KDE_NO_CDTOR_EXPORT VolumeBar::VolumeBar(QWidget*, View * view)
308 : m_view(view), m_value(100) {
309 setSizePolicy( QSizePolicy (QSizePolicy::Minimum, QSizePolicy::Fixed));
310 setMinimumSize (QSize (51, button_height_only_buttons + 2));
311 setToolTip (i18n ("Volume is ") + QString::number (m_value));
312 setAutoFillBackground (true);
313 QPalette palette;
314 palette.setColor (backgroundRole (), m_view->palette ().color (QPalette::Background));
315 setPalette (palette);
316 }
317
~VolumeBar()318 KDE_NO_CDTOR_EXPORT VolumeBar::~VolumeBar () {
319 }
320
setValue(int v)321 void VolumeBar::setValue (int v) {
322 m_value = v;
323 if (m_value < 0) m_value = 0;
324 if (m_value > 100) m_value = 100;
325 setToolTip (i18n ("Volume is ") + QString::number (m_value));
326 repaint ();
327 emit volumeChanged (m_value);
328 }
329
wheelEvent(QWheelEvent * e)330 void VolumeBar::wheelEvent (QWheelEvent * e) {
331 setValue (m_value + (e->delta () > 0 ? 2 : -2));
332 e->accept ();
333 }
334
paintEvent(QPaintEvent * e)335 void VolumeBar::paintEvent (QPaintEvent * e) {
336 QWidget::paintEvent (e);
337 QPainter p;
338 p.begin (this);
339 QColor color = palette ().color (foregroundRole ());
340 p.setPen (color);
341 int w = width () - 6 * dpi_scale;
342 int vx = m_value * w / 100;
343 p.fillRect (3 * dpi_scale, 3 * dpi_scale, vx, 7 * dpi_scale, color);
344 p.drawRect (vx + 3 * dpi_scale, 3 * dpi_scale, w - vx, 7 * dpi_scale);
345 p.end ();
346 //kDebug () << "w=" << w << " vx=" << vx;
347 }
348
mousePressEvent(QMouseEvent * e)349 void VolumeBar::mousePressEvent (QMouseEvent * e) {
350 setValue (100 * (e->x () - 3 * dpi_scale) / (width () - 6 * dpi_scale));
351 e->accept ();
352 }
353
mouseMoveEvent(QMouseEvent * e)354 void VolumeBar::mouseMoveEvent (QMouseEvent * e) {
355 setValue (100 * (e->x () - 3 * dpi_scale) / (width () - 6 * dpi_scale));
356 e->accept ();
357 }
358
359 //-----------------------------------------------------------------------------
360
ControlPanel(QWidget * parent,View * view)361 KDE_NO_CDTOR_EXPORT ControlPanel::ControlPanel(QWidget * parent, View * view)
362 : QWidget (parent),
363 m_progress_mode (progress_playing),
364 m_progress_length (0),
365 m_popup_timer (0),
366 m_popdown_timer (0),
367 m_view (view),
368 m_auto_controls (true),
369 m_popup_clicked (false) {
370 #if QT_VERSION > 0x040399
371 setAttribute (Qt::WA_NativeWindow);
372 setAttribute(Qt::WA_DontCreateNativeAncestors);
373 #endif
374 dpi_scale = qMax(1.0, logicalDpiX() / 120.0);
375 m_buttonbox = new QHBoxLayout (this);
376 m_buttonbox->setSpacing (4 * dpi_scale);
377 m_buttonbox->setContentsMargins (5 * dpi_scale, 5 * dpi_scale, 5 * dpi_scale, 5 * dpi_scale);
378 setAutoFillBackground (true);
379 QColor c = palette ().color (foregroundRole ());
380 strncpy (xpm_fg_color, QString().sprintf(". c #%02x%02x%02x", c.red(), c.green(),c.blue()).toAscii().constData(), 31);
381 xpm_fg_color[31] = 0;
382 m_buttons[button_config] = new KMPlayerMenuButton (this, m_buttonbox, config_xpm);
383 m_buttons[button_playlist] = ctrlButton(m_buttonbox, playlist_xpm);
384 m_buttons[button_back] = ctrlButton(m_buttonbox, back_xpm);
385 m_buttons[button_play] = ctrlButton(m_buttonbox, play_xpm, Qt::Key_R);
386 m_buttons[button_forward] = ctrlButton(m_buttonbox, forward_xpm);
387 m_buttons[button_stop] = ctrlButton(m_buttonbox, stop_xpm, Qt::Key_S);
388 m_buttons[button_pause]=ctrlButton(m_buttonbox, pause_xpm, Qt::Key_P);
389 m_buttons[button_record] = ctrlButton(m_buttonbox, record_xpm);
390 m_buttons[button_broadcast] = ctrlButton(m_buttonbox, broadcast_xpm);
391 m_buttons[button_language] = new KMPlayerMenuButton (this, m_buttonbox, language_xpm);
392 m_buttons[button_red] = ctrlButton(m_buttonbox, red_xpm);
393 m_buttons[button_green] = ctrlButton(m_buttonbox, green_xpm);
394 m_buttons[button_yellow] = ctrlButton(m_buttonbox, yellow_xpm);
395 m_buttons[button_blue] = ctrlButton(m_buttonbox, blue_xpm);
396 m_buttons[button_play]->setCheckable (true);
397 m_buttons[button_stop]->setCheckable (true);
398 m_buttons[button_record]->setCheckable (true);
399 m_buttons[button_broadcast]->setCheckable (true);
400 m_posSlider = new QSlider;
401 m_posSlider->setOrientation (Qt::Horizontal);
402 m_posSlider->setMaximum (100);
403 m_posSlider->setPageStep (1);
404 m_posSlider->setEnabled (false);
405 m_buttonbox->addWidget (m_posSlider);
406 setupPositionSlider (true);
407 m_volume = new VolumeBar (this, m_view);
408 m_buttonbox->addWidget (m_volume);
409
410 popupMenu = new KMPlayerPopupMenu (this, QString ());
411
412 playerMenu = new KMPlayerPopupMenu (this, i18n ("&Play with"));
413 playersAction = popupMenu->addMenu (playerMenu);
414
415 videoConsoleAction = popupMenu->addAction(QIcon::fromTheme("utilities-terminal"), i18n("Con&sole"));
416
417 playlistAction = popupMenu->addAction(QIcon::fromTheme("view-media-playlist"), i18n("Play&list"));
418
419 zoomMenu = new KMPlayerPopupMenu (this, i18n ("&Zoom"));
420 zoomAction = popupMenu->addMenu (zoomMenu);
421 zoomAction->setIcon(QIcon::fromTheme("zoom-fit-best"));
422 zoom50Action = zoomMenu->addAction (i18n ("50%"));
423 zoom100Action = zoomMenu->addAction (i18n ("100%"));
424 zoom150Action = zoomMenu->addAction (i18n ("150%"));
425
426 fullscreenAction = popupMenu->addAction(QIcon::fromTheme("view-fullscreen"), i18n("&Full Screen"));
427 fullscreenAction->setShortcut (QKeySequence (Qt::Key_F));
428
429 popupMenu->addSeparator ();
430
431 colorMenu = new KMPlayerPopupMenu (this, i18n ("Co&lors"));
432 colorAction = popupMenu->addMenu (colorMenu);
433 colorAction->setIcon(QIcon::fromTheme("format-fill-color"));
434 /*QLabel * label = new QLabel (i18n ("Contrast:"), colorMenu);
435 colorMenu->insertItem (label);
436 m_contrastSlider = new QSlider (-100, 100, 10, 0, Qt::Horizontal, colorMenu);
437 colorMenu->insertItem (m_contrastSlider);
438 label = new QLabel (i18n ("Brightness:"), colorMenu);
439 colorMenu->insertItem (label);
440 m_brightnessSlider = new QSlider (-100, 100, 10, 0, Qt::Horizontal, colorMenu);
441 colorMenu->insertItem (m_brightnessSlider);
442 label = new QLabel (i18n ("Hue:"), colorMenu);
443 colorMenu->insertItem (label);
444 m_hueSlider = new QSlider (-100, 100, 10, 0, Qt::Horizontal, colorMenu);
445 colorMenu->insertItem (m_hueSlider);
446 label = new QLabel (i18n ("Saturation:"), colorMenu);
447 colorMenu->insertItem (label);
448 m_saturationSlider = new QSlider (-100, 100, 10, 0, Qt::Horizontal, colorMenu);
449 colorMenu->insertItem (m_saturationSlider);*/
450 colorAction->setVisible (false);
451
452 bookmarkMenu = new KMPlayerPopupMenu (this, i18n("&Bookmarks"));
453 bookmarkAction = popupMenu->addMenu (bookmarkMenu);
454 bookmarkAction->setVisible (false);
455
456 languageMenu = new KMPlayerPopupMenu (this, i18n ("&Audio languages"));
457 languageAction = popupMenu->addMenu (languageMenu);
458 audioMenu = new KMPlayerPopupMenu (this, i18n ("&Audio languages"));
459 subtitleMenu = new KMPlayerPopupMenu (this, i18n ("&Subtitles"));
460 QAction *audioAction = languageMenu->addMenu (audioMenu);
461 QAction *subtitleAction = languageMenu->addMenu (subtitleMenu);
462 audioAction->setIcon(QIcon::fromTheme("audio-x-generic"));
463 subtitleAction->setIcon(QIcon::fromTheme("view-list-text"));
464 languageAction->setVisible (false);
465
466 scaleLabelAction = new QWidgetAction (popupMenu);
467 scaleLabelAction->setDefaultWidget (new QLabel (i18n ("Scale:")));
468 popupMenu->addAction (scaleLabelAction);
469 scaleAction = new QWidgetAction (popupMenu);
470 scale_slider = new QSlider;
471 scale_slider->setOrientation (Qt::Horizontal);
472 scale_slider->setMinimum (50);
473 scale_slider->setMaximum (150);
474 scale_slider->setPageStep (10);
475 scale_slider->setSliderPosition (100);
476 scaleAction->setDefaultWidget (scale_slider);
477 popupMenu->addAction (scaleAction);
478
479 configureAction = popupMenu->addAction(QIcon::fromTheme("configure"), i18n("&Configure KMPlayer..."));
480
481 QPalette pal = palette ();
482 pal.setColor(backgroundRole(), view->palette().color(QPalette::Background));
483 setPalette (pal);
484 setAutoControls (true);
485 connect (m_buttons [button_config], SIGNAL (clicked ()),
486 this, SLOT (buttonClicked ()));
487 connect (m_buttons [button_language], SIGNAL (clicked ()),
488 this, SLOT (buttonClicked ()));
489 connect (m_buttons [button_config], SIGNAL (mouseEntered ()),
490 this, SLOT (buttonMouseEntered ()));
491 connect (m_buttons [button_language], SIGNAL (mouseEntered ()),
492 this, SLOT (buttonMouseEntered ()));
493 connect (popupMenu, SIGNAL (mouseLeft ()), this, SLOT (menuMouseLeft ()));
494 connect (playerMenu, SIGNAL (mouseLeft ()), this, SLOT(menuMouseLeft ()));
495 connect (zoomMenu, SIGNAL (mouseLeft ()), this, SLOT (menuMouseLeft ()));
496 connect (colorMenu, SIGNAL (mouseLeft ()), this, SLOT (menuMouseLeft ()));
497 connect (languageMenu, SIGNAL(mouseLeft ()), this, SLOT(menuMouseLeft()));
498 connect (subtitleMenu, SIGNAL(mouseLeft ()), this, SLOT(menuMouseLeft()));
499 connect (audioMenu, SIGNAL (mouseLeft ()), this, SLOT (menuMouseLeft ()));
500 }
501
setPalette(const QPalette & pal)502 KDE_NO_EXPORT void ControlPanel::setPalette (const QPalette & pal) {
503 QWidget::setPalette (pal);
504 QColor c = palette ().color (foregroundRole ());
505 if (c == Qt::black)
506 return;
507 strncpy (xpm_fg_color, QString().sprintf(". c #%02x%02x%02x", c.red(), c.green(),c.blue()).toAscii().constData(), 31);
508 xpm_fg_color[31] = 0;
509 m_buttons[button_config]->setIcon(makeIcon(config_xpm));
510 m_buttons[button_playlist]->setIcon(makeIcon(playlist_xpm));
511 m_buttons[button_back]->setIcon(makeIcon(back_xpm));
512 m_buttons[button_play]->setIcon(makeIcon(play_xpm));
513 m_buttons[button_forward]->setIcon(makeIcon(forward_xpm));
514 m_buttons[button_stop]->setIcon(makeIcon(stop_xpm));
515 m_buttons[button_pause]->setIcon(makeIcon(pause_xpm));
516 m_buttons[button_record]->setIcon(makeIcon(record_xpm));
517 m_buttons[button_broadcast]->setIcon(makeIcon(broadcast_xpm));
518 m_buttons[button_language]->setIcon(makeIcon(language_xpm));
519 m_buttons[button_red]->setIcon(makeIcon(red_xpm));
520 m_buttons[button_green]->setIcon(makeIcon(green_xpm));
521 m_buttons[button_yellow]->setIcon(makeIcon(yellow_xpm));
522 m_buttons[button_blue]->setIcon(makeIcon(blue_xpm));
523 }
524
timerEvent(QTimerEvent * e)525 KDE_NO_EXPORT void ControlPanel::timerEvent (QTimerEvent * e) {
526 if (e->timerId () == m_popup_timer) {
527 m_popup_timer = 0;
528 if (m_button_monitored == button_config) {
529 if (m_buttons [button_config]->testAttribute(Qt::WA_UnderMouse) &&
530 !popupMenu->isVisible ())
531 showPopupMenu ();
532 } else if (m_buttons [button_language]->testAttribute(Qt::WA_UnderMouse) &&
533 !languageMenu->isVisible ()) {
534 showLanguageMenu ();
535 }
536 } else if (e->timerId () == m_popdown_timer) {
537 m_popdown_timer = 0;
538 QPoint mpos = QCursor::pos();
539 #define HAS_MOUSE(menu) ((menu)->isVisible() && (menu)->rect().contains((menu)->mapFromGlobal(mpos)))
540 if (popupMenu->isVisible () &&
541 !popupMenu->underMouse() &&
542 !HAS_MOUSE(playerMenu) &&
543 !HAS_MOUSE(zoomMenu) &&
544 !HAS_MOUSE(colorMenu) &&
545 !HAS_MOUSE(bookmarkMenu)) {
546 if (!(bookmarkMenu->isVisible () &&
547 static_cast <QWidget *> (bookmarkMenu) != QWidget::keyboardGrabber ())) {
548 // not if user entered the bookmark sub menu or if I forgot one
549 popupMenu->hide ();
550 if (m_buttons [button_config]->isChecked ())
551 m_buttons [button_config]->toggle ();
552 }
553 } else if (languageMenu->isVisible () &&
554 !HAS_MOUSE(languageMenu) &&
555 !HAS_MOUSE(audioMenu) &&
556 !HAS_MOUSE(subtitleMenu)) {
557 languageMenu->hide ();
558 if (m_buttons [button_language]->isChecked ())
559 m_buttons [button_language]->toggle ();
560 }
561 #undef HAS_MOUSE
562 }
563 killTimer (e->timerId ());
564 }
565
setAutoControls(bool b)566 void ControlPanel::setAutoControls (bool b) {
567 m_auto_controls = b;
568 if (m_auto_controls) {
569 for (int i = 0; i < (int) button_broadcast; i++)
570 m_buttons [i]->show ();
571 for (int i = button_broadcast; i < (int) button_last; i++)
572 m_buttons [i]->hide ();
573 showPositionSlider (false);
574 m_volume->show ();
575 if (m_buttons [button_broadcast]->isChecked ()) // still broadcasting
576 m_buttons [button_broadcast]->show ();
577 } else { // hide everything
578 for (int i = 0; i < (int) button_last; i++)
579 m_buttons [i]->hide ();
580 m_posSlider->hide ();
581 m_volume->hide ();
582 }
583 m_view->updateLayout ();
584 }
585
showPopupMenu()586 KDE_NO_EXPORT void ControlPanel::showPopupMenu () {
587 popupMenu->exec (m_buttons [button_config]->mapToGlobal (QPoint (0, maximumSize ().height ())));
588 }
589
showLanguageMenu()590 KDE_NO_EXPORT void ControlPanel::showLanguageMenu () {
591 languageMenu->exec (m_buttons [button_language]->mapToGlobal (QPoint (0, maximumSize ().height ())));
592 }
593
showPositionSlider(bool show)594 void ControlPanel::showPositionSlider (bool show) {
595 if (!m_auto_controls || show == m_posSlider->isVisible ())
596 return;
597 setupPositionSlider (show);
598 if (isVisible ())
599 m_view->updateLayout ();
600 }
601
setupPositionSlider(bool show)602 KDE_NO_EXPORT void ControlPanel::setupPositionSlider (bool show) {
603 int h = show ? button_height_with_slider : button_height_only_buttons;
604 m_posSlider->setEnabled (false);
605 m_posSlider->setValue (0);
606 m_posSlider->setVisible (show);
607 for (int i = 0; i < (int) button_last; i++) {
608 m_buttons[i]->setMinimumSize (15 * dpi_scale, (h-1) * dpi_scale);
609 m_buttons[i]->setMaximumHeight(h * dpi_scale);
610 }
611 setMaximumHeight((h + 6) * dpi_scale);
612 }
613
preferredHeight()614 KDE_NO_EXPORT int ControlPanel::preferredHeight () {
615 return dpi_scale * (m_posSlider->isVisible () ?
616 button_height_with_slider + 8 : button_height_only_buttons + 2);
617 }
618
enableSeekButtons(bool enable)619 void ControlPanel::enableSeekButtons (bool enable) {
620 if (!m_auto_controls) return;
621 if (enable) {
622 m_buttons[button_back]->show ();
623 m_buttons[button_forward]->show ();
624 } else {
625 m_buttons[button_back]->hide ();
626 m_buttons[button_forward]->hide ();
627 }
628 }
629
enableRecordButtons(bool enable)630 void ControlPanel::enableRecordButtons (bool enable) {
631 if (!m_auto_controls) return;
632 if (enable)
633 m_buttons[button_record]->show ();
634 else
635 m_buttons[button_record]->hide ();
636 }
637
enableFullscreenButton(bool enable)638 void ControlPanel::enableFullscreenButton(bool enable) {
639 m_buttons[button_playlist]->setIcon(makeIcon(enable ? normal_window_xpm : playlist_xpm));
640 }
641
setPlaying(bool play)642 void ControlPanel::setPlaying (bool play) {
643 if (play != m_buttons[button_play]->isChecked ())
644 m_buttons[button_play]->toggle ();
645 m_posSlider->setEnabled (false);
646 m_posSlider->setValue (0);
647 if (!play) {
648 showPositionSlider (false);
649 enableSeekButtons (true);
650 }
651 }
652
setRecording(bool record)653 KDE_NO_EXPORT void ControlPanel::setRecording (bool record) {
654 if (record != m_buttons[button_record]->isChecked ())
655 m_buttons[button_record]->toggle ();
656 }
657
setPlayingProgress(int pos,int len)658 KDE_NO_EXPORT void ControlPanel::setPlayingProgress (int pos, int len) {
659 m_posSlider->setEnabled (false);
660 m_progress_length = len;
661 showPositionSlider (len > 0);
662 if (m_progress_mode != progress_playing) {
663 m_posSlider->setMaximum (m_progress_length);
664 m_progress_mode = progress_playing;
665 }
666 if (pos < len && len > 0 && len != m_posSlider->maximum ())
667 m_posSlider->setMaximum (m_progress_length);
668 else if (m_progress_length <= 0 && pos > 7 * m_posSlider->maximum ()/8)
669 m_posSlider->setMaximum (m_posSlider->maximum() * 2);
670 else if (m_posSlider->maximum() < pos)
671 m_posSlider->setMaximum (int (1.4 * m_posSlider->maximum()));
672 m_posSlider->setValue (pos);
673 m_posSlider->setEnabled (true);
674 }
675
setLoadingProgress(int pos)676 KDE_NO_EXPORT void ControlPanel::setLoadingProgress (int pos) {
677 if (pos > 0 && pos < 100 && !m_posSlider->isVisible ())
678 showPositionSlider (true);
679 else if (pos >= 100 && m_posSlider->isVisible ())
680 showPositionSlider (false);
681 m_posSlider->setEnabled (false);
682 if (m_progress_mode != progress_loading) {
683 m_posSlider->setMaximum (100);
684 m_progress_mode = progress_loading;
685 }
686 m_posSlider->setValue (pos);
687 }
688
buttonClicked()689 KDE_NO_EXPORT void ControlPanel::buttonClicked () {
690 if (m_popup_timer) {
691 killTimer (m_popup_timer);
692 m_popup_timer = 0;
693 }
694 m_popup_clicked = true;
695 if (sender () == m_buttons [button_language])
696 showLanguageMenu ();
697 else
698 showPopupMenu ();
699 }
700
buttonMouseEntered()701 KDE_NO_EXPORT void ControlPanel::buttonMouseEntered () {
702 if (!m_popup_timer) {
703 if (sender () == m_buttons [button_config]) {
704 if (!popupMenu->isVisible ()) {
705 m_button_monitored = button_config;
706 m_popup_clicked = false;
707 m_popup_timer = startTimer (400);
708 }
709 } else if (!languageMenu->isVisible ()) {
710 m_button_monitored = button_language;
711 m_popup_clicked = false;
712 m_popup_timer = startTimer (400);
713 }
714 }
715 }
716
menuMouseLeft()717 KDE_NO_EXPORT void ControlPanel::menuMouseLeft () {
718 if (!m_popdown_timer && !m_popup_clicked)
719 m_popdown_timer = startTimer (400);
720 }
721
setLanguages(const QStringList & alang,const QStringList & slang)722 KDE_NO_EXPORT void ControlPanel::setLanguages (const QStringList & alang, const QStringList & slang) {
723 int sz = (int) alang.size ();
724 bool showbutton = (sz > 0);
725 audioMenu->clear ();
726 for (int i = 0; i < sz; i++)
727 audioMenu->addAction (alang [i])->setCheckable(true);
728 sz = (int) slang.size ();
729 showbutton |= (sz > 0);
730 subtitleMenu->clear ();
731 for (int i = 0; i < sz; i++)
732 subtitleMenu->addAction (slang [i])->setCheckable(true);
733 if (showbutton)
734 m_buttons [button_language]->show ();
735 else
736 m_buttons [button_language]->hide ();
737 }
738
actionToggled(QAction * act)739 KDE_NO_EXPORT void ControlPanel::actionToggled (QAction* act) {
740 if (act->isChecked ())
741 return;
742 int size = act->parentWidget()->actions().count();
743 for (int i = 0; i < size; i++)
744 if (act->parentWidget()->actions().at(i)->isChecked ()) {
745 act->parentWidget()->actions().at(i)->setChecked (false);
746 break;
747 }
748 act->setChecked (true);
749 }
750
751 //-----------------------------------------------------------------------------
752
753 #include "kmplayercontrolpanel.moc"
754