Fixed bug with removing tracks from another playlist. Implemented adding track to...
authorNikolay Tischenko <niktischenko@gmail.com>
Thu, 23 Sep 2010 15:47:30 +0000 (22:47 +0700)
committerNikolay Tischenko <niktischenko@gmail.com>
Thu, 23 Sep 2010 15:47:30 +0000 (22:47 +0700)
resources/someplayer.desktop
someplayer.pro
src/libraryform.cpp
src/player/player.cpp
src/playerform.cpp
src/playerform.h
src/playlistdialog.cpp [new file with mode: 0644]
src/playlistdialog.h [new file with mode: 0644]
src/playlistdialog.ui [new file with mode: 0644]

index 0e2ca43..9cb0267 100644 (file)
@@ -1,6 +1,6 @@
 [Desktop Entry]
 Encoding=UTF-8
-Version=1.0
+Version=1.1.0
 Type=Application
 Name=SomePlayer
 X-Text-Domain=someplayer
@@ -8,4 +8,4 @@ Exec=/opt/someplayer/someplayer
 Icon=someplayer
 X-HildonDesk-ShowInToolbar=true
 X-Osso-Type=application/x-executable
-Categories=Office;
+Categories=AudioVideo;
index fa3d919..0f501be 100644 (file)
@@ -25,7 +25,8 @@ SOURCES += src/main.cpp\
     src/libraryform.cpp \
     src/busywidget.cpp \
     src/trackrenderer.cpp \
-    src/config.cpp
+    src/config.cpp \
+    src/playlistdialog.cpp
 
 HEADERS  += src/mainwindow.h \
                src/player/player.h \
@@ -43,12 +44,14 @@ HEADERS  += src/mainwindow.h \
     src/libraryform.h \
     src/busywidget.h \
     src/trackrenderer.h \
-    src/config.h
+    src/config.h \
+    src/playlistdialog.h
 
 FORMS    += src/ui/mainwindow.ui \
     src/ui/playerform.ui \
     src/ui/libraryform.ui \
-    src/ui/busywidget.ui
+    src/ui/busywidget.ui \
+    src/playlistdialog.ui
 
 CONFIG += mobility
 MOBILITY = 
