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