diff --git a/src/core/song.cpp b/src/core/song.cpp index 3cbdcbab5..de22eed11 100644 --- a/src/core/song.cpp +++ b/src/core/song.cpp @@ -683,6 +683,11 @@ TagLib::String QStringToTaglibString(const QString& s) { return TagLib::String(s.toUtf8().constData(), TagLib::String::UTF8); } +bool Song::IsEditable() const { + return d->valid_ && !d->filename_.isNull() && + d->filetype_ != Type_Stream && d->filetype_ != Type_Unknown; +} + bool Song::Save() const { if (d->filename_.isNull()) return false; diff --git a/src/core/song.h b/src/core/song.h index 8b6a98198..9748b0c3b 100644 --- a/src/core/song.h +++ b/src/core/song.h @@ -170,7 +170,7 @@ class Song { QString PrettyLength() const; // Setters - bool IsEditable() const { return d->valid_ && !d->filename_.isNull(); } + bool IsEditable() const; bool Save() const; void set_id(int id) { d->id_ = id; } diff --git a/src/translations/ar.po b/src/translations/ar.po index 4f70c842f..6eaf4b877 100644 --- a/src/translations/ar.po +++ b/src/translations/ar.po @@ -440,6 +440,9 @@ msgstr "" msgid "Delay between visualizations" msgstr "" +msgid "Delete files..." +msgstr "" + msgid "Delete from disk..." msgstr "" diff --git a/src/translations/cs.po b/src/translations/cs.po index 300f9a37a..919ee0978 100644 --- a/src/translations/cs.po +++ b/src/translations/cs.po @@ -441,6 +441,9 @@ msgstr "Snížit hlasitost" msgid "Delay between visualizations" msgstr "" +msgid "Delete files..." +msgstr "" + msgid "Delete from disk..." msgstr "" diff --git a/src/translations/da.po b/src/translations/da.po index 6a6203350..e6b26b9c6 100644 --- a/src/translations/da.po +++ b/src/translations/da.po @@ -441,6 +441,9 @@ msgstr "" msgid "Delay between visualizations" msgstr "" +msgid "Delete files..." +msgstr "" + msgid "Delete from disk..." msgstr "" diff --git a/src/translations/de.po b/src/translations/de.po index e881f2044..fc913e8c1 100644 --- a/src/translations/de.po +++ b/src/translations/de.po @@ -442,6 +442,9 @@ msgstr "Lautstärke verringern" msgid "Delay between visualizations" msgstr "" +msgid "Delete files..." +msgstr "" + msgid "Delete from disk..." msgstr "" diff --git a/src/translations/el.po b/src/translations/el.po index b641e3bb0..8094951f0 100644 --- a/src/translations/el.po +++ b/src/translations/el.po @@ -444,6 +444,9 @@ msgstr "Μείωση έντασης" msgid "Delay between visualizations" msgstr "" +msgid "Delete files..." +msgstr "" + msgid "Delete from disk..." msgstr "" diff --git a/src/translations/en_CA.po b/src/translations/en_CA.po index 75c1e7260..3ab2221c6 100644 --- a/src/translations/en_CA.po +++ b/src/translations/en_CA.po @@ -442,6 +442,9 @@ msgstr "Decrease volume" msgid "Delay between visualizations" msgstr "Delay between visualisations" +msgid "Delete files..." +msgstr "" + msgid "Delete from disk..." msgstr "" diff --git a/src/translations/en_GB.po b/src/translations/en_GB.po index c81685545..4aa9ca3d8 100644 --- a/src/translations/en_GB.po +++ b/src/translations/en_GB.po @@ -440,6 +440,9 @@ msgstr "" msgid "Delay between visualizations" msgstr "Delay between visualisations" +msgid "Delete files..." +msgstr "" + msgid "Delete from disk..." msgstr "" diff --git a/src/translations/es.po b/src/translations/es.po index d1b21fc98..01e919f44 100644 --- a/src/translations/es.po +++ b/src/translations/es.po @@ -444,6 +444,9 @@ msgstr "Disminuir volumen" msgid "Delay between visualizations" msgstr "" +msgid "Delete files..." +msgstr "" + msgid "Delete from disk..." msgstr "" diff --git a/src/translations/fi.po b/src/translations/fi.po index 5fc753ec2..e6c14da1c 100644 --- a/src/translations/fi.po +++ b/src/translations/fi.po @@ -440,6 +440,9 @@ msgstr "" msgid "Delay between visualizations" msgstr "" +msgid "Delete files..." +msgstr "" + msgid "Delete from disk..." msgstr "" diff --git a/src/translations/fr.po b/src/translations/fr.po index 207c085e3..a2dea027a 100644 --- a/src/translations/fr.po +++ b/src/translations/fr.po @@ -441,6 +441,9 @@ msgstr "Diminuer le volume" msgid "Delay between visualizations" msgstr "" +msgid "Delete files..." +msgstr "" + msgid "Delete from disk..." msgstr "" diff --git a/src/translations/gl.po b/src/translations/gl.po index c4d6c1a4f..2f7353b03 100644 --- a/src/translations/gl.po +++ b/src/translations/gl.po @@ -440,6 +440,9 @@ msgstr "" msgid "Delay between visualizations" msgstr "" +msgid "Delete files..." +msgstr "" + msgid "Delete from disk..." msgstr "" diff --git a/src/translations/it.po b/src/translations/it.po index c5963f3b6..3fc4ce380 100644 --- a/src/translations/it.po +++ b/src/translations/it.po @@ -443,6 +443,9 @@ msgstr "Riduci il volume" msgid "Delay between visualizations" msgstr "" +msgid "Delete files..." +msgstr "" + msgid "Delete from disk..." msgstr "" diff --git a/src/translations/kk.po b/src/translations/kk.po index fffdaa1c7..145ecf5c0 100644 --- a/src/translations/kk.po +++ b/src/translations/kk.po @@ -440,6 +440,9 @@ msgstr "" msgid "Delay between visualizations" msgstr "" +msgid "Delete files..." +msgstr "" + msgid "Delete from disk..." msgstr "" diff --git a/src/translations/nb.po b/src/translations/nb.po index aebd99b65..fb5ff4d44 100644 --- a/src/translations/nb.po +++ b/src/translations/nb.po @@ -440,6 +440,9 @@ msgstr "" msgid "Delay between visualizations" msgstr "" +msgid "Delete files..." +msgstr "" + msgid "Delete from disk..." msgstr "" diff --git a/src/translations/oc.po b/src/translations/oc.po index 1d472feaa..7012b4590 100644 --- a/src/translations/oc.po +++ b/src/translations/oc.po @@ -440,6 +440,9 @@ msgstr "Reduire lo volum" msgid "Delay between visualizations" msgstr "" +msgid "Delete files..." +msgstr "" + msgid "Delete from disk..." msgstr "" diff --git a/src/translations/pl.po b/src/translations/pl.po index b62631dff..351c3d0ec 100644 --- a/src/translations/pl.po +++ b/src/translations/pl.po @@ -441,6 +441,9 @@ msgstr "" msgid "Delay between visualizations" msgstr "" +msgid "Delete files..." +msgstr "" + msgid "Delete from disk..." msgstr "" diff --git a/src/translations/pt.po b/src/translations/pt.po index 55c3a9b5c..a9aac4ec5 100644 --- a/src/translations/pt.po +++ b/src/translations/pt.po @@ -442,6 +442,9 @@ msgstr "Diminuir volume" msgid "Delay between visualizations" msgstr "" +msgid "Delete files..." +msgstr "" + msgid "Delete from disk..." msgstr "" diff --git a/src/translations/pt_BR.po b/src/translations/pt_BR.po index 9f2b77f74..d06c5c8e9 100644 --- a/src/translations/pt_BR.po +++ b/src/translations/pt_BR.po @@ -442,6 +442,9 @@ msgstr "Diminuir volume" msgid "Delay between visualizations" msgstr "" +msgid "Delete files..." +msgstr "" + msgid "Delete from disk..." msgstr "" diff --git a/src/translations/ro.po b/src/translations/ro.po index 5bce46dfd..89db139bd 100644 --- a/src/translations/ro.po +++ b/src/translations/ro.po @@ -440,6 +440,9 @@ msgstr "" msgid "Delay between visualizations" msgstr "" +msgid "Delete files..." +msgstr "" + msgid "Delete from disk..." msgstr "" diff --git a/src/translations/ru.po b/src/translations/ru.po index e15733add..8269e65e6 100644 --- a/src/translations/ru.po +++ b/src/translations/ru.po @@ -441,6 +441,9 @@ msgstr "Уменьшить громкость" msgid "Delay between visualizations" msgstr "" +msgid "Delete files..." +msgstr "" + msgid "Delete from disk..." msgstr "" diff --git a/src/translations/sk.po b/src/translations/sk.po index 00ed6b101..092c93903 100644 --- a/src/translations/sk.po +++ b/src/translations/sk.po @@ -443,6 +443,9 @@ msgstr "Znížiť hlasitosť" msgid "Delay between visualizations" msgstr "" +msgid "Delete files..." +msgstr "" + msgid "Delete from disk..." msgstr "" diff --git a/src/translations/sv.po b/src/translations/sv.po index 03f408563..3efc8eeb2 100644 --- a/src/translations/sv.po +++ b/src/translations/sv.po @@ -442,6 +442,9 @@ msgstr "Sänk volymen" msgid "Delay between visualizations" msgstr "" +msgid "Delete files..." +msgstr "" + msgid "Delete from disk..." msgstr "" diff --git a/src/translations/tr.po b/src/translations/tr.po index ad32b91cb..9d39807c9 100644 --- a/src/translations/tr.po +++ b/src/translations/tr.po @@ -440,6 +440,9 @@ msgstr "Sesi azalt" msgid "Delay between visualizations" msgstr "" +msgid "Delete files..." +msgstr "" + msgid "Delete from disk..." msgstr "" diff --git a/src/translations/translations.pot b/src/translations/translations.pot index 11c424255..3bded7d20 100644 --- a/src/translations/translations.pot +++ b/src/translations/translations.pot @@ -431,6 +431,9 @@ msgstr "" msgid "Delay between visualizations" msgstr "" +msgid "Delete files..." +msgstr "" + msgid "Delete from disk..." msgstr "" diff --git a/src/translations/uk.po b/src/translations/uk.po index 77a345d28..9ce4a8376 100644 --- a/src/translations/uk.po +++ b/src/translations/uk.po @@ -442,6 +442,9 @@ msgstr "Зменшити гучність" msgid "Delay between visualizations" msgstr "" +msgid "Delete files..." +msgstr "" + msgid "Delete from disk..." msgstr "" diff --git a/src/translations/zh_CN.po b/src/translations/zh_CN.po index 3c9f55186..186efa063 100644 --- a/src/translations/zh_CN.po +++ b/src/translations/zh_CN.po @@ -440,6 +440,9 @@ msgstr "降低音量" msgid "Delay between visualizations" msgstr "" +msgid "Delete files..." +msgstr "" + msgid "Delete from disk..." msgstr "" diff --git a/src/translations/zh_TW.po b/src/translations/zh_TW.po index 03d6d38d9..da752dc64 100644 --- a/src/translations/zh_TW.po +++ b/src/translations/zh_TW.po @@ -440,6 +440,9 @@ msgstr "" msgid "Delay between visualizations" msgstr "" +msgid "Delete files..." +msgstr "" + msgid "Delete from disk..." msgstr "" diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index 5942ea473..fceb7316f 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -365,9 +365,16 @@ MainWindow::MainWindow(NetworkAccessManager* network, Engine::Type engine, QWidg playlist_menu_->addAction(ui_->action_renumber_tracks); playlist_menu_->addAction(ui_->action_selection_set_value); playlist_menu_->addSeparator(); + playlist_copy_to_library_ = playlist_menu_->addAction(IconLoader::Load("edit-copy"), tr("Copy to library..."), this, SLOT(PlaylistCopyToLibrary())); + playlist_move_to_library_ = playlist_menu_->addAction(IconLoader::Load("go-jump"), tr("Move to library..."), this, SLOT(PlaylistMoveToLibrary())); + playlist_organise_ = playlist_menu_->addAction(IconLoader::Load("edit-copy"), tr("Organise files..."), this, SLOT(PlaylistMoveToLibrary())); + playlist_delete_ = playlist_menu_->addAction(IconLoader::Load("edit-delete"), tr("Delete files..."), this, SLOT(PlaylistDelete())); + playlist_menu_->addSeparator(); playlist_menu_->addAction(ui_->action_clear_playlist); playlist_menu_->addAction(ui_->action_shuffle); + playlist_delete_->setVisible(false); // TODO + connect(ui_->playlist, SIGNAL(UndoRedoActionsChanged(QAction*,QAction*)), SLOT(PlaylistUndoRedoChanged(QAction*,QAction*))); @@ -871,7 +878,10 @@ void MainWindow::InsertRadioItems(const PlaylistItemList& items) { void MainWindow::PlaylistRightClick(const QPoint& global_pos, const QModelIndex& index) { playlist_menu_index_ = index; - if (playlists_->current()->current_index() == index.row() && player_->GetState() == Engine::Playing) { + QModelIndex source_index = playlists_->current()->proxy()->mapToSource(index); + + // Is this song currently playing? + if (playlists_->current()->current_index() == source_index.row() && player_->GetState() == Engine::Playing) { playlist_play_pause_->setText(tr("Pause")); playlist_play_pause_->setIcon(IconLoader::Load("media-playback-pause")); } else { @@ -879,10 +889,11 @@ void MainWindow::PlaylistRightClick(const QPoint& global_pos, const QModelIndex& playlist_play_pause_->setIcon(IconLoader::Load("media-playback-start")); } + // Are we allowed to pause? if (index.isValid()) { playlist_play_pause_->setEnabled( - playlists_->current()->current_index() != index.row() || - ! (playlists_->current()->item_at(index.row())->options() & PlaylistItem::PauseDisabled)); + playlists_->current()->current_index() != source_index.row() || + ! (playlists_->current()->item_at(source_index.row())->options() & PlaylistItem::PauseDisabled)); } else { playlist_play_pause_->setEnabled(false); } @@ -907,26 +918,39 @@ void MainWindow::PlaylistRightClick(const QPoint& global_pos, const QModelIndex& ui_->action_edit_value->setVisible(editable); ui_->action_remove_from_playlist->setEnabled(!selection.isEmpty()); + playlist_copy_to_library_->setVisible(false); + playlist_move_to_library_->setVisible(false); + playlist_organise_->setVisible(false); + playlist_delete_->setVisible(false); + if (!index.isValid()) { ui_->action_selection_set_value->setVisible(false); ui_->action_edit_value->setVisible(false); } else { Playlist::Column column = (Playlist::Column)index.column(); - bool editable = Playlist::column_is_editable(column); + bool column_is_editable = Playlist::column_is_editable(column); ui_->action_selection_set_value->setVisible( - ui_->action_selection_set_value->isVisible() && editable); + ui_->action_selection_set_value->isVisible() && column_is_editable); ui_->action_edit_value->setVisible( - ui_->action_edit_value->isVisible() && editable); + ui_->action_edit_value->isVisible() && column_is_editable); QString column_name = Playlist::column_name(column); - QString column_value = playlists_->current()->data(index).toString(); + QString column_value = playlists_->current()->data(source_index).toString(); if (column_value.length() > 25) column_value = column_value.left(25) + "..."; ui_->action_selection_set_value->setText(tr("Set %1 to \"%2\"...") .arg(column_name.toLower()).arg(column_value)); ui_->action_edit_value->setText(tr("Edit tag \"%1\"...").arg(column_name)); + + // Is it a library item? + if (playlists_->current()->item_at(source_index.row())->type() == "Library") { + playlist_organise_->setVisible(editable); + } else { + playlist_copy_to_library_->setVisible(editable); + playlist_move_to_library_->setVisible(editable); + } } playlist_menu_->popup(global_pos); @@ -1220,3 +1244,34 @@ void MainWindow::MoveFilesToLibrary(const QList &urls) { organise_dialog_->SetCopy(false); organise_dialog_->show(); } + +void MainWindow::PlaylistCopyToLibrary() { + PlaylistOrganiseSelected(true); +} + +void MainWindow::PlaylistMoveToLibrary() { + PlaylistOrganiseSelected(false); +} + +void MainWindow::PlaylistOrganiseSelected(bool copy) { + QModelIndexList indexes = playlists_->current()->proxy()->mapSelectionToSource( + ui_->playlist->view()->selectionModel()->selection()).indexes(); + QList urls; + + int last_row = -1; + foreach (const QModelIndex& index, indexes) { + if (last_row == index.row()) + continue; + last_row = index.row(); + + urls << playlists_->current()->item_at(index.row())->Url(); + } + + organise_dialog_->SetUrls(urls); + organise_dialog_->SetCopy(copy); + organise_dialog_->show(); +} + +void MainWindow::PlaylistDelete() { + +} diff --git a/src/ui/mainwindow.h b/src/ui/mainwindow.h index 40d02d36e..e5f2fe86d 100644 --- a/src/ui/mainwindow.h +++ b/src/ui/mainwindow.h @@ -108,6 +108,11 @@ class MainWindow : public QMainWindow, public PlatformInterface { void EditValue(); void PlaylistUndoRedoChanged(QAction* undo, QAction* redo); + void PlaylistCopyToLibrary(); + void PlaylistMoveToLibrary(); + void PlaylistOrganiseSelected(bool copy); + void PlaylistDelete(); + void PlayIndex(const QModelIndex& index); void StopAfterCurrent(); @@ -195,6 +200,10 @@ class MainWindow : public QMainWindow, public PlatformInterface { QAction* playlist_play_pause_; QAction* playlist_stop_after_; QAction* playlist_undoredo_; + QAction* playlist_organise_; + QAction* playlist_copy_to_library_; + QAction* playlist_move_to_library_; + QAction* playlist_delete_; QModelIndex playlist_menu_index_; QSortFilterProxyModel* library_sort_model_;