/***************************************************************************
* Copyright (C) 2006-2012 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 <QPainter>
#include <QResizeEvent>
#include <QSettings>
#include <QMenu>
#include <QAction>
#include <QSignalMapper>
#include <QHBoxLayout>
#include <QCloseEvent>
#include <qmmpui/playlistitem.h>
#include <qmmpui/playlistmodel.h>
#include <qmmpui/playlistmanager.h>
#include <qmmpui/uihelper.h>
#include <qmmp/soundcore.h>
#include "dock.h"
#include "skin.h"
#include "listwidget.h"
#include "button.h"
#include "playlisttitlebar.h"
#include "playlistslider.h"
#include "pixmapwidget.h"
#include "symboldisplay.h"
#include "playlistcontrol.h"
#include "keyboardmanager.h"
#include "playlistbrowser.h"
#include "playlistselector.h"
#include "windowsystem.h"
#include "actionmanager.h"
#include "playlist.h"
PlayList::PlayList (PlayListManager *manager, QWidget *parent)
: QWidget (parent)
{
setAttribute(Qt::WA_AlwaysShowToolTips,true);
setWindowTitle(tr("Playlist"));
m_pl_manager = manager;
m_update = false;
m_resize = false;
m_skin = Skin::instance();
m_ratio = m_skin->ratio();
m_shaded = false;
m_pl_browser = 0;
m_pl_selector = 0;
resize (275*m_ratio, 116*m_ratio);
setSizeIncrement (25*m_ratio, 29*m_ratio);
setMinimumSize(275*m_ratio, 116*m_ratio);
m_listWidget = new ListWidget (this);
m_plslider = new PlayListSlider (this);
m_buttonAdd = new Button (this,Skin::PL_BT_ADD,Skin::PL_BT_ADD, Skin::CUR_PNORMAL);
m_buttonSub = new Button (this,Skin::PL_BT_SUB,Skin::PL_BT_SUB, Skin::CUR_PNORMAL);
m_selectButton = new Button (this,Skin::PL_BT_SEL,Skin::PL_BT_SEL, Skin::CUR_PNORMAL);
m_sortButton= new Button (this,Skin::PL_BT_SORT,Skin::PL_BT_SORT, Skin::CUR_PNORMAL);
m_playlistButton = new Button (this,Skin::PL_BT_LST,Skin::PL_BT_LST, Skin::CUR_PNORMAL);
m_resizeWidget = new QWidget(this);
m_resizeWidget->resize(25,25);
m_resizeWidget->setCursor(m_skin->getCursor (Skin::CUR_PSIZE));
m_pl_control = new PlaylistControl (this);
m_length_totalLength = new SymbolDisplay (this,14);
m_length_totalLength->setAlignment (Qt::AlignLeft);
m_current_time = new SymbolDisplay (this,6);
m_keyboardManager = new KeyboardManager (this);
connect (m_listWidget, SIGNAL (selectionChanged()), parent, SLOT (replay()));
connect (m_plslider, SIGNAL (sliderMoved (int)), m_listWidget, SLOT (scroll (int)));
connect (m_listWidget, SIGNAL (positionChanged (int, int)), m_plslider,
SLOT (setPos (int, int)));
connect (m_skin, SIGNAL (skinChanged()), this, SLOT (updateSkin()));
connect (m_buttonAdd, SIGNAL (clicked()), SLOT (showAddMenu()));
connect (m_buttonSub, SIGNAL (clicked()), SLOT (showSubMenu()));
connect (m_selectButton, SIGNAL (clicked()), SLOT (showSelectMenu()));
connect (m_sortButton, SIGNAL (clicked()), SLOT (showSortMenu()));
connect (m_playlistButton, SIGNAL (clicked()), SLOT (showPlaylistMenu()));
connect (m_pl_control, SIGNAL (nextClicked()), SIGNAL (next()));
connect (m_pl_control, SIGNAL (previousClicked()), SIGNAL (prev()));
connect (m_pl_control, SIGNAL (playClicked()), SIGNAL (play()));
connect (m_pl_control, SIGNAL (pauseClicked()), SIGNAL (pause()));
connect (m_pl_control, SIGNAL (stopClicked()), SIGNAL (stop()));
connect (m_pl_control, SIGNAL (ejectClicked()), SIGNAL (eject()));
connect (m_pl_manager, SIGNAL (selectedPlayListChanged(PlayListModel *, PlayListModel *)),
m_listWidget, SLOT(setModel(PlayListModel*)));
m_listWidget->setModel(m_pl_manager->selectedPlayList());
m_titleBar = new PlayListTitleBar (this);
m_titleBar->move (0,0);
connect (m_pl_manager, SIGNAL (currentPlayListChanged(PlayListModel *, PlayListModel *)),
m_titleBar, SLOT(setModel(PlayListModel*)));
m_titleBar->setModel(m_pl_manager->currentPlayList());
createMenus();
createActions();
readSettings();
setCursor(m_skin->getCursor(Skin::CUR_PNORMAL));
updatePositions();
#ifdef Q_WS_X11
QString wm_name = WindowSystem::netWindowManagerName();
if(wm_name.contains("metacity", Qt::CaseInsensitive) ||
wm_name.contains("openbox", Qt::CaseInsensitive))
setWindowFlags (Qt::Tool | Qt::FramelessWindowHint);
else
#endif
setWindowFlags (Qt::Dialog | Qt::FramelessWindowHint);
}
PlayList::~PlayList()
{
delete m_keyboardManager;
}
void PlayList::updatePositions()
{
int sx = (width()-275*m_ratio)/25;
int sy = (height()-116*m_ratio)/29;
if (sx < 0 || sy < 0 || m_shaded) //skip shaded mode
return;
m_titleBar->resize (275*m_ratio+25*sx, 20*m_ratio);
m_plslider->resize (20*m_ratio, 58*m_ratio+sy*29);
if(m_pl_selector)
{
m_listWidget->resize (243*m_ratio+25*sx, 58*m_ratio+29*sy - m_pl_selector->height());
m_pl_selector->resize(243*m_ratio+25*sx, m_pl_selector->height());
m_pl_selector->move(12*m_ratio, 20*m_ratio + 58*m_ratio+29*sy - m_pl_selector->height());
}
else
m_listWidget->resize (243*m_ratio+25*sx, 58*m_ratio+29*sy);
m_listWidget->move (12*m_ratio,20*m_ratio);
m_buttonAdd->move (11*m_ratio, 86*m_ratio+29*sy);
m_buttonSub->move (40*m_ratio, 86*m_ratio+29*sy);
m_selectButton->move (70*m_ratio, 86*m_ratio+29*sy);
m_sortButton->move (99*m_ratio, 86*m_ratio+29*sy);
m_pl_control->move (128*m_ratio+sx*25, 100*m_ratio+29*sy);
m_playlistButton->move (228*m_ratio+sx*25,86*m_ratio+29*sy);
m_length_totalLength -> move (131*m_ratio+sx*25,88*m_ratio+29*sy);
m_current_time->move (190*m_ratio+sx*25,101*m_ratio+29*sy);
m_plslider->move (255*m_ratio+sx*25,20*m_ratio);
m_resizeWidget->move(width() - 25, height() - 29);
}
void PlayList::createMenus()
{
m_addMenu = new QMenu (this);
m_subMenu = new QMenu (this);
m_selectMenu = new QMenu (this);
m_sortMenu = new QMenu (this);
m_playlistMenu = new QMenu (this);
m_copySelectedMenu = new QMenu (tr("&Copy Selection To"), m_listWidget->menu());
m_copySelectedMenu->setIcon(QIcon::fromTheme("edit-copy"));
connect (m_copySelectedMenu, SIGNAL (aboutToShow () ), this, SLOT (generateCopySelectedMenu ()));
connect (m_copySelectedMenu, SIGNAL (triggered ( QAction *) ), this, SLOT (copySelectedMenuActionTriggered( QAction *)));
}
void PlayList::createActions()
{
//add menu
m_addMenu->addAction(SET_ACTION(ActionManager::PL_ADD_FILE, parent(), SLOT(addFile())));
m_addMenu->addAction(SET_ACTION(ActionManager::PL_ADD_DIRECTORY, parent(), SLOT(addDir())));
m_addMenu->addAction(SET_ACTION(ActionManager::PL_ADD_URL, parent(), SLOT(addUrl())));
//sub menu
m_subMenu->addAction(SET_ACTION(ActionManager::PL_REMOVE_SELECTED, m_pl_manager, SLOT(removeSelected())));
m_subMenu->addAction(SET_ACTION(ActionManager::PL_REMOVE_ALL, m_pl_manager, SLOT(clear())));
m_subMenu->addAction(SET_ACTION(ActionManager::PL_REMOVE_UNSELECTED, m_pl_manager,
SLOT(removeUnselected())));
m_subMenu->addSeparator();
m_subMenu->addAction(SET_ACTION(ActionManager::PL_REMOVE_INVALID, m_pl_manager,
SLOT(removeInvalidItems())));
m_subMenu->addAction(SET_ACTION(ActionManager::PL_REMOVE_DUPLICATES, m_pl_manager,
SLOT(removeDuplicates())));
//sort menu
m_sortMenu->addAction(SET_ACTION(ActionManager::PL_SHOW_INFO, m_pl_manager, SLOT (showDetails ())));
m_sortMenu->addAction (ActionManager::instance()->action(ActionManager::PL_SHOW_INFO));
m_sortMenu->addSeparator();
QMenu* sort_mode_menu = new QMenu (tr("Sort List"), m_sortMenu);
sort_mode_menu->setIcon(QIcon::fromTheme("view-sort-ascending"));
QSignalMapper* signalMapper = new QSignalMapper (this);
QAction* titleAct = sort_mode_menu->addAction (tr ("By Title"));
connect (titleAct, SIGNAL (triggered (bool)), signalMapper, SLOT (map()));
signalMapper->setMapping (titleAct, PlayListModel::TITLE);
QAction* albumAct = sort_mode_menu->addAction (tr ("By Album"));
connect (albumAct, SIGNAL (triggered (bool)), signalMapper, SLOT (map()));
signalMapper->setMapping (albumAct, PlayListModel::ALBUM);
QAction* discnumberAct = sort_mode_menu->addAction (tr ("By Disc Number"));
connect (discnumberAct, SIGNAL (triggered (bool)), signalMapper, SLOT (map()));
signalMapper->setMapping (discnumberAct, PlayListModel::DISCNUMBER);
QAction* artistAct = sort_mode_menu->addAction (tr ("By Artist"));
connect (artistAct, SIGNAL (triggered (bool)), signalMapper, SLOT (map()));
signalMapper->setMapping (artistAct, PlayListModel::ARTIST);
QAction* nameAct = sort_mode_menu->addAction (tr ("By Filename"));
connect (nameAct, SIGNAL (triggered (bool)), signalMapper, SLOT (map()));
signalMapper->setMapping (nameAct, PlayListModel::FILENAME);
QAction* pathnameAct = sort_mode_menu->addAction (tr ("By Path + Filename"));
connect (pathnameAct, SIGNAL (triggered (bool)), signalMapper, SLOT (map()));
signalMapper->setMapping (pathnameAct, PlayListModel::PATH_AND_FILENAME);
QAction* dateAct = sort_mode_menu->addAction (tr ("By Date"));
connect (dateAct, SIGNAL (triggered (bool)), signalMapper, SLOT (map()));
signalMapper->setMapping (dateAct, PlayListModel::DATE);
QAction* trackAct = sort_mode_menu->addAction (tr("By Track Number"));
connect (trackAct, SIGNAL (triggered (bool)), signalMapper, SLOT (map()));
signalMapper->setMapping (trackAct, PlayListModel::TRACK);
connect (signalMapper, SIGNAL (mapped (int)), m_pl_manager, SLOT (sort (int)));
m_sortMenu->addMenu (sort_mode_menu);
sort_mode_menu = new QMenu (tr("Sort Selection"), m_sortMenu);
sort_mode_menu->setIcon(QIcon::fromTheme("view-sort-ascending"));
signalMapper = new QSignalMapper (this);
titleAct = sort_mode_menu->addAction (tr ("By Title"));