File indexing completed on 2024-04-21 15:38:16

0001 /**
0002  * Copyright (C) 2005 by Koos Vriezen <koos ! vriezen ? gmail ! com>
0003  *
0004  *  This library is free software; you can redistribute it and/or
0005  *  modify it under the terms of the GNU Library General Public
0006  *  License version 2 as published by the Free Software Foundation.
0007  *
0008  *  This library is distributed in the hope that it will be useful,
0009  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
0010  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0011  *  Library General Public License for more details.
0012  *
0013  *  You should have received a copy of the GNU Library General Public License
0014  *  along with this library; see the file COPYING.LIB.  If not, write to
0015  *  the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
0016  *  Boston, MA 02110-1301, USA.
0017  **/
0018 
0019 #include <qicon.h>
0020 #include <qlayout.h>
0021 #include <qpixmap.h>
0022 #include <qslider.h>
0023 #include <qlabel.h>
0024 #include <qpainter.h>
0025 #include <qstringlist.h>
0026 #include <QCursor>
0027 #include <QPalette>
0028 #include <QSlider>
0029 #include <QLabel>
0030 #include <QWheelEvent>
0031 #include <QWidgetAction>
0032 
0033 #include <kiconloader.h>
0034 #include <klocalizedstring.h>
0035 #include <kdebug.h>
0036 
0037 #include "kmplayerview.h"
0038 #include "kmplayercontrolpanel.h"
0039 
0040 static const int button_height_with_slider = 16;
0041 static const int button_height_only_buttons = 16;
0042 static float dpi_scale = 1.0;
0043 #include "kmplayerview.h"
0044 #include "kmplayercontrolpanel.h"
0045 
0046 using namespace KMPlayer;
0047 
0048 static char xpm_fg_color [32] = ".      c #000000";
0049 
0050 static const char * stop_xpm[] = {
0051     "5 7 2 1",
0052     "       c None",
0053     xpm_fg_color,
0054     "     ",
0055     ".....",
0056     ".....",
0057     ".....",
0058     ".....",
0059     ".....",
0060     "     "};
0061 
0062 static const char * play_xpm[] = {
0063     "5 9 2 1",
0064     "       c None",
0065     xpm_fg_color,
0066     ".    ",
0067     "..   ",
0068     "...  ",
0069     ".... ",
0070     ".....",
0071     ".... ",
0072     "...  ",
0073     "..   ",
0074     ".    "};
0075 
0076 static const char * pause_xpm[] = {
0077     "7 9 2 1",
0078     "       c None",
0079     xpm_fg_color,
0080     "       ",
0081     "..   ..",
0082     "..   ..",
0083     "..   ..",
0084     "..   ..",
0085     "..   ..",
0086     "..   ..",
0087     "..   ..",
0088     "       "};
0089 
0090 static const char * forward_xpm[] = {
0091     "11 9 2 1",
0092     "       c None",
0093     xpm_fg_color,
0094     ".     .    ",
0095     "..    ..   ",
0096     "...   ...  ",
0097     "....  .... ",
0098     "..... .....",
0099     "....  .... ",
0100     "...   ...  ",
0101     "..    ..   ",
0102     ".     .    "};
0103 
0104 static const char * back_xpm[] = {
0105     "11 9 2 1",
0106     "       c None",
0107     xpm_fg_color,
0108     "    .     .",
0109     "   ..    ..",
0110     "  ...   ...",
0111     " ....  ....",
0112     "..... .....",
0113     " ....  ....",
0114     "  ...   ...",
0115     "   ..    ..",
0116     "    .     ."};
0117 
0118 static const char * config_xpm[] = {
0119     "11 8 2 1",
0120     "       c None",
0121     xpm_fg_color,
0122     "           ",
0123     "           ",
0124     "...........",
0125     " ......... ",
0126     "  .......  ",
0127     "   .....   ",
0128     "    ...    ",
0129     "     .     "};
0130 
0131 static const char *playlist_xpm[] = {
0132     "8 9 2 1",
0133     "       c None",
0134     xpm_fg_color,
0135     "        ",
0136     "        ",
0137     "........",
0138     "........",
0139     "        ",
0140     "        ",
0141     "........",
0142     "........",
0143     "        "};
0144 
0145 static const char *normal_window_xpm[] = {
0146     "7 9 2 1",
0147     "       c None",
0148     xpm_fg_color,
0149     "       ",
0150     ".......",
0151     ".......",
0152     ".     .",
0153     ".     .",
0154     ".     .",
0155     ".     .",
0156     ".......",
0157     "       "};
0158 
0159 static const char * record_xpm[] = {
0160     "7 7 3 1",
0161     "       c None",
0162     xpm_fg_color,
0163     "+      c #FF0000",
0164     "       ",
0165     ".......",
0166     ".+++++.",
0167     ".+++++.",
0168     ".+++++.",
0169     ".......",
0170     "       "};
0171 
0172 static const char * broadcast_xpm[] = {
0173 "21 9 2 1",
0174 "       c None",
0175 xpm_fg_color,
0176 "                     ",
0177 " ..  ..       ..  .. ",
0178 "..  ..   ...   ..  ..",
0179 "..  ..  .....  ..  ..",
0180 "..  ..  .....  ..  ..",
0181 "..  ..  .....  ..  ..",
0182 "..  ..   ...   ..  ..",
0183 " ..  ..       ..  .. ",
0184 "                     "};
0185 
0186 static const char * language_xpm [] = {
0187     "12 9 2 1",
0188     "       c None",
0189     xpm_fg_color,
0190     "            ",
0191     "            ",
0192     "            ",
0193     "            ",
0194     "            ",
0195     "....  ......",
0196     "....  ......",
0197     "....  ......",
0198     "            "};
0199 
0200 static const char * red_xpm[] = {
0201     "7 9 3 1",
0202     "       c None",
0203     xpm_fg_color,
0204     "+      c #FF0000",
0205     "       ",
0206     ".......",
0207     ".+++++.",
0208     ".+++++.",
0209     ".+++++.",
0210     ".+++++.",
0211     ".+++++.",
0212     ".......",
0213     "       "};
0214 
0215 static const char * green_xpm[] = {
0216     "7 9 3 1",
0217     "       c None",
0218     xpm_fg_color,
0219     "+      c #00FF00",
0220     "       ",
0221     ".......",
0222     ".+++++.",
0223     ".+++++.",
0224     ".+++++.",
0225     ".+++++.",
0226     ".+++++.",
0227     ".......",
0228     "       "};
0229 
0230 static const char * yellow_xpm[] = {
0231     "7 9 3 1",
0232     "       c None",
0233     xpm_fg_color,
0234     "+      c #FFFF00",
0235     "       ",
0236     ".......",
0237     ".+++++.",
0238     ".+++++.",
0239     ".+++++.",
0240     ".+++++.",
0241     ".+++++.",
0242     ".......",
0243     "       "};
0244 
0245 static const char * blue_xpm[] = {
0246     "7 9 3 1",
0247     "       c None",
0248     xpm_fg_color,
0249     "+      c #0080FF00",
0250     "       ",
0251     ".......",
0252     ".+++++.",
0253     ".+++++.",
0254     ".+++++.",
0255     ".+++++.",
0256     ".+++++.",
0257     ".......",
0258     "       "};
0259 
0260 //-----------------------------------------------------------------------------
0261 
0262 static QIcon makeIcon(const char** xpm) {
0263     QPixmap pix(xpm);
0264     if (dpi_scale > 1.01)
0265         pix = pix.scaledToHeight(pix.height() * dpi_scale, Qt::SmoothTransformation);
0266     return QIcon(pix);
0267 }
0268 
0269 static QPushButton *ctrlButton(QBoxLayout* l, const char **p, int key = 0) {
0270     QPushButton* b = new QPushButton(makeIcon(p), QString());
0271     b->setFocusPolicy (Qt::NoFocus);
0272     b->setFlat (true);
0273     b->setAutoFillBackground (true);
0274     if (key)
0275         b->setShortcut (QKeySequence (key));
0276     l->addWidget (b);
0277     return b;
0278 }
0279 
0280 KDE_NO_CDTOR_EXPORT
0281 KMPlayerMenuButton::KMPlayerMenuButton(QWidget*, QBoxLayout * l, const char ** p, int key)
0282  : QPushButton(makeIcon(p), QString()) {
0283     setFocusPolicy (Qt::NoFocus);
0284     setFlat (true);
0285     setAutoFillBackground (true);
0286     if (key)
0287         setShortcut (QKeySequence (key));
0288     l->addWidget (this);
0289 }
0290 
0291 KDE_NO_EXPORT void KMPlayerMenuButton::enterEvent (QEvent *) {
0292     emit mouseEntered ();
0293 }
0294 
0295 //-----------------------------------------------------------------------------
0296 
0297 KDE_NO_CDTOR_EXPORT
0298 KMPlayerPopupMenu::KMPlayerPopupMenu (QWidget *parent, const QString &title)
0299  : QMenu(title, parent) {}
0300 
0301 KDE_NO_EXPORT void KMPlayerPopupMenu::leaveEvent (QEvent *) {
0302     emit mouseLeft ();
0303 }
0304 
0305 //-----------------------------------------------------------------------------
0306 
0307 KDE_NO_CDTOR_EXPORT VolumeBar::VolumeBar(QWidget*, View * view)
0308  : m_view(view), m_value(100) {
0309     setSizePolicy( QSizePolicy (QSizePolicy::Minimum, QSizePolicy::Fixed));
0310     setMinimumSize (QSize (51, button_height_only_buttons + 2));
0311     setToolTip (i18n ("Volume is ") + QString::number (m_value));
0312     setAutoFillBackground (true);
0313     QPalette palette;
0314     palette.setColor (backgroundRole (), m_view->palette ().color (QPalette::Background));
0315     setPalette (palette);
0316 }
0317 
0318 KDE_NO_CDTOR_EXPORT VolumeBar::~VolumeBar () {
0319 }
0320 
0321 void VolumeBar::setValue (int v) {
0322     m_value = v;
0323     if (m_value < 0) m_value = 0;
0324     if (m_value > 100) m_value = 100;
0325     setToolTip (i18n ("Volume is ") + QString::number (m_value));
0326     repaint ();
0327     emit volumeChanged (m_value);
0328 }
0329 
0330 void VolumeBar::wheelEvent (QWheelEvent * e) {
0331     setValue (m_value + (e->delta () > 0 ? 2 : -2));
0332     e->accept ();
0333 }
0334 
0335 void VolumeBar::paintEvent (QPaintEvent * e) {
0336     QWidget::paintEvent (e);
0337     QPainter p;
0338     p.begin (this);
0339     QColor color = palette ().color (foregroundRole ());
0340     p.setPen (color);
0341     int w = width () - 6 * dpi_scale;
0342     int vx = m_value * w / 100;
0343     p.fillRect (3 * dpi_scale, 3 * dpi_scale, vx, 7 * dpi_scale, color);
0344     p.drawRect (vx + 3 * dpi_scale, 3 * dpi_scale, w - vx, 7 * dpi_scale);
0345     p.end ();
0346     //kDebug () << "w=" << w << " vx=" << vx;
0347 }
0348 
0349 void VolumeBar::mousePressEvent (QMouseEvent * e) {
0350     setValue (100 * (e->x () - 3 * dpi_scale) / (width () - 6 * dpi_scale));
0351     e->accept ();
0352 }
0353 
0354 void VolumeBar::mouseMoveEvent (QMouseEvent * e) {
0355     setValue (100 * (e->x () - 3 * dpi_scale) / (width () - 6 * dpi_scale));
0356     e->accept ();
0357 }
0358 
0359 //-----------------------------------------------------------------------------
0360 
0361 KDE_NO_CDTOR_EXPORT ControlPanel::ControlPanel(QWidget * parent, View * view)
0362  : QWidget (parent),
0363    m_progress_mode (progress_playing),
0364    m_progress_length (0),
0365    m_popup_timer (0),
0366    m_popdown_timer (0),
0367    m_view (view),
0368    m_auto_controls (true),
0369    m_popup_clicked (false) {
0370 #if QT_VERSION > 0x040399
0371     setAttribute (Qt::WA_NativeWindow);
0372     setAttribute(Qt::WA_DontCreateNativeAncestors);
0373 #endif
0374     dpi_scale = qMax(1.0, logicalDpiX() / 120.0);
0375     m_buttonbox = new QHBoxLayout (this);
0376     m_buttonbox->setSpacing (4 * dpi_scale);
0377     m_buttonbox->setContentsMargins (5 * dpi_scale, 5 * dpi_scale, 5 * dpi_scale, 5 * dpi_scale);
0378     setAutoFillBackground (true);
0379     QColor c = palette ().color (foregroundRole ());
0380     strncpy (xpm_fg_color, QString().sprintf(".      c #%02x%02x%02x", c.red(), c.green(),c.blue()).toAscii().constData(), 31);
0381     xpm_fg_color[31] = 0;
0382     m_buttons[button_config] = new KMPlayerMenuButton (this, m_buttonbox, config_xpm);
0383     m_buttons[button_playlist] = ctrlButton(m_buttonbox, playlist_xpm);
0384     m_buttons[button_back] = ctrlButton(m_buttonbox, back_xpm);
0385     m_buttons[button_play] = ctrlButton(m_buttonbox, play_xpm, Qt::Key_R);
0386     m_buttons[button_forward] = ctrlButton(m_buttonbox, forward_xpm);
0387     m_buttons[button_stop] = ctrlButton(m_buttonbox, stop_xpm, Qt::Key_S);
0388     m_buttons[button_pause]=ctrlButton(m_buttonbox, pause_xpm, Qt::Key_P);
0389     m_buttons[button_record] = ctrlButton(m_buttonbox, record_xpm);
0390     m_buttons[button_broadcast] = ctrlButton(m_buttonbox, broadcast_xpm);
0391     m_buttons[button_language] = new KMPlayerMenuButton (this, m_buttonbox, language_xpm);
0392     m_buttons[button_red] = ctrlButton(m_buttonbox, red_xpm);
0393     m_buttons[button_green] = ctrlButton(m_buttonbox, green_xpm);
0394     m_buttons[button_yellow] = ctrlButton(m_buttonbox, yellow_xpm);
0395     m_buttons[button_blue] = ctrlButton(m_buttonbox, blue_xpm);
0396     m_buttons[button_play]->setCheckable (true);
0397     m_buttons[button_stop]->setCheckable (true);
0398     m_buttons[button_record]->setCheckable (true);
0399     m_buttons[button_broadcast]->setCheckable (true);
0400     m_posSlider = new QSlider;
0401     m_posSlider->setOrientation (Qt::Horizontal);
0402     m_posSlider->setMaximum (100);
0403     m_posSlider->setPageStep (1);
0404     m_posSlider->setEnabled (false);
0405     m_buttonbox->addWidget (m_posSlider);
0406     setupPositionSlider (true);
0407     m_volume = new VolumeBar (this, m_view);
0408     m_buttonbox->addWidget (m_volume);
0409 
0410     popupMenu = new KMPlayerPopupMenu (this, QString ());
0411 
0412     playerMenu = new KMPlayerPopupMenu (this, i18n ("&Play with"));
0413     playersAction = popupMenu->addMenu (playerMenu);
0414 
0415     videoConsoleAction = popupMenu->addAction(QIcon::fromTheme("utilities-terminal"), i18n("Con&sole"));
0416 
0417     playlistAction = popupMenu->addAction(QIcon::fromTheme("view-media-playlist"), i18n("Play&list"));
0418 
0419     zoomMenu = new KMPlayerPopupMenu (this, i18n ("&Zoom"));
0420     zoomAction = popupMenu->addMenu (zoomMenu);
0421     zoomAction->setIcon(QIcon::fromTheme("zoom-fit-best"));
0422     zoom50Action = zoomMenu->addAction (i18n ("50%"));
0423     zoom100Action = zoomMenu->addAction (i18n ("100%"));
0424     zoom150Action = zoomMenu->addAction (i18n ("150%"));
0425 
0426     fullscreenAction = popupMenu->addAction(QIcon::fromTheme("view-fullscreen"), i18n("&Full Screen"));
0427     fullscreenAction->setShortcut (QKeySequence (Qt::Key_F));
0428 
0429     popupMenu->addSeparator ();
0430 
0431     colorMenu = new KMPlayerPopupMenu (this, i18n ("Co&lors"));
0432     colorAction = popupMenu->addMenu (colorMenu);
0433     colorAction->setIcon(QIcon::fromTheme("format-fill-color"));
0434     /*QLabel * label = new QLabel (i18n ("Contrast:"), colorMenu);
0435     colorMenu->insertItem (label);
0436     m_contrastSlider = new QSlider (-100, 100, 10, 0, Qt::Horizontal, colorMenu);
0437     colorMenu->insertItem (m_contrastSlider);
0438     label = new QLabel (i18n ("Brightness:"), colorMenu);
0439     colorMenu->insertItem (label);
0440     m_brightnessSlider = new QSlider (-100, 100, 10, 0, Qt::Horizontal, colorMenu);
0441     colorMenu->insertItem (m_brightnessSlider);
0442     label = new QLabel (i18n ("Hue:"), colorMenu);
0443     colorMenu->insertItem (label);
0444     m_hueSlider = new QSlider (-100, 100, 10, 0, Qt::Horizontal, colorMenu);
0445     colorMenu->insertItem (m_hueSlider);
0446     label = new QLabel (i18n ("Saturation:"), colorMenu);
0447     colorMenu->insertItem (label);
0448     m_saturationSlider = new QSlider (-100, 100, 10, 0, Qt::Horizontal, colorMenu);
0449     colorMenu->insertItem (m_saturationSlider);*/
0450     colorAction->setVisible (false);
0451 
0452     bookmarkMenu = new KMPlayerPopupMenu (this, i18n("&Bookmarks"));
0453     bookmarkAction = popupMenu->addMenu (bookmarkMenu);
0454     bookmarkAction->setVisible (false);
0455 
0456     languageMenu = new KMPlayerPopupMenu (this, i18n ("&Audio languages"));
0457     languageAction = popupMenu->addMenu (languageMenu);
0458     audioMenu = new KMPlayerPopupMenu (this, i18n ("&Audio languages"));
0459     subtitleMenu = new KMPlayerPopupMenu (this, i18n ("&Subtitles"));
0460     QAction *audioAction = languageMenu->addMenu (audioMenu);
0461     QAction *subtitleAction = languageMenu->addMenu (subtitleMenu);
0462     audioAction->setIcon(QIcon::fromTheme("audio-x-generic"));
0463     subtitleAction->setIcon(QIcon::fromTheme("view-list-text"));
0464     languageAction->setVisible (false);
0465 
0466     scaleLabelAction = new QWidgetAction (popupMenu);
0467     scaleLabelAction->setDefaultWidget (new QLabel (i18n ("Scale:")));
0468     popupMenu->addAction (scaleLabelAction);
0469     scaleAction = new QWidgetAction (popupMenu);
0470     scale_slider = new QSlider;
0471     scale_slider->setOrientation (Qt::Horizontal);
0472     scale_slider->setMinimum (50);
0473     scale_slider->setMaximum (150);
0474     scale_slider->setPageStep (10);
0475     scale_slider->setSliderPosition (100);
0476     scaleAction->setDefaultWidget (scale_slider);
0477     popupMenu->addAction (scaleAction);
0478 
0479     configureAction = popupMenu->addAction(QIcon::fromTheme("configure"), i18n("&Configure KMPlayer..."));
0480 
0481     QPalette pal = palette ();
0482     pal.setColor(backgroundRole(), view->palette().color(QPalette::Background));
0483     setPalette (pal);
0484     setAutoControls (true);
0485     connect (m_buttons [button_config], SIGNAL (clicked ()),
0486             this, SLOT (buttonClicked ()));
0487     connect (m_buttons [button_language], SIGNAL (clicked ()),
0488             this, SLOT (buttonClicked ()));
0489     connect (m_buttons [button_config], SIGNAL (mouseEntered ()),
0490              this, SLOT (buttonMouseEntered ()));
0491     connect (m_buttons [button_language], SIGNAL (mouseEntered ()),
0492              this, SLOT (buttonMouseEntered ()));
0493     connect (popupMenu, SIGNAL (mouseLeft ()), this, SLOT (menuMouseLeft ()));
0494     connect (playerMenu, SIGNAL (mouseLeft ()), this, SLOT(menuMouseLeft ()));
0495     connect (zoomMenu, SIGNAL (mouseLeft ()), this, SLOT (menuMouseLeft ()));
0496     connect (colorMenu, SIGNAL (mouseLeft ()), this, SLOT (menuMouseLeft ()));
0497     connect (languageMenu, SIGNAL(mouseLeft ()), this, SLOT(menuMouseLeft()));
0498     connect (subtitleMenu, SIGNAL(mouseLeft ()), this, SLOT(menuMouseLeft()));
0499     connect (audioMenu, SIGNAL (mouseLeft ()), this, SLOT (menuMouseLeft ()));
0500 }
0501 
0502 KDE_NO_EXPORT void ControlPanel::setPalette (const QPalette & pal) {
0503     QWidget::setPalette (pal);
0504     QColor c = palette ().color (foregroundRole ());
0505     if (c == Qt::black)
0506         return;
0507     strncpy (xpm_fg_color, QString().sprintf(".      c #%02x%02x%02x", c.red(), c.green(),c.blue()).toAscii().constData(), 31);
0508     xpm_fg_color[31] = 0;
0509     m_buttons[button_config]->setIcon(makeIcon(config_xpm));
0510     m_buttons[button_playlist]->setIcon(makeIcon(playlist_xpm));
0511     m_buttons[button_back]->setIcon(makeIcon(back_xpm));
0512     m_buttons[button_play]->setIcon(makeIcon(play_xpm));
0513     m_buttons[button_forward]->setIcon(makeIcon(forward_xpm));
0514     m_buttons[button_stop]->setIcon(makeIcon(stop_xpm));
0515     m_buttons[button_pause]->setIcon(makeIcon(pause_xpm));
0516     m_buttons[button_record]->setIcon(makeIcon(record_xpm));
0517     m_buttons[button_broadcast]->setIcon(makeIcon(broadcast_xpm));
0518     m_buttons[button_language]->setIcon(makeIcon(language_xpm));
0519     m_buttons[button_red]->setIcon(makeIcon(red_xpm));
0520     m_buttons[button_green]->setIcon(makeIcon(green_xpm));
0521     m_buttons[button_yellow]->setIcon(makeIcon(yellow_xpm));
0522     m_buttons[button_blue]->setIcon(makeIcon(blue_xpm));
0523 }
0524 
0525 KDE_NO_EXPORT void ControlPanel::timerEvent (QTimerEvent * e) {
0526     if (e->timerId () == m_popup_timer) {
0527         m_popup_timer = 0;
0528         if (m_button_monitored == button_config) {
0529             if (m_buttons [button_config]->testAttribute(Qt::WA_UnderMouse) &&
0530                     !popupMenu->isVisible ())
0531                 showPopupMenu ();
0532         } else if (m_buttons [button_language]->testAttribute(Qt::WA_UnderMouse) &&
0533                     !languageMenu->isVisible ()) {
0534             showLanguageMenu ();
0535         }
0536     } else if (e->timerId () == m_popdown_timer) {
0537         m_popdown_timer = 0;
0538         QPoint mpos = QCursor::pos();
0539 #define HAS_MOUSE(menu) ((menu)->isVisible() && (menu)->rect().contains((menu)->mapFromGlobal(mpos)))
0540         if (popupMenu->isVisible () &&
0541                 !popupMenu->underMouse() &&
0542                 !HAS_MOUSE(playerMenu) &&
0543                 !HAS_MOUSE(zoomMenu) &&
0544                 !HAS_MOUSE(colorMenu) &&
0545                 !HAS_MOUSE(bookmarkMenu)) {
0546             if (!(bookmarkMenu->isVisible () &&
0547                         static_cast <QWidget *> (bookmarkMenu) != QWidget::keyboardGrabber ())) {
0548                 // not if user entered the bookmark sub menu or if I forgot one
0549                 popupMenu->hide ();
0550                 if (m_buttons [button_config]->isChecked ())
0551                     m_buttons [button_config]->toggle ();
0552             }
0553         } else if (languageMenu->isVisible () &&
0554                 !HAS_MOUSE(languageMenu) &&
0555                 !HAS_MOUSE(audioMenu) &&
0556                 !HAS_MOUSE(subtitleMenu)) {
0557             languageMenu->hide ();
0558             if (m_buttons [button_language]->isChecked ())
0559                 m_buttons [button_language]->toggle ();
0560         }
0561 #undef HAS_MOUSE
0562     }
0563     killTimer (e->timerId ());
0564 }
0565 
0566 void ControlPanel::setAutoControls (bool b) {
0567     m_auto_controls = b;
0568     if (m_auto_controls) {
0569         for (int i = 0; i < (int) button_broadcast; i++)
0570             m_buttons [i]->show ();
0571         for (int i = button_broadcast; i < (int) button_last; i++)
0572             m_buttons [i]->hide ();
0573         showPositionSlider (false);
0574         m_volume->show ();
0575         if (m_buttons [button_broadcast]->isChecked ()) // still broadcasting
0576             m_buttons [button_broadcast]->show ();
0577     } else { // hide everything
0578         for (int i = 0; i < (int) button_last; i++)
0579             m_buttons [i]->hide ();
0580         m_posSlider->hide ();
0581         m_volume->hide ();
0582     }
0583     m_view->updateLayout ();
0584 }
0585 
0586 KDE_NO_EXPORT void ControlPanel::showPopupMenu () {
0587     popupMenu->exec (m_buttons [button_config]->mapToGlobal (QPoint (0, maximumSize ().height ())));
0588 }
0589 
0590 KDE_NO_EXPORT void ControlPanel::showLanguageMenu () {
0591     languageMenu->exec (m_buttons [button_language]->mapToGlobal (QPoint (0, maximumSize ().height ())));
0592 }
0593 
0594 void ControlPanel::showPositionSlider (bool show) {
0595     if (!m_auto_controls || show == m_posSlider->isVisible ())
0596         return;
0597     setupPositionSlider (show);
0598     if (isVisible ())
0599         m_view->updateLayout ();
0600 }
0601 
0602 KDE_NO_EXPORT void ControlPanel::setupPositionSlider (bool show) {
0603     int h = show ? button_height_with_slider : button_height_only_buttons;
0604     m_posSlider->setEnabled (false);
0605     m_posSlider->setValue (0);
0606     m_posSlider->setVisible (show);
0607     for (int i = 0; i < (int) button_last; i++) {
0608         m_buttons[i]->setMinimumSize (15 * dpi_scale, (h-1) * dpi_scale);
0609         m_buttons[i]->setMaximumHeight(h * dpi_scale);
0610     }
0611     setMaximumHeight((h + 6) * dpi_scale);
0612 }
0613 
0614 KDE_NO_EXPORT int ControlPanel::preferredHeight () {
0615     return dpi_scale * (m_posSlider->isVisible () ?
0616             button_height_with_slider + 8 : button_height_only_buttons + 2);
0617 }
0618 
0619 void ControlPanel::enableSeekButtons (bool enable) {
0620     if (!m_auto_controls) return;
0621     if (enable) {
0622         m_buttons[button_back]->show ();
0623         m_buttons[button_forward]->show ();
0624     } else {
0625         m_buttons[button_back]->hide ();
0626         m_buttons[button_forward]->hide ();
0627     }
0628 }
0629 
0630 void ControlPanel::enableRecordButtons (bool enable) {
0631     if (!m_auto_controls) return;
0632     if (enable)
0633         m_buttons[button_record]->show ();
0634     else
0635         m_buttons[button_record]->hide ();
0636 }
0637 
0638 void ControlPanel::enableFullscreenButton(bool enable) {
0639     m_buttons[button_playlist]->setIcon(makeIcon(enable ? normal_window_xpm : playlist_xpm));
0640 }
0641 
0642 void ControlPanel::setPlaying (bool play) {
0643     if (play != m_buttons[button_play]->isChecked ())
0644         m_buttons[button_play]->toggle ();
0645     m_posSlider->setEnabled (false);
0646     m_posSlider->setValue (0);
0647     if (!play) {
0648         showPositionSlider (false);
0649         enableSeekButtons (true);
0650     }
0651 }
0652 
0653 KDE_NO_EXPORT void ControlPanel::setRecording (bool record) {
0654     if (record != m_buttons[button_record]->isChecked ())
0655         m_buttons[button_record]->toggle ();
0656 }
0657 
0658 KDE_NO_EXPORT void ControlPanel::setPlayingProgress (int pos, int len) {
0659     m_posSlider->setEnabled (false);
0660     m_progress_length = len;
0661     showPositionSlider (len > 0);
0662     if (m_progress_mode != progress_playing) {
0663         m_posSlider->setMaximum (m_progress_length);
0664         m_progress_mode = progress_playing;
0665     }
0666     if (pos < len && len > 0 && len != m_posSlider->maximum ())
0667         m_posSlider->setMaximum (m_progress_length);
0668     else if (m_progress_length <= 0 && pos > 7 * m_posSlider->maximum ()/8)
0669         m_posSlider->setMaximum (m_posSlider->maximum() * 2);
0670     else if (m_posSlider->maximum() < pos)
0671         m_posSlider->setMaximum (int (1.4 * m_posSlider->maximum()));
0672     m_posSlider->setValue (pos);
0673     m_posSlider->setEnabled (true);
0674 }
0675 
0676 KDE_NO_EXPORT void ControlPanel::setLoadingProgress (int pos) {
0677     if (pos > 0 && pos < 100 && !m_posSlider->isVisible ())
0678         showPositionSlider (true);
0679     else if (pos >= 100 && m_posSlider->isVisible ())
0680         showPositionSlider (false);
0681     m_posSlider->setEnabled (false);
0682     if (m_progress_mode != progress_loading) {
0683         m_posSlider->setMaximum (100);
0684         m_progress_mode = progress_loading;
0685     }
0686     m_posSlider->setValue (pos);
0687 }
0688 
0689 KDE_NO_EXPORT void ControlPanel::buttonClicked () {
0690     if (m_popup_timer) {
0691         killTimer (m_popup_timer);
0692         m_popup_timer = 0;
0693     }
0694     m_popup_clicked = true;
0695     if (sender () == m_buttons [button_language])
0696         showLanguageMenu ();
0697     else
0698         showPopupMenu ();
0699 }
0700 
0701 KDE_NO_EXPORT void ControlPanel::buttonMouseEntered () {
0702     if (!m_popup_timer) {
0703         if (sender () == m_buttons [button_config]) {
0704             if (!popupMenu->isVisible ()) {
0705                 m_button_monitored = button_config;
0706                 m_popup_clicked = false;
0707                 m_popup_timer = startTimer (400);
0708             }
0709         } else if (!languageMenu->isVisible ()) {
0710             m_button_monitored = button_language;
0711             m_popup_clicked = false;
0712             m_popup_timer = startTimer (400);
0713         }
0714     }
0715 }
0716 
0717 KDE_NO_EXPORT void ControlPanel::menuMouseLeft () {
0718     if (!m_popdown_timer && !m_popup_clicked)
0719         m_popdown_timer = startTimer (400);
0720 }
0721 
0722 KDE_NO_EXPORT void ControlPanel::setLanguages (const QStringList & alang, const QStringList & slang) {
0723     int sz = (int) alang.size ();
0724     bool showbutton = (sz > 0);
0725     audioMenu->clear ();
0726     for (int i = 0; i < sz; i++)
0727         audioMenu->addAction (alang [i])->setCheckable(true);
0728     sz = (int) slang.size ();
0729     showbutton |= (sz > 0);
0730     subtitleMenu->clear ();
0731     for (int i = 0; i < sz; i++)
0732         subtitleMenu->addAction (slang [i])->setCheckable(true);
0733     if (showbutton)
0734         m_buttons [button_language]->show ();
0735     else
0736         m_buttons [button_language]->hide ();
0737 }
0738 
0739 KDE_NO_EXPORT void ControlPanel::actionToggled (QAction* act) {
0740     if (act->isChecked ())
0741         return;
0742     int size = act->parentWidget()->actions().count();
0743     for (int i = 0; i < size; i++)
0744         if (act->parentWidget()->actions().at(i)->isChecked ()) {
0745             act->parentWidget()->actions().at(i)->setChecked (false);
0746             break;
0747         }
0748     act->setChecked (true);
0749 }
0750 
0751 //-----------------------------------------------------------------------------
0752 
0753 #include "kmplayercontrolpanel.moc"