[Bf-blender-cvs] [6b0869039a4] master: File Browser: Select files and directories after renaming

Julian Eisel noreply at git.blender.org
Wed Jul 7 18:43:42 CEST 2021


Commit: 6b0869039a40685e2f4b128b3d08b12c1f3fea75
Author: Julian Eisel
Date:   Wed Jul 7 18:20:21 2021 +0200
Branches: master
https://developer.blender.org/rB6b0869039a40685e2f4b128b3d08b12c1f3fea75

File Browser: Select files and directories after renaming

(Note: This is an alternative version for D9994 by @Schiette. The commit
message is based on his description.)

Currently, when a new directory is created it is not selected.
Similarly, when renaming an existing file or directory, it does not
remain active/highlighted blue after renaming.

This change makes sure the file or directory is always selected after
renaming, even if the renaming failed or was cancelled.
This has some usability advantages:
 - Open the newly created directory without having to select it (ENTER).
 - If you make a naming mistake, you can immediately fix that (F2)
   without having to click it again.
 - If you create a directory and forget to name it, you can fix that
   (F2) without having to select it.
 - This is consistent with many common File Browsers.

Further, selecting the item even after renaming failed or was cancelled
helps keeping the file in focus, so the user doesn't have to look for it
(especially if the renaming just failed which the user may not notice).
In other words, it avoids disorienting the user.

Also see D11119 which requires this behavior.

We could also always select the file/directory on mouse press. This
would make some hacks unnecessary, but may have further implications. I
think eventually that's what we should do though.

===================================================================

M	source/blender/editors/space_file/file_draw.c
M	source/blender/editors/space_file/file_intern.h
M	source/blender/editors/space_file/filesel.c

===================================================================

diff --git a/source/blender/editors/space_file/file_draw.c b/source/blender/editors/space_file/file_draw.c
index 4d568017b4f..faa4b3cc9cc 100644
--- a/source/blender/editors/space_file/file_draw.c
+++ b/source/blender/editors/space_file/file_draw.c
@@ -523,6 +523,7 @@ static void renamebutton_cb(bContext *C, void *UNUSED(arg1), char *oldname)
   char orgname[FILE_MAX + 12];
   char filename[FILE_MAX + 12];
   wmWindowManager *wm = CTX_wm_manager(C);
+  wmWindow *win = CTX_wm_window(C);
   SpaceFile *sfile = (SpaceFile *)CTX_wm_space_data(C);
   ARegion *region = CTX_wm_region(C);
   FileSelectParams *params = ED_fileselect_get_active_params(sfile);
@@ -542,12 +543,16 @@ static void renamebutton_cb(bContext *C, void *UNUSED(arg1), char *oldname)
       else {
         /* If rename is successful, scroll to newly renamed entry. */
         BLI_strncpy(params->renamefile, filename, sizeof(params->renamefile));
-        file_params_invoke_rename_postscroll(wm, CTX_wm_window(C), sfile);
+        file_params_invoke_rename_postscroll(wm, win, sfile);
       }
 
       /* to make sure we show what is on disk */
       ED_fileselect_clear(wm, sfile);
     }
+    else {
+      /* Renaming failed, reset the name for further renaming handling. */
+      BLI_strncpy(params->renamefile, oldname, sizeof(params->renamefile));
+    }
 
     ED_region_tag_redraw(region);
   }
@@ -812,6 +817,8 @@ static void draw_details_columns(const FileSelectParams *params,
 
 void file_draw_list(const bContext *C, ARegion *region)
 {
+  wmWindowManager *wm = CTX_wm_manager(C);
+  wmWindow *win = CTX_wm_window(C);
   SpaceFile *sfile = CTX_wm_space_file(C);
   FileSelectParams *params = ED_fileselect_get_active_params(sfile);
   FileLayout *layout = ED_fileselect_get_layout(sfile, region);
@@ -882,12 +889,12 @@ void file_draw_list(const bContext *C, ARegion *region)
       //          printf("%s: preview task: %d\n", __func__, previews_running);
       if (previews_running && !sfile->previews_timer) {
         sfile->previews_timer = WM_event_add_timer_notifier(
-            CTX_wm_manager(C), CTX_wm_window(C), NC_SPACE | ND_SPACE_FILE_PREVIEW, 0.01);
+            wm, win, NC_SPACE | ND_SPACE_FILE_PREVIEW, 0.01);
       }
       if (!previews_running && sfile->previews_timer) {
         /* Preview is not running, no need to keep generating update events! */
         //              printf("%s: Inactive preview task, sleeping!\n", __func__);
-        WM_event_remove_timer_notifier(CTX_wm_manager(C), CTX_wm_window(C), sfile->previews_timer);
+        WM_event_remove_timer_notifier(wm, win, sfile->previews_timer);
         sfile->previews_timer = NULL;
       }
     }
