From 90d3aeb642ba4d6445932343010294a39b33efe2 Mon Sep 17 00:00:00 2001 From: trialuser02 Date: Thu, 12 Nov 2009 22:00:02 +0000 Subject: added multiple playlists support git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@1363 90c681e8-e032-0410-971d-27865f9a5e38 --- src/plugins/General/covermanager/covermanager.cpp | 2 +- src/plugins/General/fileops/fileops.cpp | 3 +- .../fileops/translations/fileops_plugin_cs.ts | 14 +- .../fileops/translations/fileops_plugin_de.ts | 14 +- .../fileops/translations/fileops_plugin_it.ts | 14 +- .../fileops/translations/fileops_plugin_lt.ts | 14 +- .../fileops/translations/fileops_plugin_pl.ts | 14 +- .../fileops/translations/fileops_plugin_ru.ts | 14 +- .../fileops/translations/fileops_plugin_tr.ts | 14 +- .../fileops/translations/fileops_plugin_uk_UA.ts | 14 +- .../fileops/translations/fileops_plugin_zh_CN.ts | 14 +- .../fileops/translations/fileops_plugin_zh_TW.ts | 14 +- src/plugins/General/hal/halplugin.cpp | 14 +- src/plugins/General/lyrics/lyrics.cpp | 5 +- src/plugins/General/mpris/playerobject.cpp | 17 +- src/plugins/General/mpris/playerobject.h | 6 +- src/plugins/General/mpris/tracklistobject.cpp | 19 +- src/plugins/General/mpris/tracklistobject.h | 5 +- src/qmmpui/CMakeLists.txt | 3 + src/qmmpui/mediaplayer.cpp | 43 +-- src/qmmpui/mediaplayer.h | 12 +- src/qmmpui/playlistmanager.cpp | 395 +++++++++++++++++++++ src/qmmpui/playlistmanager.h | 200 +++++++++++ src/qmmpui/playlistmodel.cpp | 206 ++--------- src/qmmpui/playlistmodel.h | 81 +---- src/qmmpui/qmmpui.pro | 6 +- src/qmmpui/translations/libqmmpui_cs.ts | 8 + src/qmmpui/translations/libqmmpui_de.ts | 8 + src/qmmpui/translations/libqmmpui_it.ts | 8 + src/qmmpui/translations/libqmmpui_lt.ts | 8 + src/qmmpui/translations/libqmmpui_pl.ts | 8 + src/qmmpui/translations/libqmmpui_pt_BR.ts | 8 + src/qmmpui/translations/libqmmpui_ru.ts | 8 + src/qmmpui/translations/libqmmpui_tr.ts | 8 + src/qmmpui/translations/libqmmpui_uk_UA.ts | 8 + src/qmmpui/translations/libqmmpui_zh_CN.ts | 8 + src/qmmpui/translations/libqmmpui_zh_TW.ts | 8 + src/ui/configdialog.cpp | 16 +- src/ui/display.cpp | 4 +- src/ui/jumptotrackdialog.cpp | 23 +- src/ui/jumptotrackdialog.h | 18 +- src/ui/keyboardmanager.cpp | 67 ++-- src/ui/keyboardmanager.h | 8 +- src/ui/listwidget.cpp | 41 +-- src/ui/listwidget.h | 18 +- src/ui/mainwindow.cpp | 110 ++---- src/ui/mainwindow.h | 16 +- src/ui/playlist.cpp | 143 +++++--- src/ui/playlist.h | 14 +- src/ui/playlisttitlebar.cpp | 7 +- src/ui/playlisttitlebar.h | 4 +- src/ui/translations/qmmp_cs.ts | 181 +++++----- src/ui/translations/qmmp_de.ts | 181 +++++----- src/ui/translations/qmmp_it.ts | 181 +++++----- src/ui/translations/qmmp_lt.ts | 181 +++++----- src/ui/translations/qmmp_pl_PL.ts | 181 +++++----- src/ui/translations/qmmp_pt_BR.ts | 181 +++++----- src/ui/translations/qmmp_ru.ts | 181 +++++----- src/ui/translations/qmmp_tr.ts | 181 +++++----- src/ui/translations/qmmp_uk_UA.ts | 181 +++++----- src/ui/translations/qmmp_zh_CN.ts | 181 +++++----- src/ui/translations/qmmp_zh_TW.ts | 181 +++++----- 62 files changed, 2157 insertions(+), 1568 deletions(-) create mode 100644 src/qmmpui/playlistmanager.cpp create mode 100644 src/qmmpui/playlistmanager.h diff --git a/src/plugins/General/covermanager/covermanager.cpp b/src/plugins/General/covermanager/covermanager.cpp index 5cb285f25..ab4303c8e 100644 --- a/src/plugins/General/covermanager/covermanager.cpp +++ b/src/plugins/General/covermanager/covermanager.cpp @@ -37,7 +37,7 @@ CoverManager::CoverManager(QObject *parent) : General(parent) void CoverManager::showWindow() { - QList items = MediaPlayer::instance()->playListModel()->getSelectedItems(); + QList items = MediaPlayer::instance()->playListManager()->selectedPlayList()->getSelectedItems(); if (!items.isEmpty()) { if (items.at(0)->url().contains("://")) diff --git a/src/plugins/General/fileops/fileops.cpp b/src/plugins/General/fileops/fileops.cpp index 62e723a89..a2cf0ee5d 100644 --- a/src/plugins/General/fileops/fileops.cpp +++ b/src/plugins/General/fileops/fileops.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include "fileops.h" @@ -84,7 +85,7 @@ void FileOps::execAction(int n) QString pattern = m_patterns.at(n); QString destination = m_destinations.at(n); - PlayListModel *model = MediaPlayer::instance()->playListModel(); + PlayListModel *model = MediaPlayer::instance()->playListManager()->selectedPlayList(); QList items = model->getSelectedItems(); switch (type) diff --git a/src/plugins/General/fileops/translations/fileops_plugin_cs.ts b/src/plugins/General/fileops/translations/fileops_plugin_cs.ts index 80cd25897..6a8220b8e 100644 --- a/src/plugins/General/fileops/translations/fileops_plugin_cs.ts +++ b/src/plugins/General/fileops/translations/fileops_plugin_cs.ts @@ -4,37 +4,37 @@ FileOps - + Error Chyba - + Destination directory doesn't exist Cílový adresář neexistuje - + Copying Kopíruje se - + Stop Přerušit - + Copying file %1/%2 Kopíruje se soubor %1/%2 - + Remove files Odstranit soubory - + Are you sure you want to remove %n file(s) from disk? Jste si jisti, že chcete z disku odstranit %n soubor? diff --git a/src/plugins/General/fileops/translations/fileops_plugin_de.ts b/src/plugins/General/fileops/translations/fileops_plugin_de.ts index 4cd826e89..341477a22 100644 --- a/src/plugins/General/fileops/translations/fileops_plugin_de.ts +++ b/src/plugins/General/fileops/translations/fileops_plugin_de.ts @@ -4,37 +4,37 @@ FileOps - + Error Fehler - + Destination directory doesn't exist Das Zielverzeichnis existiert nicht - + Copying Kopiere - + Stop Stopp - + Copying file %1/%2 Kopiere Datei %1/%2 - + Remove files Dateien entfernen - + Are you sure you want to remove %n file(s) from disk? diff --git a/src/plugins/General/fileops/translations/fileops_plugin_it.ts b/src/plugins/General/fileops/translations/fileops_plugin_it.ts index 000c64c7e..96b5634bf 100644 --- a/src/plugins/General/fileops/translations/fileops_plugin_it.ts +++ b/src/plugins/General/fileops/translations/fileops_plugin_it.ts @@ -4,37 +4,37 @@ FileOps - + Error Errore - + Destination directory doesn't exist Cartella di destinazione - + Copying Copia - + Stop Ferma - + Copying file %1/%2 Copia del file - + Remove files Rimuovi file - + Are you sure you want to remove %n file(s) from disk? Vuoi davvero rimuovere %n file(s) dal disco? diff --git a/src/plugins/General/fileops/translations/fileops_plugin_lt.ts b/src/plugins/General/fileops/translations/fileops_plugin_lt.ts index 69ac4bc3d..fb6e6bf79 100644 --- a/src/plugins/General/fileops/translations/fileops_plugin_lt.ts +++ b/src/plugins/General/fileops/translations/fileops_plugin_lt.ts @@ -4,37 +4,37 @@ FileOps - + Error Klaida - + Destination directory doesn't exist Aplankas neegzistuoja - + Copying Kopijuoju - + Stop Stop - + Copying file %1/%2 Kopijuoju bylą %1/%2 - + Remove files Ištrinti bylas - + Are you sure you want to remove %n file(s) from disk? diff --git a/src/plugins/General/fileops/translations/fileops_plugin_pl.ts b/src/plugins/General/fileops/translations/fileops_plugin_pl.ts index 2d67a70ec..db73e9c36 100644 --- a/src/plugins/General/fileops/translations/fileops_plugin_pl.ts +++ b/src/plugins/General/fileops/translations/fileops_plugin_pl.ts @@ -4,37 +4,37 @@ FileOps - + Error Błąd - + Destination directory doesn't exist Katalog docelowy nie istnieje - + Copying Kopiowanie - + Stop - + Copying file %1/%2 Kopiowanie pliku %1/%2 - + Remove files Usuń pliki - + Are you sure you want to remove %n file(s) from disk? Czy napewno chcesz usunąć %n plik(ów) z dysku? diff --git a/src/plugins/General/fileops/translations/fileops_plugin_ru.ts b/src/plugins/General/fileops/translations/fileops_plugin_ru.ts index 8da9527f4..54353ecc7 100644 --- a/src/plugins/General/fileops/translations/fileops_plugin_ru.ts +++ b/src/plugins/General/fileops/translations/fileops_plugin_ru.ts @@ -4,37 +4,37 @@ FileOps - + Error Ошибка - + Destination directory doesn't exist Директория назначения не существует - + Copying Копирование - + Stop Остановить - + Copying file %1/%2 Копирование файла %1/%2 - + Remove files Удалить файлы - + Are you sure you want to remove %n file(s) from disk? Вы уверены, что хотите удалить %n файл с диска? diff --git a/src/plugins/General/fileops/translations/fileops_plugin_tr.ts b/src/plugins/General/fileops/translations/fileops_plugin_tr.ts index 96df85603..88ef5d138 100644 --- a/src/plugins/General/fileops/translations/fileops_plugin_tr.ts +++ b/src/plugins/General/fileops/translations/fileops_plugin_tr.ts @@ -4,37 +4,37 @@ FileOps - + Error Hata - + Destination directory doesn't exist Hedef dizin mevcut değil - + Copying Kopyalıyor - + Stop Dur - + Copying file %1/%2 %1/%2 dosyası kopyalanıyor - + Remove files Dosyaları kaldır - + Are you sure you want to remove %n file(s) from disk? diff --git a/src/plugins/General/fileops/translations/fileops_plugin_uk_UA.ts b/src/plugins/General/fileops/translations/fileops_plugin_uk_UA.ts index 330683148..6f846f613 100644 --- a/src/plugins/General/fileops/translations/fileops_plugin_uk_UA.ts +++ b/src/plugins/General/fileops/translations/fileops_plugin_uk_UA.ts @@ -4,37 +4,37 @@ FileOps - + Error Помилка - + Destination directory doesn't exist Тека призначення не існує - + Copying Копіювання - + Stop Зупинити - + Copying file %1/%2 Копіювання файла %1/%2 - + Remove files Видалити файли - + Are you sure you want to remove %n file(s) from disk? Ви дійсно бажаєте видалити %n файл(ів) з диску? diff --git a/src/plugins/General/fileops/translations/fileops_plugin_zh_CN.ts b/src/plugins/General/fileops/translations/fileops_plugin_zh_CN.ts index 6bbd98d7d..5223deb6d 100644 --- a/src/plugins/General/fileops/translations/fileops_plugin_zh_CN.ts +++ b/src/plugins/General/fileops/translations/fileops_plugin_zh_CN.ts @@ -4,37 +4,37 @@ FileOps - + Error 错误 - + Destination directory doesn't exist 目标目录不存在 - + Copying 正在复制 - + Stop 停止 - + Copying file %1/%2 正在复制文件 %1/%2 - + Remove files 删除文件 - + Are you sure you want to remove %n file(s) from disk? diff --git a/src/plugins/General/fileops/translations/fileops_plugin_zh_TW.ts b/src/plugins/General/fileops/translations/fileops_plugin_zh_TW.ts index 013bf5e7a..2238a5356 100644 --- a/src/plugins/General/fileops/translations/fileops_plugin_zh_TW.ts +++ b/src/plugins/General/fileops/translations/fileops_plugin_zh_TW.ts @@ -4,37 +4,37 @@ FileOps - + Error 錯誤 - + Destination directory doesn't exist 目標目錄早已存在 - + Copying 正在復制 - + Stop 停止 - + Copying file %1/%2 復制檔案 %1/%2 - + Remove files 刪除檔案 - + Are you sure you want to remove %n file(s) from disk? diff --git a/src/plugins/General/hal/halplugin.cpp b/src/plugins/General/hal/halplugin.cpp index 002ebc0e3..1d40e0c8b 100644 --- a/src/plugins/General/hal/halplugin.cpp +++ b/src/plugins/General/hal/halplugin.cpp @@ -23,7 +23,7 @@ #include #include -#include +#include #include #include #include "haldevice.h" @@ -190,9 +190,9 @@ void HalPlugin::processAction(QAction *action) qDebug("HalPlugin: action triggered: %s", qPrintable(action->data().toString())); QString path = action->data().toString(); if (path.startsWith("cdda://")) - MediaPlayer::instance()->playListModel()->addFile(path); + MediaPlayer::instance()->playListManager()->selectedPlayList()->addFile(path); else - MediaPlayer::instance()->playListModel()->addDirectory(path); + MediaPlayer::instance()->playListManager()->selectedPlayList()->addDirectory(path); } QAction *HalPlugin::findAction(const QString &dev_path) @@ -229,7 +229,7 @@ HalDevice *HalPlugin::findDevice(QAction *action) void HalPlugin::addPath(const QString &path) { - foreach(PlayListItem *item, MediaPlayer::instance()->playListModel()->items()) // Is it already exist? + foreach(PlayListItem *item, MediaPlayer::instance()->playListManager()->selectedPlayList()->items()) // Is it already exist? { if (item->url().startsWith(path)) return; @@ -237,11 +237,11 @@ void HalPlugin::addPath(const QString &path) if (path.startsWith("cdda://") && m_addTracks) { - MediaPlayer::instance()->playListModel()->addFile(path); + MediaPlayer::instance()->playListManager()->selectedPlayList()->addFile(path); return; } else if (!path.startsWith("cdda://") && m_addFiles) - MediaPlayer::instance()->playListModel()->addDirectory(path); + MediaPlayer::instance()->playListManager()->selectedPlayList()->addDirectory(path); } void HalPlugin::removePath(const QString &path) @@ -250,7 +250,7 @@ void HalPlugin::removePath(const QString &path) (!path.startsWith("cdda://") && !m_removeFiles)) //process settings return; - PlayListModel *model = MediaPlayer::instance()->playListModel(); + PlayListModel *model = MediaPlayer::instance()->playListManager()->selectedPlayList(); int i = 0; while (model->count() > 0 && i < model->count()) diff --git a/src/plugins/General/lyrics/lyrics.cpp b/src/plugins/General/lyrics/lyrics.cpp index e0492cbf5..65ab6182a 100644 --- a/src/plugins/General/lyrics/lyrics.cpp +++ b/src/plugins/General/lyrics/lyrics.cpp @@ -23,7 +23,7 @@ #include #include -#include +#include #include #include #include "lyricswindow.h" @@ -43,7 +43,8 @@ Lyrics::~Lyrics() void Lyrics::showLyrics() { - QList items = MediaPlayer::instance()->playListModel()->getSelectedItems(); + PlayListManager *pl_manager = MediaPlayer::instance()->playListManager(); + QList items = pl_manager->selectedPlayList()->getSelectedItems(); if (!items.isEmpty()) { if (items.at(0)->artist().isEmpty() || items.at(0)->title().isEmpty()) diff --git a/src/plugins/General/mpris/playerobject.cpp b/src/plugins/General/mpris/playerobject.cpp index 894b68617..d7166e964 100644 --- a/src/plugins/General/mpris/playerobject.cpp +++ b/src/plugins/General/mpris/playerobject.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2008 by Ilya Kotov * + * Copyright (C) 2008-2009 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -24,7 +24,7 @@ #include #include #include -#include +#include #include "playerobject.h" @@ -53,18 +53,17 @@ const QDBusArgument &operator >> (const QDBusArgument &arg, PlayerStatus &status return arg; } -PlayerObject::PlayerObject(QObject *parent) - : QObject(parent) +PlayerObject::PlayerObject(QObject *parent) : QObject(parent) { qDBusRegisterMetaType(); m_core = SoundCore::instance(); m_player = MediaPlayer::instance(); - m_model = m_player->playListModel(); + m_pl_manager = m_player->playListManager(); connect(m_core, SIGNAL(stateChanged (Qmmp::State)), SLOT(updateCaps())); connect(m_core, SIGNAL(metaDataChanged ()), SLOT(updateTrack())); connect(m_core, SIGNAL(stateChanged (Qmmp::State)), SLOT(updateStatus())); - connect(m_model, SIGNAL(repeatableListChanged(bool)), SLOT(updateStatus())); - connect(m_model, SIGNAL(shuffleChanged(bool)), SLOT(updateStatus())); + connect(m_pl_manager, SIGNAL(repeatableListChanged(bool)), SLOT(updateStatus())); + connect(m_pl_manager, SIGNAL(shuffleChanged(bool)), SLOT(updateStatus())); connect(m_player, SIGNAL(repeatableChanged(bool)), SLOT(updateStatus())); } @@ -118,9 +117,9 @@ PlayerStatus PlayerObject::GetStatus() case Qmmp::Paused: st.state = 1; }; - st.random = int(m_model->isShuffle()); + st.random = int(m_pl_manager->isShuffle()); st.repeat = int(m_player->isRepeatable()); - st.repeatPlayList = int(m_model->isRepeatableList()); + st.repeatPlayList = int(m_pl_manager->isRepeatableList()); return st; } diff --git a/src/plugins/General/mpris/playerobject.h b/src/plugins/General/mpris/playerobject.h index dbd7e771c..709357387 100644 --- a/src/plugins/General/mpris/playerobject.h +++ b/src/plugins/General/mpris/playerobject.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2008 by Ilya Kotov * + * Copyright (C) 2008-2009 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -25,7 +25,7 @@ class SoundCore; class MediaPlayer; -class PlayListModel; +class PlayListManager; /** @author Ilya Kotov @@ -94,7 +94,7 @@ private slots: private: SoundCore *m_core; MediaPlayer *m_player; - PlayListModel *m_model; + PlayListManager *m_pl_manager; }; diff --git a/src/plugins/General/mpris/tracklistobject.cpp b/src/plugins/General/mpris/tracklistobject.cpp index 6b3699a0c..3ca1830ba 100644 --- a/src/plugins/General/mpris/tracklistobject.cpp +++ b/src/plugins/General/mpris/tracklistobject.cpp @@ -21,18 +21,20 @@ #include #include -#include +#include #include #include #include "tracklistobject.h" -TrackListObject::TrackListObject(QObject *parent) - : QObject(parent) +TrackListObject::TrackListObject(QObject *parent) : QObject(parent) { m_player = MediaPlayer::instance(); - m_model = m_player->playListModel(); + m_pl_manager = m_player->playListManager(); + m_model = m_pl_manager->currentPlayList(); connect (m_model, SIGNAL(listChanged()), SLOT(updateTrackList())); + connect (m_pl_manager, SIGNAL(currentPlayListChanged(PlayListModel*,PlayListModel*)), + SLOT(switchPlayList(PlayListModel*,PlayListModel*))); } @@ -111,3 +113,12 @@ void TrackListObject::updateTrackList() { emit TrackListChange(m_model->count()); } + +void TrackListObject::switchPlayList(PlayListModel *cur, PlayListModel *prev) +{ + m_model = cur; + connect (m_model, SIGNAL(listChanged()), SLOT(updateTrackList())); + if(prev) + disconnect(prev,0,this,0); + updateTrackList(); +} diff --git a/src/plugins/General/mpris/tracklistobject.h b/src/plugins/General/mpris/tracklistobject.h index 856ebd5df..0004f25b9 100644 --- a/src/plugins/General/mpris/tracklistobject.h +++ b/src/plugins/General/mpris/tracklistobject.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2008 by Ilya Kotov * + * Copyright (C) 2008-2009 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -25,6 +25,7 @@ #include class PlayListModel; +class PlayListManager; class MediaPlayer; /** @@ -54,9 +55,11 @@ signals: private slots: void updateTrackList(); + void switchPlayList(PlayListModel *cur, PlayListModel *prev); private: PlayListModel *m_model; + PlayListManager *m_pl_manager; MediaPlayer *m_player; }; diff --git a/src/qmmpui/CMakeLists.txt b/src/qmmpui/CMakeLists.txt index af54b4145..84b640b7a 100644 --- a/src/qmmpui/CMakeLists.txt +++ b/src/qmmpui/CMakeLists.txt @@ -38,6 +38,7 @@ SET(libqmmpui_SRCS playlistsettings.cpp detailsdialog.cpp tageditor.cpp + playlistmanager.cpp ) SET(libqmmpui_MOC_HDRS @@ -60,6 +61,7 @@ SET(libqmmpui_MOC_HDRS playlistsettings.h detailsdialog.h tageditor.h + playlistmanager.h ) SET(libqmmpui_DEVEL_HDRS @@ -78,6 +80,7 @@ SET(libqmmpui_DEVEL_HDRS playlistparser.h detailsdialog.h tageditor.h + playlistmanager.h ) diff --git a/src/qmmpui/mediaplayer.cpp b/src/qmmpui/mediaplayer.cpp index 0d47dd257..d50cea3ce 100644 --- a/src/qmmpui/mediaplayer.cpp +++ b/src/qmmpui/mediaplayer.cpp @@ -22,11 +22,7 @@ #include #include #include - -#include -#include "playlistmodel.h" #include "playlistitem.h" - #include "mediaplayer.h" #define MAX_SKIPS 5 @@ -37,7 +33,7 @@ MediaPlayer::MediaPlayer(QObject *parent) : QObject(parent) { m_instance = this; - m_model = 0; + m_pl_manager = 0; m_core = 0; m_skips = 0; m_repeat = FALSE; @@ -47,7 +43,6 @@ MediaPlayer::MediaPlayer(QObject *parent) qApp->installTranslator(translator); } - MediaPlayer::~MediaPlayer() {} @@ -56,20 +51,20 @@ MediaPlayer* MediaPlayer::instance() return m_instance; } -void MediaPlayer::initialize(SoundCore *core, PlayListModel *model) +void MediaPlayer::initialize(SoundCore *core, PlayListManager *pl_manager) { Q_CHECK_PTR(core); - Q_CHECK_PTR(model); + Q_CHECK_PTR(m_pl_manager); m_core = core; - m_model = model; + m_pl_manager = pl_manager; m_repeat = FALSE; connect(m_core, SIGNAL(aboutToFinish()), SLOT(updateNextUrl())); connect(m_core, SIGNAL(finished()), SLOT(next())); } -PlayListModel *MediaPlayer::playListModel() +PlayListManager *MediaPlayer::playListManager() { - return m_model; + return m_pl_manager; } bool MediaPlayer::isRepeatable() const @@ -79,17 +74,17 @@ bool MediaPlayer::isRepeatable() const void MediaPlayer::play() { - m_model->doCurrentVisibleRequest(); + m_pl_manager->currentPlayList()->doCurrentVisibleRequest(); if (m_core->state() == Qmmp::Paused) { m_core->pause(); return; } - if (m_model->count() == 0) + if (m_pl_manager->currentPlayList()->count() == 0) return; - QString s = m_model->currentItem()->url(); + QString s = m_pl_manager->currentPlayList()->currentItem()->url(); if (s.isEmpty()) { m_nextUrl.clear(); @@ -122,11 +117,11 @@ void MediaPlayer::play() break; } qApp->processEvents(); - if (!m_model->isEmptyQueue()) + if (!m_pl_manager->currentPlayList()->isEmptyQueue()) { - m_model->setCurrentToQueued(); + m_pl_manager->currentPlayList()->setCurrentToQueued(); } - else if (!m_model->next()) + else if (!m_pl_manager->currentPlayList()->next()) { stop(); return; @@ -148,11 +143,11 @@ void MediaPlayer::stop() void MediaPlayer::next() { - if (!m_model->isEmptyQueue()) + if (!m_pl_manager->currentPlayList()->isEmptyQueue()) { - m_model->setCurrentToQueued(); + m_pl_manager->currentPlayList()->setCurrentToQueued(); } - else if (!m_model->next()) + else if (!m_pl_manager->currentPlayList()->next()) { stop(); return; @@ -168,7 +163,7 @@ void MediaPlayer::next() void MediaPlayer::previous() { - if (!m_model->previous()) + if (!m_pl_manager->currentPlayList()->previous()) { stop(); return; @@ -200,10 +195,10 @@ void MediaPlayer::setRepeatable(bool r) void MediaPlayer::updateNextUrl() { - if(m_model->nextItem() && !isRepeatable()) + if(m_pl_manager->currentPlayList()->nextItem() && !isRepeatable()) { - m_core->play(m_model->nextItem()->url(), TRUE); - m_nextUrl = m_model->nextItem()->url(); + m_core->play(m_pl_manager->currentPlayList()->nextItem()->url(), TRUE); + m_nextUrl = m_pl_manager->currentPlayList()->nextItem()->url(); qDebug("MediaPlayer: sending next url"); } else diff --git a/src/qmmpui/mediaplayer.h b/src/qmmpui/mediaplayer.h index d0b84fad3..77969542c 100644 --- a/src/qmmpui/mediaplayer.h +++ b/src/qmmpui/mediaplayer.h @@ -21,9 +21,9 @@ #define MEDIAPLAYER_H #include +#include +#include "playlistmanager.h" -class PlayListModel; -class SoundCore; /*! @brief The MediaPlayer class provides a simple way to use SoundCore and PlayListModel together. * @author Ilya Kotov @@ -50,11 +50,11 @@ public: * @param core Pointer to the SoundCore object. * @param model Playlist model */ - void initialize(SoundCore *core, PlayListModel *model); + void initialize(SoundCore *core, PlayListManager *pl_mamager); /*! - * Returns playlist model pointer + * Returns playlist manager pointer */ - PlayListModel *playListModel(); + PlayListManager *playListManager(); /*! * Returns \b true if "Repeate Track" option is enabled, otherwise returns \b false */ @@ -94,7 +94,7 @@ private slots: void updateNextUrl(); private: - PlayListModel *m_model; + PlayListManager *m_pl_manager; SoundCore *m_core; static MediaPlayer* m_instance; bool m_repeat; diff --git a/src/qmmpui/playlistmanager.cpp b/src/qmmpui/playlistmanager.cpp new file mode 100644 index 000000000..f49d72749 --- /dev/null +++ b/src/qmmpui/playlistmanager.cpp @@ -0,0 +1,395 @@ +/*************************************************************************** + * Copyright (C) 2009 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 +#include +#include +#include +#include +#include +#include "playlistsettings.h" +#include "playlistmanager.h" + +PlayListManager::PlayListManager(QObject *parent) : QObject(parent) +{ + m_current = 0; + m_selected = 0; + m_repeatable = FALSE; + m_shuffle = FALSE; + readPlayLists(); +} + +PlayListManager::~PlayListManager() +{ + writePlayLists(); + delete PlaylistSettings::instance(); +} + +PlayListModel *PlayListManager::selectedPlayList() const +{ + return m_selected; +} + +PlayListModel *PlayListManager::currentPlayList() const +{ + return m_current; +} + +QList PlayListManager::playLists() const +{ + return m_models; +} + +QStringList PlayListManager::playListNames() const +{ + QStringList names; + foreach(PlayListModel *model, m_models) + names << model->name(); + return names; +} + +void PlayListManager::selectPlayList(PlayListModel *model) +{ + if(model != m_selected && m_models.contains(model)) + { + PlayListModel *prev = m_selected; + m_selected = model; + emit selectedPlayListChanged(model, prev); + } +} + +void PlayListManager::selectPlayList(int i) +{ + if(i > m_models.count() - 1) + return; + selectPlayList(playListAt(i)); +} + +void PlayListManager::activatePlayList(PlayListModel *model) +{ + if(model != m_current && m_models.contains(model)) + { + PlayListModel *prev = m_current; + m_current = model; + emit currentPlayListChanged(model, prev); + } +} + +PlayListModel *PlayListManager::createPlayList(const QString &name) +{ + PlayListModel *model = new PlayListModel (name.isEmpty() ? tr("Playlist") : name, this); + int i = m_models.indexOf(m_selected); + m_models.insert(i, model); + model->prepareForRepeatablePlaying(m_repeatable); + model->prepareForShufflePlaying(m_shuffle); + emit playListAdded(i); + return model; +} + +void PlayListManager::removePlayList(PlayListModel *model) +{ + if(m_models.count() < 2 || !m_models.contains(model)) + return; + + int i = m_models.indexOf(model); + + if(m_current == model) + activatePlayList(m_models.at(i + (i > 0) ? -1 : 1)); + if(m_selected == model) + selectPlayList(m_models.at(i + (i > 0) ? -1 : 1)); + m_models.removeAt(i); + model->deleteLater(); + emit playListRemoved(i); +} + +void PlayListManager::setRepeatableList(bool r) +{ + if(m_repeatable == r) + return; + m_repeatable = r; + foreach(PlayListModel *model, m_models) + model->prepareForRepeatablePlaying(r); + emit repeatableListChanged(r); +} + +void PlayListManager::setShuffle(bool s) +{ + if(m_shuffle == s) + return; + m_shuffle = s; + foreach(PlayListModel *model, m_models) + model->prepareForShufflePlaying(s); + emit shuffleChanged(s); +} + +int PlayListManager::count() +{ + return m_models.count(); +} + +int PlayListManager::indexOf(PlayListModel *model) +{ + return m_models.indexOf(model); +} + +PlayListModel *PlayListManager::playListAt(int i) +{ + if(i >= 0 || i < m_models.count()) + return m_models.at(i); + return 0; +} + +bool PlayListManager::convertUnderscore() +{ + return PlaylistSettings::instance()->convertUnderscore(); +} + +bool PlayListManager::convertTwenty() +{ + return PlaylistSettings::instance()->convertTwenty(); +} + +bool PlayListManager::useMetadata() +{ + return PlaylistSettings::instance()->useMetadata(); +} + +const QString PlayListManager::format() const +{ + return PlaylistSettings::instance()->format(); +} + +void PlayListManager::setConvertUnderscore(bool yes) +{ + PlaylistSettings::instance()->setConvertUnderscore(yes); + emit settingsChanged(); +} + +void PlayListManager::setConvertTwenty(bool yes) +{ + PlaylistSettings::instance()->setConvertTwenty(yes); + emit settingsChanged(); +} + +void PlayListManager::setUseMetadata(bool yes) +{ + PlaylistSettings::instance()->setUseMetadata(yes); + emit settingsChanged(); +} + +void PlayListManager::setFormat(const QString &format) +{ + PlaylistSettings::instance()->setFormat(format); + emit settingsChanged(); +} + +bool PlayListManager::isRepeatableList() const +{ + return m_repeatable; +} + +bool PlayListManager::isShuffle() const +{ + return m_shuffle; +} + +void PlayListManager::readPlayLists() +{ + QString line, param, value; + int s; + QList infoList; + QFile file(QDir::homePath() +"/.qmmp/playlist.txt"); + file.open(QIODevice::ReadOnly); + QByteArray array = file.readAll(); + file.close(); + QBuffer buffer(&array); + buffer.open(QIODevice::ReadOnly); + + while (!buffer.atEnd()) + { + line = QString::fromUtf8(buffer.readLine()).trimmed(); + if ((s = line.indexOf("=")) < 0) + continue; + + param = line.left(s); + value = line.right(line.size() - s - 1); + + if(param == "playlist") + { + if(!m_models.isEmpty()) + { + foreach(FileInfo *info, infoList) + m_models.last()->add(new PlayListItem(info)); + } + infoList.clear(); + m_models << new PlayListModel(value, this); + } + else if (param == "file") + infoList << new FileInfo(value); + else if (infoList.isEmpty()) + continue; + else if (param == "title") + infoList.last()->setMetaData(Qmmp::TITLE, value); + else if (param == "artist") + infoList.last()->setMetaData(Qmmp::ARTIST, value); + else if (param == "album") + infoList.last()->setMetaData(Qmmp::ALBUM, value); + else if (param == "comment") + infoList.last()->setMetaData(Qmmp::COMMENT, value); + else if (param == "genre") + infoList.last()->setMetaData(Qmmp::GENRE, value); + else if (param == "composer") + infoList.last()->setMetaData(Qmmp::COMPOSER, value); + else if (param == "year") + infoList.last()->setMetaData(Qmmp::YEAR, value); + else if (param == "track") + infoList.last()->setMetaData(Qmmp::TRACK, value); + else if (param == "disc") + infoList.last()->setMetaData(Qmmp::DISCNUMBER, value); + else if (param == "length") + infoList.last()->setLength(value.toInt()); + } + buffer.close(); + if(!m_models.isEmpty()) + { + foreach(FileInfo *info, infoList) + m_models.last()->add(new PlayListItem(info)); + } + else + m_models << new PlayListModel("Default",this); + m_selected = m_models.at(0); + m_current = m_models.at(0); +} + +void PlayListManager::writePlayLists() +{ + QFile file(QDir::homePath() +"/.qmmp/playlist.txt"); + file.open(QIODevice::WriteOnly); + foreach(PlayListModel *model, m_models) + { + QList items = model->items(); + file.write(QString("playlist=%1").arg(model->name()).toUtf8() +"\n"); + foreach(PlayListItem* m, items) + { + file.write(QString("file=%1").arg(m->url()).toUtf8() +"\n"); + file.write(QString("title=%1").arg(m->title()).toUtf8() +"\n"); + file.write(QString("artist=%1").arg(m->artist()).toUtf8() +"\n"); + file.write(QString("album=%1").arg(m->album()).toUtf8() +"\n"); + file.write(QString("comment=%1").arg(m->comment()).toUtf8() +"\n"); + file.write(QString("genre=%1").arg(m->genre()).toUtf8() +"\n"); + file.write(QString("composer=%1").arg(m->composer()).toUtf8() +"\n"); + file.write(QString("year=%1").arg(m->year()).toUtf8() +"\n"); + file.write(QString("track=%1").arg(m->track()).toUtf8() +"\n"); + file.write(QString("disc=%1").arg(m->discNumber()).toUtf8() +"\n"); + file.write(QString("length=%1").arg(m->length()).toUtf8() +"\n"); + } + } + file.close(); +} + +void PlayListManager::clear() +{ + m_selected->clear(); +} + +void PlayListManager::clearSelection() +{ + m_selected->clearSelection(); +} + +void PlayListManager::removeSelected() +{ + m_selected->removeSelected(); +} + +void PlayListManager::removeUnselected() +{ + m_selected->removeUnselected(); +} + +void PlayListManager::removeAt (int i) +{ + m_selected->removeAt(i); +} + +void PlayListManager::removeItem (PlayListItem *item) +{ + m_selected->removeItem(item); +} + +void PlayListManager::invertSelection() +{ + m_selected->invertSelection(); +} + +void PlayListManager::selectAll() +{ + m_selected->selectAll(); +} + +void PlayListManager::showDetails() +{ + m_selected->showDetails(); +} + +void PlayListManager::addFile(const QString &path) +{ + m_selected->addFile(path); +} + +void PlayListManager::addFiles(const QStringList& l) +{ + m_selected->addFiles(l); +} + +void PlayListManager::addDirectory(const QString& dir) +{ + m_selected->addDirectory(dir); +} + +void PlayListManager::randomizeList() +{ + m_selected->randomizeList(); +} + +void PlayListManager::reverseList() +{ + m_selected->reverseList(); +} + +void PlayListManager::sortSelection(int mode) +{ + m_selected->sortSelection(mode); +} + +void PlayListManager::sort(int mode) +{ + m_selected->sort(mode); +} + +void PlayListManager::addToQueue() +{ + m_selected->addToQueue(); +} + +void PlayListManager::clearInvalidItems() +{ + m_selected->clearInvalidItems(); +} diff --git a/src/qmmpui/playlistmanager.h b/src/qmmpui/playlistmanager.h new file mode 100644 index 000000000..d6550e063 --- /dev/null +++ b/src/qmmpui/playlistmanager.h @@ -0,0 +1,200 @@ +/*************************************************************************** + * Copyright (C) 2009 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. * + ***************************************************************************/ +#ifndef PLAYLISTMANAGER_H +#define PLAYLISTMANAGER_H + +#include +#include "playlistmodel.h" + +/*! + * @author Ilya Kotov + */ +class PlayListManager : public QObject +{ +Q_OBJECT +public: + PlayListManager(QObject *parent); + ~PlayListManager(); + + QList playLists() const; + QStringList playListNames() const; + PlayListModel *selectedPlayList() const; + PlayListModel *currentPlayList() const; + int count(); + int indexOf(PlayListModel *model); + PlayListModel *playListAt(int i); + /*! + * Returns state of the "Convert underscores to blanks" option (\b true - enabled, \b false - disabled). + */ + bool convertUnderscore(); + /*! + * Returns state of the "Convert %20 to blanks" option (\b true - enabled, \b false - disabled). + */ + bool convertTwenty(); + /*! + * Returns the state of metadata usage (\b true - use, \b false - not use). + */ + bool useMetadata(); + /*! + * Returns title format string. + */ + const QString format() const; + /*! + * Sets the "Convert underscores to blanks" option state to \b enabled + * @param enabled Option state (\b true - enabled, \b false - disabled) + */ + void setConvertUnderscore(bool enabled); + /*! + * Sets the "Convert %20 to blanks" option state to \b enabled + * @param enabled Option state (\b true - enabled, \b false - disabled) + */ + void setConvertTwenty(bool enabled); + /*! + * Sets metadata usage option state to \b enabled + * @param enabled Option state (\b true - enabled, \b false - disabled) + */ + void setUseMetadata(bool enabled); + /*! + * Sets short title format + * @param format title format. (Expressions: "%p" - artist, "%a" - album, "%t" - title, "%n" - track, + * "%g" - genre, "%c" - comment, "%C" - composer, "%D" - disc number "%f" - file name, " + * %F" - full path, "%y" - year) + */ + void setFormat(const QString &format); + /*! + * Returns state of "Repeat All" option. + */ + bool isRepeatableList() const; + /*! + * Returns state of "Shuffle" option. + */ + bool isShuffle() const; + +signals: + void currentPlayListChanged (PlayListModel *current, PlayListModel *previous); + void selectedPlayListChanged (PlayListModel *selected, PlayListModel *previous); + void playListAdded(int index); + void playListRemoved(int index); + /*! + * Emitted when state of the "Repeat All" option has changed. + * @param state New state of the "Repeat All" option (\b true - enabled, \b false disabled) + */ + void repeatableListChanged(bool state); + /*! + * Emitted when state of the "Shuffle" option has changed. + * @param state New state of the "Shuffle" option (\b true - enabled, \b false disabled) + */ + void shuffleChanged(bool state); + /*! + * Emitted when other settings (format, metadata, etc) have changed. + */ + void settingsChanged(); + +public slots: + void selectPlayList(PlayListModel *model); + void selectPlayList(int index); + void activatePlayList(PlayListModel *model); + PlayListModel *createPlayList(const QString &name = QString()); + void removePlayList(PlayListModel *model); + void setRepeatableList(bool r); + void setShuffle(bool s); + /*! + * This is a convenience function and is the same as calling \b selectedPlayList()->clear() + */ + void clear(); + /*! + * This is a convenience function and is the same as calling \b selectedPlayList()->clearSelection() + */ + void clearSelection(); + /*! + * This is a convenience function and is the same as calling \b selectedPlayList()->removeSelected() + */ + void removeSelected(); + /*! + * This is a convenience function and is the same as calling \b selectedPlayList()->removeUnselected() + */ + void removeUnselected(); + /*! + * This is a convenience function and is the same as calling \b selectedPlayList()->removeAt(i) + */ + void removeAt (int i); + /*! + * This is a convenience function and is the same as calling \b selectedPlayList()->removeItem(item) + */ + void removeItem (PlayListItem *item); + /*! + * This is a convenience function and is the same as calling \b selectedPlayList()->invertSelection() + */ + void invertSelection(); + /*! + * This is a convenience function and is the same as calling \b selectedPlayList()->selectAll() + */ + void selectAll(); + /*! + * This is a convenience function and is the same as calling \b selectedPlayList()->showDetails() + */ + void showDetails(); + /*! + * This is a convenience function and is the same as calling \b selectedPlayList()->addFile(path) + */ + void addFile(const QString &path); + /*! + * This is a convenience function and is the same as calling \b selectedPlayList()->addFiles(l) + */ + void addFiles(const QStringList& l); + /*! + * This is a convenience function and is the same as calling \b selectedPlayList()->addDirectory(dir) + */ + void addDirectory(const QString& dir); + /*! + * This is a convenience function and is the same as calling \b selectedPlayList()->randomizeList() + */ + void randomizeList(); + /*! + * This is a convenience function and is the same as calling \b selectedPlayList()->reverseList() + */ + void reverseList(); + /*! + * This is a convenience function and is the same as calling \b selectedPlayList()->sortSelection(mode) + */ + void sortSelection(int mode); + /*! + * This is a convenience function and is the same as calling \b selectedPlayList()->sort(mode) + */ + void sort(int mode); + /*! + * This is a convenience function and is the same as calling \b selectedPlayList()->addToQueue() + */ + void addToQueue(); + /*! + * This is a convenience function and is the same as calling \b selectedPlayList()->clearInvalidItems() + */ + void clearInvalidItems(); + +private: + void readPlayLists(); + void writePlayLists(); + QList m_models; + PlayListModel *m_current; + PlayListModel *m_selected; + bool m_repeatable, m_shuffle; +}; + +#endif // PLAYLISTMANAGER_H diff --git a/src/qmmpui/playlistmodel.cpp b/src/qmmpui/playlistmodel.cpp index 0f1eda511..c87ad7409 100644 --- a/src/qmmpui/playlistmodel.cpp +++ b/src/qmmpui/playlistmodel.cpp @@ -34,11 +34,12 @@ #include "playlistparser.h" #include "playlistformat.h" #include "fileloader.h" -#include "playlistmodel.h" #include "playlistitem.h" #include "playstate.h" #include "detailsdialog.h" #include "playlistsettings.h" +#include "playlistmodel.h" + #define INVALID_ROW -1 @@ -63,27 +64,22 @@ void TagUpdater::updateTag() } } - -PlayListModel::PlayListModel(QObject *parent) +PlayListModel::PlayListModel(const QString &name, QObject *parent) : QObject(parent) , m_selection() { qsrand(time(0)); + m_name = name; m_shuffle = 0; m_total_length = 0; m_current = 0; - m_block_update_signals = false; is_repeatable_list = false; m_play_state = new NormalPlayState(this); - readSettings(); } PlayListModel::~PlayListModel() { - writeSettings(); clear(); delete m_play_state; - //qDeleteAll(m_registered_pl_formats); - foreach(GuardedFileLoader l,m_running_loaders) { if (!l.isNull()) @@ -92,10 +88,19 @@ PlayListModel::~PlayListModel() l->wait(); } } - delete PlaylistSettings::instance(); } -void PlayListModel::load(PlayListItem *item) +QString PlayListModel::name() const +{ + return m_name; +} + +void PlayListModel::setName(const QString &name) +{ + m_name = name; +} + +void PlayListModel::add(PlayListItem *item) { if (m_items.isEmpty()) m_currentItem = item; @@ -105,9 +110,25 @@ void PlayListModel::load(PlayListItem *item) if (m_items.size() == 1) emit firstAdded(); + m_current = m_items.indexOf(m_currentItem); + emit listChanged(); +} - if (!m_block_update_signals) - emit listChanged(); +void PlayListModel::add(QList items) +{ + if(items.isEmpty()) + return; + if (m_items.isEmpty()) + m_currentItem = items.at(0); + + foreach(PlayListItem *item, items) + m_total_length += item->length(); + m_items.append(items); + + if (m_items.size() == items.size()) + emit firstAdded(); + m_current = m_items.indexOf(m_currentItem); + emit listChanged(); } int PlayListModel::count() @@ -117,10 +138,7 @@ int PlayListModel::count() PlayListItem* PlayListModel::currentItem() { - if (m_items.isEmpty()) - return 0; - else - return m_items.at(qMin(m_items.size() - 1, m_current)); + return m_items.isEmpty() ? 0 : m_items.at(qMin(m_items.size() - 1, m_current)); } PlayListItem* PlayListModel::nextItem() @@ -153,12 +171,10 @@ bool PlayListModel::setCurrent(int c) return TRUE; } - bool PlayListModel::next() { if (isFileLoaderRunning()) m_play_state->prepare(); - return m_play_state->next(); } @@ -166,8 +182,7 @@ bool PlayListModel::previous() { if (isFileLoaderRunning()) m_play_state->prepare(); - - return m_play_state->previous();//) + return m_play_state->previous(); } void PlayListModel::clear() @@ -362,89 +377,6 @@ void PlayListModel::showDetails() } } -void PlayListModel::readSettings() -{ - QSettings settings(Qmmp::configFile(), QSettings::IniFormat); - m_current = settings.value("Playlist/current",0).toInt(); - - QString line, param, value; - int s; - QList infoList; - QFile file(QDir::homePath() +"/.qmmp/playlist.txt"); - file.open(QIODevice::ReadOnly); - QByteArray array = file.readAll(); - file.close(); - QBuffer buffer(&array); - buffer.open(QIODevice::ReadOnly); - while (!buffer.atEnd()) - { - line = QString::fromUtf8(buffer.readLine()).trimmed(); - if ((s = line.indexOf("=")) < 0) - continue; - - param = line.left(s); - value = line.right(line.size() - s - 1); - - if (param == "file") - infoList << new FileInfo(value); - else if (infoList.isEmpty()) - continue; - else if (param == "title") - infoList.last()->setMetaData(Qmmp::TITLE, value); - else if (param == "artist") - infoList.last()->setMetaData(Qmmp::ARTIST, value); - else if (param == "album") - infoList.last()->setMetaData(Qmmp::ALBUM, value); - else if (param == "comment") - infoList.last()->setMetaData(Qmmp::COMMENT, value); - else if (param == "genre") - infoList.last()->setMetaData(Qmmp::GENRE, value); - else if (param == "composer") - infoList.last()->setMetaData(Qmmp::COMPOSER, value); - else if (param == "year") - infoList.last()->setMetaData(Qmmp::YEAR, value); - else if (param == "track") - infoList.last()->setMetaData(Qmmp::TRACK, value); - else if (param == "disc") - infoList.last()->setMetaData(Qmmp::DISCNUMBER, value); - else if (param == "length") - infoList.last()->setLength(value.toInt()); - } - buffer.close(); - if (m_current > infoList.count() - 1) - m_current = 0; - m_block_update_signals = TRUE; - foreach(FileInfo *info, infoList) - load(new PlayListItem(info)); - m_block_update_signals = FALSE; - if(!m_items.isEmpty()) - m_currentItem = m_items.at(m_current); - doCurrentVisibleRequest(); -} - -void PlayListModel::writeSettings() -{ - QFile file(QDir::homePath() +"/.qmmp/playlist.txt"); - file.open(QIODevice::WriteOnly); - foreach(PlayListItem* m, m_items) - { - file.write(QString("file=%1").arg(m->url()).toUtf8() +"\n"); - file.write(QString("title=%1").arg(m->title()).toUtf8() +"\n"); - file.write(QString("artist=%1").arg(m->artist()).toUtf8() +"\n"); - file.write(QString("album=%1").arg(m->album()).toUtf8() +"\n"); - file.write(QString("comment=%1").arg(m->comment()).toUtf8() +"\n"); - file.write(QString("genre=%1").arg(m->genre()).toUtf8() +"\n"); - file.write(QString("composer=%1").arg(m->composer()).toUtf8() +"\n"); - file.write(QString("year=%1").arg(m->year()).toUtf8() +"\n"); - file.write(QString("track=%1").arg(m->track()).toUtf8() +"\n"); - file.write(QString("disc=%1").arg(m->discNumber()).toUtf8() +"\n"); - file.write(QString("length=%1").arg(m->length()).toUtf8() +"\n"); - } - file.close(); - QSettings settings(Qmmp::configFile(), QSettings::IniFormat); - settings.setValue("Playlist/current", m_current); -} - void PlayListModel::addFile(const QString& path) { if (path.isEmpty()) @@ -452,7 +384,7 @@ void PlayListModel::addFile(const QString& path) QList playList = MetaDataManager::instance()->createPlayList(path, PlaylistSettings::instance()->useMetadata()); foreach(FileInfo *info, playList) - emit load(new PlayListItem(info)); + add(new PlayListItem(info)); m_play_state->prepare(); } @@ -462,7 +394,7 @@ FileLoader * PlayListModel::createFileLoader() FileLoader* f_loader = new FileLoader(this); // f_loader->setStackSize(20 * 1024 * 1024); m_running_loaders << f_loader; - connect(f_loader,SIGNAL(newPlayListItem(PlayListItem*)),this,SLOT(load(PlayListItem*)),Qt::QueuedConnection); + connect(f_loader,SIGNAL(newPlayListItem(PlayListItem*)), SLOT(add(PlayListItem*)),Qt::QueuedConnection); connect(f_loader,SIGNAL(finished()),this,SLOT(preparePlayState())); connect(f_loader,SIGNAL(finished()),f_loader,SLOT(deleteLater())); return f_loader; @@ -583,8 +515,6 @@ void PlayListModel::moveItems(int from, int to) } } - - int PlayListModel::topmostInSelection(int row) { if (row == 0) @@ -654,14 +584,7 @@ void PlayListModel::addToQueue() { QList selected_items = getSelectedItems(); foreach(PlayListItem* file,selected_items) - {/* - if(isQueued(file)) - m_queued_songs.removeAt(m_queued_songs.indexOf(file)); - else - m_queued_songs.append(file); - */ setQueued(file); - } emit listChanged(); } @@ -671,7 +594,6 @@ void PlayListModel::setQueued(PlayListItem* file) m_queued_songs.removeAt(m_queued_songs.indexOf(file)); else m_queued_songs.append(file); - emit listChanged(); } @@ -885,14 +807,11 @@ void PlayListModel::prepareForShufflePlaying(bool val) m_play_state = new NormalPlayState(this); m_shuffle = val; - - emit shuffleChanged(val); } void PlayListModel::prepareForRepeatablePlaying(bool val) { is_repeatable_list = val; - emit repeatableListChanged(val); } void PlayListModel::doCurrentVisibleRequest() @@ -901,13 +820,6 @@ void PlayListModel::doCurrentVisibleRequest() emit listChanged(); } -void PlayListModel::setUpdatesEnabled(bool yes) -{ - m_block_update_signals = !yes; - if (yes) - emit listChanged(); -} - void PlayListModel::loadPlaylist(const QString &f_name) { PlaylistFormat* prs = PlaylistParser::instance()->findByPath(f_name); @@ -975,50 +887,6 @@ void PlayListModel::preparePlayState() m_play_state->prepare(); } -bool PlayListModel::convertUnderscore() -{ - return PlaylistSettings::instance()->convertUnderscore(); -} - -bool PlayListModel::convertTwenty() -{ - return PlaylistSettings::instance()->convertTwenty(); -} - -bool PlayListModel::useMetadata() -{ - return PlaylistSettings::instance()->useMetadata(); -} - -const QString PlayListModel::format() const -{ - return PlaylistSettings::instance()->format(); -} - -void PlayListModel::setConvertUnderscore(bool yes) -{ - PlaylistSettings::instance()->setConvertUnderscore(yes); - emit settingsChanged(); -} - -void PlayListModel::setConvertTwenty(bool yes) -{ - PlaylistSettings::instance()->setConvertTwenty(yes); - emit settingsChanged(); -} - -void PlayListModel::setUseMetadata(bool yes) -{ - PlaylistSettings::instance()->setUseMetadata(yes); - emit settingsChanged(); -} - -void PlayListModel::setFormat(const QString &format) -{ - PlaylistSettings::instance()->setFormat(format); - emit settingsChanged(); -} - void PlayListModel::clearInvalidItems() { foreach(PlayListItem *item, m_items) diff --git a/src/qmmpui/playlistmodel.h b/src/qmmpui/playlistmodel.h index 8e945da57..834d38f1f 100644 --- a/src/qmmpui/playlistmodel.h +++ b/src/qmmpui/playlistmodel.h @@ -26,6 +26,7 @@ #include #include #include +#include "playlistitem.h" class FileLoader; class PlayListItem; @@ -102,11 +103,14 @@ public: * Constructs a playlist model. * @param parent QObject parent */ - PlayListModel(QObject *parent = 0); + PlayListModel(const QString &name, QObject *parent = 0); /*! * Object destructor. */ ~PlayListModel(); + + QString name() const; + void setName(const QString &name); /*! * Returns number of items. */ @@ -201,15 +205,15 @@ public: /*! * Returns list with selected rows indexes. */ - QList getSelectedRows()const; + QList getSelectedRows() const; /*! * Returns list of \b PlayListItem pointers that are selected. */ - QList getSelectedItems()const; + QList getSelectedItems() const; /*! * Returns list of all \b PlayListItem pointers. */ - QList items()const + QList items() const { return m_items; } @@ -232,7 +236,6 @@ public: * Loads playlist with \b f_name name. */ void loadPlaylist(const QString& f_name); - /*! * Saves current songs to the playlist with \b f_name name. */ @@ -272,26 +275,17 @@ signals: * Emitted when first item has added. */ void firstAdded(); - /*! - * Emitted when state of the "Repeat All" option has changed. - * @param state New state of the "Repeat All" option (\b true - enabled, \b false disabled) - */ - void repeatableListChanged(bool state); - /*! - * Emitted when state of the "Shuffle" option has changed. - * @param state New state of the "Shuffle" option (\b true - enabled, \b false disabled) - */ - void shuffleChanged(bool state); - /*! - * Emitted when other settings (format, metadata, etc) have changed. - */ - void settingsChanged(); public slots: /*! * Adds \b item to the playlist. */ - void load(PlayListItem *item); + void add(PlayListItem *item); + /*! + * Adds a list of items to the playlist. + * @param items List of items + */ + void add(QList items); /*! * Removes all items. */ @@ -386,44 +380,6 @@ public slots: * Sets \b f media file to queue. */ void setQueued(PlayListItem* f); - /*! - * Returns state of the "Convert underscores to blanks" option (\b true - enabled, \b false - disabled). - */ - bool convertUnderscore(); - /*! - * Returns state of the "Convert %20 to blanks" option (\b true - enabled, \b false - disabled). - */ - bool convertTwenty(); - /*! - * Returns the state of metadata usage (\b true - use, \b false - not use). - */ - bool useMetadata(); - /*! - * Returns title format string. - */ - const QString format() const; - /*! - * Sets the "Convert underscores to blanks" option state to \b enabled - * @param enabled Option state (\b true - enabled, \b false - disabled) - */ - void setConvertUnderscore(bool enabled); - /*! - * Sets the "Convert %20 to blanks" option state to \b enabled - * @param enabled Option state (\b true - enabled, \b false - disabled) - */ - void setConvertTwenty(bool enabled); - /*! - * Sets metadata usage option state to \b enabled - * @param enabled Option state (\b true - enabled, \b false - disabled) - */ - void setUseMetadata(bool enabled); - /*! - * Sets short title format - * @param format title format. (Expressions: "%p" - artist, "%a" - album, "%t" - title, "%n" - track, - * "%g" - genre, "%c" - comment, "%C" - composer, "%D" - disc number "%f" - file name, " - * %F" - full path, "%y" - year) - */ - void setFormat(const QString &format); /*! * Removes invalid items from playlist */ @@ -465,13 +421,6 @@ private: QList m_editing_items; PlayListItem* m_currentItem; int m_current; - void readSettings(); - void writeSettings(); - void setUpdatesEnabled(bool); - bool updatesEnabled()const - { - return !m_block_update_signals; - } /*! * This flyweight object represents current selection. */ @@ -488,7 +437,6 @@ private: * Current playing state (Normal or Shuffle) */ PlayState* m_play_state; - bool m_block_update_signals; int m_total_length; typedef QPointer GuardedFileLoader; /*! @@ -498,6 +446,7 @@ private: */ QVector m_running_loaders; bool m_shuffle; + QString m_name; }; diff --git a/src/qmmpui/qmmpui.pro b/src/qmmpui/qmmpui.pro index ea0cb623b..e3096c8cc 100644 --- a/src/qmmpui/qmmpui.pro +++ b/src/qmmpui/qmmpui.pro @@ -36,7 +36,8 @@ HEADERS += general.h \ mediaplayer.h \ playlistsettings.h \ detailsdialog.h \ - tageditor.h + tageditor.h \ + playlistmanager.h SOURCES += general.cpp \ generalhandler.cpp \ playlistparser.cpp \ @@ -51,7 +52,8 @@ SOURCES += general.cpp \ mediaplayer.cpp \ playlistsettings.cpp \ detailsdialog.cpp \ - tageditor.cpp + tageditor.cpp \ + playlistmanager.cpp FORMS += detailsdialog.ui \ tageditor.ui unix:DESTDIR = . diff --git a/src/qmmpui/translations/libqmmpui_cs.ts b/src/qmmpui/translations/libqmmpui_cs.ts index ea9a4dfa7..5ba850bf1 100644 --- a/src/qmmpui/translations/libqmmpui_cs.ts +++ b/src/qmmpui/translations/libqmmpui_cs.ts @@ -68,6 +68,14 @@ p, li { white-space: pre-wrap; } + + PlayListManager + + + Playlist + + + QtFileDialogFactory diff --git a/src/qmmpui/translations/libqmmpui_de.ts b/src/qmmpui/translations/libqmmpui_de.ts index fd71c68ab..3fba815bb 100644 --- a/src/qmmpui/translations/libqmmpui_de.ts +++ b/src/qmmpui/translations/libqmmpui_de.ts @@ -72,6 +72,14 @@ p, li { white-space: pre-wrap; } <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> + + PlayListManager + + + Playlist + + + QtFileDialogFactory diff --git a/src/qmmpui/translations/libqmmpui_it.ts b/src/qmmpui/translations/libqmmpui_it.ts index 9f2776e71..4fd497a3f 100644 --- a/src/qmmpui/translations/libqmmpui_it.ts +++ b/src/qmmpui/translations/libqmmpui_it.ts @@ -68,6 +68,14 @@ p, li { white-space: pre-wrap; } + + PlayListManager + + + Playlist + + + QtFileDialogFactory diff --git a/src/qmmpui/translations/libqmmpui_lt.ts b/src/qmmpui/translations/libqmmpui_lt.ts index 05e6cbb63..106a1e353 100644 --- a/src/qmmpui/translations/libqmmpui_lt.ts +++ b/src/qmmpui/translations/libqmmpui_lt.ts @@ -68,6 +68,14 @@ p, li { white-space: pre-wrap; } + + PlayListManager + + + Playlist + + + QtFileDialogFactory diff --git a/src/qmmpui/translations/libqmmpui_pl.ts b/src/qmmpui/translations/libqmmpui_pl.ts index 505d60a25..6e1b6ccb9 100644 --- a/src/qmmpui/translations/libqmmpui_pl.ts +++ b/src/qmmpui/translations/libqmmpui_pl.ts @@ -68,6 +68,14 @@ p, li { white-space: pre-wrap; } + + PlayListManager + + + Playlist + + + QtFileDialogFactory diff --git a/src/qmmpui/translations/libqmmpui_pt_BR.ts b/src/qmmpui/translations/libqmmpui_pt_BR.ts index b6a6c4c31..160f36849 100644 --- a/src/qmmpui/translations/libqmmpui_pt_BR.ts +++ b/src/qmmpui/translations/libqmmpui_pt_BR.ts @@ -68,6 +68,14 @@ p, li { white-space: pre-wrap; } + + PlayListManager + + + Playlist + + + QtFileDialogFactory diff --git a/src/qmmpui/translations/libqmmpui_ru.ts b/src/qmmpui/translations/libqmmpui_ru.ts index 3708ba4f0..ad4b32096 100644 --- a/src/qmmpui/translations/libqmmpui_ru.ts +++ b/src/qmmpui/translations/libqmmpui_ru.ts @@ -68,6 +68,14 @@ p, li { white-space: pre-wrap; } + + PlayListManager + + + Playlist + + + QtFileDialogFactory diff --git a/src/qmmpui/translations/libqmmpui_tr.ts b/src/qmmpui/translations/libqmmpui_tr.ts index 06ce067a6..167aad31b 100644 --- a/src/qmmpui/translations/libqmmpui_tr.ts +++ b/src/qmmpui/translations/libqmmpui_tr.ts @@ -68,6 +68,14 @@ p, li { white-space: pre-wrap; } + + PlayListManager + + + Playlist + + + QtFileDialogFactory diff --git a/src/qmmpui/translations/libqmmpui_uk_UA.ts b/src/qmmpui/translations/libqmmpui_uk_UA.ts index bc68cd376..57771a6fb 100644 --- a/src/qmmpui/translations/libqmmpui_uk_UA.ts +++ b/src/qmmpui/translations/libqmmpui_uk_UA.ts @@ -68,6 +68,14 @@ p, li { white-space: pre-wrap; } + + PlayListManager + + + Playlist + + + QtFileDialogFactory diff --git a/src/qmmpui/translations/libqmmpui_zh_CN.ts b/src/qmmpui/translations/libqmmpui_zh_CN.ts index 257d42b9a..3ef670ebf 100644 --- a/src/qmmpui/translations/libqmmpui_zh_CN.ts +++ b/src/qmmpui/translations/libqmmpui_zh_CN.ts @@ -68,6 +68,14 @@ p, li { white-space: pre-wrap; } + + PlayListManager + + + Playlist + + + QtFileDialogFactory diff --git a/src/qmmpui/translations/libqmmpui_zh_TW.ts b/src/qmmpui/translations/libqmmpui_zh_TW.ts index 3cbe3c90c..8b3b6a60a 100644 --- a/src/qmmpui/translations/libqmmpui_zh_TW.ts +++ b/src/qmmpui/translations/libqmmpui_zh_TW.ts @@ -68,6 +68,14 @@ p, li { white-space: pre-wrap; } + + PlayListManager + + + Playlist + + + QtFileDialogFactory diff --git a/src/ui/configdialog.cpp b/src/ui/configdialog.cpp index 068a9010c..a468cd28c 100644 --- a/src/ui/configdialog.cpp +++ b/src/ui/configdialog.cpp @@ -105,10 +105,10 @@ void ConfigDialog::readSettings() QSettings settings (Qmmp::configFile(), QSettings::IniFormat); if (MediaPlayer *player = MediaPlayer::instance()) { - ui.formatLineEdit->setText(player->playListModel()->format()); - ui.metadataCheckBox->setChecked(player->playListModel()->useMetadata()); - ui.underscoresCheckBox->setChecked(player->playListModel()->convertUnderscore()); - ui.per20CheckBox->setChecked(player->playListModel()->convertTwenty()); + ui.formatLineEdit->setText(player->playListManager()->format()); + ui.metadataCheckBox->setChecked(player->playListManager()->useMetadata()); + ui.underscoresCheckBox->setChecked(player->playListManager()->convertUnderscore()); + ui.per20CheckBox->setChecked(player->playListManager()->convertTwenty()); } ui.protocolCheckBox->setChecked(settings.value ("PlayList/show_protocol", FALSE).toBool()); ui.numbersCheckBox->setChecked(settings.value ("PlayList/show_numbers", TRUE).toBool()); @@ -607,10 +607,10 @@ void ConfigDialog::saveSettings() QSettings settings (Qmmp::configFile(), QSettings::IniFormat); if (MediaPlayer *player = MediaPlayer::instance()) { - player->playListModel()->setFormat(ui.formatLineEdit->text().trimmed()); - player->playListModel()->setUseMetadata(ui.metadataCheckBox->isChecked()); - player->playListModel()->setConvertUnderscore(ui.underscoresCheckBox->isChecked()); - player->playListModel()->setConvertTwenty(ui.per20CheckBox->isChecked()); + player->playListManager()->setFormat(ui.formatLineEdit->text().trimmed()); + player->playListManager()->setUseMetadata(ui.metadataCheckBox->isChecked()); + player->playListManager()->setConvertUnderscore(ui.underscoresCheckBox->isChecked()); + player->playListManager()->setConvertTwenty(ui.per20CheckBox->isChecked()); } settings.setValue ("PlayList/show_protocol", ui.protocolCheckBox->isChecked()); settings.setValue ("PlayList/show_numbers", ui.numbersCheckBox->isChecked()); diff --git a/src/ui/display.cpp b/src/ui/display.cpp index 58cb78e7c..fab49fbf9 100644 --- a/src/ui/display.cpp +++ b/src/ui/display.cpp @@ -114,9 +114,9 @@ MainDisplay::MainDisplay (QWidget *parent) connect(m_core, SIGNAL(stateChanged(Qmmp::State)), SLOT(setState(Qmmp::State))); connect(m_core, SIGNAL(volumeChanged(int,int)), SLOT(setVolume(int, int))); connect(m_core, SIGNAL(elapsedChanged(qint64)),m_titlebar, SLOT(setTime(qint64))); - PlayListModel *model = MediaPlayer::instance()->playListModel(); + /*PlayListModel *model = MediaPlayer::instance()->playListModel(); connect(model, SIGNAL(repeatableListChanged(bool)), m_repeatButton, SLOT(setON(bool))); - connect(model, SIGNAL(shuffleChanged(bool)), m_shuffleButton, SLOT(setON(bool))); + connect(model, SIGNAL(shuffleChanged(bool)), m_shuffleButton, SLOT(setON(bool)));*/ updatePositions(); updateMask(); } diff --git a/src/ui/jumptotrackdialog.cpp b/src/ui/jumptotrackdialog.cpp index 6c9343170..0cad6ecfd 100644 --- a/src/ui/jumptotrackdialog.cpp +++ b/src/ui/jumptotrackdialog.cpp @@ -19,19 +19,19 @@ ***************************************************************************/ #include "jumptotrackdialog.h" -#include +#include #include #include #include #include -JumpToTrackDialog::JumpToTrackDialog(QWidget* parent, Qt::WFlags fl) - : QDialog( parent, fl ) +JumpToTrackDialog::JumpToTrackDialog(PlayListManager *manager, QWidget* parent) + : QDialog (parent) { setupUi(this); setAttribute(Qt::WA_QuitOnClose, FALSE); - m_playListModel = 0; + m_pl_manager = manager; m_listModel = new QStringListModel(this); m_proxyModel = new QSortFilterProxyModel; @@ -76,8 +76,8 @@ void JumpToTrackDialog::on_queuePushButton_clicked() if (!mi_list.isEmpty()) { int selected = (m_proxyModel->mapToSource(mi_list.at(0))).row(); - m_playListModel->setQueued(m_playListModel->item(selected)); - if (m_playListModel->isQueued(m_playListModel->item(selected))) + m_pl_manager->selectedPlayList()->setQueued(m_pl_manager->selectedPlayList()->item(selected)); + if (m_pl_manager->selectedPlayList()->isQueued(m_pl_manager->selectedPlayList()->item(selected))) queuePushButton->setText(tr("Unqueue")); else queuePushButton->setText(tr("Queue")); @@ -96,16 +96,11 @@ void JumpToTrackDialog::on_jumpToPushButton_clicked() void JumpToTrackDialog::refresh() { filterLineEdit->clear(); - QStringList titles = m_playListModel->getTitles(0,m_playListModel->count()); + QStringList titles = m_pl_manager->selectedPlayList()->getTitles(0, m_pl_manager->selectedPlayList()->count()); m_listModel->setStringList(titles); filterLineEdit->setFocus(); } -void JumpToTrackDialog::setModel(PlayListModel * model) -{ - m_playListModel = model; -} - void JumpToTrackDialog::on_filterLineEdit_textChanged(const QString &str) { m_proxyModel->setFilterFixedString(str); @@ -126,14 +121,14 @@ void JumpToTrackDialog::on_filterLineEdit_returnPressed () void JumpToTrackDialog::jumpTo(const QModelIndex & index) { int selected = (m_proxyModel->mapToSource(index)).row(); - m_playListModel->setCurrent(selected); + m_pl_manager->selectedPlayList()->setCurrent(selected); emit playRequest(); } void JumpToTrackDialog::queueUnqueue(const QModelIndex& curr,const QModelIndex&) { int row = m_proxyModel->mapToSource(curr).row(); - if (m_playListModel->isQueued(m_playListModel->item(row))) + if (m_pl_manager->selectedPlayList()->isQueued(m_pl_manager->selectedPlayList()->item(row))) queuePushButton->setText(tr("Unqueue")); else queuePushButton->setText(tr("Queue")); diff --git a/src/ui/jumptotrackdialog.h b/src/ui/jumptotrackdialog.h index fb4cf301e..56f95a177 100644 --- a/src/ui/jumptotrackdialog.h +++ b/src/ui/jumptotrackdialog.h @@ -24,24 +24,22 @@ #include #include "ui_jumptotrackdialog.h" -/** - @author Vladimir Kuznetsov - */ - class QStringListModel; -class PlayListModel; class QSortFilterProxyModel; +class PlayListManager; - +/** + @author Vladimir Kuznetsov + */ class JumpToTrackDialog : public QDialog, private Ui::JumpToTrackDialog { Q_OBJECT public: - JumpToTrackDialog(QWidget* parent = 0, Qt::WFlags fl = 0 ); + JumpToTrackDialog(PlayListManager *manager, QWidget* parent = 0); ~JumpToTrackDialog(); - void setModel(PlayListModel* model); void refresh(); + protected slots: void on_closePushButton_clicked(); void on_refreshPushButton_clicked(); @@ -51,12 +49,14 @@ protected slots: void on_filterLineEdit_returnPressed (); void jumpTo(const QModelIndex&); void queueUnqueue(const QModelIndex&,const QModelIndex&); + signals: void playRequest(); + private: - PlayListModel* m_playListModel; QStringListModel* m_listModel; QSortFilterProxyModel* m_proxyModel; + PlayListManager *m_pl_manager; }; #endif diff --git a/src/ui/keyboardmanager.cpp b/src/ui/keyboardmanager.cpp index 8a6853b85..024f12bae 100644 --- a/src/ui/keyboardmanager.cpp +++ b/src/ui/keyboardmanager.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2006 by Ilya Kotov * + * Copyright (C) 2006-2009 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -20,9 +20,7 @@ #include - #include - #include "playlist.h" #include "listwidget.h" #include "keyboardmanager.h" @@ -72,14 +70,9 @@ bool KeyboardManager::handleKeyRelease (QKeyEvent*) return FALSE; } -void KeyboardManager::setModel (PlayListModel *m) -{ - m_playListModel = m; -} - void KeyboardManager::keyUp (QKeyEvent * ke) { - QList rows = m_playListModel->getSelectedRows(); + QList rows = m_playlist->listWidget()->model()->getSelectedRows(); ListWidget* list_widget = m_playlist->listWidget(); if (rows.count() > 0) @@ -89,7 +82,7 @@ void KeyboardManager::keyUp (QKeyEvent * ke) if (! (ke->modifiers() & Qt::ShiftModifier || ke->modifiers() & Qt::AltModifier)) { - m_playListModel->clearSelection(); + m_playlist->listWidget()->model()->clearSelection(); list_widget->setAnchorRow(-1); } @@ -109,22 +102,22 @@ void KeyboardManager::keyUp (QKeyEvent * ke) { if (ke->modifiers() == Qt::AltModifier) { - m_playListModel->moveItems (rows[0],rows[0] - 1); + m_playlist->listWidget()->model()->moveItems (rows[0],rows[0] - 1); list_widget->setAnchorRow (list_widget->getAnchorRow() - 1); } else { if (rows.last() > list_widget->getAnchorRow() && ke->modifiers() & Qt::ShiftModifier) { - m_playListModel->setSelected (rows.last(),false); + m_playlist->listWidget()->model()->setSelected (rows.last(),false); } else if (rows[0] > 0) { - m_playListModel->setSelected (rows[0] - 1,true); + m_playlist->listWidget()->model()->setSelected (rows[0] - 1,true); } else { - m_playListModel->setSelected (rows[0],true); + m_playlist->listWidget()->model()->setSelected (rows[0],true); if(list_widget->getAnchorRow() == -1) list_widget->setAnchorRow(rows[0]); } @@ -135,11 +128,11 @@ void KeyboardManager::keyUp (QKeyEvent * ke) } else { - m_playListModel->setSelected (list_widget->firstVisibleRow(),true); + m_playlist->listWidget()->model()->setSelected (list_widget->firstVisibleRow(),true); list_widget->setAnchorRow(list_widget->firstVisibleRow()); } - rows = m_playListModel->getSelectedRows(); + rows = m_playlist->listWidget()->model()->getSelectedRows(); if (rows[0] < list_widget->firstVisibleRow() && list_widget->firstVisibleRow() > 0) { @@ -154,20 +147,20 @@ void KeyboardManager::keyUp (QKeyEvent * ke) { //if(list_widget->getAnchorRow() == -1) list_widget->setAnchorRow(list_widget->firstVisibleRow()); - m_playListModel->setSelected (list_widget->firstVisibleRow(),true); + m_playlist->listWidget()->model()->setSelected (list_widget->firstVisibleRow(),true); } } void KeyboardManager::keyDown (QKeyEvent * ke) { - QList rows = m_playListModel->getSelectedRows(); + QList rows = m_playlist->listWidget()->model()->getSelectedRows(); ListWidget* list_widget = m_playlist->listWidget(); //qWarning("count: %d",rows.count()); if (rows.count() > 0) { if (! (ke->modifiers() & Qt::ShiftModifier || ke->modifiers() & Qt::AltModifier)) { - m_playListModel->clearSelection(); + m_playlist->listWidget()->model()->clearSelection(); list_widget->setAnchorRow(-1); } @@ -187,37 +180,37 @@ void KeyboardManager::keyDown (QKeyEvent * ke) { if (ke->modifiers() == Qt::AltModifier) { - m_playListModel->moveItems (rows.last(),rows.last() + 1); + m_playlist->listWidget()->model()->moveItems (rows.last(),rows.last() + 1); list_widget->setAnchorRow (list_widget->getAnchorRow() + 1); } else { //qWarning("list_widget %d",list_widget->getAnchorRow()); - //qWarning("model count: %d rows.last(): %d",m_playListModel->count(),rows.last()); + //qWarning("model count: %d rows.last(): %d",m_playlist->listWidget()->model()->count(),rows.last()); if (rows[0] < list_widget->getAnchorRow() && ke->modifiers() & Qt::ShiftModifier) - m_playListModel->setSelected (rows[0],false); - else if (rows.last() < m_playListModel->count() - 1) + m_playlist->listWidget()->model()->setSelected (rows[0],false); + else if (rows.last() < m_playlist->listWidget()->model()->count() - 1) { - m_playListModel->setSelected (rows.last() + 1,true); + m_playlist->listWidget()->model()->setSelected (rows.last() + 1,true); } else { - m_playListModel->setSelected (rows.last(),true); + m_playlist->listWidget()->model()->setSelected (rows.last(),true); if(list_widget->getAnchorRow() == -1) list_widget->setAnchorRow(rows.last()); } - if (! (ke->modifiers() & Qt::ShiftModifier) && rows.last() < m_playListModel->count() - 1) + if (! (ke->modifiers() & Qt::ShiftModifier) && rows.last() < m_playlist->listWidget()->model()->count() - 1) list_widget->setAnchorRow (rows.last() + 1); } } else { - m_playListModel->setSelected (list_widget->firstVisibleRow(),true); + m_playlist->listWidget()->model()->setSelected (list_widget->firstVisibleRow(),true); list_widget->setAnchorRow(list_widget->firstVisibleRow()); } - rows = m_playListModel->getSelectedRows(); + rows = m_playlist->listWidget()->model()->getSelectedRows(); if (!rows.isEmpty() && rows.last() >= list_widget->visibleRows() + list_widget->firstVisibleRow()) { @@ -231,7 +224,7 @@ void KeyboardManager::keyDown (QKeyEvent * ke) } else { - m_playListModel->setSelected (list_widget->firstVisibleRow(),true); + m_playlist->listWidget()->model()->setSelected (list_widget->firstVisibleRow(),true); //if(list_widget->getAnchorRow() == -1) list_widget->setAnchorRow(list_widget->firstVisibleRow()); } @@ -249,18 +242,18 @@ void KeyboardManager::keyPgDown (QKeyEvent *) { ListWidget* list_widget = m_playlist->listWidget(); int page_size = list_widget->visibleRows(); - int offset = (list_widget->firstVisibleRow() +page_size < m_playListModel->count()) ? - list_widget->firstVisibleRow() +page_size:m_playListModel->count() - 1; + int offset = (list_widget->firstVisibleRow() +page_size < m_playlist->listWidget()->model()->count()) ? + list_widget->firstVisibleRow() +page_size:m_playlist->listWidget()->model()->count() - 1; list_widget->scroll (offset); } void KeyboardManager::keyEnter (QKeyEvent *) { - QList rows = m_playListModel->getSelectedRows(); + QList rows = m_playlist->listWidget()->model()->getSelectedRows(); MainWindow* mw = qobject_cast (m_playlist->parentWidget()); if (mw && rows.count() > 0) { - m_playListModel->setCurrent (rows[0]); + m_playlist->listWidget()->model()->setCurrent (rows[0]); mw->replay(); } } @@ -271,17 +264,17 @@ void KeyboardManager::keyHome(QKeyEvent *ke) m_playlist->listWidget()->scroll (0); if(ke->modifiers() & Qt::ShiftModifier) for(int i = 0; i <= list_widget->getAnchorRow(); ++i) - m_playListModel->setSelected (i,true); + m_playlist->listWidget()->model()->setSelected (i,true); } void KeyboardManager::keyEnd(QKeyEvent *ke) { ListWidget* list_widget = m_playlist->listWidget(); int page_size = list_widget->visibleRows(); - int scroll_to = m_playListModel->count() - page_size; + int scroll_to = m_playlist->listWidget()->model()->count() - page_size; if(scroll_to >= 0) list_widget->scroll(scroll_to); if(ke->modifiers() & Qt::ShiftModifier) - for(int i = list_widget->getAnchorRow(); i < m_playListModel->count(); ++i) - m_playListModel->setSelected (i,true); + for(int i = list_widget->getAnchorRow(); i < m_playlist->listWidget()->model()->count(); ++i) + m_playlist->listWidget()->model()->setSelected (i,true); } diff --git a/src/ui/keyboardmanager.h b/src/ui/keyboardmanager.h index 791a93334..73fa1bd53 100644 --- a/src/ui/keyboardmanager.h +++ b/src/ui/keyboardmanager.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2006 by Ilya Kotov * + * Copyright (C) 2006-2009 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -23,7 +23,6 @@ #define _KEYBOARDMANAGER_H class PlayList; -class PlayListModel; class QKeyEvent; @@ -52,10 +51,6 @@ class KeyboardManager */ bool handleKeyRelease (QKeyEvent*); - /*! - * Inits the \b KeyboardManager object with data model. - */ - void setModel (PlayListModel*); protected: void keyUp (QKeyEvent* ke); void keyDown (QKeyEvent* ke); @@ -66,7 +61,6 @@ class KeyboardManager void keyEnd(QKeyEvent* ke); private: PlayList* m_playlist; - PlayListModel* m_playListModel; }; #endif diff --git a/src/ui/listwidget.cpp b/src/ui/listwidget.cpp index 6a56d4218..2a80fb421 100644 --- a/src/ui/listwidget.cpp +++ b/src/ui/listwidget.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2006-2008 by Ilya Kotov * + * Copyright (C) 2006-2009 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -27,11 +27,9 @@ #include #include #include - #include #include #include - #include "textscroller.h" #include "listwidget.h" #include "skin.h" @@ -71,7 +69,6 @@ void ListWidget::readSettings() m_show_protocol = settings.value ("PlayList/show_protocol", FALSE).toBool(); m_show_number = settings.value ("PlayList/show_numbers", TRUE).toBool(); - if (m_update) { delete m_metrics; @@ -179,19 +176,11 @@ void ListWidget::mousePressEvent(QMouseEvent *e) if (m_pressed_row > m_anchor_row) { - //int upper_selected = m_model->firstSelectedUpper(m_anchor_row); - //if (INVALID_ROW != upper_selected) - //{ - /*for (int j = upper_selected;j < m_anchor_row;j++) - { - m_model->setSelected(j, false); - }*/ m_model->clearSelection(); for (int j = m_anchor_row;j <= m_pressed_row;j++) { m_model->setSelected(j, true); } - //} } else { @@ -201,27 +190,6 @@ void ListWidget::mousePressEvent(QMouseEvent *e) m_model->setSelected(j, true); } } - - /* - int upper_selected = m_model->firstSelectedUpper(row); - int lower_selected = m_model->firstSelectedLower(row); - if (INVALID_ROW != upper_selected) - { - for (int j = upper_selected;j <= row;j++) - { - m_model->setSelected(j, true); - } - } - else if (INVALID_ROW != lower_selected) - { - for (int j = row;j <= lower_selected;j++) - { - m_model->setSelected(j, true); - } - } - else - m_model->setSelected(row, true); - */ } else { @@ -324,9 +292,11 @@ void ListWidget::updateList() update(); } -void ListWidget::setModel(PlayListModel *model) +void ListWidget::setModel(PlayListModel *selected, PlayListModel *previous) { - m_model = model; + if(previous) + disconnect(previous, 0, this, 0); //disconnect previous model + m_model = selected; connect (m_model, SIGNAL(listChanged()), SLOT(updateList())); connect (m_model, SIGNAL(currentChanged()), SLOT(recenterCurrent())); updateList(); @@ -464,7 +434,6 @@ int ListWidget::rowAt(int y) const return INVALID_ROW; } - void ListWidget::contextMenuEvent(QContextMenuEvent * event) { if (menu()) diff --git a/src/ui/listwidget.h b/src/ui/listwidget.h index df3889593..15e657c62 100644 --- a/src/ui/listwidget.h +++ b/src/ui/listwidget.h @@ -46,7 +46,6 @@ public: ~ListWidget(); - void setModel(PlayListModel *); void readSettings(); /*! * Returns count of currently visible rows. @@ -74,15 +73,24 @@ public: m_anchor_row = r; } + QMenu *menu() + { + return m_menu; + } + + PlayListModel *model() + { + Q_ASSERT(!m_model); + return m_model; + } + + public slots: void updateList(); void scroll(int); //0-99 void recenterCurrent(); + void setModel(PlayListModel *selected, PlayListModel *previous = 0); - QMenu *menu() - { - return m_menu; - } signals: void selectionChanged(); diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index ae23f58b0..4f021d725 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2006-2009 by Ilya Kotov m * + * Copyright (C) 2006-2009 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -22,6 +22,7 @@ #include #include #include +#include #include @@ -35,6 +36,7 @@ #include #include #include +#include #include #include "textscroller.h" @@ -58,10 +60,8 @@ MainWindow::MainWindow(const QStringList& args, BuiltinCommandLineOption* option : QMainWindow(parent) { m_vis = 0; - seeking = FALSE; m_update = FALSE; m_paused = FALSE; - m_playlistName = tr("Default"); m_option_manager = option_manager; setWindowIcon(QIcon(":/32x32/qmmp.png")); #if QT_VERSION >= 0x040500 @@ -69,14 +69,13 @@ MainWindow::MainWindow(const QStringList& args, BuiltinCommandLineOption* option #else setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint); #endif - //setFixedSize (275,116); setWindowTitle("Qmmp"); //prepare libqmmp and libqmmpui libraries for playing m_player = new MediaPlayer(this); m_core = new SoundCore(this); - m_playListModel = new PlayListModel(this); - m_player->initialize(m_core, m_playListModel); + m_pl_manager = new PlayListManager(this); + m_player->initialize(m_core, m_pl_manager); //additional featuries new PlaylistParser(this); m_generalHandler = new GeneralHandler(this); @@ -90,15 +89,13 @@ MainWindow::MainWindow(const QStringList& args, BuiltinCommandLineOption* option setCentralWidget(m_display); m_display->setFocus (); - m_playlist = new PlayList(this); - m_playlist->setModel(m_playListModel); + 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(this); - m_jumpDialog->setModel(m_playListModel); + m_jumpDialog = new JumpToTrackDialog(m_pl_manager, this); m_jumpDialog->hide(); createActions(); @@ -113,22 +110,19 @@ MainWindow::MainWindow(const QStringList& args, BuiltinCommandLineOption* option 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(newPlaylist()),SLOT(newPlaylist())); connect (m_playlist,SIGNAL(loadPlaylist()),SLOT(loadPlaylist())); connect (m_playlist,SIGNAL(savePlaylist()),SLOT(savePlaylist())); - connect(m_display,SIGNAL(shuffleToggled(bool)),m_playListModel,SLOT(prepareForShufflePlaying(bool))); - connect(m_display,SIGNAL(repeatableToggled(bool)),m_playListModel,SLOT(prepareForRepeatablePlaying(bool))); + 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_equalizer, SIGNAL(valueChanged()), SLOT(updateEQ())); - connect(m_jumpDialog,SIGNAL(playRequest()),this,SLOT(play())); + 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_core, SIGNAL(bufferingProgress(int)), TextScroller::getPointer(), - SLOT(setProgress(int))); - + connect(m_core, SIGNAL(bufferingProgress(int)), TextScroller::getPointer(), SLOT(setProgress(int))); connect(m_generalHandler, SIGNAL(toggleVisibilityCalled()), SLOT(toggleVisibility())); connect(m_generalHandler, SIGNAL(exitCalled()), SLOT(close())); @@ -136,7 +130,7 @@ MainWindow::MainWindow(const QStringList& args, BuiltinCommandLineOption* option m_display->setEQ(m_equalizer); m_display->setPL(m_playlist); dock->updateDock(); - m_playListModel->doCurrentVisibleRequest(); + m_pl_manager->currentPlayList()->doCurrentVisibleRequest(); updateEQ(); #ifndef Q_OS_WIN32 QString cwd = QDir::currentPath(); @@ -148,9 +142,7 @@ MainWindow::MainWindow(const QStringList& args, BuiltinCommandLineOption* option MainWindow::~MainWindow() -{ - //stop(); -} +{} void MainWindow::play() { @@ -160,16 +152,15 @@ void MainWindow::play() void MainWindow::replay() { stop(); + m_pl_manager->activatePlayList(m_pl_manager->selectedPlayList()); play(); } void MainWindow::seek(qint64 pos) { - if (!seeking) - m_core->seek(pos); + m_core->seek(pos); } - void MainWindow::forward() { seek(m_core->elapsed() + KEY_OFFSET); @@ -217,12 +208,12 @@ void MainWindow::updateEQ() void MainWindow::showState(Qmmp::State state) { - disconnect(m_playListModel, SIGNAL(firstAdded()), this, SLOT(play())); + //disconnect(m_playListModel, SIGNAL(firstAdded()), this, SLOT(play())); switch ((int) state) { case Qmmp::Playing: - if (m_playListModel->currentItem()) - m_equalizer->loadPreset(m_playListModel->currentItem()->url().section("/",-1)); + if (m_pl_manager->currentPlayList()->currentItem()) + m_equalizer->loadPreset(m_pl_manager->currentPlayList()->currentItem()->url().section("/",-1)); if (m_playlist->listWidget()) m_playlist->listWidget()->updateList(); //removes progress message from TextScroller break; @@ -237,6 +228,7 @@ void MainWindow::showState(Qmmp::State state) break; } } + void MainWindow::showMetaData() { qDebug("===== metadata ======"); @@ -270,7 +262,7 @@ void MainWindow::closeEvent (QCloseEvent *) void MainWindow::addDir() { FileDialog::popup(this, FileDialog::AddDirs, &m_lastDir, - m_playListModel, SLOT(addFileList(const QStringList&)), + m_pl_manager->selectedPlayList(), SLOT(addFileList(const QStringList&)), tr("Choose a directory")); } @@ -281,25 +273,10 @@ void MainWindow::addFile() MetaDataManager::instance()->nameFilters().join (" ") +")"; filters << MetaDataManager::instance()->filters(); FileDialog::popup(this, FileDialog::AddDirsFiles, &m_lastDir, - m_playListModel, SLOT(addFileList(const QStringList&)), + m_pl_manager->selectedPlayList(), SLOT(addFileList(const QStringList&)), tr("Select one or more files to open"), filters.join(";;")); } -void MainWindow::clear() -{ - m_playListModel->clear(); -} - -void MainWindow::startSeek() -{ - seeking = TRUE; -} - -void MainWindow::endSeek() -{ - seeking = FALSE; -} - void MainWindow::changeEvent (QEvent * event) { if (event->type() == QEvent::ActivationChange) @@ -328,14 +305,11 @@ void MainWindow::readSettings() bool val = settings.value("Playlist/repeatable",FALSE).toBool(); // Repeat/Shuffle - m_playListModel->prepareForRepeatablePlaying(val); + m_pl_manager->setRepeatableList(val); m_display->setIsRepeatable(val); val = settings.value("Playlist/shuffle",FALSE).toBool(); m_display->setIsShuffle(val); - m_playListModel->prepareForShufflePlaying(val); - - // Playlist name - m_playlistName = settings.value("Playlist/playlist_name","Default").toString(); + m_pl_manager->setShuffle(val); m_update = TRUE; } @@ -363,8 +337,6 @@ void MainWindow::writeSettings() settings.setValue("repeatable",m_display->isRepeatable()); settings.setValue("shuffle",m_display->isShuffle()); - // Playlist name - settings.setValue("playlist_name",m_playlistName); settings.endGroup(); } @@ -376,7 +348,6 @@ void MainWindow::showSettings() readSettings(); m_playlist->readSettings(); TextScroller::getPointer()->readSettings(); - //m_core->updateConfig(); m_visMenu->updateActions(); m_skin->reloadSkin(); Dock::instance()->updateDock(); @@ -433,12 +404,12 @@ void MainWindow::createActions() repeateAllAction->setShortcut(tr("R")) ; repeateTrackAction->setShortcut(tr("Ctrl+R")) ; shuffleAction->setShortcut(tr("S")) ; - connect(repeateAllAction, SIGNAL(triggered (bool)), m_playListModel, SLOT(prepareForRepeatablePlaying(bool))); + connect(repeateAllAction, SIGNAL(triggered (bool)), m_pl_manager, SLOT(setRepeatableList(bool))); connect(repeateTrackAction, SIGNAL(triggered (bool)), m_player, SLOT(setRepeatable(bool))); - connect(shuffleAction, SIGNAL(triggered (bool)), m_playListModel, SLOT(prepareForShufflePlaying(bool))); - connect(m_playListModel, SIGNAL(repeatableListChanged(bool)), repeateAllAction, SLOT(setChecked(bool))); + connect(shuffleAction, SIGNAL(triggered (bool)), m_pl_manager, SLOT(setShuffle(bool))); + connect(m_pl_manager, SIGNAL(repeatableListChanged(bool)), repeateAllAction, SLOT(setChecked(bool))); connect(m_player, SIGNAL (repeatableChanged(bool)), repeateTrackAction, SLOT(setChecked(bool))); - connect(m_playListModel, SIGNAL(shuffleChanged(bool)), shuffleAction, SLOT(setChecked(bool))); + connect(m_pl_manager, SIGNAL(shuffleChanged(bool)), shuffleAction, SLOT(setChecked(bool))); m_mainMenu->addSeparator(); m_mainMenu->addAction(tr("&Jump To File"),this, SLOT(jumpToFile()), tr("J")); m_mainMenu->addSeparator(); @@ -477,12 +448,6 @@ QMenu* MainWindow::menu() return m_mainMenu; } -void MainWindow::newPlaylist() -{ - m_playListModel->clear(); - m_playlistName = tr("Default"); -} - void MainWindow::loadPlaylist() { QStringList l; @@ -497,9 +462,9 @@ void MainWindow::loadPlaylist() QString f_name = FileDialog::getOpenFileName(this,tr("Open Playlist"),m_lastDir,mask); if (!f_name.isEmpty()) { - m_playListModel->clear(); - m_playListModel->loadPlaylist(f_name); - m_playlistName = QFileInfo(f_name).baseName(); + 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(); } } @@ -520,12 +485,11 @@ void MainWindow::savePlaylist() QString mask = tr("Playlist Files")+" (" + l.join(" *.").prepend("*.") + ")"; QString f_name = FileDialog::getSaveFileName(this, tr("Save Playlist"),m_lastDir + "/" + - m_playlistName + "." + l[0],mask); + m_pl_manager->selectedPlayList()->name() + "." + l[0],mask); if (!f_name.isEmpty()) { - m_playListModel->savePlaylist(f_name); - m_playlistName = QFileInfo(f_name).baseName(); + m_pl_manager->selectedPlayList()->savePlaylist(f_name); m_lastDir = QFileInfo(f_name).absoluteDir().path(); } } @@ -538,12 +502,12 @@ void MainWindow::setFileList(const QStringList & l) if (m_core->state() == Qmmp::Playing || m_core->state() == Qmmp::Paused) stop(); qApp->processEvents(); //receive stop signal - connect(m_playListModel, SIGNAL(firstAdded()), this, SLOT(play())); - if (!m_playListModel->setFileList(l)) + //connect(m_playListModel, SIGNAL(firstAdded()), this, SLOT(play())); + /*if (!m_playListModel->setFileList(l)) { disconnect(m_playListModel, SIGNAL(firstAdded()), this, SLOT(play())); addFile(); - } + }*/ } void MainWindow::playPause() @@ -572,7 +536,7 @@ bool MainWindow::processCommandArgs(const QStringList &slist,const QString& cwd) else full_path_list << cwd + "/" + slist.at(i); } - m_playListModel->addFileList(full_path_list); //TODO url support + m_pl_manager->currentPlayList()->addFileList(full_path_list); //TODO url support } else if (str.startsWith("-")) // is it a command? { @@ -618,7 +582,7 @@ void MainWindow::handleCloseRequest() void MainWindow::addUrl() { - AddUrlDialog::popup(this,m_playListModel); + AddUrlDialog::popup(this, m_pl_manager->currentPlayList()); } SoundCore * MainWindow::soundCore() const diff --git a/src/ui/mainwindow.h b/src/ui/mainwindow.h index bb6c49001..42d3d7d77 100644 --- a/src/ui/mainwindow.h +++ b/src/ui/mainwindow.h @@ -34,7 +34,7 @@ @author Ilya Kotov */ class PlayList; -class PlayListModel; +class PlayListManager; class ConfigDialog; class EqWidget; class MainVisual; @@ -82,23 +82,19 @@ public slots: void addFile(); void addUrl(); - void newPlaylist(); void loadPlaylist(); void savePlaylist(); void setFileList(const QStringList&); protected: - virtual void closeEvent ( QCloseEvent *); - virtual void changeEvent ( QEvent * event ); - virtual void keyPressEvent ( QKeyEvent* ); + virtual void closeEvent (QCloseEvent *); + virtual void changeEvent (QEvent *event); + virtual void keyPressEvent (QKeyEvent* ); private slots: void showState(Qmmp::State state); void showMetaData(); - void clear(); - void startSeek(); - void endSeek(); void showSettings(); void updateEQ(); void forward(); @@ -110,12 +106,11 @@ private: void readSettings(); void writeSettings(); void createActions(); - bool seeking; SoundCore *m_core; QMenu *m_mainMenu; MainDisplay *m_display; PlayList *m_playlist; - PlayListModel *m_playListModel; + PlayListManager *m_pl_manager; ConfigDialog *m_confDialog; int m_preamp; EqWidget *m_equalizer; @@ -127,7 +122,6 @@ private: bool m_paused; bool m_showToolTip; Skin *m_skin; - QString m_playlistName; JumpToTrackDialog* m_jumpDialog; bool m_hideOnClose, m_startHidden; VisualMenu *m_visMenu; diff --git a/src/ui/playlist.cpp b/src/ui/playlist.cpp index 6471bf6ed..296d26d5e 100644 --- a/src/ui/playlist.cpp +++ b/src/ui/playlist.cpp @@ -41,18 +41,19 @@ #include #include +#include #include #include #include -PlayList::PlayList (QWidget *parent) +PlayList::PlayList (PlayListManager *manager, QWidget *parent) : QWidget (parent) { + m_pl_manager = manager; m_update = FALSE; m_resize = FALSE; m_skin = Skin::instance(); m_ratio = m_skin->ratio(); - createMenus(); m_shaded = FALSE; resize (275*m_ratio, 116*m_ratio); @@ -76,6 +77,7 @@ PlayList::PlayList (QWidget *parent) m_current_time = new SymbolDisplay (this,6); m_keyboardManager = new KeyboardManager (this); + m_pl_actions = new QActionGroup (this); connect (m_listWidget, SIGNAL (selectionChanged()), parent, SLOT (replay())); @@ -95,16 +97,29 @@ PlayList::PlayList (QWidget *parent) 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(); } - PlayList::~PlayList() -{} +{ + delete m_keyboardManager; +} void PlayList::updatePositions() { @@ -168,29 +183,27 @@ void PlayList::createActions() 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); + connect (remSelAct, SIGNAL (triggered()), m_pl_manager, SLOT (removeSelected ())); + 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 ())); + connect (remAllAct, SIGNAL (triggered()), m_pl_manager, 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 ())); + connect (remUnselAct, SIGNAL (triggered()), m_pl_manager, SLOT (removeUnselected ())); m_subMenu->addSeparator(); - m_subMenu->addAction (tr("Remove unavailable files"), m_playListModel, SLOT(clearInvalidItems())); + m_subMenu->addAction (tr("Remove unavailable files"), m_pl_manager, SLOT(clearInvalidItems())); //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 ())); + connect (detailsAct, SIGNAL (triggered()), m_pl_manager, SLOT (showDetails ())); // sort menu m_sortMenu->addAction (detailsAct); @@ -227,8 +240,7 @@ void PlayList::createActions() connect (trackAct, SIGNAL (triggered (bool)), signalMapper, SLOT (map())); signalMapper->setMapping (trackAct, PlayListModel::TRACK); - connect (signalMapper, SIGNAL (mapped (int)), - m_playListModel, SLOT (sort (int))); + connect (signalMapper, SIGNAL (mapped (int)), m_pl_manager, SLOT (sort (int))); m_sortMenu->addMenu (sort_mode_menu); @@ -262,14 +274,13 @@ void PlayList::createActions() connect (trackAct, SIGNAL (triggered (bool)), signalMapper, SLOT (map())); signalMapper->setMapping (trackAct, PlayListModel::TRACK); - connect (signalMapper, SIGNAL (mapped (int)), - m_playListModel, SLOT (sortSelection (int))); + connect (signalMapper, SIGNAL (mapped (int)), m_pl_manager, 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_sortMenu->addAction (tr ("Randomize List"),m_pl_manager,SLOT (randomizeList())); + m_sortMenu->addAction (tr ("Reverse List"),m_pl_manager,SLOT (reverseList())); m_listWidget->menu()->addSeparator(); m_listWidget->menu()->addActions (m_subMenu->actions().mid(0,3)); //use 3 first actions @@ -277,38 +288,39 @@ void PlayList::createActions() tr("Actions"), this)); m_listWidget->menu()->addSeparator(); - m_listWidget->menu()->addAction(tr("&Queue"),m_playListModel, SLOT(addToQueue()), tr("Q")); + m_listWidget->menu()->addAction(tr("&Queue"),m_pl_manager, SLOT(addToQueue()), tr("Q")); m_actions << m_listWidget->menu()->actions(); //select menu QAction *invSelAct = new QAction (tr ("Invert Selection"),this); m_selectMenu->addAction (invSelAct); - connect (invSelAct, SIGNAL (triggered()), - m_playListModel, SLOT (invertSelection ())); + connect (invSelAct, SIGNAL (triggered()), m_pl_manager, SLOT (invertSelection ())); m_selectMenu->addSeparator(); QAction *selNoneAct = new QAction (tr ("&Select None"),this); - //selNoneAct->setShortcut(tr("Ctrl+Shift+A")); + selNoneAct->setShortcut(tr("Shift+A")); m_selectMenu->addAction (selNoneAct); - connect (selNoneAct, SIGNAL (triggered()), - m_playListModel, SLOT (clearSelection ())); + connect (selNoneAct, SIGNAL (triggered()), m_pl_manager, SLOT (clearSelection ())); this->addAction (selNoneAct); QAction *selAllAct = new QAction (tr ("&Select All"),this); selAllAct->setShortcut (tr ("Ctrl+A")); m_actions << selAllAct; m_selectMenu->addAction (selAllAct); - connect (selAllAct, SIGNAL (triggered()), - m_playListModel, SLOT (selectAll ())); - //this->addAction (selAllAct); + connect (selAllAct, SIGNAL (triggered()), m_pl_manager, SLOT (selectAll ())); -// Playlist Menu + // 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())); + connect (newListAct, SIGNAL (triggered()), m_pl_manager, SLOT (createPlayList())); + QAction *deleteListAct = new QAction (tr ("&Delete List"),this); + deleteListAct->setShortcut (tr ("Shift+D")); + m_actions << deleteListAct; + m_playlistMenu->addAction (deleteListAct); + connect (deleteListAct, SIGNAL (triggered()), SLOT (deletePlaylist())); m_playlistMenu->addSeparator(); QAction *loadListAct = new QAction (tr ("&Load List"),this); @@ -322,8 +334,19 @@ void PlayList::createActions() m_actions << saveListAct; m_playlistMenu->addAction (saveListAct); connect (saveListAct, SIGNAL (triggered()), this, SIGNAL (savePlaylist())); - //this->addActions (m_playlistMenu->actions()); - + //plalists + m_playlistMenu->addSeparator(); + foreach(QString name, m_pl_manager->playListNames()) + { + QAction *pl = new QAction(name, this); + pl->setCheckable(TRUE); + m_playlistMenu->addAction (pl); + m_pl_actions->addAction(pl); + } + m_pl_actions->actions().at(m_pl_manager->indexOf(m_pl_manager->currentPlayList()))->setChecked(TRUE); + connect(m_pl_actions, SIGNAL(triggered(QAction*)), SLOT(select(QAction*))); + connect(m_pl_manager, SIGNAL(playListAdded(int)), SLOT(addModel(int))); + connect(m_pl_manager, SIGNAL(playListRemoved(int)), SLOT(removeModel(int))); Dock::instance()->addActions (m_actions); } @@ -375,6 +398,7 @@ void PlayList::mousePressEvent (QMouseEvent *e) else m_resize = FALSE; } + void PlayList::mouseMoveEvent (QMouseEvent *e) { if (m_resize) @@ -396,6 +420,7 @@ void PlayList::mouseMoveEvent (QMouseEvent *e) #endif } } + void PlayList::mouseReleaseEvent (QMouseEvent *) { setCursor (m_skin->getCursor (Skin::CUR_PNORMAL)); @@ -404,14 +429,6 @@ void PlayList::mouseReleaseEvent (QMouseEvent *) m_resize = FALSE; Dock::instance()->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) { @@ -442,7 +459,6 @@ void PlayList::readSettings() settings.endGroup(); m_update = TRUE; } - } void PlayList::writeSettings() @@ -496,14 +512,12 @@ void PlayList::setTime(qint64 time) m_current_time->display (formatTime (time/1000)); m_current_time->update(); - if (m_playListModel && SoundCore::instance()) + if (SoundCore::instance()) { - m_playListModel->totalLength(); - QString str_length = formatTime (m_playListModel->totalLength()) + + QString str_length = formatTime (m_pl_manager->currentPlayList()->totalLength()) + "/" + formatTime (SoundCore::instance()->totalTime()/1000); m_length_totalLength->display (str_length); m_length_totalLength->update(); - } } @@ -515,7 +529,7 @@ void PlayList::updateList() PlayListItem *PlayList::currentItem() { - return m_playListModel ? m_playListModel->currentItem() : 0; + return m_pl_manager->currentPlayList()->currentItem(); } void PlayList::showPlaylistMenu() @@ -537,6 +551,45 @@ void PlayList::updateSkin() setMinimalMode(m_shaded); } +void PlayList::select(QAction *a) +{ + int i = m_pl_actions->actions().indexOf(a); + m_pl_manager->selectPlayList(i); +} + +void PlayList::addModel(int i) +{ + QList actions = m_pl_actions->actions(); + foreach(QAction *a, actions) //clear action group + { + m_pl_actions->removeAction(a); + m_playlistMenu->removeAction (a); + } + QAction *new_action = new QAction(m_pl_manager->playListNames().at(i), this); + new_action->setCheckable(TRUE); + actions.insert(i, new_action); + foreach(QAction *a, actions) + { + m_pl_actions->addAction(a); + m_playlistMenu->addAction (a); + } + m_pl_actions->actions().at(m_pl_manager->indexOf(m_pl_manager->currentPlayList()))->setChecked(TRUE); +} + +void PlayList::removeModel(int i) +{ + QAction *a = m_pl_actions->actions().at(i); + m_pl_actions->removeAction(a); + m_playlistMenu->removeAction (a); + a->deleteLater(); + m_pl_actions->actions().at(m_pl_manager->indexOf(m_pl_manager->currentPlayList()))->setChecked(TRUE); +} + +void PlayList::deletePlaylist() +{ + m_pl_manager->removePlayList(m_pl_manager->selectedPlayList()); +} + void PlayList::setMinimalMode(bool b) { if(!m_shaded) diff --git a/src/ui/playlist.h b/src/ui/playlist.h index 2d17a59d4..4b58b0048 100644 --- a/src/ui/playlist.h +++ b/src/ui/playlist.h @@ -23,6 +23,7 @@ #include class QMenu; +class QActionGroup; class Skin; class ListWidget; class PlayListItem; @@ -36,6 +37,7 @@ class OutputState; class PixmapWidget; class PlaylistControl; class KeyboardManager; +class PlayListManager; /** @@ -45,11 +47,10 @@ class PlayList : public QWidget { Q_OBJECT public: - PlayList (QWidget *parent = 0); + PlayList (PlayListManager *manager, QWidget *parent = 0); ~PlayList(); void load (PlayListItem *); - void setModel (PlayListModel *); void readSettings(); PlayListItem *currentItem(); ListWidget* listWidget() const @@ -67,7 +68,6 @@ class PlayList : public QWidget void eject(); void loadPlaylist(); void savePlaylist(); - void newPlaylist(); void closed(); public slots: @@ -81,7 +81,10 @@ class PlayList : public QWidget void showSortMenu(); void showPlaylistMenu(); void updateSkin(); - + void select(QAction *a); //selects playlist with action + void addModel(int i); + void removeModel(int i); + void deletePlaylist(); private: void updatePositions(); @@ -108,7 +111,6 @@ class PlayList : public QWidget Skin *m_skin; ListWidget *m_listWidget; - PlayListModel *m_playListModel; PlayListTitleBar *m_titleBar; PlayListSlider *m_plslider; QList m_actions; @@ -118,7 +120,9 @@ class PlayList : public QWidget int m_ratio; int m_height; bool m_shaded; + PlayListManager *m_pl_manager; KeyboardManager* m_keyboardManager; + QActionGroup *m_pl_actions; protected: virtual void paintEvent (QPaintEvent *); diff --git a/src/ui/playlisttitlebar.cpp b/src/ui/playlisttitlebar.cpp index 6104ff0e6..8646f1192 100644 --- a/src/ui/playlisttitlebar.cpp +++ b/src/ui/playlisttitlebar.cpp @@ -194,10 +194,13 @@ void PlayListTitleBar::setActive(bool a) } -void PlayListTitleBar::setModel(PlayListModel *model) +void PlayListTitleBar::setModel(PlayListModel *selected, PlayListModel *previous) { - m_model = model; + if(previous) + disconnect(previous, 0, this, 0); //disconnect previous model + m_model = selected; connect (m_model, SIGNAL(listChanged()), SLOT(showCurrent())); + showCurrent(); } void PlayListTitleBar::readSettings() diff --git a/src/ui/playlisttitlebar.h b/src/ui/playlisttitlebar.h index cde01c3c6..745aab446 100644 --- a/src/ui/playlisttitlebar.h +++ b/src/ui/playlisttitlebar.h @@ -37,15 +37,13 @@ class PlayListTitleBar : public PixmapWidget Q_OBJECT public: PlayListTitleBar(QWidget *parent = 0); - ~PlayListTitleBar(); - void setActive(bool); - void setModel(PlayListModel *model); void readSettings(); public slots: void showCurrent(); + void setModel(PlayListModel *selected, PlayListModel *previous = 0); private slots: void updateSkin(); diff --git a/src/ui/translations/qmmp_cs.ts b/src/ui/translations/qmmp_cs.ts index dd4aa1171..4c73fe409 100644 --- a/src/ui/translations/qmmp_cs.ts +++ b/src/ui/translations/qmmp_cs.ts @@ -615,14 +615,14 @@ JumpToTrackDialog - + Unqueue Vyřadit - + Queue Zařadit @@ -851,174 +851,168 @@ MainWindow - - - Default - Seznam - - - + Choose a directory Výběr adresáře - + Select one or more files to open Vyberte jeden či více souborů k otevření - + &Play Pře&hrát - + X X - + &Pause Pau&za - + C C - + &Stop &Stop - + V V - + &Previous &Předchozí - + Z Z - + &Next &Další - + B B - + &Jump To File Přeskočit na soubo&r - + J J - + &Settings &Nastavení - + Ctrl+P Ctrl+P - + &About O &aplikaci - + &Exit U&končit - + Ctrl+Q Ctrl+Q - - + + Playlist Files Seznamy skladeb - + Open Playlist Načíst seznam skladeb - + Save Playlist Uložit seznam skladeb - + Space Mezerník - + &About Qt O knihovně &Qt - + &Play/Pause &Přehrát/Pauza - + All Supported Bitstreams Všechny podporované formáty - + &Repeat Track &Opakovat stopu - + &Shuffle Za&míchat - + R O - + Ctrl+R Ctrl+R - + S M - + &Repeat Playlist &Opakovat seznam skladeb - + Tools Nástroje @@ -1026,194 +1020,209 @@ PlayList - + &Add File Přidat &soubor - + F F - + &Add Directory Přidat &adresář - + D D - + &Remove Selected &Odstranit vybrané - + Del Del - + &Remove All Odstranit &vše - + &Remove Unselected Odstranit &nevybrané - + Remove unavailable files Odstranit nedostupné soubory - + &View Track Details Zobrazit &informace o skladbě - + Alt+I Alt+I - + Sort List Seřadit seznam - - + + By Title Podle názvu skladby - - + + By Album - - + + By Artist - - + + By Filename Podle názvu souboru - - + + By Path + Filename Podle cesty a názvu souboru - - + + By Date Podle data - + Sort Selection Seřadit výběr - + Randomize List Zamíchat seznam - + Reverse List Obrátit pořadí seznamu - + Invert Selection Invertovat výběr - + &Select None &Zrušit výběr - + + Shift+A + + + + &Select All &Vybrat vše - + Ctrl+A Ctrl+A - + &New List &Nový seznam - + Shift+N Shift+N - + + &Delete List + + + + + Shift+D + + + + &Load List Načíst &seznam - + O O - + &Save List &Uložit seznam - + Shift+S Shift+S - + &Add Url Přidat &URL - + U U - - + + By Track Number Podle čísla skladby - + &Queue &Fronta - + Q Q - + Actions Činnosti diff --git a/src/ui/translations/qmmp_de.ts b/src/ui/translations/qmmp_de.ts index 625da29b6..5824c12c6 100644 --- a/src/ui/translations/qmmp_de.ts +++ b/src/ui/translations/qmmp_de.ts @@ -615,14 +615,14 @@ JumpToTrackDialog - + Unqueue Aus Warteschlange entfernen - + Queue In Warteschlange @@ -851,174 +851,168 @@ MainWindow - - - Default - Standard - - - + Choose a directory Verzeichnis wählen - + Select one or more files to open Dateien hinzufügen - + &Play &Wiedergabe - + X X - + &Pause &Pause - + C C - + &Stop &Stopp - + V V - + &Previous &Vorheriger Titel - + Z Z - + &Next &Nächster Titel - + B B - + &Jump To File Springe zu &Titel - + J J - + &Settings &Einstellungen - + Ctrl+P Strg+P - + &About Ü&ber - + &Exit Be&enden - + Ctrl+Q Strg+Q - - + + Playlist Files Wiedergabelisten - + Open Playlist Wiedergabeliste öffnen - + Save Playlist Wiedergabeliste speichern - + Space Leertaste - + &About Qt Übe&r Qt - + &Play/Pause Wieder&gabe/Pause - + All Supported Bitstreams Alle unterstützten Formate - + &Repeat Track Tite&l wiederholen - + &Shuffle &Zufallswiedergabe - + R R - + Ctrl+R Strg+R - + S S - + &Repeat Playlist W&iedergabeliste wiederholen - + Tools Werkzeuge @@ -1026,194 +1020,209 @@ PlayList - + &Add File &Datei hinzufügen - + F F - + &Add Directory &Verzeichnis hinzufügen - + D D - + &Remove Selected &Ausgewählte entfernen - + Del Entf - + &Remove All Alle &entfernen - + &Remove Unselected &Nicht ausgewählte entfernen - + Remove unavailable files Nichtverfügbare Dateien entfernen - + &View Track Details &Titeldetails anzeigen - + Alt+I Alt+I - + Sort List Wiedergabeliste sortieren - - + + By Title Nach Titel - - + + By Album - - + + By Artist - - + + By Filename Nach Dateinamen - - + + By Path + Filename Nach Pfad + Dateinamen - - + + By Date Nach Datum - + Sort Selection Auswahl sortieren - + Randomize List Wiedergabeliste mischen - + Reverse List Wiedergabeliste umkehren - + Invert Selection Auswahl umkehren - + &Select None &Auswahl aufheben - + + Shift+A + + + + &Select All Alle aus&wählen - + Ctrl+A Strg+A - + &New List &Neue Wiedergabeliste - + Shift+N Umschalt+N - + + &Delete List + + + + + Shift+D + + + + &Load List Wiedergabeliste &laden - + O O - + &Save List Wiedergabeliste &speichern - + Shift+S Umschalt+S - + &Add Url &URL hinzufügen - + U U - - + + By Track Number Nach Titelnummer - + &Queue &Warteschlange - + Q Q - + Actions Aktionen diff --git a/src/ui/translations/qmmp_it.ts b/src/ui/translations/qmmp_it.ts index de478172c..2448f7930 100644 --- a/src/ui/translations/qmmp_it.ts +++ b/src/ui/translations/qmmp_it.ts @@ -615,14 +615,14 @@ JumpToTrackDialog - + Unqueue Elimna dalla coda - + Queue Metti in coda @@ -851,174 +851,168 @@ MainWindow - - - Default - Défault - - - + Choose a directory Scegliere una cartella - + Select one or more files to open Seleziona uno o più brani da aprire - + &Play &Esegui - + X X - + &Pause &Pausa - + C C - + &Stop &Arresta - + V V - + &Previous &Precedente - + Z Z - + &Next &Successivo - + B B - + &Jump To File &Vai al brano - + J J - + &Settings &Configurazione - + Ctrl+P Ctrl+P - + &Exit &Esci - + Ctrl+Q Ctrl+Q - + Open Playlist Apri lista di brani - + Save Playlist Salva lista di brani - + &About &Informazioni - - + + Playlist Files Brani della lista - + Space Spazio - + &About Qt &Informazioni su Qt - + &Play/Pause &Esegui / Pausa - + All Supported Bitstreams Elenco di tutti i tipi di flusso accettati - + &Repeat Track &Ripeti brano - + &Shuffle &Ordine casuale - + R R - + Ctrl+R Ctrl+R - + S S - + &Repeat Playlist &Ripeti lista brani - + Tools Strumenti @@ -1026,194 +1020,209 @@ PlayList - + F F - + D D - + Alt+I Alt+I - + Ctrl+A Ctrl+A - + O O - + &Add File &Aggiungi brani - + &Add Directory &Aggiungi cartelle - + &Remove Selected &Elimina la selezione - + &Remove All &Elimina tutto - + &Remove Unselected &Elimina i non selezionati - + Remove unavailable files Rimuovi files non disponibili - + &View Track Details &Dettagli della traccia - + Sort List Riordina la lista - - + + By Title Per titolo - - + + By Album - - + + By Artist - - + + By Filename Per titolo del brano - - + + By Path + Filename per percorso più titolo del brano - - + + By Date Per data - + Sort Selection Riordina la selezione - + Randomize List Mescola i brnai della lista - + Reverse List Inverti la lista - + Invert Selection Inverti la selezione - + &Select None &Non scegliere alcun brano - + + Shift+A + + + + &Select All &Seleziona tutto - + &New List &Nuova lista - + Shift+N Shift+N - + + &Delete List + + + + + Shift+D + + + + &Load List &Carica lista - + &Save List &Salva lista - + Shift+S Shift+S - + Del Canc - + &Add Url &Aggiungi URL - + U U - - + + By Track Number Per numero di traccia - + &Queue &Metti in coda - + Q Q - + Actions Azioni diff --git a/src/ui/translations/qmmp_lt.ts b/src/ui/translations/qmmp_lt.ts index fcdf4bf90..7414278b4 100644 --- a/src/ui/translations/qmmp_lt.ts +++ b/src/ui/translations/qmmp_lt.ts @@ -615,14 +615,14 @@ JumpToTrackDialog - + Unqueue Pašalinti iš eilės - + Queue Į eilę @@ -851,174 +851,168 @@ MainWindow - - - Default - - - - + Choose a directory Pasirinkite aplanką - + Select one or more files to open Pasirinkite vieną ar kelias bylas atvėrimui - + &Play &Groti - + X - + &Pause &Pristabdyti - + C - + &Stop &Sustabdyti - + V - + &Previous &Ankstesnis - + Z - + &Next &Sekantis - + B - + &Jump To File &Pereiti prie bylos - + J - + &Settings &Nustatymai - + Ctrl+P - + &Exit &Išeiti - + Ctrl+Q - + Open Playlist Atverti grojaraštį - + Save Playlist Išsaugoti grojaraštį - + &About &Apie - - + + Playlist Files Grojaraščio bylos - + Space - + &About Qt &Apie Qt - + &Play/Pause &Groti/Pristabdyti - + All Supported Bitstreams Palaikomi bylų tipai - + &Repeat Track &Kartoti takelį - + &Shuffle &Atsitiktine tvarka - + R - + Ctrl+R - + S - + &Repeat Playlist &Kartoti grojaraštį - + Tools Įrankiai @@ -1026,194 +1020,209 @@ PlayList - + F - + D - + Alt+I - + Ctrl+A - + O - + &Add File &Pridėti bylą - + &Add Directory &Pridėti aplanką - + &Remove Selected &Pašalinti pasirinktus - + &Remove All &Pašalinti visus - + &Remove Unselected &Pašalinti NEpasirinktus - + Remove unavailable files - + &View Track Details &Takelio informacija - + Sort List Rūšiuoti - - + + By Title Pagal dainos pavadinimą - - + + By Album - - + + By Artist - - + + By Filename Pagal bylos pavadinimą - - + + By Path + Filename Pagal kelią iki bylos - - + + By Date Pagal datą - + Sort Selection Rūšiuoti pasirinktus - + Randomize List Sumaišyti sąrašą - + Reverse List Apversti - + Invert Selection Atšaukti pasirinkimą - + &Select None &Nepasirinkti nei vieno - + + Shift+A + + + + &Select All &Pasirinkti visus - + &New List &Naujas sąrašas - + Shift+N - + + &Delete List + + + + + Shift+D + + + + &Load List &Įkelti sąrašą - + &Save List &Išsaugoti sąrašą - + Shift+S - + Del - + &Add Url &Pridėti interneto adresą - + U - - + + By Track Number Pagal takelio numerį - + &Queue &Į eilę - + Q - + Actions Veiksmai diff --git a/src/ui/translations/qmmp_pl_PL.ts b/src/ui/translations/qmmp_pl_PL.ts index e859f72e2..a8c1791b8 100644 --- a/src/ui/translations/qmmp_pl_PL.ts +++ b/src/ui/translations/qmmp_pl_PL.ts @@ -615,14 +615,14 @@ JumpToTrackDialog - + Unqueue Wykolejkuj - + Queue Kolejkuj @@ -851,174 +851,168 @@ MainWindow - - - Default - Domyślne - - - + Choose a directory Wybierz katalog - + Select one or more files to open Wybierz jeden lub więcej plików do otwarcia - + &Play &Odtwarzaj - + X X - + &Pause &Wstrzymaj - + C C - + &Stop &Zatrzymaj - + V V - + &Previous &Poprzedni - + Z Z - + &Next &Następny - + B B - + &Jump To File &Skocz do pliku - + J J - + &Settings &Ustawienia - + Ctrl+P Ctrl+P - + &Exit &Wyjście - + Ctrl+Q Ctrl+Q - + Open Playlist Otwórz listę odtwarzania - + Save Playlist Zapisz listę odtwarzania - + &About &O programie - - + + Playlist Files Pliki listy odtwarzania - + Space - + &About Qt &O Qt - + &Play/Pause &Odtwarzaj/Wstrzymaj - + All Supported Bitstreams Wszystkie wspierane formaty - + &Repeat Track &Powtórz utwór - + &Shuffle &Losowo - + R - + Ctrl+R - + S - + &Repeat Playlist Powtó&rz listę odtwarzania - + Tools Narzędzia @@ -1026,194 +1020,209 @@ PlayList - + F F - + D D - + Alt+I Alt+I - + Ctrl+A Ctrl+A - + O O - + &Add File &Dodaj plik - + &Add Directory Dodaj &katalog - + &Remove Selected &Usuń zaznaczone - + &Remove All Usuń &wszystkie - + &Remove Unselected Usuń &niezaznaczone - + Remove unavailable files Usuń niedostępne pliki - + &View Track Details &Pokaż informacje o pliku - + Sort List Sortuj listę - - + + By Title Według nazwy - - + + By Album - - + + By Artist - - + + By Filename Według nazwy pliku - - + + By Path + Filename Według Ścieżki + Nazwy pliku - - + + By Date Wg Daty - + Sort Selection Sortuj zaznaczone - + Randomize List Tasuj listę - + Reverse List Odwróć listę - + Invert Selection Odwróć zaznaczenie - + &Select None &Odznacz wszystkie - + + Shift+A + + + + &Select All &Zaznacz wszystkie - + &New List &Nowa lista - + Shift+N Shift+N - + + &Delete List + + + + + Shift+D + + + + &Load List &Ładuj listę - + &Save List &Zapisz listę - + Shift+S Shift+S - + Del Del - + &Add Url Dod&aj Url - + U U - - + + By Track Number Wg numeru utworu - + &Queue &Kolejkuj - + Q Q - + Actions Akcje diff --git a/src/ui/translations/qmmp_pt_BR.ts b/src/ui/translations/qmmp_pt_BR.ts index 165dea5c2..b0585a8ce 100644 --- a/src/ui/translations/qmmp_pt_BR.ts +++ b/src/ui/translations/qmmp_pt_BR.ts @@ -615,14 +615,14 @@ JumpToTrackDialog - + Unqueue Sem Faixa na Fila - + Queue Faixa na Fila @@ -851,174 +851,168 @@ MainWindow - - - Default - Padrão - - - + Choose a directory Escolher o diretorio - + Select one or more files to open Selecionar um ou mais arquivos - + &Play Tocar - + X - + &Pause Pausar - + C - + &Stop Parar - + V - + &Previous Anterior - + Z - + &Next Próximo - + B - + &Jump To File Pular para arquivo - + J - + &Settings Configurações - + Ctrl+P - + &Exit Sair - + Ctrl+Q - + Open Playlist Abrir Playlist - + Save Playlist Salvar Playlist - + &About &Sobre - - + + Playlist Files ФArquivos de lista de músicas - + Space - + &About Qt - + &Play/Pause - + All Supported Bitstreams - + &Repeat Track - + &Shuffle - + R - + Ctrl+R - + S - + &Repeat Playlist - + Tools @@ -1026,194 +1020,209 @@ PlayList - + F - + D - + Alt+I - + Ctrl+A - + O - + &Add File &Adicionar arquivo - + &Add Directory &Adicionar Diretorio - + &Remove Selected &Remover selecionadas - + &Remove All &Remover tudo - + &Remove Unselected &Remover não selecionadas - + Remove unavailable files - + &View Track Details &Ver detalhes da Faixa - + Sort List Classificar lista - - + + By Title Por Título - - + + By Album - - + + By Artist - - + + By Filename Por Nome - - + + By Path + Filename Por Dirertório + Nome - - + + By Date Por Data - + Sort Selection Classificar por Seleção - + Randomize List Lista Eleatória - + Reverse List Lista Revertida - + Invert Selection Inverter Seleção - + &Select None &Nenhum selecionado - + + Shift+A + + + + &Select All &Selecionar tudo - + &New List &Nova lista - + Shift+N - + + &Delete List + + + + + Shift+D + + + + &Load List &Carregar lista - + &Save List &Salvar lista - + Shift+S - + Del - + &Add Url - + U - - + + By Track Number - + &Queue Na fila - + Q - + Actions diff --git a/src/ui/translations/qmmp_ru.ts b/src/ui/translations/qmmp_ru.ts index 85e48dc4e..ac3bcbd2f 100644 --- a/src/ui/translations/qmmp_ru.ts +++ b/src/ui/translations/qmmp_ru.ts @@ -615,14 +615,14 @@ JumpToTrackDialog - + Unqueue Снять с очереди - + Queue В очередь @@ -851,174 +851,168 @@ MainWindow - - - Default - - - - + Choose a directory Выберите директорию - + Select one or more files to open Выберите один или несколько файлов - + &Play &Воспроизвести - + X - + &Pause &Приостановить - + C - + &Stop &Стоп - + V - + &Previous &Предыдущий фрагмент - + Z - + &Next &Следующий фрагмент - + B - + &Jump To File &Перейти к файлу - + J - + &Settings &Настройки - + Ctrl+P - + &Exit &Выход - + Ctrl+Q - + Open Playlist Открыть список - + Save Playlist Сохранить список - + &About &О программе - - + + Playlist Files Файлы списков - + Space - + &About Qt &О библиотеке Qt - + &Play/Pause &Воспр/приост - + All Supported Bitstreams Все форматы - + &Repeat Track &Повторять трек - + &Shuffle &В случайном порядке - + R - + Ctrl+R - + S - + &Repeat Playlist &Повторять список - + Tools Сервис @@ -1026,194 +1020,209 @@ PlayList - + F - + D - + Alt+I - + Ctrl+A - + O - + &Add File &Добавить файл - + &Add Directory &Добавить директорию - + &Remove Selected &Удалить выделенное - + &Remove All &Удалить всё - + &Remove Unselected &Удалить невыделенное - + Remove unavailable files Удалить недоступные файлы - + &View Track Details &Информация - + Sort List Сортировать - - + + By Title По названию - - + + By Album По альбому - - + + By Artist По исполнителю - - + + By Filename По имени файла - - + + By Path + Filename По пути и файлу - - + + By Date По дате - + Sort Selection Сортировать выделенное - + Randomize List Перемешать - + Reverse List Перевернуть - + Invert Selection Инвертировать выделение - + &Select None &Снять выделение - + + Shift+A + + + + &Select All &Выделить всё - + &New List &Новый лист - + Shift+N - + + &Delete List + + + + + Shift+D + + + + &Load List &Загрузить лист - + &Save List &Сохранить лист - + Shift+S - + Del - + &Add Url &Добавить URL - + U - - + + By Track Number По номеру трека - + &Queue &В очередь - + Q - + Actions Действия diff --git a/src/ui/translations/qmmp_tr.ts b/src/ui/translations/qmmp_tr.ts index 2e6d04b6c..58cfdc258 100644 --- a/src/ui/translations/qmmp_tr.ts +++ b/src/ui/translations/qmmp_tr.ts @@ -615,14 +615,14 @@ JumpToTrackDialog - + Unqueue Kuyrukta Değil - + Queue Kuyruk @@ -851,174 +851,168 @@ MainWindow - - - Default - Öntanımlı - - - + Choose a directory Bir dizin seçin - + Select one or more files to open Açmak için bir yada daha çok dosya seçin - + &Play &Çal - + X X - + &Pause &Duraklat - + C C - + &Stop &Durdur - + V V - + &Previous &Önceki - + Z Z - + &Next &Sonraki - + B B - + &Jump To File &Parçaya Git - + J J - + &Settings &Ayarlar - + Ctrl+P Ctrl+P - + &Exit &Çıkış - + Ctrl+Q Ctrl+Q - + Open Playlist Çalma Listesini Aç - + Save Playlist Çalma Listesini Kaydet - + &About &Hakkında - - + + Playlist Files Çalma Listesi Dosyaları - + Space Boşluk - + &About Qt &Qt Hakkında - + &Play/Pause &Oynat/Duraklat - + All Supported Bitstreams Tüm Desteklenen Bitstreamler - + &Repeat Track &Parçayı Yinele - + &Shuffle &Rastgele - + R R - + Ctrl+R Ctrl+R - + S S - + &Repeat Playlist &Çalma Listesini Yinele - + Tools Araçlar @@ -1026,194 +1020,209 @@ PlayList - + F F - + D D - + Alt+I Alt+I - + Ctrl+A Ctrl+A - + O O - + &Add File &Dosya Ekle - + &Add Directory &Dizin Ekle - + &Remove Selected &Seçileni Kaldır - + &Remove All &Hepsini Kaldır - + &Remove Unselected &Seçilmemişleri Kaldır - + Remove unavailable files - + &View Track Details &Parça Detaylarını Göster - + Sort List Listeyi Sınıflandır - - + + By Title Başlığa Göre - - + + By Album - - + + By Artist - - + + By Filename Dosya Adına Göre - - + + By Path + Filename Dosya Yolu + Dosya Adına Göre - - + + By Date Tarihe Göre - + Sort Selection Seçilenleri Sınıflandır - + Randomize List Rastgele Listele - + Reverse List Listeyi Ters Çevir - + Invert Selection Seçimi Tersine Çevir - + &Select None &Hiçbirini Seçme - + + Shift+A + + + + &Select All &Tümünü Seç - + &New List &Yeni Liste - + Shift+N Shift+N - + + &Delete List + + + + + Shift+D + + + + &Load List &Liste Yükle - + &Save List &Listeyi Kaydet - + Shift+S Shift+S - + Del Del - + &Add Url &Url Ekle - + U U - - + + By Track Number Parça Numarasına Göre - + &Queue &Kuyruğa ekle - + Q Q - + Actions Eylemler diff --git a/src/ui/translations/qmmp_uk_UA.ts b/src/ui/translations/qmmp_uk_UA.ts index 395908d87..fbc46944e 100644 --- a/src/ui/translations/qmmp_uk_UA.ts +++ b/src/ui/translations/qmmp_uk_UA.ts @@ -615,14 +615,14 @@ JumpToTrackDialog - + Unqueue Зняти з черги - + Queue В чергу @@ -851,174 +851,168 @@ MainWindow - - - Default - За умовчанням - - - + Choose a directory Виберіть теку - + Select one or more files to open Виберіть один чи кілька файлів - + &Play &Відтворити - + X - + &Pause &Пауза - + C - + &Stop &Стоп - + V - + &Previous &Назад - + Z - + &Next &Вперед - + B - + &Jump To File &Перейти до файлу - + J - + &Settings &Налаштування - + Ctrl+P - + &Exit &Вихід - + Ctrl+Q - + Open Playlist Відкрити список - + Save Playlist Зберегти список - + &About &Про програму - - + + Playlist Files Файли списків - + Space - + &About Qt &Про Qt - + &Play/Pause &Грати/Пауза - + All Supported Bitstreams Усі формати - + &Repeat Track &Повторити трек - + &Shuffle &Перемішати - + R - + Ctrl+R - + S - + &Repeat Playlist &Повторити список - + Tools Утиліти @@ -1026,194 +1020,209 @@ PlayList - + F - + D - + Alt+I - + Ctrl+A - + O - + &Add File &Додати файл - + &Add Directory &Додати теку - + &Remove Selected &Видалити вибране - + &Remove All &Видалити все - + &Remove Unselected &Видалити не вибране - + Remove unavailable files Видалити недоступні файли - + &View Track Details &Інформація - + Sort List Сортувати - - + + By Title За назвою - - + + By Album За альбомом - - + + By Artist За артистом - - + + By Filename За ім'ям файлу - - + + By Path + Filename За шляхом та файлом - - + + By Date За датою - + Sort Selection Сортувати вибране - + Randomize List Перемішати - + Reverse List Перевернути - + Invert Selection Інвертувати вибране - + &Select None &Зняти виділення - + + Shift+A + + + + &Select All &Вибрати все - + &New List &Новий список - + Shift+N - + + &Delete List + + + + + Shift+D + + + + &Load List &Завантажити список - + &Save List &Зберегти список - + Shift+S - + Del - + &Add Url &Додати адресу - + U - - + + By Track Number - + &Queue &В чергу - + Q - + Actions Дії diff --git a/src/ui/translations/qmmp_zh_CN.ts b/src/ui/translations/qmmp_zh_CN.ts index 370b6a017..44fd0082a 100644 --- a/src/ui/translations/qmmp_zh_CN.ts +++ b/src/ui/translations/qmmp_zh_CN.ts @@ -615,14 +615,14 @@ JumpToTrackDialog - + Unqueue 移出队列 - + Queue 加入队列 @@ -851,174 +851,168 @@ MainWindow - - - Default - 默认 - - - + Choose a directory 选择一个目录 - + Select one or more files to open 选择打开一个或更多文件 - + &Play 播放(&P) - + X X - + &Pause 暂停(&P) - + C C - + &Stop 停止(&S) - + V V - + &Previous 上一曲(&P) - + Z Z - + &Next 下一曲(&N) - + B B - + &Jump To File 跳到文件(&J) - + J J - + &Settings 设置(&S) - + Ctrl+P Ctrl+P - + &Exit 退出(&E) - + Ctrl+Q Ctrl+Q - + Open Playlist 打开播放列表 - + Save Playlist 保存播放列表 - + &About 关于(&A) - - + + Playlist Files 播放列表文件 - + Space 空格 - + &About Qt 关于 Qt (&A) - + &Play/Pause 播放/暂停(&P) - + All Supported Bitstreams 支持的全部文件 - + &Repeat Track 重复音轨(&R) - + &Shuffle 乱序(&S) - + R R - + Ctrl+R Ctrl+R - + S S - + &Repeat Playlist 重复播放列表(&R) - + Tools 工具 @@ -1026,194 +1020,209 @@ PlayList - + F F - + D D - + Alt+I Alt+I - + Ctrl+A Ctrl+A - + O O - + &Add File 添加文件(&A) - + &Add Directory 添加文件夹(&A) - + &Remove Selected 删除所选(&R) - + &Remove All 删除全部(&R) - + &Remove Unselected 删除未选(&R) - + Remove unavailable files - + &View Track Details 查看音轨详细信息(&V) - + Sort List 列表排序 - - + + By Title 按标题 - - + + By Album - - + + By Artist - - + + By Filename 按文件名 - - + + By Path + Filename 按路径+文件名 - - + + By Date 按日期 - + Sort Selection 选择排序 - + Randomize List 随机产生列表 - + Reverse List 逆序列表 - + Invert Selection 反选 - + &Select None 无选择(&S) - + + Shift+A + + + + &Select All 选择全部(&S) - + &New List 新建列表(&N) - + Shift+N Shift+N - + + &Delete List + + + + + Shift+D + + + + &Load List 载入列表(&L) - + &Save List 保存列表(&S) - + Shift+S Shift+S - + Del Del - + &Add Url 添加 URL (&A) - + U U - - + + By Track Number 按音轨 - + &Queue 队列(&Q) - + Q Q - + Actions 动作 diff --git a/src/ui/translations/qmmp_zh_TW.ts b/src/ui/translations/qmmp_zh_TW.ts index 9ea1a9df2..89a1e7abd 100644 --- a/src/ui/translations/qmmp_zh_TW.ts +++ b/src/ui/translations/qmmp_zh_TW.ts @@ -615,14 +615,14 @@ JumpToTrackDialog - + Unqueue 移出佇列 - + Queue 加入佇列 @@ -851,174 +851,168 @@ MainWindow - - - Default - 預設 - - - + Choose a directory 選取一個目錄 - + Select one or more files to open 選取開啟一個或更多檔案 - + &Play 播放(&P) - + X X - + &Pause 暫停(&P) - + C C - + &Stop 停止(&S) - + V V - + &Previous 上一曲(&P) - + Z Z - + &Next 下一曲(&N) - + B B - + &Jump To File 跳到檔案(&J) - + J J - + &Settings 設定(&S) - + Ctrl+P Ctrl+P - + &Exit 結束(&E) - + Ctrl+Q Ctrl+Q - + Open Playlist 開啟播放清單 - + Save Playlist 儲存播放清單 - + &About 關於(&A) - - + + Playlist Files 播放清單檔案 - + Space 空格 - + &About Qt 關於 Qt (&A) - + &Play/Pause 播放/暫停(&P) - + All Supported Bitstreams 支援的全部檔案 - + &Repeat Track 重復音軌(&R) - + &Shuffle 亂序(&S) - + R R - + Ctrl+R Ctrl+R - + S S - + &Repeat Playlist 重復播放清單(&R) - + Tools 工具 @@ -1026,194 +1020,209 @@ PlayList - + F F - + D D - + Alt+I Alt+I - + Ctrl+A Ctrl+A - + O O - + &Add File 添加檔案(&A) - + &Add Directory 添加檔案夾(&A) - + &Remove Selected 移除所選(&R) - + &Remove All 移除全部(&R) - + &Remove Unselected 移除未選(&R) - + Remove unavailable files - + &View Track Details 檢視音軌詳細資訊(&V) - + Sort List 清單排序 - - + + By Title 按標題 - - + + By Album - - + + By Artist - - + + By Filename 按檔名 - - + + By Path + Filename 按路徑+檔名 - - + + By Date 按日期 - + Sort Selection 選取排序 - + Randomize List 隨機產生清單 - + Reverse List 逆串列表 - + Invert Selection 反選 - + &Select None 無選取(&S) - + + Shift+A + + + + &Select All 選取全部(&S) - + &New List 新建清單(&N) - + Shift+N Shift+N - + + &Delete List + + + + + Shift+D + + + + &Load List 載入清單(&L) - + &Save List 儲存清單(&S) - + Shift+S Shift+S - + Del Del - + &Add Url 添加 URL (&A) - + U U - - + + By Track Number 按音軌 - + &Queue 佇列(&Q) - + Q Q - + Actions 動作 -- cgit v1.2.3-13-gbd6f