X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fscreen_play.c;h=b9b0ecb0f18606cf639f905a76ef31728cf201a4;hb=a00c1bb99e0706ef8a59f14baae76f194f27d7db;hp=eae3ace8c50098fbc5f2ab1b7bb5ce3bb9df2853;hpb=e67ad30e9bea8ce099b4a6311cf2b20ce6d86263;p=ncmpc.git diff --git a/src/screen_play.c b/src/screen_play.c index eae3ace..b9b0ecb 100644 --- a/src/screen_play.c +++ b/src/screen_play.c @@ -1,7 +1,7 @@ /* ncmpc (Ncurses MPD Client) * (c) 2004-2009 The Music Player Daemon Project * Project homepage: http://musicpd.org - + * 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 @@ -81,9 +81,12 @@ playlist_changed_callback(mpdclient_t *c, int event, gpointer data) case PLAYLIST_EVENT_DELETE: break; case PLAYLIST_EVENT_MOVE: - lw->selected = *((int *) data); - if (lw->selected < lw->start) - lw->start--; + if(lw->visual_selection < 0) + { + lw->selected = *((int *) data); + if (lw->selected < lw->start) + lw->start--; + } break; default: break; @@ -137,7 +140,6 @@ static void center_playing_item(mpdclient_t *c) { unsigned length = c->playlist.list->len; - unsigned offset = lw->selected - lw->start; int idx; if (!c->song || length < lw->rows || @@ -152,8 +154,25 @@ center_playing_item(mpdclient_t *c) list_window_center(lw, length, idx); /* make sure the cursor is in the window */ - lw->selected = lw->start+offset; - list_window_check_selected(lw, length); + if (lw->selected < lw->start) { + lw->selected = lw->start; + if (lw->visual_selection) { + lw->selected_start = lw->visual_base; + lw->selected_end = lw->selected; + } else { + lw->selected_start = lw->selected; + lw->selected_end = lw->selected; + } + } else if (lw->selected > lw->start + lw->rows - 1) { + lw->selected = lw->start + lw->rows - 1; + if (lw->visual_selection) { + lw->selected_start = lw->selected; + lw->selected_end = lw->visual_base; + } else { + lw->selected_start = lw->selected; + lw->selected_end = lw->selected; + } + } } #ifndef NCMPC_MINI @@ -225,7 +244,7 @@ playlist_save(mpdclient_t *c, char *name, char *defaultname) /* query the user for a filename */ filename = screen_readln(screen.status_window.w, - _("Save playlist as: "), + _("Save playlist as"), defaultname, NULL, gcmp); @@ -363,7 +382,7 @@ handle_add_to_playlist(mpdclient_t *c) /* get path */ path = screen_readln(screen.status_window.w, - _("Add: "), + _("Add"), NULL, NULL, #ifdef NCMPC_MINI @@ -493,7 +512,7 @@ play_update(mpdclient_t *c) prev_song_id = current_song_id; /* center the cursor */ - if (options.auto_center && current_song_id != -1) + if (options.auto_center && current_song_id != -1 && ! lw->visual_selection) center_playing_item(c); playlist_repaint(); @@ -568,8 +587,21 @@ play_cmd(mpdclient_t *c, command_t cmd) mpdclient_cmd_play(c, lw->selected); return true; case CMD_DELETE: - mpdclient_cmd_delete(c, lw->selected); + { + int i = lw->selected_end, start = lw->selected_start; + for(; i >= start; --i) + mpdclient_cmd_delete(c, i); + + i++; + if(i >= (int)playlist_length(&c->playlist)) + i--; + lw->selected = i; + lw->selected_start = i; + lw->selected_end = i; + lw->visual_selection = false; + return true; + } case CMD_SAVE_PLAYLIST: playlist_save(c, NULL, NULL); return true; @@ -580,12 +612,60 @@ play_cmd(mpdclient_t *c, command_t cmd) center_playing_item(c); playlist_repaint(); return false; + case CMD_SHUFFLE: + { + if(!lw->visual_selection) + /* No visual selection, shuffle all list. */ + break; + + if (mpdclient_cmd_shuffle_range(c, lw->selected_start, lw->selected_end+1) == 0) + screen_status_message(_("Shuffled playlist")); + return true; + } case CMD_LIST_MOVE_UP: - mpdclient_cmd_move(c, lw->selected, lw->selected-1); + if(lw->selected_start == 0) + return false; + if(lw->visual_selection) + { + unsigned i = lw->selected_start; + unsigned last_selected = lw->selected; + for(; i <= lw->selected_end; ++i) + mpdclient_cmd_move(c, i, i-1); + lw->selected_start--; + lw->selected_end--; + lw->selected = last_selected - 1; + lw->visual_base--; + } + else + { + mpdclient_cmd_move(c, lw->selected, lw->selected-1); + lw->selected--; + lw->selected_start--; + lw->selected_end--; + } return true; case CMD_LIST_MOVE_DOWN: - mpdclient_cmd_move(c, lw->selected, lw->selected+1); + if(lw->selected_end+1 >= playlist_length(&c->playlist)) + return false; + if(lw->visual_selection) + { + int i = lw->selected_end; + unsigned last_selected = lw->selected; + for(; i >= (int)lw->selected_start; --i) + mpdclient_cmd_move(c, i, i+1); + lw->selected_start++; + lw->selected_end++; + lw->selected = last_selected + 1; + lw->visual_base++; + } + else + { + mpdclient_cmd_move(c, lw->selected, lw->selected+1); + lw->selected++; + lw->selected_start++; + lw->selected_end++; + } return true; case CMD_LIST_FIND: case CMD_LIST_RFIND: @@ -595,6 +675,10 @@ play_cmd(mpdclient_t *c, command_t cmd) cmd, list_callback, NULL); playlist_repaint(); return true; + case CMD_LIST_JUMP: + screen_jump(lw, list_callback, NULL); + playlist_repaint(); + return true; #ifdef HAVE_GETMOUSE case CMD_MOUSE_EVENT: