diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2011-07-01 18:54:41 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2011-07-01 18:54:41 +0000 |
| commit | b8b7804fcc229e9c34e18dc3ec6dfafd2e3485b0 (patch) | |
| tree | 1a63bd6647225ae445adf01dceb8271632723a83 /src/plugins/Ui/skinned/mainwindow.cpp | |
| parent | bb31a704825263be94b5528a2e362898af109cf9 (diff) | |
| download | qmmp-b8b7804fcc229e9c34e18dc3ec6dfafd2e3485b0.tar.gz qmmp-b8b7804fcc229e9c34e18dc3ec6dfafd2e3485b0.tar.bz2 qmmp-b8b7804fcc229e9c34e18dc3ec6dfafd2e3485b0.zip | |
moved skinned ui to separate plugin
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@2252 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Ui/skinned/mainwindow.cpp')
| -rw-r--r-- | src/plugins/Ui/skinned/mainwindow.cpp | 616 |
1 files changed, 616 insertions, 0 deletions
diff --git a/src/plugins/Ui/skinned/mainwindow.cpp b/src/plugins/Ui/skinned/mainwindow.cpp new file mode 100644 index 000000000..fdbe51adb --- /dev/null +++ b/src/plugins/Ui/skinned/mainwindow.cpp @@ -0,0 +1,616 @@ +/*************************************************************************** + * Copyright (C) 2006-2011 by Ilya Kotov * + * forkotov02@hotmail.ru * + * * + * 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 <QtGui> +#include <QFileDialog> +#include <QDir> +#include <QAction> +#include <QMenu> +#include <math.h> +#include <qmmp/soundcore.h> +#include <qmmp/visual.h> +#include <qmmp/metadatamanager.h> +#include <qmmpui/generalhandler.h> +#include <qmmpui/general.h> +#include <qmmpui/playlistparser.h> +#include <qmmpui/playlistformat.h> +#include <qmmpui/commandlinemanager.h> +#include <qmmpui/filedialog.h> +#include <qmmpui/playlistmodel.h> +#include <qmmpui/playlistmanager.h> +#include <qmmpui/mediaplayer.h> +#include "mainwindow.h" +#include "skin.h" +#include "playlist.h" +#include "configdialog.h" +#include "dock.h" +#include "eqwidget.h" +#include "mainvisual.h" +#include "jumptotrackdialog.h" +#include "aboutdialog.h" +#include "addurldialog.h" +#include "listwidget.h" +#include "visualmenu.h" +#include "windowsystem.h" +#include "actionmanager.h" +//#include "builtincommandlineoption.h" + +#define KEY_OFFSET 10000 + +MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) +{ +#ifdef Q_WS_X11 + qDebug("MainWindow: detected wm: %s", qPrintable(WindowSystem::netWindowManagerName())); +#endif + m_vis = 0; + m_update = false; + setWindowIcon(QIcon(":/32x32/qmmp.png")); + setWindowFlags(Qt::Window | Qt::FramelessWindowHint | + Qt::WindowCloseButtonHint | Qt::WindowSystemMenuHint); + setWindowTitle("Qmmp"); + + new ActionManager(); + + //prepare libqmmp and libqmmpui libraries for playing + m_player = MediaPlayer::instance(); + m_core = SoundCore::instance(); + m_pl_manager = PlayListManager::instance(); + //additional featuries + //new PlaylistParser(this); + m_generalHandler = GeneralHandler::instance(); + + //user interface + m_skin = new Skin(this); + resize(275 * m_skin->ratio(),116 * m_skin->ratio()); + Dock *dock = new Dock(this); + dock->setMainWidget(this); + m_display = new MainDisplay(this); + setCentralWidget(m_display); + m_display->setFocus (); + + m_playlist = new PlayList(m_pl_manager, this); + dock->addWidget(m_playlist); + + m_equalizer = new EqWidget(this); + dock->addWidget(m_equalizer); + + m_jumpDialog = new JumpToTrackDialog(m_pl_manager, this); + m_jumpDialog->hide(); + + createActions(); + //prepare visualization + Visual::initialize(this, m_visMenu, SLOT(updateActions())); + m_vis = MainVisual::instance(); + Visual::add(m_vis); + //connections + connect (m_playlist,SIGNAL(next()),SLOT(next())); + connect (m_playlist,SIGNAL(prev()),SLOT(previous())); + connect (m_playlist,SIGNAL(play()),SLOT(play())); + connect (m_playlist,SIGNAL(pause()), m_core ,SLOT(pause())); + connect (m_playlist,SIGNAL(stop()),SLOT(stop())); + connect (m_playlist,SIGNAL(eject()),SLOT(addFile())); + connect (m_playlist,SIGNAL(loadPlaylist()),SLOT(loadPlaylist())); + connect (m_playlist,SIGNAL(savePlaylist()),SLOT(savePlaylist())); + + connect(m_display,SIGNAL(shuffleToggled(bool)),m_pl_manager,SLOT(setShuffle(bool))); + connect(m_display,SIGNAL(repeatableToggled(bool)),m_pl_manager,SLOT(setRepeatableList(bool))); + + connect(m_jumpDialog,SIGNAL(playRequest()), SLOT(replay())); + + connect(m_core, SIGNAL(stateChanged(Qmmp::State)), SLOT(showState(Qmmp::State))); + connect(m_core, SIGNAL(elapsedChanged(qint64)),m_playlist, SLOT(setTime(qint64))); + connect(m_core, SIGNAL(metaDataChanged()),SLOT(showMetaData())); + connect(m_generalHandler, SIGNAL(toggleVisibilityCalled()), SLOT(toggleVisibility())); + connect(m_generalHandler, SIGNAL(exitCalled()), SLOT(close())); + + readSettings(); + m_display->setEQ(m_equalizer); + m_display->setPL(m_playlist); + dock->updateDock(); + m_pl_manager->currentPlayList()->doCurrentVisibleRequest(); + if (m_startHidden && m_generalHandler->visibilityControl()) + toggleVisibility(); +} + +MainWindow::~MainWindow() +{} + +void MainWindow::play() +{ + m_player->play(); +} + +void MainWindow::replay() +{ + stop(); + m_pl_manager->activatePlayList(m_pl_manager->selectedPlayList()); + play(); +} + +void MainWindow::forward() +{ + m_core->seek(m_core->elapsed() + KEY_OFFSET); +} + +void MainWindow::backward() +{ + m_core->seek(qMax(qint64(0), m_core->elapsed() - KEY_OFFSET)); +} + +void MainWindow::setVolume(int volume, int balance) +{ + m_core->setVolume(volume-qMax(balance,0)*volume/100, + volume+qMin(balance,0)*volume/100); +} + +void MainWindow::pause(void) +{ + m_core->pause(); +} + +void MainWindow::stop() +{ + m_player->stop(); +} + +void MainWindow::next() +{ + m_player->next(); +} + +void MainWindow::previous() +{ + m_player->previous(); +} + +void MainWindow::showState(Qmmp::State state) +{ + disconnectPl(); + switch ((int) state) + { + case Qmmp::Playing: + if (m_pl_manager->currentPlayList()->currentItem()) + m_equalizer->loadPreset(m_pl_manager->currentPlayList()->currentItem()->url().section("/",-1)); + break; + case Qmmp::Paused: + break; + case Qmmp::Stopped: + m_playlist->setTime(-1); + if (m_playlist->currentItem()) + setWindowTitle(m_playlist->currentItem()->text()); + else + setWindowTitle("Qmmp"); + break; + } +} + +void MainWindow::showMetaData() +{ + if (m_playlist->currentItem() && + m_playlist->currentItem()->url() == m_core->metaData().value(Qmmp::URL)) + { + setWindowTitle(m_playlist->currentItem()->text()); + } +} + +void MainWindow::closeEvent (QCloseEvent *) +{ + writeSettings(); + m_playlist->close(); + m_equalizer->close(); + QApplication::quit (); +} + +void MainWindow::addDir() +{ + FileDialog::popup(this, FileDialog::AddDirs, &m_lastDir, + m_pl_manager->selectedPlayList(), SLOT(add(const QStringList&)), + tr("Choose a directory")); +} + +void MainWindow::addFile() +{ + QStringList filters; + filters << tr("All Supported Bitstreams")+" (" + + MetaDataManager::instance()->nameFilters().join (" ") +")"; + filters << MetaDataManager::instance()->filters(); + FileDialog::popup(this, FileDialog::AddDirsFiles, &m_lastDir, + m_pl_manager->selectedPlayList(), SLOT(add(const QStringList&)), + tr("Select one or more files to open"), filters.join(";;")); +} + +void MainWindow::changeEvent (QEvent * event) +{ + if (event->type() == QEvent::ActivationChange) + { + m_display->setActive(isActiveWindow()); + } +} + +void MainWindow::readSettings() +{ + QSettings settings(Qmmp::configFile(), QSettings::IniFormat); + if (!m_update) + { + settings.beginGroup("MainWindow"); + + move(settings.value("pos", QPoint(100, 100)).toPoint()); //geometry + + m_lastDir = settings.value("last_dir","/").toString(); //last directory + m_startHidden = settings.value("start_hidden", false).toBool(); + settings.endGroup(); + + if(settings.value("General/always_on_top", false).toBool()) + { + ACTION(ActionManager::WM_ALLWAYS_ON_TOP)->setChecked(true); + setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); + } + ACTION(ActionManager::WM_STICKY)->setChecked(settings.value("General/show_on_all_desktops", + false).toBool()); + show(); + qApp->processEvents(); + //visibility + m_playlist->setVisible(settings.value("Playlist/visible",true).toBool()); + qApp->processEvents(); + m_equalizer->setVisible(settings.value("Equalizer/visible",true).toBool()); + qApp->processEvents(); + bool val = settings.value("Playlist/repeatable",false).toBool(); + + // Repeat/Shuffle + m_pl_manager->setRepeatableList(val); + m_display->setIsRepeatable(val); + val = settings.value("Playlist/shuffle",false).toBool(); + m_display->setIsShuffle(val); + m_pl_manager->setShuffle(val); + + m_update = true; + } + else + { + if(ACTION(ActionManager::WM_ALLWAYS_ON_TOP)->isChecked()) + { + setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); + m_playlist->setWindowFlags(m_playlist->windowFlags() | Qt::WindowStaysOnTopHint); + m_equalizer->setWindowFlags(m_equalizer->windowFlags() | Qt::WindowStaysOnTopHint); + } + else + { + setWindowFlags(windowFlags() & ~Qt::WindowStaysOnTopHint); + m_playlist->setWindowFlags(m_playlist->windowFlags() & ~Qt::WindowStaysOnTopHint); + m_equalizer->setWindowFlags(m_equalizer->windowFlags() & ~Qt::WindowStaysOnTopHint); + } + show(); + qApp->processEvents(); + m_playlist->setVisible(m_display->isPlaylistVisible()); + m_equalizer->setVisible(m_display->isEqualizerVisible()); + } +#ifdef Q_WS_X11 + WindowSystem::changeWinSticky(winId(), ACTION(ActionManager::WM_STICKY)->isChecked()); + WindowSystem::setWinHint(winId(), "player", "Qmmp"); +#endif + //Call setWindowOpacity only if needed + double opacity = settings.value("MainWindow/opacity", 1.0).toDouble(); + if(opacity != windowOpacity ()) + setWindowOpacity(opacity); + + opacity = settings.value("Equalizer/opacity", 1.0).toDouble(); + if(opacity != m_equalizer->windowOpacity ()) + m_equalizer->setWindowOpacity(opacity); + + opacity = settings.value("PlayList/opacity", 1.0).toDouble(); + if(opacity != m_playlist->windowOpacity ()) + m_playlist->setWindowOpacity(opacity); + + m_hideOnClose = settings.value("MainWindow/hide_on_close", false).toBool(); +} + +void MainWindow::writeSettings() +{ + QSettings settings(Qmmp::configFile(), QSettings::IniFormat); + settings.beginGroup("MainWindow"); + //geometry + settings.setValue("pos", this->pos()); + //last directory + settings.setValue("last_dir",m_lastDir); + settings.endGroup(); + // Repeat/Shuffle + settings.beginGroup("Playlist"); + settings.setValue("repeatable",m_display->isRepeatable()); + settings.setValue("shuffle",m_display->isShuffle()); + settings.endGroup(); + // playback state + settings.beginGroup("General"); + settings.setValue("resume_playback", m_core->state() == Qmmp::Playing && + settings.value("resume_on_startup", false).toBool()); + settings.setValue("resume_playback_time", m_core->totalTime() > 0 ? m_core->elapsed() : 0); + settings.setValue("double_size", ACTION(ActionManager::WM_DOUBLE_SIZE)->isChecked()); + settings.setValue("always_on_top", ACTION(ActionManager::WM_ALLWAYS_ON_TOP)->isChecked()); + settings.setValue("show_on_all_desktops", ACTION(ActionManager::WM_STICKY)->isChecked()); + settings.endGroup(); +} + +void MainWindow::showSettings() +{ + ConfigDialog *confDialog = new ConfigDialog(this); + confDialog->exec(); + updateSettings(); + confDialog->deleteLater(); + ActionManager::instance()->saveActions(); +} + +void MainWindow::toggleVisibility() +{ + if (isHidden()) + { + show(); + raise(); + activateWindow(); + m_playlist->setVisible(m_display->isPlaylistVisible()); + m_equalizer->setVisible(m_display->isEqualizerVisible()); +#ifdef Q_WS_X11 + if(WindowSystem::netWindowManagerName() == "Metacity") + { + m_playlist->activateWindow(); + m_equalizer->activateWindow(); + } +#endif + qApp->processEvents(); + setFocus (); + if (isMinimized()) + { + if (isMaximized()) + showMaximized(); + else + showNormal(); + } +#ifdef Q_WS_X11 + WindowSystem::changeWinSticky(winId(), ACTION(ActionManager::WM_STICKY)->isChecked()); + WindowSystem::setWinHint(winId(), "player", "Qmmp"); + raise(); +#endif + } + else + { + if (m_playlist->isVisible()) + m_playlist->hide(); + if (m_equalizer->isVisible()) + m_equalizer->hide(); + hide(); + } + qApp->processEvents(); +} + +void MainWindow::createActions() +{ + m_mainMenu = new QMenu(this); + m_mainMenu->addAction(SET_ACTION(ActionManager::PLAY, this, SLOT(play()))); + m_mainMenu->addAction(SET_ACTION(ActionManager::PAUSE, this, SLOT(pause()))); + m_mainMenu->addAction(SET_ACTION(ActionManager::STOP, this, SLOT(stop()))); + m_mainMenu->addAction(SET_ACTION(ActionManager::PREVIOUS, this, SLOT(previous()))); + m_mainMenu->addAction(SET_ACTION(ActionManager::NEXT, this, SLOT(next()))); + m_mainMenu->addAction(SET_ACTION(ActionManager::PLAY_PAUSE, this, SLOT(playPause()))); + m_mainMenu->addSeparator(); + m_mainMenu->addAction(QIcon::fromTheme("go-up"), tr("&Jump To File"), + this, SLOT(jumpToFile()), tr("J")); + m_mainMenu->addSeparator(); + QMenu *viewMenu = m_mainMenu->addMenu(tr("View")); + viewMenu->addAction(ACTION(ActionManager::SHOW_PLAYLIST)); + viewMenu->addAction(ACTION(ActionManager::SHOW_EQUALIZER)); + viewMenu->addSeparator(); + viewMenu->addAction(SET_ACTION(ActionManager::WM_ALLWAYS_ON_TOP, this, SLOT(updateSettings()))); + viewMenu->addAction(SET_ACTION(ActionManager::WM_STICKY, this, SLOT(updateSettings()))); + viewMenu->addAction(SET_ACTION(ActionManager::WM_DOUBLE_SIZE, this, SLOT(updateSettings()))); + + QMenu *plMenu = m_mainMenu->addMenu(tr("Playlist")); + plMenu->addAction(SET_ACTION(ActionManager::REPEAT_ALL, m_pl_manager, SLOT(setRepeatableList(bool)))); + plMenu->addAction(SET_ACTION(ActionManager::REPEAT_TRACK, m_player, SLOT(setRepeatable(bool)))); + plMenu->addAction(SET_ACTION(ActionManager::SHUFFLE, m_pl_manager, SLOT(setShuffle(bool)))); + plMenu->addAction(SET_ACTION(ActionManager::NO_PL_ADVANCE, m_player, + SLOT(setNoPlaylistAdvance(bool)))); + plMenu->addAction(SET_ACTION(ActionManager::STOP_AFTER_SELECTED, m_pl_manager, + SLOT(stopAfterSelected()))); + plMenu->addAction(SET_ACTION(ActionManager::CLEAR_QUEUE, m_pl_manager, SLOT(clearQueue()))); + connect(m_pl_manager, SIGNAL(repeatableListChanged(bool)), + ACTION(ActionManager::REPEAT_ALL), SLOT(setChecked(bool))); + connect(m_player, SIGNAL (repeatableChanged(bool)), + ACTION(ActionManager::REPEAT_TRACK), SLOT(setChecked(bool))); + connect(m_player, SIGNAL (noPlaylistAdvanceChanged(bool)), + ACTION(ActionManager::NO_PL_ADVANCE), SLOT(setChecked(bool))); + connect(m_pl_manager, SIGNAL(shuffleChanged(bool)), + ACTION(ActionManager::SHUFFLE), SLOT(setChecked(bool))); + + m_visMenu = new VisualMenu(this); + m_mainMenu->addMenu(m_visMenu); + m_mainMenu->addMenu(m_generalHandler->createMenu(GeneralHandler::TOOLS_MENU, tr("Tools"), this)); + m_mainMenu->addSeparator(); + m_mainMenu->addAction(SET_ACTION(ActionManager::SETTINGS, this, SLOT(showSettings()))); + m_mainMenu->addSeparator(); + m_mainMenu->addAction(SET_ACTION(ActionManager::ABOUT, this, SLOT(about()))); + m_mainMenu->addAction(SET_ACTION(ActionManager::ABOUT_QT, qApp, SLOT(aboutQt()))); + m_mainMenu->addSeparator(); + m_mainMenu->addAction(SET_ACTION(ActionManager::QUIT, this, SLOT(close()))); + + QAction* forward = new QAction(this); + forward->setShortcut(QKeySequence(Qt::Key_Right)); + connect(forward,SIGNAL(triggered(bool)),this,SLOT(forward())); + QAction* backward = new QAction(this); + backward->setShortcut(QKeySequence(Qt::Key_Left)); + connect(backward,SIGNAL(triggered(bool)),this,SLOT(backward())); + + Dock::instance()->addActions(QList<QAction*>() << forward << backward); + Dock::instance()->addActions(m_mainMenu->actions()); +} + + +void MainWindow::about() +{ + AboutDialog dlg(this); + dlg.exec(); +} + +void MainWindow::updateSettings() +{ + readSettings(); + m_playlist->readSettings(); + m_visMenu->updateActions(); + m_skin->reloadSkin(); + Dock::instance()->updateDock(); +} + +QMenu* MainWindow::menu() +{ + return m_mainMenu; +} + +void MainWindow::loadPlaylist() +{ + QStringList l; + QList<PlaylistFormat*> p_list = PlaylistParser::instance()->formats(); + if (!p_list.isEmpty()) + { + foreach(PlaylistFormat* fmt,p_list) + l << fmt->getExtensions(); + + QString mask = tr("Playlist Files")+" (" + l.join(" *.").prepend("*.") + ")"; + //TODO use nonmodal dialog and multiplier playlists + QString f_name = FileDialog::getOpenFileName(this,tr("Open Playlist"),m_lastDir,mask); + if (!f_name.isEmpty()) + { + m_pl_manager->selectedPlayList()->clear(); + m_pl_manager->selectedPlayList()->loadPlaylist(f_name); + m_pl_manager->selectedPlayList()->setName(QFileInfo(f_name).baseName()); + m_lastDir = QFileInfo(f_name).absoluteDir().path(); + } + } + else + { + qWarning("Error: There is no registered playlist parsers"); + } +} + +void MainWindow::savePlaylist() +{ + QStringList l; + QList<PlaylistFormat*> p_list = PlaylistParser::instance()->formats(); + if (!p_list.isEmpty()) + { + foreach(PlaylistFormat* fmt,p_list) + l << fmt->getExtensions(); + + QString mask = tr("Playlist Files")+" (" + l.join(" *.").prepend("*.") + ")"; + QString f_name = FileDialog::getSaveFileName(this, tr("Save Playlist"),m_lastDir + "/" + + m_pl_manager->selectedPlayList()->name() + "." + l[0],mask); + + if (!f_name.isEmpty()) + { + m_pl_manager->selectedPlayList()->savePlaylist(f_name); + m_lastDir = QFileInfo(f_name).absoluteDir().path(); + } + } + else + qWarning("Error: There is no registered playlist parsers"); +} + +void MainWindow::setFileList(const QStringList &l, bool clear) +{ + m_pl_manager->activatePlayList(m_pl_manager->selectedPlayList()); + if(!clear) + { + m_pl_manager->selectedPlayList()->add(l); + return; + } + if (m_core->state() != Qmmp::Stopped) + { + stop(); + qApp->processEvents(); //receive stop signal + } + m_model = m_pl_manager->selectedPlayList(); + m_model->clear(); + connect(m_model, SIGNAL(itemAdded(PlayListItem*)), SLOT(play())); + connect(m_model, SIGNAL(loaderFinished()), SLOT(disconnectPl())); + m_model->add(l); +} + +void MainWindow::playPause() +{ + if (m_core->state() == Qmmp::Playing) + m_core->pause(); + else + play(); +} + +void MainWindow::jumpToFile() +{ + if (m_jumpDialog->isHidden()) + { + m_jumpDialog->show(); + m_jumpDialog->refresh(); + } +} + +void MainWindow::handleCloseRequest() +{ + if (m_hideOnClose && m_generalHandler->visibilityControl()) + toggleVisibility(); + else + QApplication::closeAllWindows(); +} + +void MainWindow::disconnectPl() +{ + if(m_model) + { + disconnect(m_model, SIGNAL(itemAdded(PlayListItem*)), this, SLOT(play())); + disconnect(m_model, SIGNAL(loaderFinished()), this, SLOT(disconnectPl())); + m_model = 0; + } +} + +void MainWindow::addUrl() +{ + AddUrlDialog::popup(this, m_pl_manager->selectedPlayList()); +} + +SoundCore * MainWindow::soundCore() const +{ + return m_core; +} + +MainDisplay * MainWindow::mainDisplay() const +{ + return m_display; +} + +void MainWindow::keyPressEvent(QKeyEvent *ke) +{ + QKeyEvent event = QKeyEvent(ke->type(), ke->key(), + ke->modifiers(), ke->text(),ke->isAutoRepeat(), ke->count()); + QApplication::sendEvent(m_playlist,&event); +} + +void MainWindow::resume() +{ + QSettings settings(Qmmp::configFile(), QSettings::IniFormat); + settings.beginGroup("General"); + if(settings.value("resume_playback", false).toBool()) + { + qint64 pos = settings.value("resume_playback_time").toLongLong(); + m_player->play(pos); + } +} |