@@ -998,8 +1005,19 @@ void file_draw_list(const bContext *C, ARegion *region)
       UI_but_flag_enable(but, UI_BUT_NO_UTF8); /* allow non utf8 names */
       UI_but_flag_disable(but, UI_BUT_UNDO);
       if (false == UI_but_active_only(C, region, block, but)) {
-        file_selflag = filelist_entry_select_set(
-            sfile->files, file, FILE_SEL_REMOVE, FILE_SEL_EDITING, CHECK_ALL);
+        /* Note that this is the only place where we can also handle a cancelled renaming. */
+
+        file_params_rename_end(wm, win, sfile, file);
+
+        /* After the rename button is removed, we need to make sure the view is redrawn once more,
+         * in case selection changed. Usually UI code would trigger that redraw, but the rename
+         * operator may have been called from a different region.
+         * Tagging regions for redrawing while drawing is rightfully prevented. However, this
+         * active button removing basically introduces handling logic to drawing code. So a
+         * notifier should be an acceptable workaround. */
+        WM_event_add_notifier_ex(wm, win, NC_SPACE | ND_SPACE_FILE_PARAMS, NULL);
+
+        file_selflag = filelist_entry_select_get(sfile->files, file, CHECK_ALL);
       }
     }
 
diff --git a/source/blender/editors/space_file/file_intern.h b/source/blender/editors/space_file/file_intern.h
index 060a36febe7..0bbed65671c 100644
--- a/source/blender/editors/space_file/file_intern.h
+++ b/source/blender/editors/space_file/file_intern.h
@@ -121,6 +121,10 @@ void file_params_renamefile_clear(struct FileSelectParams *params);
 void file_params_invoke_rename_postscroll(struct wmWindowManager *wm,
                                           struct wmWindow *win,
                                           SpaceFile *sfile);
+void file_params_rename_end(struct wmWindowManager *wm,
+                            struct wmWindow *win,
+                            SpaceFile *sfile,
+                            struct FileDirEntry *rename_file);
 void file_params_renamefile_activate(struct SpaceFile *sfile, struct FileSelectParams *params);
 
 typedef void *onReloadFnData;
diff --git a/source/blender/editors/space_file/filesel.c b/source/blender/editors/space_file/filesel.c
index 664929b09fc..6be957539aa 100644
--- a/source/blender/editors/space_file/filesel.c
+++ b/source/blender/editors/space_file/filesel.c
@@ -1261,6 +1261,26 @@ void file_params_invoke_rename_postscroll(wmWindowManager *wm, wmWindow *win, Sp
   sfile->scroll_offset = 0;
 }
 
+/**
+ * To be executed whenever renaming ends (successfully or not).
+ */
+void file_params_rename_end(wmWindowManager *wm,
+                            wmWindow *win,
+                            SpaceFile *sfile,
+                            FileDirEntry *rename_file)
+{
+  FileSelectParams *params = ED_fileselect_get_active_params(sfile);
+
+  filelist_entry_select_set(
+      sfile->files, rename_file, FILE_SEL_REMOVE, FILE_SEL_EDITING, CHECK_ALL);
+
+  /* Ensure smooth-scroll timer is active, even if not needed, because that way rename state is
+   * handled properly. */
+  file_params_invoke_rename_postscroll(wm, win, sfile);
+  /* Also always activate the rename file, even if renaming was cancelled. */
+  file_params_renamefile_activate(sfile, params);
+}
+
 void file_params_renamefile_clear(FileSelectParams *params)
 {
   params->renamefile[0] = '\0';
@@ -1292,7 +1312,10 @@ void file_params_renamefile_activate(SpaceFile *sfile, FileSelectParams *params)
       params->rename_flag = FILE_PARAMS_RENAME_ACTIVE;
     }
     else if ((params->rename_flag & FILE_PARAMS_RENAME_POSTSCROLL_PENDING) != 0) {
-      filelist_entry_select_set(sfile->files, file, FILE_SEL_ADD, FILE_SEL_HIGHLIGHTED, CHECK_ALL);
+      file_select_deselect_all(sfile, FILE_SEL_SELECTED);
+      filelist_entry_select_set(
+          sfile->files, file, FILE_SEL_ADD, FILE_SEL_SELECTED | FILE_SEL_HIGHLIGHTED, CHECK_ALL);
+      params->active_file = idx;
       params->renamefile[0] = '\0';
       params->rename_flag = FILE_PARAMS_RENAME_POSTSCROLL_ACTIVE;
     }



More information about the Bf-blender-cvs mailing list