Code

go to root/parent dir key added
[ncmpc.git] / src / screen_file.c
index b2ca1b6cd9c6c5acd0bf72f9935f116ce9e55a82..4a4bdf70c1bcb0b65b5842cf5ba1c2d13a71bbbd 100644 (file)
@@ -34,7 +34,7 @@
 #include "screen.h"
 #include "screen_utils.h"
 #include "screen_browse.h"
-
+#include "screen_play.h"
 
 #define USE_OLD_LAYOUT
 #undef  USE_OLD_ADD
@@ -202,25 +202,38 @@ browse_lw_callback(int index, int *highlight, void *data)
       g_free(filename);
       return buf;
     }
-  return "Error: Unknow entry!";
+  return "Error: Unknown entry!";
 }
 
 /* chdir */
 static int
-change_directory(screen_t *screen, mpdclient_t *c, filelist_entry_t *entry)
+change_directory(screen_t *screen, mpdclient_t *c, filelist_entry_t *entry, char *new_path)
 {
-  mpd_InfoEntity *entity = entry->entity;
+  mpd_InfoEntity *entity = NULL;
   gchar *path = NULL;
 
+  if( entry!=NULL )
+    entity = entry->entity;
+  else if( new_path==NULL )
+    return -1;
+
   if( entity==NULL )
     {
-      /* return to parent */
-      char *parent = g_path_get_dirname(filelist->path);
-      if( strcmp(parent, ".") == 0 )
+      if( entry || 0==strcmp(new_path, "..") )
        {
-         parent[0] = '\0';
+         /* return to parent */
+         char *parent = g_path_get_dirname(filelist->path);
+         if( strcmp(parent, ".") == 0 )
+           {
+             parent[0] = '\0';
+           }
+         path = g_strdup(parent);
+       }
+      else
+       {
+         /* entry==NULL, then new_path ("" is root) */
+         path = g_strdup(new_path);
        }
-      path = g_strdup(parent);
       list_window_reset(lw);
       /* restore previous list window state */
       list_window_pop_state(lw_state,lw); 
@@ -366,7 +379,7 @@ browse_handle_enter(screen_t *screen,
 
   entity = entry->entity;
   if( entity==NULL || entity->type==MPD_INFO_ENTITY_TYPE_DIRECTORY )
-    return change_directory(screen, c, entry);
+    return change_directory(screen, c, entry, NULL);
   else if( entity->type==MPD_INFO_ENTITY_TYPE_PLAYLISTFILE )
     return load_playlist(screen, c, entry);
   else if( entity->type==MPD_INFO_ENTITY_TYPE_SONG )
@@ -549,7 +562,20 @@ browse_close(void)
 static char *
 browse_title(char *str, size_t size)
 {
-  g_snprintf(str, size, _("Browse: %s"), basename(filelist->path));
+  char *pathcopy;
+  char *parentdir;
+  pathcopy = strdup(filelist->path);
+  parentdir = dirname(pathcopy);
+  parentdir = basename(parentdir);
+  if( parentdir[0] == '.' && strlen(parentdir) == 1 )
+    {
+      parentdir = NULL;
+    }
+  g_snprintf(str, size, _("Browse: %s%s%s"),
+            parentdir ? parentdir : "",
+            parentdir ? "/" : "",
+            basename(filelist->path));
+  free(pathcopy);
   return str;
 }
 
@@ -622,6 +648,12 @@ browse_cmd(screen_t *screen, mpdclient_t *c, command_t cmd)
     case CMD_PLAY:
       browse_handle_enter(screen, c, lw, filelist);
       return 1;
+    case CMD_GO_ROOT_DIRECTORY:
+      return change_directory(screen, c, NULL, "");
+      break;
+    case CMD_GO_PARENT_DIRECTORY:
+      return change_directory(screen, c, NULL, "..");
+      break;
     case CMD_SELECT:
       if( browse_handle_select(screen, c, lw, filelist) == 0 )
        {
@@ -648,8 +680,12 @@ browse_cmd(screen_t *screen, mpdclient_t *c, command_t cmd)
        {
          if( mpdclient_cmd_db_update_utf8(c,filelist->path)==0 )
            {
-             screen_status_printf(_("Database update of %s started!"),
+             if(strcmp(filelist->path,"")) {
+                screen_status_printf(_("Database update of %s started!"),
                                   filelist->path);
+             } else {
+               screen_status_printf(_("Database update started!"));
+             }
              /* set updatingDb to make shure the browse callback gets called
               * even if the updated has finished before status is updated */
              c->status->updatingDb = 1;