index a6ff189..f63cdf4 100644 (file)
@@ -277,14 +277,16 @@ void LibraryForm::_delete_button() {
                ui->listView->selectionModel()->clearSelection();
                QQueue<int> to_delete;
                foreach (QModelIndex id, selected) {
-                       _delete_track(_current_tracks.at(id.row()));
                        to_delete.append(id.row());
                }
                qSort(to_delete);
                int count = to_delete.count();
                for (int i = count-1; i >= 0; i--) {
-                       _current_tracks.removeAt(to_delete.at(i));
+                       _current_playlist.removeTrackAt(to_delete.at(i));
+                       qDebug() << "Removing from" << _current_playlist.name() << to_delete.at(i);
                }
+               _current_tracks = _current_playlist.tracks();
+               _lib->savePlaylist(_current_playlist);
                __fill_model_tracks(_model, _current_tracks);
        } else if (_state == STATE_PLAYLIST) {
                QModelIndexList selected = ui->listView->selectionModel()->selectedIndexes();
@@ -313,6 +315,7 @@ void LibraryForm::_delete_track(Track track) {
 
 void LibraryForm::_use_button() {
        _lib->saveCurrentPlaylist(_current_playlist);
+       _current_playlist = _lib->getCurrentPlaylist();
 }
 
 void LibraryForm::search(QString &pattern) {
index 0181fc6..bd8c8d5 100644 (file)
@@ -162,6 +162,8 @@ void Player::seek(int s) {
 }
 
 void Player::play() {
+       if (_playlist.tracks().isEmpty())
+               return;
        _state = PLAYER_PLAYING;
        emit stateChanged(_state);
        if (_current == -1) {
index c00332c..fd2bdab 100644 (file)
@@ -26,6 +26,7 @@
 #include <QSlider>
 #include "trackrenderer.h"
 #include <QResource>
+#include "playlistdialog.h"
 
 using namespace SomePlayer::DataObjects;
 using namespace SomePlayer::Playback;
@@ -70,6 +71,7 @@ PlayerForm::PlayerForm(Library* lib, QWidget *parent) :
        QAction *delete_action = _context_menu->addAction("Delete");
        QAction *enqueue_action = _context_menu->addAction("Enqueue");
        QAction *add_to_favorites = _context_menu->addAction("Add to favorites");
+       QAction *add_to_playlists = _context_menu->addAction("Add to playlists");
 
        _track_renderer = new TrackRenderer(this);
        ui->playlistView->setItemDelegateForColumn(0, _track_renderer);
@@ -92,6 +94,7 @@ PlayerForm::PlayerForm(Library* lib, QWidget *parent) :
        connect(delete_action, SIGNAL(triggered()), this, SLOT(_delete_track()));
        connect(enqueue_action, SIGNAL(triggered()), this, SLOT(_enqueue_track()));
        connect(add_to_favorites, SIGNAL(triggered()), this, SLOT(_add_to_favorites()));
+       connect(add_to_playlists, SIGNAL(triggered()), this, SLOT(_add_to_playlists()));
        connect(_player, SIGNAL(stateChanged(PlayerState)), this, SLOT(_state_changed(PlayerState)));
        connect(_player, SIGNAL(trackDone(Track)), _lib, SLOT(updateTrackCount(Track)));
        connect(_tag_resolver, SIGNAL(decoded(Track)), this, SLOT(_track_decoded(Track)));
@@ -286,3 +289,19 @@ void PlayerForm::_track_decoded(Track track) {
        _lib->saveCurrentPlaylist(_current_playlist);
        _player->setPlaylist(_current_playlist);
 }
+
+void PlayerForm::_add_to_playlists() {
+       QList<QModelIndex> idx = ui->playlistView->selectionModel()->selectedIndexes();
+       int id = idx.first().row();
+
+       QList<QString> names = _lib->getPlaylistsNames();
+       names.removeOne(_CURRENT_PLAYLIST_SUBST_);
+       PlaylistDialog dialog(names, this);
+       dialog.exec();
+       QList<QString> selected = dialog.selected();
+       foreach (QString name, selected) {
+               Playlist pl = _lib->getPlaylist(name);
+               pl.addTrack(_current_playlist.tracks().at(id));
+               _lib->savePlaylist(pl);
+       }
+}
index d03878a..6129049 100644 (file)
@@ -73,6 +73,7 @@ private slots:
        void _delete_track();
        void _enqueue_track();
        void _add_to_favorites();
+       void _add_to_playlists();
        void _state_changed(PlayerState);
        void _toggle_repeat();
        void _toggle_random();
diff --git a/src/playlistdialog.cpp b/src/playlistdialog.cpp
new file mode 100644 (file)
index 0000000..a4fd908
--- /dev/null
@@ -0,0 +1,29 @@
+#include "playlistdialog.h"
+#include "ui_playlistdialog.h"
+#include <QStandardItemModel>
+
+PlaylistDialog::PlaylistDialog(QList<QString> playlistNames, QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::PlaylistDialog)
+{
+    ui->setupUi(this);
+    QStandardItemModel *model = new QStandardItemModel(this);
+    foreach (QString str, playlistNames) {
+           model->appendRow(new QStandardItem(str));
+    }
+    ui->listView->setModel(model);
+}
+
+PlaylistDialog::~PlaylistDialog()
+{
+    delete ui;
+}
+
+QList<QString> PlaylistDialog::selected() {
+       QList<QString> _selected;
+       QList<QModelIndex> idx = ui->listView->selectionModel()->selectedIndexes();
+       foreach (QModelIndex id, idx) {
+               _selected.append(id.data().toString());
+       }
+       return _selected;
+}
diff --git a/src/playlistdialog.h b/src/playlistdialog.h
new file mode 100644 (file)
index 0000000..89758e0
--- /dev/null
@@ -0,0 +1,26 @@
+#ifndef PLAYLISTDIALOG_H
+#define PLAYLISTDIALOG_H
+
+#include <QDialog>
+
+namespace Ui {
+    class PlaylistDialog;
+}
+
+class PlaylistDialog : public QDialog
+{
+    Q_OBJECT
+
+public:
+    explicit PlaylistDialog(QList<QString> playlistNames, QWidget *parent = 0);
+    ~PlaylistDialog();
+
+    QList<QString> selected();
+
+private:
+    Ui::PlaylistDialog *ui;
+
+private slots:
+};
+
+#endif // PLAYLISTDIALOG_H
diff --git a/src/playlistdialog.ui b/src/playlistdialog.ui
new file mode 100644 (file)
index 0000000..048b5c6
--- /dev/null
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PlaylistDialog</class>
+ <widget class="QDialog" name="PlaylistDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>592</width>
+    <height>361</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Dialog</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <property name="spacing">
+    <number>0</number>
+   </property>
+   <property name="margin">
+    <number>0</number>
+   </property>
+   <item>
+    <widget class="QListView" name="listView">
+     <property name="editTriggers">
+      <set>QAbstractItemView::NoEditTriggers</set>
+     </property>
+     <property name="selectionMode">
+      <enum>QAbstractItemView::MultiSelection</enum>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>PlaylistDialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>PlaylistDialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>