Code

Spelling corrections
[ncmpc.git] / src / screen_play.c
index eae3ace8c50098fbc5f2ab1b7bb5ce3bb9df2853..b9b0ecb0f18606cf639f905a76ef31728cf201a4 100644 (file)
@@ -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: