aboutsummaryrefslogtreecommitdiff
path: root/src/ui/playlist.cpp
diff options
context:
space:
mode:
authorvovanec <vovanec@90c681e8-e032-0410-971d-27865f9a5e38>2008-02-07 13:36:34 +0000
committervovanec <vovanec@90c681e8-e032-0410-971d-27865f9a5e38>2008-02-07 13:36:34 +0000
commit06d1877811fa6aa97dddc0e03bcde4e766928c87 (patch)
treec25462d0e58c3d58c728664440412bf4f16a49ec /src/ui/playlist.cpp
parent3f6b60f23c44a8ba8dd97ca6f41a16e2af7ef2f7 (diff)
downloadqmmp-06d1877811fa6aa97dddc0e03bcde4e766928c87.tar.gz
qmmp-06d1877811fa6aa97dddc0e03bcde4e766928c87.tar.bz2
qmmp-06d1877811fa6aa97dddc0e03bcde4e766928c87.zip
new directory structure
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@232 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/ui/playlist.cpp')
-rw-r--r--src/ui/playlist.cpp471
1 files changed, 471 insertions, 0 deletions
diff --git a/src/ui/playlist.cpp b/src/ui/playlist.cpp
new file mode 100644
index 000000000..282463ef0
--- /dev/null
+++ b/src/ui/playlist.cpp
@@ -0,0 +1,471 @@
+/***************************************************************************
+ * Copyright (C) 2006 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 "dock.h"
+#include "fileloader.h"
+#include "playlist.h"
+#include "skin.h"
+#include "listwidget.h"
+#include "button.h"
+#include "mediafile.h"
+#include "playlistmodel.h"
+#include "playlisttitlebar.h"
+#include "playlistslider.h"
+#include "pixmapwidget.h"
+#include "symboldisplay.h"
+#include "playlistcontrol.h"
+#include "keyboardmanager.h"
+#include <output.h>
+
+PlayList::PlayList ( QWidget *parent )
+ : QWidget ( parent )
+{
+ setWindowFlags ( Qt::Dialog | Qt::FramelessWindowHint );
+
+ m_update = FALSE;
+ m_resize = FALSE;
+ m_anchor_row = -1;
+
+ createMenus();
+
+
+ resize ( 275,116 );
+ setMinimumSize ( 275,116 );
+ setBaseSize ( 275,116 );
+ m_listWidget = new ListWidget ( this );
+ m_listWidget->show();
+ m_listWidget->setGeometry ( 12,20,243,58 );
+
+ m_plslider = new PlayListSlider ( this );
+ m_plslider->show();
+
+ setSizeIncrement ( 25,29 );
+ m_skin = Skin::getPointer();
+
+ m_buttonAdd = new Button ( this,Skin::PL_BT_ADD,Skin::PL_BT_ADD );
+ m_buttonAdd->move ( 11,86 );
+ m_buttonSub = new Button ( this,Skin::PL_BT_SUB,Skin::PL_BT_SUB );
+ m_buttonSub->move ( 40,86 );
+ m_selectButton = new Button ( this,Skin::PL_BT_SEL,Skin::PL_BT_SEL );
+ m_selectButton->move ( 70,86 );
+ m_sortButton= new Button ( this,Skin::PL_BT_SORT,Skin::PL_BT_SORT );
+ m_sortButton->move ( 99,86 );
+ m_playlistButton = new Button ( this,Skin::PL_BT_LST,Skin::PL_BT_LST );
+
+ m_pl_control = new PlaylistControl ( this );
+ m_pl_control->move ( 0,0 );
+ m_pl_control->show();
+
+ m_length_totalLength = new SymbolDisplay ( this,14 );
+ m_length_totalLength->setAlignment ( Qt::AlignLeft );
+ m_length_totalLength -> show();
+
+ m_current_time = new SymbolDisplay ( this,6 );
+ m_current_time->show();
+
+ 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 ( update() ) );
+ 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() ) );
+ m_titleBar = new PlayListTitleBar ( this );
+ m_titleBar->move ( 0,0 );
+ readSettings();
+}
+
+
+PlayList::~PlayList()
+{}
+
+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 );
+}
+
+void PlayList::createActions()
+{ //add menu
+ QAction *addFileAct = new QAction ( tr ( "&Add File" ),this );
+ addFileAct->setShortcut ( tr ( "F" ) );
+ m_addMenu->addAction ( addFileAct );
+ connect ( addFileAct, SIGNAL ( triggered() ), parent(), SLOT ( addFile () ) );
+ m_actions << addFileAct;
+
+ QAction *addDirAct = new QAction ( tr ( "&Add Directory" ),this );
+ addDirAct->setShortcut ( tr ( "D" ) );
+ m_addMenu->addAction ( addDirAct );
+ connect ( addDirAct, SIGNAL ( triggered() ), parent(), SLOT ( addDir () ) );
+ m_actions << addDirAct;
+
+ QAction *addUrlAct = new QAction ( tr ( "&Add Url" ),this );
+ addUrlAct->setShortcut ( tr ( "U" ) );
+ m_addMenu->addAction ( addUrlAct );
+ connect ( addUrlAct, SIGNAL ( triggered() ), parent(), SLOT ( addUrl () ) );
+ m_actions << addUrlAct;
+
+ //remove menu
+ QAction *remSelAct = new QAction ( tr ( "&Remove Selected" ),this );
+ remSelAct->setShortcut ( tr ( "Del" ) );
+ m_subMenu->addAction ( remSelAct );
+ connect ( remSelAct, SIGNAL ( triggered() ),
+ m_playListModel, SLOT ( removeSelected () ) );
+ this->addAction ( remSelAct );
+
+ QAction *remAllAct = new QAction ( tr ( "&Remove All" ),this );
+ //remAllAct->setShortcut(tr("D")); FIXME: add correct shortcat
+ m_subMenu->addAction ( remAllAct );
+ connect ( remAllAct, SIGNAL ( triggered() ), m_playListModel, SLOT ( clear () ) );
+ m_actions << remAllAct;
+
+ QAction *remUnselAct = new QAction ( tr ( "&Remove Unselected" ),this );
+ m_subMenu->addAction ( remUnselAct );
+ connect ( remUnselAct, SIGNAL ( triggered() ),
+ m_playListModel, SLOT ( removeUnselected () ) );
+
+ //listwidget menu
+ QAction *detailsAct = new QAction ( tr ( "&View Track Details" ),this );
+ detailsAct->setShortcut ( tr ( "Alt+I" ) );
+ m_listWidget->menu()->addAction ( detailsAct );
+ connect ( detailsAct, SIGNAL ( triggered() ), m_playListModel, SLOT ( showDetails () ) );
+
+ // sort menu
+ m_sortMenu->addAction ( detailsAct );
+ m_sortMenu->addSeparator();
+
+ QMenu* sort_mode_menu = new QMenu ( tr ( "Sort List" ),m_sortMenu );
+
+ 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* 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 );
+
+ connect ( signalMapper, SIGNAL ( mapped ( int ) ),
+ m_playListModel, SLOT ( sort ( int ) ) );
+
+ m_sortMenu->addMenu ( sort_mode_menu );
+
+ sort_mode_menu = new QMenu ( tr ( "Sort Selection" ),m_sortMenu );
+ signalMapper = new QSignalMapper ( this );
+ titleAct = sort_mode_menu->addAction ( tr ( "By Title" ) );
+ connect ( titleAct, SIGNAL ( triggered ( bool ) ), signalMapper, SLOT ( map() ) );
+ signalMapper->setMapping ( titleAct, PlayListModel::TITLE );
+
+ nameAct = sort_mode_menu->addAction ( tr ( "By Filename" ) );
+ connect ( nameAct, SIGNAL ( triggered ( bool ) ), signalMapper, SLOT ( map() ) );
+ signalMapper->setMapping ( nameAct, PlayListModel::FILENAME );
+
+ pathnameAct = sort_mode_menu->addAction ( tr ( "By Path + Filename" ) );
+ connect ( pathnameAct, SIGNAL ( triggered ( bool ) ), signalMapper, SLOT ( map() ) );
+ signalMapper->setMapping ( pathnameAct, PlayListModel::PATH_AND_FILENAME );
+
+ dateAct = sort_mode_menu->addAction ( tr ( "By Date" ) );
+ connect ( dateAct, SIGNAL ( triggered ( bool ) ), signalMapper, SLOT ( map() ) );
+ signalMapper->setMapping ( dateAct, PlayListModel::DATE );
+
+ connect ( signalMapper, SIGNAL ( mapped ( int ) ),
+ m_playListModel, SLOT ( sortSelection ( int ) ) );
+
+ m_sortMenu->addMenu ( sort_mode_menu );
+
+ m_sortMenu->addSeparator();
+ m_sortMenu->addAction ( tr ( "Randomize List" ),m_playListModel,SLOT ( randomizeList() ) );
+ m_sortMenu->addAction ( tr ( "Reverse List" ),m_playListModel,SLOT ( reverseList() ) );
+
+ m_listWidget->menu()->addSeparator();
+ m_listWidget->menu()->addActions ( m_subMenu->actions() );
+ m_actions << detailsAct;
+
+ //select menu
+ QAction *invSelAct = new QAction ( tr ( "Invert Selection" ),this );
+ m_selectMenu->addAction ( invSelAct );
+ connect ( invSelAct, SIGNAL ( triggered() ),
+ m_playListModel, SLOT ( invertSelection () ) );
+
+ m_selectMenu->addSeparator();
+
+ QAction *selNoneAct = new QAction ( tr ( "&Select None" ),this );
+ //selNoneAct->setShortcut(tr("Ctrl+Shift+A"));
+ m_selectMenu->addAction ( selNoneAct );
+ connect ( selNoneAct, SIGNAL ( triggered() ),
+ m_playListModel, SLOT ( clearSelection () ) );
+ this->addAction ( selNoneAct );
+
+ QAction *selAllAct = new QAction ( tr ( "&Select All" ),this );
+ selAllAct->setShortcut ( tr ( "Ctrl+A" ) );
+ m_selectMenu->addAction ( selAllAct );
+ connect ( selAllAct, SIGNAL ( triggered() ),
+ m_playListModel, SLOT ( selectAll () ) );
+ this->addAction ( selAllAct );
+
+// Playlist Menu
+ QAction *newListAct = new QAction ( tr ( "&New List" ),this );
+ newListAct->setShortcut ( tr ( "Shift+N" ) );
+ m_actions << newListAct;
+ m_playlistMenu->addAction ( newListAct );
+ connect ( newListAct, SIGNAL ( triggered() ), this, SIGNAL ( newPlaylist() ) );
+ m_playlistMenu->addSeparator();
+
+ QAction *loadListAct = new QAction ( tr ( "&Load List" ),this );
+ loadListAct->setShortcut ( tr ( "O" ) );
+ m_playlistMenu->addAction ( loadListAct );
+ connect ( loadListAct, SIGNAL ( triggered() ), this, SIGNAL ( loadPlaylist() ) );
+
+ QAction *saveListAct = new QAction ( tr ( "&Save List" ),this );
+ saveListAct->setShortcut ( tr ( "Shift+S" ) );
+ m_playlistMenu->addAction ( saveListAct );
+ connect ( saveListAct, SIGNAL ( triggered() ), this, SIGNAL ( savePlaylist() ) );
+ this->addActions ( m_playlistMenu->actions() );
+
+ Dock::getPointer()->addActions ( m_actions );
+}
+
+void PlayList::closeEvent ( QCloseEvent* )
+{
+ writeSettings();
+}
+
+void PlayList::paintEvent ( QPaintEvent * )
+{
+ int m_sx = ( width()-275 ) /25;
+ int m_sy = ( height()-116 ) /29;
+ drawPixmap ( m_sx, m_sy );
+}
+
+void PlayList::drawPixmap ( int sx, int sy )
+{
+ QPainter paint;
+ paint.begin ( this );
+ paint.drawPixmap ( 0,20,m_skin->getPlPart ( Skin::PL_LFILL ) );
+ for ( int i = 1; i<sy+2; i++ )
+ {
+ paint.drawPixmap ( 0,20+29*i,m_skin->getPlPart ( Skin::PL_LFILL ) );
+ }
+ paint.drawPixmap ( 0,78+29*sy,m_skin->getPlPart ( Skin::PL_LSBAR ) );
+ for ( int i = 0; i<sx; i++ )
+ {
+ paint.drawPixmap ( 125+i*25,78+sy*29,m_skin->getPlPart ( Skin::PL_SFILL1 ) );
+ }
+
+ paint.drawPixmap ( 125+sx*25,78+sy*29,m_skin->getPlPart ( Skin::PL_RSBAR ) );
+ paint.end();
+
+}
+
+void PlayList::resizeEvent ( QResizeEvent *e )
+{
+ int sx = ( e->size().width()-275 ) /25;
+ int sy = ( e->size().height()-116 ) /29;
+ if (sx < 0 || sy < 0)
+ return;
+
+ m_titleBar->resize ( 275+25*sx,20 );
+ m_plslider->resize ( 20,58+sy*29 );
+
+ m_listWidget->resize ( 243+25*sx,58+29*sy );
+
+ m_buttonAdd->move ( 11,86+29*sy );
+ m_buttonSub->move ( 40,86+29*sy );
+ m_selectButton->move ( 70,86+29*sy );
+ m_sortButton->move ( 99,86+29*sy );
+
+ m_pl_control->move ( 128+sx*25,100+29*sy );
+ m_playlistButton->move ( 228+sx*25,86+29*sy );
+
+ m_length_totalLength -> move ( 131+sx*25,88+29*sy );
+ m_current_time->move ( 190+sx*25,101+29*sy );
+
+ m_plslider->move ( 255+sx*25,20 );
+}
+void PlayList::mousePressEvent ( QMouseEvent *e )
+{
+ m_pos = e->pos ();
+ if ( ( m_pos.x() > width()-25 ) && ( m_pos.y() > height()-25 ) )
+ {
+ m_resize = TRUE;
+ setCursor ( Qt::SizeFDiagCursor );
+ }
+ else
+ m_resize = FALSE;
+}
+void PlayList::mouseMoveEvent ( QMouseEvent *e )
+{
+ if ( m_resize )
+ {
+ resize ( e->x() +25, e->y() +25 );
+ //usleep(32000);
+ }
+}
+void PlayList::mouseReleaseEvent ( QMouseEvent * )
+{
+ setCursor ( Qt::ArrowCursor );
+ /*if (m_resize)
+ m_listWidget->updateList();*/
+ m_resize = FALSE;
+ Dock::getPointer()->updateDock();
+}
+void PlayList::setModel ( PlayListModel *model )
+{
+ m_playListModel = model;
+ m_listWidget->setModel (model);
+ m_keyboardManager->setModel (model);
+ m_titleBar->setModel (model);
+ createActions();
+}
+
+void PlayList::changeEvent ( QEvent * event )
+{
+ if ( event->type() == QEvent::ActivationChange )
+ {
+ m_titleBar->setActive ( isActiveWindow() );
+ }
+}
+
+void PlayList::readSettings()
+{
+ if ( m_update )
+ {
+ m_listWidget->readSettings();
+ m_titleBar->readSettings();
+ }
+ else
+ {
+ QSettings settings (QDir::homePath() +"/.qmmp/qmmprc", QSettings::IniFormat);
+ settings.beginGroup ( "PlayList" );
+ //position
+ move ( settings.value ("pos", QPoint ( 100, 332 ) ).toPoint());
+ settings.endGroup();
+ m_update = TRUE;
+ }
+
+}
+
+void PlayList::writeSettings()
+{
+ QSettings settings ( QDir::homePath() +"/.qmmp/qmmprc", QSettings::IniFormat );
+ settings.beginGroup ( "PlayList" );
+ //position
+ settings.setValue ( "pos", this->pos() );
+ settings.endGroup();
+}
+
+void PlayList::showAddMenu()
+{
+ m_addMenu->exec ( m_buttonAdd->mapToGlobal ( QPoint ( 0,0 ) ) );
+}
+
+void PlayList::showSubMenu()
+{
+ m_subMenu->exec ( m_buttonSub->mapToGlobal ( QPoint ( 0,0 ) ) );
+}
+
+void PlayList::showSelectMenu()
+{
+ m_selectMenu->exec ( m_selectButton->mapToGlobal ( QPoint ( 0,0 ) ) );
+}
+
+void PlayList::showSortMenu()
+{
+ m_sortMenu->exec ( m_sortButton->mapToGlobal ( QPoint ( 0,0 ) ) );
+}
+
+
+
+QString PlayList::formatTime ( int sec )
+{
+ int minutes = sec / 60;
+ int seconds = sec % 60;
+
+ QString str_minutes = QString::number ( minutes );
+ QString str_seconds = QString::number ( seconds );
+
+ if ( minutes < 10 ) str_minutes.prepend ( "0" );
+ if ( seconds < 10 ) str_seconds.prepend ( "0" );
+
+ return str_minutes + ":" + str_seconds;
+}
+
+void PlayList::setInfo (const OutputState &st,int length_current, int length_total)
+{
+ if ( st.type() == OutputState::Info )
+ {
+ m_current_time->display ( formatTime ( st.elapsedSeconds() ) );
+ m_current_time->update();
+
+ QString str_length = formatTime ( length_current ) + "/" + formatTime ( length_total );
+ m_length_totalLength->display ( str_length );
+ m_length_totalLength->update();
+ }
+}
+
+MediaFile *PlayList::currentItem()
+{
+ if ( m_playListModel )
+ return m_playListModel->currentItem();
+ else
+ return 0;
+}
+
+void PlayList::showPlaylistMenu()
+{
+ m_playlistMenu->exec ( m_playlistButton->mapToGlobal ( QPoint ( 0,0 ) ) );
+}
+
+void PlayList::keyPressEvent ( QKeyEvent *ke )
+{
+ if ( m_keyboardManager->handleKeyPress ( ke ) )
+ update();
+}