From 3d7df64565cb81bf5bc25267e638cc174bd12555 Mon Sep 17 00:00:00 2001 From: Guillermo Venegas Date: Wed, 10 Jan 2024 12:46:01 -0600 Subject: [PATCH 1/3] init --- source/blender/blenkernel/BKE_file_handler.hh | 8 +++ .../blender/blenkernel/intern/file_handler.cc | 57 +++++++++++++++++++ source/blender/editors/space_file/file_ops.cc | 5 +- source/blender/editors/space_file/filesel.cc | 10 +++- 4 files changed, 78 insertions(+), 2 deletions(-) diff --git a/source/blender/blenkernel/BKE_file_handler.hh b/source/blender/blenkernel/BKE_file_handler.hh index a66818c12b0..b5a9b1d1072 100644 --- a/source/blender/blenkernel/BKE_file_handler.hh +++ b/source/blender/blenkernel/BKE_file_handler.hh @@ -33,6 +33,10 @@ struct FileHandlerType { /** List of file extensions supported by the file handler. */ Vector file_extensions; + /** Last file select directory where the import/export operator where executed. */ + std::string last_import_dir; + std::string last_import_filename; + /** RNA integration. */ ExtensionRNA rna_ext; @@ -71,4 +75,8 @@ Span> file_handlers(); blender::Vector file_handlers_poll_file_drop( const bContext *C, const blender::Span paths); +void file_handler_last_dir_set(StringRef opname, StringRef dir); +StringRef file_handler_last_dir_get(StringRef opname); +void file_handler_last_filename_set(StringRef opname, StringRef dir); +StringRef file_handler_last_filename_get(StringRef opname); } // namespace blender::bke diff --git a/source/blender/blenkernel/intern/file_handler.cc b/source/blender/blenkernel/intern/file_handler.cc index 9653ea470ee..0762d8d127d 100644 --- a/source/blender/blenkernel/intern/file_handler.cc +++ b/source/blender/blenkernel/intern/file_handler.cc @@ -117,4 +117,61 @@ blender::Vector FileHandlerType::filter_supported_paths( return indices; } +void file_handler_last_dir_set(StringRef opname, StringRef dir) +{ + { + auto itr = std::find_if(file_handlers().begin(), + file_handlers().end(), + [opname](const std::unique_ptr &file_handler) { + return opname == file_handler->import_operator; + }); + if (itr != file_handlers().end()) { + itr->get()->last_import_dir = dir; + } + } +} + +StringRef file_handler_last_dir_get(StringRef opname) +{ + { + auto itr = std::find_if(file_handlers().begin(), + file_handlers().end(), + [opname](const std::unique_ptr &file_handler) { + return opname == file_handler->import_operator; + }); + if (itr != file_handlers().end()) { + return itr->get()->last_import_dir; + } + } + return nullptr; +} + +void file_handler_last_filename_set(StringRef opname, StringRef dir) +{ + { + auto itr = std::find_if(file_handlers().begin(), + file_handlers().end(), + [opname](const std::unique_ptr &file_handler) { + return opname == file_handler->import_operator; + }); + if (itr != file_handlers().end()) { + itr->get()->last_import_filename = dir; + } + } +} + +StringRef file_handler_last_filename_get(StringRef opname) +{ + { + auto itr = std::find_if(file_handlers().begin(), + file_handlers().end(), + [opname](const std::unique_ptr &file_handler) { + return opname == file_handler->import_operator; + }); + if (itr != file_handlers().end()) { + return itr->get()->last_import_filename; + } + } + return nullptr; +} } // namespace blender::bke diff --git a/source/blender/editors/space_file/file_ops.cc b/source/blender/editors/space_file/file_ops.cc index 771b44b9e22..4be38f75df0 100644 --- a/source/blender/editors/space_file/file_ops.cc +++ b/source/blender/editors/space_file/file_ops.cc @@ -14,6 +14,7 @@ #include "BKE_appdir.h" #include "BKE_blendfile.hh" #include "BKE_context.hh" +#include "BKE_file_handler.hh" #include "BKE_global.h" #include "BKE_main.hh" #include "BKE_report.h" @@ -2086,7 +2087,9 @@ static bool file_execute(bContext *C, SpaceFile *sfile) char filepath[FILE_MAX]; sfile->op = nullptr; - + FileSelectParams *params = ED_fileselect_get_active_params(sfile); + blender::bke::file_handler_last_dir_set(op->idname, params->dir); + blender::bke::file_handler_last_filename_set(op->idname, params->file); file_sfile_to_operator_ex(C, bmain, op, sfile, filepath); if (BLI_exists(params->dir)) { diff --git a/source/blender/editors/space_file/filesel.cc b/source/blender/editors/space_file/filesel.cc index a87464c171c..9f354c95414 100644 --- a/source/blender/editors/space_file/filesel.cc +++ b/source/blender/editors/space_file/filesel.cc @@ -43,6 +43,7 @@ #include "BKE_appdir.h" #include "BKE_context.hh" +#include "BKE_file_handler.hh" #include "BKE_idtype.h" #include "BKE_main.hh" #include "BKE_preferences.h" @@ -181,7 +182,14 @@ static FileSelectParams *fileselect_ensure_updated_file_params(SpaceFile *sfile) params->type = FILE_SPECIAL; } - if (is_filepath && RNA_struct_property_is_set_ex(op->ptr, "filepath", false)) { + if (auto dir = blender::bke::file_handler_last_dir_get(op->idname); dir.data()) { + STRNCPY(params->dir, dir.data()); + auto filename = blender::bke::file_handler_last_filename_get(op->idname); + if (filename.data()) { + STRNCPY(params->dir, dir.data()); + } + } + else if (is_filepath && RNA_struct_property_is_set_ex(op->ptr, "filepath", false)) { char filepath[FILE_MAX]; RNA_string_get(op->ptr, "filepath", filepath); if (params->type == FILE_LOADLIB) { -- 2.30.2 From a9028091895da54dc9461f966a3b23c560bfb9cb Mon Sep 17 00:00:00 2001 From: Guillermo Venegas Date: Wed, 10 Jan 2024 13:20:59 -0600 Subject: [PATCH 2/3] format --- source/blender/blenkernel/BKE_file_handler.hh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/source/blender/blenkernel/BKE_file_handler.hh b/source/blender/blenkernel/BKE_file_handler.hh index b5a9b1d1072..050cbce9964 100644 --- a/source/blender/blenkernel/BKE_file_handler.hh +++ b/source/blender/blenkernel/BKE_file_handler.hh @@ -33,8 +33,9 @@ struct FileHandlerType { /** List of file extensions supported by the file handler. */ Vector file_extensions; - /** Last file select directory where the import/export operator where executed. */ + /** Last directory in the file select window where the import operator where executed. */ std::string last_import_dir; + /** Last filename used in the file select window where the import operator where executed. */ std::string last_import_filename; /** RNA integration. */ @@ -76,7 +77,10 @@ blender::Vector file_handlers_poll_file_drop( const bContext *C, const blender::Span paths); void file_handler_last_dir_set(StringRef opname, StringRef dir); + StringRef file_handler_last_dir_get(StringRef opname); + void file_handler_last_filename_set(StringRef opname, StringRef dir); + StringRef file_handler_last_filename_get(StringRef opname); } // namespace blender::bke -- 2.30.2 From 571713c855581a99bae761766830e98e9c89759e Mon Sep 17 00:00:00 2001 From: Guillermo Venegas Date: Wed, 10 Jan 2024 15:12:58 -0600 Subject: [PATCH 3/3] explicit requested path --- source/blender/editors/space_file/filesel.cc | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/space_file/filesel.cc b/source/blender/editors/space_file/filesel.cc index 9f354c95414..7a414069604 100644 --- a/source/blender/editors/space_file/filesel.cc +++ b/source/blender/editors/space_file/filesel.cc @@ -181,8 +181,16 @@ static FileSelectParams *fileselect_ensure_updated_file_params(SpaceFile *sfile) else { params->type = FILE_SPECIAL; } - - if (auto dir = blender::bke::file_handler_last_dir_get(op->idname); dir.data()) { + /* Check before if the operator has explicit requested to load a directory in the fileselect. + */ + bool has_explicit_filepath = (is_filepath && + RNA_struct_property_is_set(op->ptr, "filepath")) || + (is_directory && + RNA_struct_property_is_set(op->ptr, "directory")); + /* Use the file handler to get previously used settings. */ + if (auto dir = blender::bke::file_handler_last_dir_get(op->idname); + !has_explicit_filepath && dir.data()) + { STRNCPY(params->dir, dir.data()); auto filename = blender::bke::file_handler_last_filename_get(op->idname); if (filename.data()) { -- 2.30.2