Code

renamed visual selection to range selection
[ncmpc.git] / src / screen_browser.c
index b118a7ec3c7e457a2350e60583beaacaff04ea58..29dd4bfa49f3865f524e6ae98e55a6fd1aac8853 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
@@ -279,13 +279,23 @@ browser_get_selected(const struct screen_browser *browser)
        return filelist_get(browser->filelist, browser->lw->selected);
 }
 
+static struct filelist_entry *
+browser_get_index(const struct screen_browser *browser, unsigned i)
+{
+       if (browser->filelist == NULL ||
+           i >= filelist_length(browser->filelist))
+               return NULL;
+
+       return filelist_get(browser->filelist, i);
+}
+
 static bool
 browser_handle_enter(struct screen_browser *browser, mpdclient_t *c)
 {
        struct filelist_entry *entry = browser_get_selected(browser);
        mpd_InfoEntity *entity;
 
-       if( entry==NULL )
+       if( entry==NULL || browser->lw->selected_start < browser->lw->selected_end)
                return false;
 
        entity = entry->entity;
@@ -361,23 +371,49 @@ browser_select_entry(mpdclient_t *c, filelist_entry_t *entry,
 static bool
 browser_handle_select(struct screen_browser *browser, mpdclient_t *c)
 {
-       struct filelist_entry *entry = browser_get_selected(browser);
+       struct filelist_entry *entry;
+
+       if (browser->lw->range_selection) {
+               for (unsigned i = browser->lw->selected_start;
+                        i <= browser->lw->selected_end; i++) {
+                       entry = browser_get_index(browser, i);
 
-       if (entry == NULL || entry->entity == NULL)
+                       if (entry != NULL && entry->entity != NULL)
+                               browser_select_entry(c, entry, TRUE);
+               }
                return false;
+       } else {
+               entry = browser_get_selected(browser);
 
-       return browser_select_entry(c, entry, TRUE);
+               if (entry == NULL || entry->entity == NULL)
+                       return false;
+
+               return browser_select_entry(c, entry, TRUE);
+       }
 }
 
 static bool
 browser_handle_add(struct screen_browser *browser, mpdclient_t *c)
 {
-       struct filelist_entry *entry = browser_get_selected(browser);
+       struct filelist_entry *entry;
+
+       if (browser->lw->range_selection) {
+               for (unsigned i = browser->lw->selected_start;
+                        i <= browser->lw->selected_end; i++) {
+                       entry = browser_get_index(browser, i);
 
-       if (entry == NULL || entry->entity == NULL)
+                       if (entry != NULL && entry->entity != NULL)
+                               browser_select_entry(c, entry, FALSE);
+               }
                return false;
+       } else {
+               entry = browser_get_selected(browser);
+
+               if (entry == NULL || entry->entity == NULL)
+                       return false;
 
-       return browser_select_entry(c, entry, FALSE);
+               return browser_select_entry(c, entry, FALSE);
+       }
 }
 
 static void
@@ -511,6 +547,14 @@ browser_cmd(struct screen_browser *browser,
                screen_lyrics_switch(c, entry->entity->info.song);
                return true;
 #endif
+       case CMD_SCREEN_SWAP:
+               entry = browser_get_selected(browser);
+               if (entry->entity != NULL &&
+                       entry->entity->type == MPD_INFO_ENTITY_TYPE_SONG)
+                       screen_swap(c, entry->entity->info.song);
+               else
+                       screen_swap(c, NULL);
+               return true;
 
        default:
                break;