| File src/action.cpp changed (mode: 100644) (index 2d87cbe..4fef9d6) |
| ... |
... |
long Interface::crop(int crop_mode) |
| 977 |
977 |
/* |
/* |
| 978 |
978 |
* Remove selected songs from list |
* Remove selected songs from list |
| 979 |
979 |
*/ |
*/ |
| 980 |
|
long Interface::remove(Songlist * list) |
|
|
980 |
|
long |
|
981 |
|
Interface::remove(Songlist * list) |
| 981 |
982 |
{ |
{ |
| 982 |
|
int count = 0; |
|
| 983 |
983 |
Song * song; |
Song * song; |
| 984 |
984 |
vector<Song *> songs; |
vector<Song *> songs; |
| 985 |
985 |
vector<Song *>::iterator i; |
vector<Song *>::iterator i; |
| 986 |
986 |
|
|
| 987 |
|
if (!list) |
|
| 988 |
|
{ |
|
|
987 |
|
/* FIXME: this check should, perhaps, be done earlier? */ |
|
988 |
|
if (!list) { |
| 989 |
989 |
pms->log(MSG_STATUS, STERR, _("This is not a playlist: you can't remove songs from here.")); |
pms->log(MSG_STATUS, STERR, _("This is not a playlist: you can't remove songs from here.")); |
| 990 |
990 |
return STERR; |
return STERR; |
| 991 |
991 |
} |
} |
| 992 |
992 |
|
|
| 993 |
|
if (list == pms->comm->library()) |
|
| 994 |
|
{ |
|
|
993 |
|
/* FIXME: same goes for this check */ |
|
994 |
|
if (list == pms->comm->library()) { |
| 995 |
995 |
pms->log(MSG_STATUS, STERR, _("The library is read-only.")); |
pms->log(MSG_STATUS, STERR, _("The library is read-only.")); |
| 996 |
996 |
return STERR; |
return STERR; |
| 997 |
997 |
} |
} |
| 998 |
998 |
|
|
| 999 |
|
song = list->popnextselected(); |
|
| 1000 |
|
while (song != NULL) |
|
| 1001 |
|
{ |
|
|
999 |
|
while ((song = list->popnextselected()) != NULL) { |
| 1002 |
1000 |
songs.push_back(song); |
songs.push_back(song); |
| 1003 |
|
song = list->popnextselected(); |
|
| 1004 |
1001 |
} |
} |
| 1005 |
1002 |
|
|
| 1006 |
1003 |
i = songs.begin(); |
i = songs.begin(); |
| 1007 |
|
while (i != songs.end()) |
|
| 1008 |
|
{ |
|
| 1009 |
|
if (pms->comm->remove(list, *i)) |
|
| 1010 |
|
++count; |
|
|
1004 |
|
while (i != songs.end()) { |
|
1005 |
|
if (!pms->comm->remove(list, *i)) { |
|
1006 |
|
return STERR; |
|
1007 |
|
} |
| 1011 |
1008 |
++i; |
++i; |
| 1012 |
1009 |
} |
} |
| 1013 |
1010 |
|
|
| 1014 |
|
if (count > 0) |
|
| 1015 |
|
{ |
|
| 1016 |
|
pms->disp->actwin()->wantdraw = true; |
|
| 1017 |
|
pms->log(MSG_STATUS, STOK, _("Removed %d %s."), count, (count == 1 ? _("song") : _("songs"))); |
|
| 1018 |
|
return STOK; |
|
| 1019 |
|
} |
|
|
1011 |
|
/* FIXME: should wantdraw really be set _here_? */ |
|
1012 |
|
pms->disp->actwin()->wantdraw = true; |
|
1013 |
|
pms->log(MSG_STATUS, STOK, _("Removed %d %s."), songs.size(), (songs.size() == 1 ? _("song") : _("songs"))); |
| 1020 |
1014 |
|
|
| 1021 |
|
pms->log(MSG_STATUS, STERR, _("No songs removed.")); |
|
| 1022 |
|
return STERR; |
|
|
1015 |
|
return STOK; |
| 1023 |
1016 |
} |
} |
| 1024 |
1017 |
|
|
| 1025 |
1018 |
/* |
/* |
| File src/command.cpp changed (mode: 100644) (index 7051fcb..18eab10) |
| ... |
... |
Control::add(Songlist * list, Song * song) |
| 807 |
807 |
/* |
/* |
| 808 |
808 |
* Remove a song from the playlist |
* Remove a song from the playlist |
| 809 |
809 |
*/ |
*/ |
| 810 |
|
int |
|
|
810 |
|
bool |
| 811 |
811 |
Control::remove(Songlist * list, Song * song) |
Control::remove(Songlist * list, Song * song) |
| 812 |
812 |
{ |
{ |
| 813 |
813 |
int pos = MATCH_FAILED; |
int pos = MATCH_FAILED; |
| 814 |
814 |
|
|
| 815 |
815 |
assert(song != NULL); |
assert(song != NULL); |
| 816 |
816 |
assert(list != NULL); |
assert(list != NULL); |
|
817 |
|
assert(list != _library); |
| 817 |
818 |
|
|
| 818 |
|
if (list == _library) { |
|
| 819 |
|
// FIXME: error message |
|
| 820 |
|
return false; |
|
| 821 |
|
} |
|
|
819 |
|
EXIT_IDLE; |
|
820 |
|
|
|
821 |
|
pms->log(MSG_DEBUG, 0, "Removing song with id=%d pos=%d uri=%s from list %s.\n", song->id, song->pos, song->file.c_str(), list->filename.c_str()); |
| 822 |
822 |
|
|
| 823 |
|
if (list == _playlist && song->id == MPD_SONG_NO_ID) { |
|
|
823 |
|
/* Remove song from queue */ |
|
824 |
|
if (list == _playlist) { |
| 824 |
825 |
// All songs must have ID's |
// All songs must have ID's |
| 825 |
826 |
// FIXME: version requirement |
// FIXME: version requirement |
| 826 |
827 |
assert(song->id != MPD_SONG_NO_ID); |
assert(song->id != MPD_SONG_NO_ID); |
|
828 |
|
return mpd_run_delete_id(conn->h(), song->id); |
| 827 |
829 |
} |
} |
| 828 |
830 |
|
|
| 829 |
|
if (list != _playlist) { |
|
| 830 |
|
if (list->filename.size() == 0) { |
|
| 831 |
|
// FIXME: what does this check? |
|
| 832 |
|
return false; |
|
| 833 |
|
} |
|
| 834 |
|
pos = list->locatesong(song); |
|
| 835 |
|
if (pos == MATCH_FAILED) { |
|
| 836 |
|
// FIXME: error message |
|
| 837 |
|
return false; |
|
| 838 |
|
} |
|
| 839 |
|
pms->log(MSG_DEBUG, 0, "Removing song %d from list.\n", pos); |
|
| 840 |
|
} |
|
|
831 |
|
/* Remove song from stored playlist */ |
|
832 |
|
assert(list->filename.size() == 0); |
| 841 |
833 |
|
|
| 842 |
|
if (list == _playlist) { |
|
| 843 |
|
return mpd_run_delete_id(conn->h(), song->id); |
|
| 844 |
|
} else { |
|
| 845 |
|
return mpd_run_playlist_delete(conn->h(), (char *)list->filename.c_str(), pos); |
|
|
834 |
|
pos = list->locatesong(song); |
|
835 |
|
if (pos == MATCH_FAILED) { |
|
836 |
|
// FIXME: error message |
|
837 |
|
return false; |
| 846 |
838 |
} |
} |
| 847 |
839 |
|
|
|
840 |
|
return mpd_run_playlist_delete(conn->h(), (char *)list->filename.c_str(), pos); |
|
841 |
|
|
| 848 |
842 |
// FIXME: remove from list? |
// FIXME: remove from list? |
| 849 |
843 |
/* |
/* |
| 850 |
844 |
if (command_mode != 0) return true; |
if (command_mode != 0) return true; |
| |
| ... |
... |
bool Control::activatelist(Songlist * list) |
| 1653 |
1647 |
|
|
| 1654 |
1648 |
/* |
/* |
| 1655 |
1649 |
* Retrieves current playlist from MPD |
* Retrieves current playlist from MPD |
| 1656 |
|
* TODO: implement more entity types |
|
|
1650 |
|
* TODO: implement missing entity types |
| 1657 |
1651 |
*/ |
*/ |
| 1658 |
1652 |
bool |
bool |
| 1659 |
1653 |
Control::update_queue() |
Control::update_queue() |
| File src/command.h changed (mode: 100644) (index 71ed136..35fb924) |
| ... |
... |
public: |
| 267 |
267 |
/* List management */ |
/* List management */ |
| 268 |
268 |
song_t add(Songlist *, Song *); |
song_t add(Songlist *, Song *); |
| 269 |
269 |
song_t add(Songlist * source, Songlist * dest); |
song_t add(Songlist * source, Songlist * dest); |
| 270 |
|
int remove(Songlist *, Song *); |
|
|
270 |
|
bool remove(Songlist *, Song *); |
| 271 |
271 |
int prune(Songlist *, Songlist *); |
int prune(Songlist *, Songlist *); |
| 272 |
272 |
|
|
| 273 |
273 |
/* Play controls */ |
/* Play controls */ |
| File src/list.cpp changed (mode: 100644) (index 35b8e83..1095527) |
| ... |
... |
song_t Songlist::add(Songlist * list) |
| 481 |
481 |
|
|
| 482 |
482 |
/* |
/* |
| 483 |
483 |
* Adds a song to the list, either at end or in the middle |
* Adds a song to the list, either at end or in the middle |
|
484 |
|
* |
|
485 |
|
* FIXME: vector::erase from the middle of an array is an inefficient operation! |
|
486 |
|
* |
|
487 |
|
* Returns the zero-indexed position of the added song. |
| 484 |
488 |
*/ |
*/ |
| 485 |
|
song_t Songlist::add(Song * song) |
|
|
489 |
|
song_t |
|
490 |
|
Songlist::add(Song * song) |
| 486 |
491 |
{ |
{ |
| 487 |
492 |
vector<Song *>::iterator i; |
vector<Song *>::iterator i; |
| 488 |
493 |
|
|
| 489 |
|
if (song == NULL) |
|
| 490 |
|
return MPD_SONG_NO_ID; |
|
|
494 |
|
assert(song != NULL); |
| 491 |
495 |
|
|
| 492 |
496 |
if (song->pos == MPD_SONG_NO_NUM || song->pos == static_cast<song_t>(songs.size())) |
if (song->pos == MPD_SONG_NO_NUM || song->pos == static_cast<song_t>(songs.size())) |
| 493 |
497 |
{ |
{ |
| |
| ... |
... |
song_t Songlist::add(Song * song) |
| 498 |
502 |
} |
} |
| 499 |
503 |
else |
else |
| 500 |
504 |
{ |
{ |
| 501 |
|
i = songs.begin() + song->pos; |
|
| 502 |
|
if (songs[song->pos]->pos == song->pos) /* FIXME: random crash here? */ |
|
| 503 |
|
{ |
|
| 504 |
|
if (songs[song->pos]->time != MPD_SONG_NO_TIME) |
|
| 505 |
|
length -= songs[song->pos]->time; |
|
| 506 |
|
i = songs.erase(songs.begin() + song->pos); |
|
|
505 |
|
/* FIXME: random crash here? */ |
|
506 |
|
if (songs[song->pos]->pos == song->pos) { |
|
507 |
|
assert(remove(song) == true); |
| 507 |
508 |
} |
} |
|
509 |
|
|
|
510 |
|
i = songs.begin() + song->pos; |
| 508 |
511 |
songs.insert(i, song); |
songs.insert(i, song); |
|
512 |
|
|
| 509 |
513 |
/* FIXME: filtersongs does not get updated because of ->pos mismatch, but do we need it anyway? */ |
/* FIXME: filtersongs does not get updated because of ->pos mismatch, but do we need it anyway? */ |
| 510 |
514 |
} |
} |
| 511 |
515 |
|
|
| 512 |
|
if (song->time != MPD_SONG_NO_TIME) |
|
| 513 |
|
{ |
|
|
516 |
|
/* FIXME: new function */ |
|
517 |
|
if (song->time != MPD_SONG_NO_TIME) { |
| 514 |
518 |
length += song->time; |
length += song->time; |
| 515 |
519 |
} |
} |
| 516 |
520 |
|
|
|
521 |
|
/* FIXME */ |
| 517 |
522 |
seliter = filtersongs.begin(); |
seliter = filtersongs.begin(); |
| 518 |
523 |
rseliter = filtersongs.rbegin(); |
rseliter = filtersongs.rbegin(); |
| 519 |
524 |
|
|
| 520 |
|
return static_cast<song_t>(songs.size() - 1); |
|
|
525 |
|
return song->pos; |
| 521 |
526 |
} |
} |
| 522 |
527 |
|
|
| 523 |
528 |
/* |
/* |
| 524 |
|
* Removes a song from the list |
|
|
529 |
|
* Remove a song from the list. |
|
530 |
|
* |
|
531 |
|
* Returns true on success, false on failure. |
| 525 |
532 |
*/ |
*/ |
| 526 |
|
int Songlist::remove(Song * song) |
|
|
533 |
|
bool |
|
534 |
|
Songlist::remove(Song * song) |
| 527 |
535 |
{ |
{ |
| 528 |
|
if (!song) return false; |
|
|
536 |
|
assert(song != NULL); |
| 529 |
537 |
|
|
| 530 |
538 |
selectsong(song, false); |
selectsong(song, false); |
| 531 |
539 |
|
|
| 532 |
|
if (song->pos == MPD_SONG_NO_NUM) |
|
| 533 |
|
{ |
|
|
540 |
|
if (song->pos == MPD_SONG_NO_NUM) { |
| 534 |
541 |
return remove(match(song->file, 0, filtersongs.size() - 1, MATCH_FILE)); |
return remove(match(song->file, 0, filtersongs.size() - 1, MATCH_FILE)); |
| 535 |
|
} |
|
| 536 |
|
else return remove(song->pos); |
|
|
542 |
|
} |
|
543 |
|
|
|
544 |
|
return remove(song->pos); |
| 537 |
545 |
} |
} |
| 538 |
546 |
|
|
| 539 |
547 |
/* |
/* |
| 540 |
|
* Remove song by index |
|
|
548 |
|
* Remove song in position N from the list. |
|
549 |
|
* |
|
550 |
|
* Returns true on success, false on failure. |
| 541 |
551 |
*/ |
*/ |
| 542 |
|
int Songlist::remove(int songpos) |
|
|
552 |
|
bool |
|
553 |
|
Songlist::remove(int songpos) |
| 543 |
554 |
{ |
{ |
| 544 |
555 |
vector<Song *>::iterator it; |
vector<Song *>::iterator it; |
| 545 |
556 |
song_t realsongpos; |
song_t realsongpos; |
| |
| ... |
... |
int Songlist::remove(int songpos) |
| 549 |
560 |
return false; |
return false; |
| 550 |
561 |
} |
} |
| 551 |
562 |
|
|
| 552 |
|
if (songs[songpos]->time != MPD_SONG_NO_TIME) |
|
| 553 |
|
{ |
|
|
563 |
|
if (songs[songpos]->time != MPD_SONG_NO_TIME) { |
| 554 |
564 |
length -= songs[songpos]->time; |
length -= songs[songpos]->time; |
| 555 |
565 |
} |
} |
| 556 |
566 |
|
|