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"