diff options
author | Maia Kozheva <sikon@ubuntu.com> | 2009-11-20 18:22:19 +0600 |
---|---|---|
committer | Maia Kozheva <sikon@ubuntu.com> | 2009-11-20 18:22:19 +0600 |
commit | 263b32f108c15cd1c55a8f4eb4704fac6553f1ac (patch) | |
tree | 1c49e7848aa2d3d64a9d9b96b8852cb1884da2f7 /src/baseguiplus.cpp |
Imported Upstream version 0.6.8
Diffstat (limited to 'src/baseguiplus.cpp')
-rw-r--r-- | src/baseguiplus.cpp | 609 |
1 files changed, 609 insertions, 0 deletions
diff --git a/src/baseguiplus.cpp b/src/baseguiplus.cpp new file mode 100644 index 0000000..ae856b7 --- /dev/null +++ b/src/baseguiplus.cpp @@ -0,0 +1,609 @@ +/* smplayer, GUI front-end for mplayer. + Copyright (C) 2006-2009 Ricardo Villalba <rvm@escomposlinux.org> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include "baseguiplus.h" +#include "config.h" +#include "myaction.h" +#include "global.h" +#include "images.h" +#include "playlist.h" + +#ifndef Q_OS_WIN +#include "tvlist.h" +#endif + +#include "widgetactions.h" + +#include <QMenu> +#include <QCloseEvent> +#include <QApplication> +#include <QDesktopWidget> + +#if DOCK_PLAYLIST +#include <QDockWidget> +#include "playlistdock.h" +#include "desktopinfo.h" + +#define PLAYLIST_ON_SIDES 1 +#endif + +using namespace Global; + +BaseGuiPlus::BaseGuiPlus( QWidget * parent, Qt::WindowFlags flags ) + : BaseGui( parent, flags ) +{ + // Initialize variables + mainwindow_visible = true; + //infowindow_visible = false; + trayicon_playlist_was_visible = false; + widgets_size = 0; +#if DOCK_PLAYLIST + fullscreen_playlist_was_visible = false; + fullscreen_playlist_was_floating = false; + compact_playlist_was_visible = false; + ignore_playlist_events = false; +#endif + + + mainwindow_pos = pos(); + + tray = new QSystemTrayIcon( Images::icon("logo", 22), this ); + + tray->setToolTip( "SMPlayer" ); + connect( tray, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), + this, SLOT(trayIconActivated(QSystemTrayIcon::ActivationReason))); + + quitAct = new MyAction(this, "quit"); + connect( quitAct, SIGNAL(triggered()), this, SLOT(quit()) ); + openMenu->addAction(quitAct); + + showTrayAct = new MyAction(this, "show_tray_icon" ); + showTrayAct->setCheckable(true); + connect( showTrayAct, SIGNAL(toggled(bool)), + tray, SLOT(setVisible(bool)) ); + optionsMenu->addAction(showTrayAct); + + showAllAct = new MyAction(this, "restore/hide"); + connect( showAllAct, SIGNAL(triggered()), + this, SLOT(toggleShowAll()) ); + + + context_menu = new QMenu(this); + context_menu->addAction(showAllAct); + context_menu->addSeparator(); + context_menu->addAction(openFileAct); + context_menu->addMenu(recentfiles_menu); + context_menu->addAction(openDirectoryAct); + context_menu->addAction(openDVDAct); + context_menu->addAction(openURLAct); +#ifndef Q_OS_WIN + context_menu->addMenu(tvlist->menu()); + context_menu->addMenu(radiolist->menu()); +#endif + context_menu->addSeparator(); + context_menu->addAction(playOrPauseAct); + context_menu->addAction(stopAct); + context_menu->addSeparator(); + context_menu->addAction(playPrevAct); + context_menu->addAction(playNextAct); + context_menu->addSeparator(); + context_menu->addAction(showPlaylistAct); + context_menu->addAction(showPreferencesAct); + context_menu->addSeparator(); + context_menu->addAction(quitAct); + + tray->setContextMenu( context_menu ); + +#if DOCK_PLAYLIST + // Playlistdock + playlistdock = new PlaylistDock(this); + playlistdock->setObjectName("playlistdock"); + playlistdock->setFloating(false); // To avoid that the playlist is visible for a moment + playlistdock->setWidget(playlist); + playlistdock->setAllowedAreas(Qt::TopDockWidgetArea | + Qt::BottomDockWidgetArea +#if PLAYLIST_ON_SIDES + | Qt::LeftDockWidgetArea | + Qt::RightDockWidgetArea +#endif + ); + addDockWidget(Qt::BottomDockWidgetArea, playlistdock); + playlistdock->hide(); + playlistdock->setFloating(true); // Floating by default + + connect( playlistdock, SIGNAL(closed()), this, SLOT(playlistClosed()) ); +#if USE_DOCK_TOPLEVEL_EVENT + connect( playlistdock, SIGNAL(topLevelChanged(bool)), + this, SLOT(dockTopLevelChanged(bool)) ); +#else + connect( playlistdock, SIGNAL(visibilityChanged(bool)), + this, SLOT(dockVisibilityChanged(bool)) ); +#endif // USE_DOCK_TOPLEVEL_EVENT + + ignore_playlist_events = false; +#endif // DOCK_PLAYLIST + + retranslateStrings(); + + loadConfig(); +} + +BaseGuiPlus::~BaseGuiPlus() { + saveConfig(); +} + +bool BaseGuiPlus::startHidden() { +#ifdef Q_OS_WIN + return false; +#else + if ( (!showTrayAct->isChecked()) || (mainwindow_visible) ) + return false; + else + return true; +#endif +} + +void BaseGuiPlus::closeEvent( QCloseEvent * e ) { + qDebug("BaseGuiPlus::closeEvent"); + e->ignore(); + closeWindow(); +} + +void BaseGuiPlus::closeWindow() { + qDebug("BaseGuiPlus::closeWindow"); + + if (tray->isVisible()) { + //e->ignore(); + exitFullscreen(); + showAll(false); // Hide windows + if (core->state() == Core::Playing) core->stop(); + + if (pref->balloon_count > 0) { + tray->showMessage( "SMPlayer", + tr("SMPlayer is still running here"), + QSystemTrayIcon::Information, 3000 ); + pref->balloon_count--; + } + + } else { + BaseGui::closeWindow(); + } + //tray->hide(); + +} + +void BaseGuiPlus::quit() { + qDebug("BaseGuiPlus::quit"); + BaseGui::closeWindow(); +} + +void BaseGuiPlus::retranslateStrings() { + BaseGui::retranslateStrings(); + + quitAct->change( Images::icon("exit"), tr("&Quit") ); + showTrayAct->change( Images::icon("systray"), tr("S&how icon in system tray") ); + + updateShowAllAct(); + +#if DOCK_PLAYLIST + playlistdock->setWindowTitle( tr("Playlist") ); +#endif +} + +void BaseGuiPlus::updateShowAllAct() { + if (isVisible()) + showAllAct->change( tr("&Hide") ); + else + showAllAct->change( tr("&Restore") ); +} + +void BaseGuiPlus::saveConfig() { + qDebug("BaseGuiPlus::saveConfig"); + + QSettings * set = settings; + + set->beginGroup( "base_gui_plus"); + + set->setValue( "show_tray_icon", showTrayAct->isChecked() ); + set->setValue( "mainwindow_visible", isVisible() ); + + set->setValue( "trayicon_playlist_was_visible", trayicon_playlist_was_visible ); + set->setValue( "widgets_size", widgets_size ); +#if DOCK_PLAYLIST + set->setValue( "fullscreen_playlist_was_visible", fullscreen_playlist_was_visible ); + set->setValue( "fullscreen_playlist_was_floating", fullscreen_playlist_was_floating ); + set->setValue( "compact_playlist_was_visible", compact_playlist_was_visible ); + set->setValue( "ignore_playlist_events", ignore_playlist_events ); +#endif + +/* +#if DOCK_PLAYLIST + set->setValue( "playlist_and_toolbars_state", saveState() ); +#endif +*/ + + set->endGroup(); +} + +void BaseGuiPlus::loadConfig() { + qDebug("BaseGuiPlus::loadConfig"); + + QSettings * set = settings; + + set->beginGroup( "base_gui_plus"); + + bool show_tray_icon = set->value( "show_tray_icon", false).toBool(); + showTrayAct->setChecked( show_tray_icon ); + //tray->setVisible( show_tray_icon ); + + mainwindow_visible = set->value("mainwindow_visible", true).toBool(); + + trayicon_playlist_was_visible = set->value( "trayicon_playlist_was_visible", trayicon_playlist_was_visible ).toBool(); + widgets_size = set->value( "widgets_size", widgets_size ).toInt(); +#if DOCK_PLAYLIST + fullscreen_playlist_was_visible = set->value( "fullscreen_playlist_was_visible", fullscreen_playlist_was_visible ).toBool(); + fullscreen_playlist_was_floating = set->value( "fullscreen_playlist_was_floating", fullscreen_playlist_was_floating ).toBool(); + compact_playlist_was_visible = set->value( "compact_playlist_was_visible", compact_playlist_was_visible ).toBool(); + ignore_playlist_events = set->value( "ignore_playlist_events", ignore_playlist_events ).toBool(); +#endif + +/* +#if DOCK_PLAYLIST + restoreState( set->value( "playlist_and_toolbars_state" ).toByteArray() ); +#endif +*/ + + set->endGroup(); + + updateShowAllAct(); +} + + +void BaseGuiPlus::trayIconActivated(QSystemTrayIcon::ActivationReason reason) { + qDebug("DefaultGui::trayIconActivated: %d", reason); + + updateShowAllAct(); + + if (reason == QSystemTrayIcon::Trigger) { + toggleShowAll(); + } + else + if (reason == QSystemTrayIcon::MiddleClick) { + core->pause(); + } +} + +void BaseGuiPlus::toggleShowAll() { + // Ignore if tray is not visible + if (tray->isVisible()) { + showAll( !isVisible() ); + } +} + +void BaseGuiPlus::showAll(bool b) { + if (!b) { + // Hide all +#if DOCK_PLAYLIST + trayicon_playlist_was_visible = (playlistdock->isVisible() && + playlistdock->isFloating() ); + if (trayicon_playlist_was_visible) + playlistdock->hide(); + + /* + trayicon_playlist_was_visible = playlistdock->isVisible(); + playlistdock->hide(); + */ +#else + trayicon_playlist_was_visible = playlist->isVisible(); + playlist_pos = playlist->pos(); + playlist->hide(); +#endif + + mainwindow_pos = pos(); + hide(); + + /* + infowindow_visible = info_window->isVisible(); + infowindow_pos = info_window->pos(); + info_window->hide(); + */ + } else { + // Show all + move(mainwindow_pos); + show(); + +#if DOCK_PLAYLIST + if (trayicon_playlist_was_visible) { + playlistdock->show(); + } +#else + if (trayicon_playlist_was_visible) { + playlist->move(playlist_pos); + playlist->show(); + } +#endif + + /* + if (infowindow_visible) { + info_window->show(); + info_window->move(infowindow_pos); + } + */ + } + updateShowAllAct(); +} + +void BaseGuiPlus::resizeWindow(int w, int h) { + qDebug("BaseGuiPlus::resizeWindow: %d, %d", w, h); + + if ( (tray->isVisible()) && (!isVisible()) ) showAll(true); + + BaseGui::resizeWindow(w, h ); +} + +void BaseGuiPlus::updateMediaInfo() { + qDebug("BaseGuiPlus::updateMediaInfo"); + BaseGui::updateMediaInfo(); + + tray->setToolTip( windowTitle() ); +} + +void BaseGuiPlus::setWindowCaption(const QString & title) { + tray->setToolTip( title ); + + BaseGui::setWindowCaption( title ); +} + + +// Playlist stuff +void BaseGuiPlus::aboutToEnterFullscreen() { + qDebug("BaseGuiPlus::aboutToEnterFullscreen"); + + BaseGui::aboutToEnterFullscreen(); + +#if DOCK_PLAYLIST + playlistdock->setAllowedAreas(Qt::NoDockWidgetArea); + + int playlist_screen = QApplication::desktop()->screenNumber(playlistdock); + int mainwindow_screen = QApplication::desktop()->screenNumber(this); + qDebug("BaseGuiPlus::aboutToEnterFullscreen: mainwindow screen: %d, playlist screen: %d", mainwindow_screen, playlist_screen); + + fullscreen_playlist_was_visible = playlistdock->isVisible(); + fullscreen_playlist_was_floating = playlistdock->isFloating(); + + ignore_playlist_events = true; + + // Hide the playlist if it's in the same screen as the main window + if ((playlist_screen == mainwindow_screen) /* || + (!fullscreen_playlist_was_floating) */ ) + { + playlistdock->setFloating(true); + playlistdock->hide(); + } +#endif +} + +void BaseGuiPlus::aboutToExitFullscreen() { + qDebug("BaseGuiPlus::aboutToExitFullscreen"); + + BaseGui::aboutToExitFullscreen(); + +#if DOCK_PLAYLIST + playlistdock->setAllowedAreas(Qt::TopDockWidgetArea | + Qt::BottomDockWidgetArea + #if PLAYLIST_ON_SIDES + | Qt::LeftDockWidgetArea | + Qt::RightDockWidgetArea + #endif + ); + + if (fullscreen_playlist_was_visible) { + playlistdock->show(); + } + playlistdock->setFloating( fullscreen_playlist_was_floating ); + ignore_playlist_events = false; +#endif +} + +void BaseGuiPlus::aboutToEnterCompactMode() { +#if DOCK_PLAYLIST + compact_playlist_was_visible = (playlistdock->isVisible() && + !playlistdock->isFloating()); + if (compact_playlist_was_visible) + playlistdock->hide(); +#endif + + widgets_size = height() - panel->height(); + qDebug("BaseGuiPlus::aboutToEnterCompactMode: widgets_size: %d", widgets_size); + + BaseGui::aboutToEnterCompactMode(); + + if (pref->resize_method == Preferences::Always) { + resize( width(), height() - widgets_size ); + } +} + +void BaseGuiPlus::aboutToExitCompactMode() { + BaseGui::aboutToExitCompactMode(); + + if (pref->resize_method == Preferences::Always) { + resize( width(), height() + widgets_size ); + } + +#if DOCK_PLAYLIST + if (compact_playlist_was_visible) + playlistdock->show(); +#endif +} + +#if DOCK_PLAYLIST +void BaseGuiPlus::showPlaylist(bool b) { + qDebug("BaseGuiPlus::showPlaylist: %d", b); + qDebug("BaseGuiPlus::showPlaylist (before): playlist visible: %d", playlistdock->isVisible()); + qDebug("BaseGuiPlus::showPlaylist (before): playlist position: %d, %d", playlistdock->pos().x(), playlistdock->pos().y()); + qDebug("BaseGuiPlus::showPlaylist (before): playlist size: %d x %d", playlistdock->size().width(), playlistdock->size().height()); + + if ( !b ) { + playlistdock->hide(); + } else { + exitFullscreenIfNeeded(); + playlistdock->show(); + + // Check if playlist is outside of the screen + if (playlistdock->isFloating()) { + if (!DesktopInfo::isInsideScreen(playlistdock)) { + qWarning("BaseGuiPlus::showPlaylist: playlist is outside of the screen"); + playlistdock->move(0,0); + } + } + } + //updateWidgets(); + + qDebug("BaseGuiPlus::showPlaylist (after): playlist visible: %d", playlistdock->isVisible()); + qDebug("BaseGuiPlus::showPlaylist (after): playlist position: %d, %d", playlistdock->pos().x(), playlistdock->pos().y()); + qDebug("BaseGuiPlus::showPlaylist (after): playlist size: %d x %d", playlistdock->size().width(), playlistdock->size().height()); + +} + +void BaseGuiPlus::playlistClosed() { + showPlaylistAct->setChecked(false); +} + +#if !USE_DOCK_TOPLEVEL_EVENT +void BaseGuiPlus::dockVisibilityChanged(bool visible) { + qDebug("BaseGuiPlus::dockVisibilityChanged: %d", visible); + + if (!playlistdock->isFloating()) { + if (!visible) shrinkWindow(); else stretchWindow(); + } +} + +#else + +void BaseGuiPlus::dockTopLevelChanged(bool floating) { + qDebug("BaseGuiPlus::dockTopLevelChanged: %d", floating); + + if (floating) shrinkWindow(); else stretchWindow(); +} +#endif + +void BaseGuiPlus::stretchWindow() { + qDebug("BaseGuiPlus::stretchWindow"); + if ((ignore_playlist_events) || (pref->resize_method!=Preferences::Always)) return; + + qDebug("BaseGuiPlus::stretchWindow: dockWidgetArea: %d", (int) dockWidgetArea(playlistdock) ); + + if ( (dockWidgetArea(playlistdock) == Qt::TopDockWidgetArea) || + (dockWidgetArea(playlistdock) == Qt::BottomDockWidgetArea) ) + { + int new_height = height() + playlistdock->height(); + + //if (new_height > DesktopInfo::desktop_size(this).height()) + // new_height = DesktopInfo::desktop_size(this).height() - 20; + + qDebug("BaseGuiPlus::stretchWindow: stretching: new height: %d", new_height); + resize( width(), new_height ); + + //resizeWindow(core->mset.win_width, core->mset.win_height); + } + + else + + if ( (dockWidgetArea(playlistdock) == Qt::LeftDockWidgetArea) || + (dockWidgetArea(playlistdock) == Qt::RightDockWidgetArea) ) + { + int new_width = width() + playlistdock->width(); + + qDebug("BaseGuiPlus::stretchWindow: stretching: new width: %d", new_width); + resize( new_width, height() ); + } +} + +void BaseGuiPlus::shrinkWindow() { + qDebug("BaseGuiPlus::shrinkWindow"); + if ((ignore_playlist_events) || (pref->resize_method!=Preferences::Always)) return; + + qDebug("BaseGuiPlus::shrinkWindow: dockWidgetArea: %d", (int) dockWidgetArea(playlistdock) ); + + if ( (dockWidgetArea(playlistdock) == Qt::TopDockWidgetArea) || + (dockWidgetArea(playlistdock) == Qt::BottomDockWidgetArea) ) + { + int new_height = height() - playlistdock->height(); + qDebug("DefaultGui::shrinkWindow: shrinking: new height: %d", new_height); + resize( width(), new_height ); + + //resizeWindow(core->mset.win_width, core->mset.win_height); + } + + else + + if ( (dockWidgetArea(playlistdock) == Qt::LeftDockWidgetArea) || + (dockWidgetArea(playlistdock) == Qt::RightDockWidgetArea) ) + { + int new_width = width() - playlistdock->width(); + + qDebug("BaseGuiPlus::shrinkWindow: shrinking: new width: %d", new_width); + resize( new_width, height() ); + } +} + +#endif + +// Convenience functions intended for other GUI's +TimeSliderAction * BaseGuiPlus::createTimeSliderAction(QWidget * parent) { + TimeSliderAction * timeslider_action = new TimeSliderAction( parent ); + timeslider_action->setObjectName("timeslider_action"); + +#ifdef SEEKBAR_RESOLUTION + connect( timeslider_action, SIGNAL( posChanged(int) ), + core, SLOT(goToPosition(int)) ); + connect( core, SIGNAL(positionChanged(int)), + timeslider_action, SLOT(setPos(int)) ); +#else + connect( timeslider_action, SIGNAL( posChanged(int) ), + core, SLOT(goToPos(int)) ); + connect( core, SIGNAL(posChanged(int)), + timeslider_action, SLOT(setPos(int)) ); +#endif + connect( timeslider_action, SIGNAL( draggingPos(int) ), + this, SLOT(displayGotoTime(int)) ); +#if ENABLE_DELAYED_DRAGGING + timeslider_action->setDragDelay( pref->time_slider_drag_delay ); + + connect( timeslider_action, SIGNAL( delayedDraggingPos(int) ), + this, SLOT(goToPosOnDragging(int)) ); +#else + connect( timeslider_action, SIGNAL( draggingPos(int) ), + this, SLOT(goToPosOnDragging(int)) ); +#endif + return timeslider_action; +} + +VolumeSliderAction * BaseGuiPlus::createVolumeSliderAction(QWidget * parent) { + VolumeSliderAction * volumeslider_action = new VolumeSliderAction(parent); + volumeslider_action->setObjectName("volumeslider_action"); + + connect( volumeslider_action, SIGNAL( valueChanged(int) ), + core, SLOT( setVolume(int) ) ); + connect( core, SIGNAL(volumeChanged(int)), + volumeslider_action, SLOT(setValue(int)) ); + + return volumeslider_action; +} + +#include "moc_baseguiplus.cpp" |