From 722b8a34755fe34d666808f25725e807c3ad054d Mon Sep 17 00:00:00 2001 From: Guillermo Date: Tue, 8 Aug 2023 13:58:38 -0600 Subject: [PATCH 01/12] changes --- .../editors/interface/interface_drag.cc | 2 +- source/blender/editors/screen/screen_ops.cc | 2 +- .../blender/editors/space_clip/space_clip.cc | 3 +- .../editors/space_console/space_console.cc | 2 +- .../blender/editors/space_file/space_file.cc | 2 +- .../editors/space_image/space_image.cc | 2 +- .../blender/editors/space_node/space_node.cc | 6 +-- .../space_sequencer/sequencer_drag_drop.cc | 10 ++--- .../blender/editors/space_text/space_text.cc | 2 +- .../editors/space_view3d/space_view3d.cc | 6 +-- source/blender/windowmanager/WM_api.hh | 10 ++--- source/blender/windowmanager/WM_types.hh | 10 ++++- .../windowmanager/intern/wm_dragdrop.cc | 39 +++++++++++++------ .../blender/windowmanager/intern/wm_window.cc | 10 ++--- 14 files changed, 65 insertions(+), 41 deletions(-) diff --git a/source/blender/editors/interface/interface_drag.cc b/source/blender/editors/interface/interface_drag.cc index 7f5bfa1f49c..26a4debd5c9 100644 --- a/source/blender/editors/interface/interface_drag.cc +++ b/source/blender/editors/interface/interface_drag.cc @@ -64,7 +64,7 @@ void UI_but_drag_set_path(uiBut *but, const char *path) if (but->dragflag & UI_BUT_DRAGPOIN_FREE) { WM_drag_data_free(but->dragtype, but->dragpoin); } - but->dragpoin = WM_drag_create_path_data(path); + but->dragpoin = WM_drag_create_path_data(blender::Span(&path, 1)); but->dragflag |= UI_BUT_DRAGPOIN_FREE; } diff --git a/source/blender/editors/screen/screen_ops.cc b/source/blender/editors/screen/screen_ops.cc index 5c1f04411ee..5c99f287d98 100644 --- a/source/blender/editors/screen/screen_ops.cc +++ b/source/blender/editors/screen/screen_ops.cc @@ -5907,7 +5907,7 @@ static bool blend_file_drop_poll(bContext * /*C*/, wmDrag *drag, const wmEvent * static void blend_file_drop_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) { /* copy drag path to properties */ - RNA_string_set(drop->ptr, "filepath", WM_drag_get_path(drag)); + RNA_string_set(drop->ptr, "filepath", WM_drag_get_paths(drag)[0].c_str()); } void ED_keymap_screen(wmKeyConfig *keyconf) diff --git a/source/blender/editors/space_clip/space_clip.cc b/source/blender/editors/space_clip/space_clip.cc index 0590cde1309..704bf0d889f 100644 --- a/source/blender/editors/space_clip/space_clip.cc +++ b/source/blender/editors/space_clip/space_clip.cc @@ -536,7 +536,8 @@ static void clip_drop_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) PointerRNA itemptr; char dir[FILE_MAX], file[FILE_MAX]; - BLI_path_split_dir_file(WM_drag_get_path(drag), dir, sizeof(dir), file, sizeof(file)); + BLI_path_split_dir_file( + WM_drag_get_paths(drag)[0].c_str(), dir, sizeof(dir), file, sizeof(file)); RNA_string_set(drop->ptr, "directory", dir); diff --git a/source/blender/editors/space_console/space_console.cc b/source/blender/editors/space_console/space_console.cc index 3c9583536fc..3be2eb03efc 100644 --- a/source/blender/editors/space_console/space_console.cc +++ b/source/blender/editors/space_console/space_console.cc @@ -174,7 +174,7 @@ static bool path_drop_poll(bContext * /*C*/, wmDrag *drag, const wmEvent * /*eve static void path_drop_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) { char pathname[FILE_MAX + 2]; - SNPRINTF(pathname, "\"%s\"", WM_drag_get_path(drag)); + SNPRINTF(pathname, "\"%s\"", WM_drag_get_paths(drag)[0].c_str()); RNA_string_set(drop->ptr, "text", pathname); } diff --git a/source/blender/editors/space_file/space_file.cc b/source/blender/editors/space_file/space_file.cc index 50ececbfdcc..9076afe24b1 100644 --- a/source/blender/editors/space_file/space_file.cc +++ b/source/blender/editors/space_file/space_file.cc @@ -799,7 +799,7 @@ static bool filepath_drop_poll(bContext *C, wmDrag *drag, const wmEvent * /*even static void filepath_drop_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) { - RNA_string_set(drop->ptr, "filepath", WM_drag_get_path(drag)); + RNA_string_set(drop->ptr, "filepath", WM_drag_get_paths(drag)[0].c_str()); } /* region dropbox definition */ diff --git a/source/blender/editors/space_image/space_image.cc b/source/blender/editors/space_image/space_image.cc index 258624f220c..6e90f677b0b 100644 --- a/source/blender/editors/space_image/space_image.cc +++ b/source/blender/editors/space_image/space_image.cc @@ -268,7 +268,7 @@ static bool image_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event) static void image_drop_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) { /* copy drag path to properties */ - RNA_string_set(drop->ptr, "filepath", WM_drag_get_path(drag)); + RNA_string_set(drop->ptr, "filepath", WM_drag_get_paths(drag)[0].c_str()); } /* area+region dropbox definition */ diff --git a/source/blender/editors/space_node/space_node.cc b/source/blender/editors/space_node/space_node.cc index b22310ec357..0828705f3fa 100644 --- a/source/blender/editors/space_node/space_node.cc +++ b/source/blender/editors/space_node/space_node.cc @@ -725,9 +725,9 @@ static void node_id_path_drop_copy(bContext *C, wmDrag *drag, wmDropBox *drop) return; } - const char *path = WM_drag_get_path(drag); - if (path) { - RNA_string_set(drop->ptr, "filepath", path); + const auto paths = WM_drag_get_paths(drag); + if (paths.begin()) { + RNA_string_set(drop->ptr, "filepath", paths[0].c_str()); RNA_struct_property_unset(drop->ptr, "name"); return; } diff --git a/source/blender/editors/space_sequencer/sequencer_drag_drop.cc b/source/blender/editors/space_sequencer/sequencer_drag_drop.cc index 454d6af6ab0..80619b39cf1 100644 --- a/source/blender/editors/space_sequencer/sequencer_drag_drop.cc +++ b/source/blender/editors/space_sequencer/sequencer_drag_drop.cc @@ -249,17 +249,17 @@ static void sequencer_drop_copy(bContext *C, wmDrag *drag, wmDropBox *drop) return; } - const char *path = WM_drag_get_path(drag); + const auto paths = WM_drag_get_paths(drag); /* Path dropped. */ - if (path) { + if (paths.begin()) { if (RNA_struct_find_property(drop->ptr, "filepath")) { - RNA_string_set(drop->ptr, "filepath", path); + RNA_string_set(drop->ptr, "filepath", paths[0].c_str()); } if (RNA_struct_find_property(drop->ptr, "directory")) { PointerRNA itemptr; char dir[FILE_MAX], file[FILE_MAX]; - BLI_path_split_dir_file(path, dir, sizeof(dir), file, sizeof(file)); + BLI_path_split_dir_file(paths[0].c_str(), dir, sizeof(dir), file, sizeof(file)); RNA_string_set(drop->ptr, "directory", dir); @@ -337,7 +337,7 @@ static void get_drag_path(const bContext *C, wmDrag *drag, char r_path[FILE_MAX] BLI_path_abs(r_path, BKE_main_blendfile_path_from_global()); } else { - BLI_strncpy(r_path, WM_drag_get_path(drag), FILE_MAX); + BLI_strncpy(r_path, WM_drag_get_paths(drag)[0].c_str(), FILE_MAX); } } diff --git a/source/blender/editors/space_text/space_text.cc b/source/blender/editors/space_text/space_text.cc index fc80f095a52..613d38512b4 100644 --- a/source/blender/editors/space_text/space_text.cc +++ b/source/blender/editors/space_text/space_text.cc @@ -315,7 +315,7 @@ static bool text_drop_poll(bContext * /*C*/, wmDrag *drag, const wmEvent * /*eve static void text_drop_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) { /* copy drag path to properties */ - RNA_string_set(drop->ptr, "filepath", WM_drag_get_path(drag)); + RNA_string_set(drop->ptr, "filepath", WM_drag_get_paths(drag)[0].c_str()); } static bool text_drop_paste_poll(bContext * /*C*/, wmDrag *drag, const wmEvent * /*event*/) diff --git a/source/blender/editors/space_view3d/space_view3d.cc b/source/blender/editors/space_view3d/space_view3d.cc index 3f25a756117..7a856677bd2 100644 --- a/source/blender/editors/space_view3d/space_view3d.cc +++ b/source/blender/editors/space_view3d/space_view3d.cc @@ -927,9 +927,9 @@ static void view3d_id_path_drop_copy(bContext *C, wmDrag *drag, wmDropBox *drop) RNA_struct_property_unset(drop->ptr, "filepath"); return; } - const char *path = WM_drag_get_path(drag); - if (path) { - RNA_string_set(drop->ptr, "filepath", path); + const auto paths = WM_drag_get_paths(drag); + if (paths.begin()) { + RNA_string_set(drop->ptr, "filepath", paths[0].c_str()); RNA_struct_property_unset(drop->ptr, "image"); } } diff --git a/source/blender/windowmanager/WM_api.hh b/source/blender/windowmanager/WM_api.hh index 1c53cc59417..d6068d87f62 100644 --- a/source/blender/windowmanager/WM_api.hh +++ b/source/blender/windowmanager/WM_api.hh @@ -1393,13 +1393,13 @@ const ListBase *WM_drag_asset_list_get(const wmDrag *drag); const char *WM_drag_get_item_name(wmDrag *drag); -/* Path drag and drop. */ +/* Paths drag and drop. */ /** - * \param path: The path to drag. Value will be copied into the drag data so the passed string may - * be destructed. + * \param paths: The paths to drag. Values will be copied into the drag data so the passed strings + * may be destructed. Only paths that share the same extension of the first file will be copied. */ -wmDragPath *WM_drag_create_path_data(const char *path); -const char *WM_drag_get_path(const wmDrag *drag); +wmDragPath *WM_drag_create_path_data(blender::Span paths); +const blender::Span WM_drag_get_paths(const wmDrag *drag); /** * Note that even though the enum return type uses bit-flags, this should never have multiple * type-bits set, so `ELEM()` like comparison is possible. diff --git a/source/blender/windowmanager/WM_types.hh b/source/blender/windowmanager/WM_types.hh index 78ce4181524..4ed77f96dc5 100644 --- a/source/blender/windowmanager/WM_types.hh +++ b/source/blender/windowmanager/WM_types.hh @@ -106,6 +106,7 @@ struct wmWindowManager; #include "BLI_compiler_attrs.h" #include "BLI_utildefines.h" +#include "BLI_vector.hh" #include "DNA_listBase.h" #include "DNA_uuid_types.h" #include "DNA_vec_types.h" @@ -1125,10 +1126,15 @@ struct wmDragAssetListItem { }; struct wmDragPath { - char *path; + const blender::Vector paths; /* Note that even though the enum type uses bit-flags, this should never have multiple type-bits * set, so `ELEM()` like comparison is possible. */ - int file_type; /* eFileSel_File_Types */ + const int file_type; /* eFileSel_File_Types */ + const std::string tooltip; + wmDragPath(const blender::Vector &paths, const std::string &tooltip, int file_type) + : paths(std::move(paths)), file_type(file_type), tooltip(tooltip) + { + } }; struct wmDragGreasePencilLayer { diff --git a/source/blender/windowmanager/intern/wm_dragdrop.cc b/source/blender/windowmanager/intern/wm_dragdrop.cc index 5f5b1c7afbb..c4bd775449f 100644 --- a/source/blender/windowmanager/intern/wm_dragdrop.cc +++ b/source/blender/windowmanager/intern/wm_dragdrop.cc @@ -760,29 +760,45 @@ const ListBase *WM_drag_asset_list_get(const wmDrag *drag) return &drag->asset_items; } -wmDragPath *WM_drag_create_path_data(const char *path) +wmDragPath *WM_drag_create_path_data(blender::Span _paths) { - wmDragPath *path_data = MEM_new("wmDragPath"); - path_data->path = BLI_strdup(path); - path_data->file_type = ED_path_extension_type(path); + const char *ext = BLI_path_extension(_paths[0]); + blender::Vector paths; + for (auto path : _paths) { + if (STREQ(ext, BLI_path_extension(path))) { + paths.append(path); + } + } + char *tooltip; + if (_paths.size() == 1) { + tooltip = BLI_strdup(_paths[0]); + } + else { + tooltip = BLI_sprintfN(TIP_("Dragging %d %s files."), paths.size()); + } + + wmDragPath *path_data = MEM_new( + "wmDragPath", paths, tooltip, ED_path_extension_type(_paths[0])); + + MEM_freeN(tooltip); + return path_data; } static void wm_drag_free_path_data(wmDragPath **path_data) { - MEM_freeN((*path_data)->path); MEM_delete(*path_data); *path_data = nullptr; } -const char *WM_drag_get_path(const wmDrag *drag) +const blender::Span WM_drag_get_paths(const wmDrag *drag) { if (drag->type != WM_DRAG_PATH) { - return nullptr; + return blender::Span(); } const wmDragPath *path_data = static_cast(drag->poin); - return path_data->path; + return path_data->paths.as_span(); } int WM_drag_get_path_file_type(const wmDrag *drag) @@ -846,7 +862,7 @@ const char *WM_drag_get_item_name(wmDrag *drag) } case WM_DRAG_PATH: { const wmDragPath *path_drag_data = static_cast(drag->poin); - return path_drag_data->path; + return path_drag_data->tooltip.c_str(); } case WM_DRAG_NAME: return static_cast(drag->poin); @@ -1039,8 +1055,9 @@ void wm_drags_draw(bContext *C, wmWindow *win) wmWindowViewport(win); } - /* Drawing should be allowed to assume the context from handling and polling (that's why we - * restore it above). */ + /* Drawing should be allowed to assume the context from + * handling and polling (that's why we restore it + * above). */ if (drag->drop_state.active_dropbox->draw_droptip) { drag->drop_state.active_dropbox->draw_droptip(C, win, drag, xy); continue; diff --git a/source/blender/windowmanager/intern/wm_window.cc b/source/blender/windowmanager/intern/wm_window.cc index c00f4e67ab2..4ce0ebba482 100644 --- a/source/blender/windowmanager/intern/wm_window.cc +++ b/source/blender/windowmanager/intern/wm_window.cc @@ -1512,14 +1512,14 @@ wm_window_swap_buffers(win); if (ddd->dataType == GHOST_kDragnDropTypeFilenames) { GHOST_TStringArray *stra = static_cast(ddd->data); - for (int a = 0; a < stra->count; a++) { - printf("drop file %s\n", stra->strings[a]); + if (stra->count) { + printf("drop file %s\n", stra->strings[0]); /* try to get icon type from extension */ - int icon = ED_file_extension_icon((char *)stra->strings[a]); - wmDragPath *path_data = WM_drag_create_path_data((char *)stra->strings[a]); + int icon = ED_file_extension_icon((char *)stra->strings[0]); + wmDragPath *path_data = WM_drag_create_path_data( + blender::Span((char **)stra->strings, stra->count)); WM_event_start_drag(C, icon, WM_DRAG_PATH, path_data, 0.0, WM_DRAG_NOP); /* void poin should point to string, it makes a copy */ - break; /* only one drop element supported now */ } } -- 2.30.2 From 7aede01d905bcb316a8f449dedb744eb8d24a734 Mon Sep 17 00:00:00 2001 From: Guillermo Date: Tue, 8 Aug 2023 14:53:09 -0600 Subject: [PATCH 02/12] fix error --- source/blender/windowmanager/intern/wm_dragdrop.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/blender/windowmanager/intern/wm_dragdrop.cc b/source/blender/windowmanager/intern/wm_dragdrop.cc index c4bd775449f..72ea50a194a 100644 --- a/source/blender/windowmanager/intern/wm_dragdrop.cc +++ b/source/blender/windowmanager/intern/wm_dragdrop.cc @@ -765,7 +765,8 @@ wmDragPath *WM_drag_create_path_data(blender::Span _paths) const char *ext = BLI_path_extension(_paths[0]); blender::Vector paths; for (auto path : _paths) { - if (STREQ(ext, BLI_path_extension(path))) { + const char *test_ext = BLI_path_extension(path); + if (ext == test_ext || (ext && test_ext && STREQ(ext, test_ext))) { paths.append(path); } } -- 2.30.2 From c62bcf21aff4ebd4ac5a67a4d69d50d424c8b260 Mon Sep 17 00:00:00 2001 From: Guillermo Venegas Date: Fri, 18 Aug 2023 11:57:12 -0600 Subject: [PATCH 03/12] changes --- .../windowmanager/intern/wm_dragdrop.cc | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/source/blender/windowmanager/intern/wm_dragdrop.cc b/source/blender/windowmanager/intern/wm_dragdrop.cc index 4a922c84dfe..75fa206b1d1 100644 --- a/source/blender/windowmanager/intern/wm_dragdrop.cc +++ b/source/blender/windowmanager/intern/wm_dragdrop.cc @@ -770,27 +770,28 @@ const ListBase *WM_drag_asset_list_get(const wmDrag *drag) wmDragPath *WM_drag_create_path_data(blender::Span _paths) { - const char *ext = BLI_path_extension(_paths[0]); + const char *extension = BLI_path_extension(_paths[0]); blender::Vector paths; for (auto path : _paths) { const char *test_ext = BLI_path_extension(path); - if (ext == test_ext || (ext && test_ext && STREQ(ext, test_ext))) { + if (extension == test_ext || (extension && test_ext && STREQ(extension, test_ext))) { paths.append(path); } } - char *tooltip; + const char *tooltip = _paths[0]; + char tooltip_buffer[256]; if (_paths.size() == 1) { - tooltip = BLI_strdup(_paths[0]); - } - else { - tooltip = BLI_sprintfN(TIP_("Dragging %d %s files."), paths.size()); + BLI_snprintf(tooltip_buffer, + ARRAY_SIZE(tooltip_buffer), + TIP_("Dragging %d %s files."), + paths.size(), + extension ? extension : TIP_("Folder")); + tooltip = tooltip_buffer; } wmDragPath *path_data = MEM_new( "wmDragPath", paths, tooltip, ED_path_extension_type(_paths[0])); - MEM_freeN(tooltip); - return path_data; } -- 2.30.2 From cb4e1bb23125a58761089419338b1e4321cf3222 Mon Sep 17 00:00:00 2001 From: Guillermo Venegas Date: Fri, 18 Aug 2023 20:56:41 -0600 Subject: [PATCH 04/12] naming --- .../windowmanager/intern/wm_dragdrop.cc | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/source/blender/windowmanager/intern/wm_dragdrop.cc b/source/blender/windowmanager/intern/wm_dragdrop.cc index 75fa206b1d1..8df9d21d63a 100644 --- a/source/blender/windowmanager/intern/wm_dragdrop.cc +++ b/source/blender/windowmanager/intern/wm_dragdrop.cc @@ -768,29 +768,29 @@ const ListBase *WM_drag_asset_list_get(const wmDrag *drag) return &drag->asset_items; } -wmDragPath *WM_drag_create_path_data(blender::Span _paths) +wmDragPath *WM_drag_create_path_data(blender::Span paths) { - const char *extension = BLI_path_extension(_paths[0]); - blender::Vector paths; - for (auto path : _paths) { + const char *extension = BLI_path_extension(paths[0]); + blender::Vector filtered_paths; + for (auto path : paths) { const char *test_ext = BLI_path_extension(path); if (extension == test_ext || (extension && test_ext && STREQ(extension, test_ext))) { - paths.append(path); + filtered_paths.append(path); } } - const char *tooltip = _paths[0]; + const char *tooltip = paths[0]; char tooltip_buffer[256]; - if (_paths.size() == 1) { + if (filtered_paths.size() > 1) { BLI_snprintf(tooltip_buffer, ARRAY_SIZE(tooltip_buffer), TIP_("Dragging %d %s files."), - paths.size(), + filtered_paths.size(), extension ? extension : TIP_("Folder")); tooltip = tooltip_buffer; } wmDragPath *path_data = MEM_new( - "wmDragPath", paths, tooltip, ED_path_extension_type(_paths[0])); + "wmDragPath", filtered_paths, tooltip, ED_path_extension_type(paths[0])); return path_data; } -- 2.30.2 From 148a6d1dbbe13d8f645e4655dd297e1f630cd75c Mon Sep 17 00:00:00 2001 From: Guillermo Venegas Date: Thu, 26 Oct 2023 13:42:56 -0600 Subject: [PATCH 05/12] changes --- source/blender/editors/screen/screen_ops.cc | 2 +- source/blender/editors/space_clip/space_clip.cc | 3 +-- source/blender/editors/space_console/space_console.cc | 2 +- source/blender/editors/space_file/space_file.cc | 2 +- source/blender/editors/space_image/space_image.cc | 2 +- source/blender/editors/space_node/space_node.cc | 6 +++--- .../editors/space_sequencer/sequencer_drag_drop.cc | 10 +++++----- source/blender/editors/space_text/space_text.cc | 2 +- source/blender/editors/space_view3d/space_view3d.cc | 6 +++--- source/blender/windowmanager/WM_api.hh | 1 + source/blender/windowmanager/intern/wm_dragdrop.cc | 10 ++++++++++ 11 files changed, 28 insertions(+), 18 deletions(-) diff --git a/source/blender/editors/screen/screen_ops.cc b/source/blender/editors/screen/screen_ops.cc index 7b859b35d0b..317b9fc2e25 100644 --- a/source/blender/editors/screen/screen_ops.cc +++ b/source/blender/editors/screen/screen_ops.cc @@ -5941,7 +5941,7 @@ static bool blend_file_drop_poll(bContext * /*C*/, wmDrag *drag, const wmEvent * static void blend_file_drop_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) { /* copy drag path to properties */ - RNA_string_set(drop->ptr, "filepath", WM_drag_get_paths(drag)[0].c_str()); + RNA_string_set(drop->ptr, "filepath", WM_drag_get_single_path(drag)); } void ED_keymap_screen(wmKeyConfig *keyconf) diff --git a/source/blender/editors/space_clip/space_clip.cc b/source/blender/editors/space_clip/space_clip.cc index 12b42d26c9e..bf831c04635 100644 --- a/source/blender/editors/space_clip/space_clip.cc +++ b/source/blender/editors/space_clip/space_clip.cc @@ -536,8 +536,7 @@ static void clip_drop_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) PointerRNA itemptr; char dir[FILE_MAX], file[FILE_MAX]; - BLI_path_split_dir_file( - WM_drag_get_paths(drag)[0].c_str(), dir, sizeof(dir), file, sizeof(file)); + BLI_path_split_dir_file(WM_drag_get_single_path(drag), dir, sizeof(dir), file, sizeof(file)); RNA_string_set(drop->ptr, "directory", dir); diff --git a/source/blender/editors/space_console/space_console.cc b/source/blender/editors/space_console/space_console.cc index bc420f41680..ee415c69e60 100644 --- a/source/blender/editors/space_console/space_console.cc +++ b/source/blender/editors/space_console/space_console.cc @@ -174,7 +174,7 @@ static bool path_drop_poll(bContext * /*C*/, wmDrag *drag, const wmEvent * /*eve static void path_drop_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) { char pathname[FILE_MAX + 2]; - SNPRINTF(pathname, "\"%s\"", WM_drag_get_paths(drag)[0].c_str()); + SNPRINTF(pathname, "\"%s\"", WM_drag_get_single_path(drag)); RNA_string_set(drop->ptr, "text", pathname); } diff --git a/source/blender/editors/space_file/space_file.cc b/source/blender/editors/space_file/space_file.cc index 8758b3d825e..185e311b8d8 100644 --- a/source/blender/editors/space_file/space_file.cc +++ b/source/blender/editors/space_file/space_file.cc @@ -797,7 +797,7 @@ static bool filepath_drop_poll(bContext *C, wmDrag *drag, const wmEvent * /*even static void filepath_drop_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) { - RNA_string_set(drop->ptr, "filepath", WM_drag_get_paths(drag)[0].c_str()); + RNA_string_set(drop->ptr, "filepath", WM_drag_get_single_path(drag)); } /* region dropbox definition */ diff --git a/source/blender/editors/space_image/space_image.cc b/source/blender/editors/space_image/space_image.cc index d770c8000c2..c72dffb52ad 100644 --- a/source/blender/editors/space_image/space_image.cc +++ b/source/blender/editors/space_image/space_image.cc @@ -268,7 +268,7 @@ static bool image_drop_poll(bContext *C, wmDrag *drag, const wmEvent *event) static void image_drop_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) { /* copy drag path to properties */ - RNA_string_set(drop->ptr, "filepath", WM_drag_get_paths(drag)[0].c_str()); + RNA_string_set(drop->ptr, "filepath", WM_drag_get_single_path(drag)); } /* area+region dropbox definition */ diff --git a/source/blender/editors/space_node/space_node.cc b/source/blender/editors/space_node/space_node.cc index dd6393c5839..68973c67b44 100644 --- a/source/blender/editors/space_node/space_node.cc +++ b/source/blender/editors/space_node/space_node.cc @@ -898,9 +898,9 @@ static void node_id_path_drop_copy(bContext *C, wmDrag *drag, wmDropBox *drop) return; } - const auto paths = WM_drag_get_paths(drag); - if (paths.begin()) { - RNA_string_set(drop->ptr, "filepath", paths[0].c_str()); + const char* path = WM_drag_get_single_path(drag); + if (path) { + RNA_string_set(drop->ptr, "filepath", path); RNA_struct_property_unset(drop->ptr, "name"); return; } diff --git a/source/blender/editors/space_sequencer/sequencer_drag_drop.cc b/source/blender/editors/space_sequencer/sequencer_drag_drop.cc index a9129850525..f0c8b8ae04c 100644 --- a/source/blender/editors/space_sequencer/sequencer_drag_drop.cc +++ b/source/blender/editors/space_sequencer/sequencer_drag_drop.cc @@ -249,17 +249,17 @@ static void sequencer_drop_copy(bContext *C, wmDrag *drag, wmDropBox *drop) return; } - const auto paths = WM_drag_get_paths(drag); + const char *path = WM_drag_get_single_path(drag); /* Path dropped. */ - if (paths.begin()) { + if (path) { if (RNA_struct_find_property(drop->ptr, "filepath")) { - RNA_string_set(drop->ptr, "filepath", paths[0].c_str()); + RNA_string_set(drop->ptr, "filepath", path); } if (RNA_struct_find_property(drop->ptr, "directory")) { PointerRNA itemptr; char dir[FILE_MAX], file[FILE_MAX]; - BLI_path_split_dir_file(paths[0].c_str(), dir, sizeof(dir), file, sizeof(file)); + BLI_path_split_dir_file(path, dir, sizeof(dir), file, sizeof(file)); RNA_string_set(drop->ptr, "directory", dir); @@ -337,7 +337,7 @@ static void get_drag_path(const bContext *C, wmDrag *drag, char r_path[FILE_MAX] BLI_path_abs(r_path, BKE_main_blendfile_path_from_global()); } else { - BLI_strncpy(r_path, WM_drag_get_paths(drag)[0].c_str(), FILE_MAX); + BLI_strncpy(r_path, WM_drag_get_single_path(drag), FILE_MAX); } } diff --git a/source/blender/editors/space_text/space_text.cc b/source/blender/editors/space_text/space_text.cc index 4a3b3a60d12..94618ce7e5c 100644 --- a/source/blender/editors/space_text/space_text.cc +++ b/source/blender/editors/space_text/space_text.cc @@ -316,7 +316,7 @@ static bool text_drop_poll(bContext * /*C*/, wmDrag *drag, const wmEvent * /*eve static void text_drop_copy(bContext * /*C*/, wmDrag *drag, wmDropBox *drop) { /* copy drag path to properties */ - RNA_string_set(drop->ptr, "filepath", WM_drag_get_paths(drag)[0].c_str()); + RNA_string_set(drop->ptr, "filepath", WM_drag_get_single_path(drag)); } static bool text_drop_paste_poll(bContext * /*C*/, wmDrag *drag, const wmEvent * /*event*/) diff --git a/source/blender/editors/space_view3d/space_view3d.cc b/source/blender/editors/space_view3d/space_view3d.cc index fd76f61112f..e2b3f657d63 100644 --- a/source/blender/editors/space_view3d/space_view3d.cc +++ b/source/blender/editors/space_view3d/space_view3d.cc @@ -891,9 +891,9 @@ static void view3d_id_path_drop_copy(bContext *C, wmDrag *drag, wmDropBox *drop) RNA_struct_property_unset(drop->ptr, "filepath"); return; } - const auto paths = WM_drag_get_paths(drag); - if (paths.begin()) { - RNA_string_set(drop->ptr, "filepath", paths[0].c_str()); + const char* path = WM_drag_get_single_path(drag); + if (path) { + RNA_string_set(drop->ptr, "filepath", path); RNA_struct_property_unset(drop->ptr, "image"); } } diff --git a/source/blender/windowmanager/WM_api.hh b/source/blender/windowmanager/WM_api.hh index eff74c8a4ac..f0faf236f11 100644 --- a/source/blender/windowmanager/WM_api.hh +++ b/source/blender/windowmanager/WM_api.hh @@ -1426,6 +1426,7 @@ const char *WM_drag_get_item_name(wmDrag *drag); * may be destructed. Only paths that share the same extension of the first file will be copied. */ wmDragPath *WM_drag_create_path_data(blender::Span paths); +const char *WM_drag_get_single_path(const wmDrag *drag); const blender::Span WM_drag_get_paths(const wmDrag *drag); /** * Note that even though the enum return type uses bit-flags, this should never have multiple diff --git a/source/blender/windowmanager/intern/wm_dragdrop.cc b/source/blender/windowmanager/intern/wm_dragdrop.cc index be9b1843fee..15a7eee7a21 100644 --- a/source/blender/windowmanager/intern/wm_dragdrop.cc +++ b/source/blender/windowmanager/intern/wm_dragdrop.cc @@ -792,6 +792,16 @@ static void wm_drag_free_path_data(wmDragPath **path_data) *path_data = nullptr; } +const char *WM_drag_get_single_path(const wmDrag *drag) +{ + if (drag->type != WM_DRAG_PATH) { + nullptr; + } + + const wmDragPath *path_data = static_cast(drag->poin); + return path_data->paths[0].c_str(); +} + const blender::Span WM_drag_get_paths(const wmDrag *drag) { if (drag->type != WM_DRAG_PATH) { -- 2.30.2 From 64280d1a1c81761c4019953f46b519de4094d777 Mon Sep 17 00:00:00 2001 From: Guillermo Venegas Date: Thu, 26 Oct 2023 13:44:58 -0600 Subject: [PATCH 06/12] format --- .../blender/editors/space_node/space_node.cc | 2 +- .../editors/space_view3d/space_view3d.cc | 2 +- .../blender/windowmanager/intern/wm_window.cc | 20 +++++++++---------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/source/blender/editors/space_node/space_node.cc b/source/blender/editors/space_node/space_node.cc index 68973c67b44..0d2ec2ab7b9 100644 --- a/source/blender/editors/space_node/space_node.cc +++ b/source/blender/editors/space_node/space_node.cc @@ -898,7 +898,7 @@ static void node_id_path_drop_copy(bContext *C, wmDrag *drag, wmDropBox *drop) return; } - const char* path = WM_drag_get_single_path(drag); + const char *path = WM_drag_get_single_path(drag); if (path) { RNA_string_set(drop->ptr, "filepath", path); RNA_struct_property_unset(drop->ptr, "name"); diff --git a/source/blender/editors/space_view3d/space_view3d.cc b/source/blender/editors/space_view3d/space_view3d.cc index e2b3f657d63..d0b0df81581 100644 --- a/source/blender/editors/space_view3d/space_view3d.cc +++ b/source/blender/editors/space_view3d/space_view3d.cc @@ -891,7 +891,7 @@ static void view3d_id_path_drop_copy(bContext *C, wmDrag *drag, wmDropBox *drop) RNA_struct_property_unset(drop->ptr, "filepath"); return; } - const char* path = WM_drag_get_single_path(drag); + const char *path = WM_drag_get_single_path(drag); if (path) { RNA_string_set(drop->ptr, "filepath", path); RNA_struct_property_unset(drop->ptr, "image"); diff --git a/source/blender/windowmanager/intern/wm_window.cc b/source/blender/windowmanager/intern/wm_window.cc index 9c59a82be7f..f72ca8da0f4 100644 --- a/source/blender/windowmanager/intern/wm_window.cc +++ b/source/blender/windowmanager/intern/wm_window.cc @@ -1568,17 +1568,17 @@ static bool ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr C_void_pt if (ddd->dataType == GHOST_kDragnDropTypeFilenames) { const GHOST_TStringArray *stra = static_cast(ddd->data); - if (stra->count) { - printf("drop file %s\n", stra->strings[0]); - /* try to get icon type from extension */ - int icon = ED_file_extension_icon((char *)stra->strings[0]); - wmDragPath *path_data = WM_drag_create_path_data( - blender::Span((char **)stra->strings, stra->count)); - WM_event_start_drag(C, icon, WM_DRAG_PATH, path_data, 0.0, WM_DRAG_NOP); - /* Void pointer should point to string, it makes a copy. */ - break; /* only one drop element supported now */ - } + if (stra->count) { + printf("drop file %s\n", stra->strings[0]); + /* try to get icon type from extension */ + int icon = ED_file_extension_icon((char *)stra->strings[0]); + wmDragPath *path_data = WM_drag_create_path_data( + blender::Span((char **)stra->strings, stra->count)); + WM_event_start_drag(C, icon, WM_DRAG_PATH, path_data, 0.0, WM_DRAG_NOP); + /* Void pointer should point to string, it makes a copy. */ + break; /* only one drop element supported now */ } + } break; } -- 2.30.2 From 1ae824ba8f58a2ac04629c672f676ca510524725 Mon Sep 17 00:00:00 2001 From: Guillermo Venegas Date: Thu, 26 Oct 2023 14:35:57 -0600 Subject: [PATCH 07/12] remove innecesary ctor --- source/blender/windowmanager/WM_types.hh | 10 +++------- .../windowmanager/intern/wm_dragdrop.cc | 19 ++++++++++++------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/source/blender/windowmanager/WM_types.hh b/source/blender/windowmanager/WM_types.hh index c89b9e5a559..0cda834cde2 100644 --- a/source/blender/windowmanager/WM_types.hh +++ b/source/blender/windowmanager/WM_types.hh @@ -1173,15 +1173,11 @@ struct wmDragAssetListItem { }; struct wmDragPath { - const blender::Vector paths; + blender::Vector paths; /* Note that even though the enum type uses bit-flags, this should never have multiple type-bits * set, so `ELEM()` like comparison is possible. */ - const int file_type; /* eFileSel_File_Types */ - const std::string tooltip; - wmDragPath(const blender::Vector &paths, const std::string &tooltip, int file_type) - : paths(std::move(paths)), file_type(file_type), tooltip(tooltip) - { - } + int file_type; /* eFileSel_File_Types */ + std::string tooltip; }; struct wmDragGreasePencilLayer { diff --git a/source/blender/windowmanager/intern/wm_dragdrop.cc b/source/blender/windowmanager/intern/wm_dragdrop.cc index 15a7eee7a21..d6f2e3d9335 100644 --- a/source/blender/windowmanager/intern/wm_dragdrop.cc +++ b/source/blender/windowmanager/intern/wm_dragdrop.cc @@ -761,27 +761,32 @@ const ListBase *WM_drag_asset_list_get(const wmDrag *drag) wmDragPath *WM_drag_create_path_data(blender::Span paths) { + wmDragPath *path_data = MEM_new("wmDragPath"); + + path_data->file_type = ED_path_extension_type(paths[0]); + const char *extension = BLI_path_extension(paths[0]); - blender::Vector filtered_paths; + for (auto path : paths) { const char *test_ext = BLI_path_extension(path); if (extension == test_ext || (extension && test_ext && STREQ(extension, test_ext))) { - filtered_paths.append(path); + path_data->paths.append(path); } } - const char *tooltip = paths[0]; + + const char *tooltip = path_data->paths[0].c_str(); char tooltip_buffer[256]; - if (filtered_paths.size() > 1) { + + if (path_data->paths.size() > 1) { BLI_snprintf(tooltip_buffer, ARRAY_SIZE(tooltip_buffer), TIP_("Dragging %d %s files."), - filtered_paths.size(), + path_data->paths.size(), extension ? extension : TIP_("Folder")); tooltip = tooltip_buffer; } - wmDragPath *path_data = MEM_new( - "wmDragPath", filtered_paths, tooltip, ED_path_extension_type(paths[0])); + path_data->tooltip = tooltip; return path_data; } -- 2.30.2 From 0b8d3d77dc2653e724f293136954685a63b3df01 Mon Sep 17 00:00:00 2001 From: Guillermo Venegas Date: Tue, 7 Nov 2023 12:31:47 -0600 Subject: [PATCH 08/12] addressing review --- source/blender/windowmanager/WM_api.hh | 5 ++-- source/blender/windowmanager/WM_types.hh | 3 ++- .../windowmanager/intern/wm_dragdrop.cc | 27 ++++++------------- .../blender/windowmanager/intern/wm_window.cc | 1 - 4 files changed, 13 insertions(+), 23 deletions(-) diff --git a/source/blender/windowmanager/WM_api.hh b/source/blender/windowmanager/WM_api.hh index f0faf236f11..57937d2f610 100644 --- a/source/blender/windowmanager/WM_api.hh +++ b/source/blender/windowmanager/WM_api.hh @@ -1423,14 +1423,15 @@ const char *WM_drag_get_item_name(wmDrag *drag); /* Paths drag and drop. */ /** * \param paths: The paths to drag. Values will be copied into the drag data so the passed strings - * may be destructed. Only paths that share the same extension of the first file will be copied. + * may be destructed. */ wmDragPath *WM_drag_create_path_data(blender::Span paths); const char *WM_drag_get_single_path(const wmDrag *drag); const blender::Span WM_drag_get_paths(const wmDrag *drag); /** * Note that even though the enum return type uses bit-flags, this should never have multiple - * type-bits set, so `ELEM()` like comparison is possible. + * type-bits set, so `ELEM()` like comparison is possible. For internal use only, and only + * indicates the file type of first path in `wmDragPath.paths`. */ int /* eFileSel_File_Types */ WM_drag_get_path_file_type(const wmDrag *drag); diff --git a/source/blender/windowmanager/WM_types.hh b/source/blender/windowmanager/WM_types.hh index 0cda834cde2..e3e4692a860 100644 --- a/source/blender/windowmanager/WM_types.hh +++ b/source/blender/windowmanager/WM_types.hh @@ -1175,7 +1175,8 @@ struct wmDragAssetListItem { struct wmDragPath { blender::Vector paths; /* Note that even though the enum type uses bit-flags, this should never have multiple type-bits - * set, so `ELEM()` like comparison is possible. */ + * set, so `ELEM()` like comparison is possible. For internal use only, and only indicates the file type + * of first path in `wmDragPath.paths`. */ int file_type; /* eFileSel_File_Types */ std::string tooltip; }; diff --git a/source/blender/windowmanager/intern/wm_dragdrop.cc b/source/blender/windowmanager/intern/wm_dragdrop.cc index d6f2e3d9335..0de43a96e9b 100644 --- a/source/blender/windowmanager/intern/wm_dragdrop.cc +++ b/source/blender/windowmanager/intern/wm_dragdrop.cc @@ -60,6 +60,7 @@ #include "wm_event_system.h" #include "wm_window.hh" +#include /* ****************************************************** */ static ListBase dropboxes = {nullptr, nullptr}; @@ -765,28 +766,17 @@ wmDragPath *WM_drag_create_path_data(blender::Span paths) path_data->file_type = ED_path_extension_type(paths[0]); - const char *extension = BLI_path_extension(paths[0]); - for (auto path : paths) { - const char *test_ext = BLI_path_extension(path); - if (extension == test_ext || (extension && test_ext && STREQ(extension, test_ext))) { - path_data->paths.append(path); - } + path_data->paths.append(path); } - const char *tooltip = path_data->paths[0].c_str(); - char tooltip_buffer[256]; + path_data->tooltip = path_data->paths[0]; if (path_data->paths.size() > 1) { - BLI_snprintf(tooltip_buffer, - ARRAY_SIZE(tooltip_buffer), - TIP_("Dragging %d %s files."), - path_data->paths.size(), - extension ? extension : TIP_("Folder")); - tooltip = tooltip_buffer; + std::string path_count = std::to_string(path_data->paths.size()); + path_data->tooltip = fmt::format(TIP_("Dragging {} files."), path_count); } - path_data->tooltip = tooltip; return path_data; } @@ -800,7 +790,7 @@ static void wm_drag_free_path_data(wmDragPath **path_data) const char *WM_drag_get_single_path(const wmDrag *drag) { if (drag->type != WM_DRAG_PATH) { - nullptr; + return nullptr; } const wmDragPath *path_data = static_cast(drag->poin); @@ -1071,9 +1061,8 @@ void wm_drags_draw(bContext *C, wmWindow *win) wmWindowViewport(win); } - /* Drawing should be allowed to assume the context from - * handling and polling (that's why we restore it - * above). */ + /* Drawing should be allowed to assume the context from handling and polling (that's why we + restore it above). */ if (drag->drop_state.active_dropbox->draw_droptip) { drag->drop_state.active_dropbox->draw_droptip(C, win, drag, xy); continue; diff --git a/source/blender/windowmanager/intern/wm_window.cc b/source/blender/windowmanager/intern/wm_window.cc index f72ca8da0f4..fc8768ecaca 100644 --- a/source/blender/windowmanager/intern/wm_window.cc +++ b/source/blender/windowmanager/intern/wm_window.cc @@ -1569,7 +1569,6 @@ static bool ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr C_void_pt const GHOST_TStringArray *stra = static_cast(ddd->data); if (stra->count) { - printf("drop file %s\n", stra->strings[0]); /* try to get icon type from extension */ int icon = ED_file_extension_icon((char *)stra->strings[0]); wmDragPath *path_data = WM_drag_create_path_data( -- 2.30.2 From b2b60973ae715cc81c94b93b94a6d3e056ab8f7e Mon Sep 17 00:00:00 2001 From: Guillermo Venegas Date: Tue, 7 Nov 2023 12:35:01 -0600 Subject: [PATCH 09/12] format --- source/blender/windowmanager/WM_types.hh | 4 ++-- source/blender/windowmanager/intern/wm_dragdrop.cc | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/source/blender/windowmanager/WM_types.hh b/source/blender/windowmanager/WM_types.hh index e3e4692a860..e21c6edd0d9 100644 --- a/source/blender/windowmanager/WM_types.hh +++ b/source/blender/windowmanager/WM_types.hh @@ -1175,8 +1175,8 @@ struct wmDragAssetListItem { struct wmDragPath { blender::Vector paths; /* Note that even though the enum type uses bit-flags, this should never have multiple type-bits - * set, so `ELEM()` like comparison is possible. For internal use only, and only indicates the file type - * of first path in `wmDragPath.paths`. */ + * set, so `ELEM()` like comparison is possible. For internal use only, and only indicates the + * file type of first path in `wmDragPath.paths`. */ int file_type; /* eFileSel_File_Types */ std::string tooltip; }; diff --git a/source/blender/windowmanager/intern/wm_dragdrop.cc b/source/blender/windowmanager/intern/wm_dragdrop.cc index 0de43a96e9b..5d35ffa1c71 100644 --- a/source/blender/windowmanager/intern/wm_dragdrop.cc +++ b/source/blender/windowmanager/intern/wm_dragdrop.cc @@ -777,7 +777,6 @@ wmDragPath *WM_drag_create_path_data(blender::Span paths) path_data->tooltip = fmt::format(TIP_("Dragging {} files."), path_count); } - return path_data; } @@ -1062,7 +1061,7 @@ void wm_drags_draw(bContext *C, wmWindow *win) } /* Drawing should be allowed to assume the context from handling and polling (that's why we - restore it above). */ + * restore it above). */ if (drag->drop_state.active_dropbox->draw_droptip) { drag->drop_state.active_dropbox->draw_droptip(C, win, drag, xy); continue; -- 2.30.2 From b5770d6b3b6f2fc30443b1a0595f0868f54d0550 Mon Sep 17 00:00:00 2001 From: Guillermo Venegas Date: Fri, 10 Nov 2023 08:08:45 -0600 Subject: [PATCH 10/12] add tests, logs, format, and fix comments --- source/blender/windowmanager/CMakeLists.txt | 8 ++ .../windowmanager/intern/wm_dragdrop.cc | 3 +- .../windowmanager/intern/wm_dragdrop_test.cc | 74 +++++++++++++++++++ .../blender/windowmanager/intern/wm_window.cc | 12 ++- 4 files changed, 94 insertions(+), 3 deletions(-) create mode 100644 source/blender/windowmanager/intern/wm_dragdrop_test.cc diff --git a/source/blender/windowmanager/CMakeLists.txt b/source/blender/windowmanager/CMakeLists.txt index 6435005fc22..77ffa639758 100644 --- a/source/blender/windowmanager/CMakeLists.txt +++ b/source/blender/windowmanager/CMakeLists.txt @@ -210,3 +210,11 @@ blender_add_lib_nolist(bf_windowmanager "${SRC}" "${INC}" "${INC_SYS}" "${LIB}") # RNA_prototypes.h add_dependencies(bf_windowmanager bf_rna) + +if(WITH_GTESTS) + set(TEST_SRC + intern/wm_dragdrop_test.cc + ) + include(GTestTesting) + blender_add_test_lib(bf_wm_tests "${TEST_SRC}" "${INC};${TEST_INC}" "${INC_SYS}" "${LIB}") +endif() diff --git a/source/blender/windowmanager/intern/wm_dragdrop.cc b/source/blender/windowmanager/intern/wm_dragdrop.cc index 5d35ffa1c71..8a597e4d9cf 100644 --- a/source/blender/windowmanager/intern/wm_dragdrop.cc +++ b/source/blender/windowmanager/intern/wm_dragdrop.cc @@ -762,6 +762,7 @@ const ListBase *WM_drag_asset_list_get(const wmDrag *drag) wmDragPath *WM_drag_create_path_data(blender::Span paths) { + BLI_assert(!paths.is_empty()); wmDragPath *path_data = MEM_new("wmDragPath"); path_data->file_type = ED_path_extension_type(paths[0]); @@ -774,7 +775,7 @@ wmDragPath *WM_drag_create_path_data(blender::Span paths) if (path_data->paths.size() > 1) { std::string path_count = std::to_string(path_data->paths.size()); - path_data->tooltip = fmt::format(TIP_("Dragging {} files."), path_count); + path_data->tooltip = fmt::format(TIP_("Dragging {} files"), path_count); } return path_data; diff --git a/source/blender/windowmanager/intern/wm_dragdrop_test.cc b/source/blender/windowmanager/intern/wm_dragdrop_test.cc new file mode 100644 index 00000000000..76f070e7dee --- /dev/null +++ b/source/blender/windowmanager/intern/wm_dragdrop_test.cc @@ -0,0 +1,74 @@ +/* SPDX-FileCopyrightText: 2023 Blender Authors + * + * SPDX-License-Identifier: Apache-2.0 */ + +#include "testing/testing.h" + +/* #bContextStore. */ +#include "BKE_context.h" + +/* #eFileSel_File_Types. */ +#include "DNA_space_types.h" + +#include "WM_api.hh" +#include "WM_types.hh" + +namespace blender::tests { + +TEST(wm_dragdrop, create) +{ + { + /** + * NOTE: `WM_drag_create_path_data` gets the `file_type` from the first path in `paths` and + * only needs its extension, so there is no need to describe a full path here that can have a + * different format on Windows or Linux. However callers must ensure that they are valid paths. + */ + blender::Vector paths{"text_file.txt"}; + wmDragPath *path_data = WM_drag_create_path_data(paths); + blender::Vector expected_file_paths{"text_file.txt"}; + + EXPECT_EQ(path_data->paths.size(), 1); + EXPECT_EQ(path_data->tooltip, "text_file.txt"); + EXPECT_EQ(path_data->paths, expected_file_paths); + + /** Test `wmDrag` path data getters. */ + wmDrag drag; + drag.type = WM_DRAG_PATH; + drag.poin = path_data; + EXPECT_STREQ(WM_drag_get_single_path(&drag), "text_file.txt"); + EXPECT_EQ(WM_drag_get_path_file_type(&drag), FILE_TYPE_TEXT); + EXPECT_EQ(WM_drag_get_paths(&drag), expected_file_paths.as_span()); + + MEM_delete(path_data); + } + { + blender::Vector paths = {"blender.blend", "text_file.txt", "image.png"}; + wmDragPath *path_data = WM_drag_create_path_data(paths); + blender::Vector expected_file_paths = { + "blender.blend", "text_file.txt", "image.png"}; + + EXPECT_EQ(path_data->paths.size(), 3); + EXPECT_EQ(path_data->tooltip, "Dragging 3 files"); + EXPECT_EQ(path_data->paths, expected_file_paths); + + /** Test `wmDrag` path data getters. */ + wmDrag drag; + drag.type = WM_DRAG_PATH; + drag.poin = path_data; + EXPECT_STREQ(WM_drag_get_single_path(&drag), "blender.blend"); + EXPECT_EQ(WM_drag_get_path_file_type(&drag), FILE_TYPE_BLENDER); + EXPECT_EQ(WM_drag_get_paths(&drag), expected_file_paths.as_span()); + + MEM_delete(path_data); + } + { + /** Test `wmDrag` path data getters when the drag type is different to `WM_DRAG_PATH`. */ + wmDrag drag; + drag.type = WM_DRAG_COLOR; + EXPECT_EQ(WM_drag_get_single_path(&drag), nullptr); + EXPECT_EQ(WM_drag_get_path_file_type(&drag), 0); + EXPECT_EQ(WM_drag_get_paths(&drag).size(), 0); + } +} + +} // namespace blender::tests diff --git a/source/blender/windowmanager/intern/wm_window.cc b/source/blender/windowmanager/intern/wm_window.cc index fc8768ecaca..d43e82d651b 100644 --- a/source/blender/windowmanager/intern/wm_window.cc +++ b/source/blender/windowmanager/intern/wm_window.cc @@ -15,6 +15,8 @@ #include #include +#include "CLG_log.h" + #include "DNA_listBase.h" #include "DNA_screen_types.h" #include "DNA_windowmanager_types.h" @@ -63,6 +65,8 @@ #include "ED_scene.hh" #include "ED_screen.hh" +#include + #include "IMB_imbuf.h" #include "IMB_imbuf_types.h" @@ -1569,13 +1573,17 @@ static bool ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr C_void_pt const GHOST_TStringArray *stra = static_cast(ddd->data); if (stra->count) { - /* try to get icon type from extension */ + CLOG_INFO(WM_LOG_EVENTS, 1, "Drop %d files:", stra->count); + for (const char *path : blender::Span((char **)stra->strings, stra->count)) { + CLOG_INFO(WM_LOG_EVENTS, 1, "%s", path); + } + /* Try to get icon type from extension of the first path. */ int icon = ED_file_extension_icon((char *)stra->strings[0]); wmDragPath *path_data = WM_drag_create_path_data( blender::Span((char **)stra->strings, stra->count)); WM_event_start_drag(C, icon, WM_DRAG_PATH, path_data, 0.0, WM_DRAG_NOP); /* Void pointer should point to string, it makes a copy. */ - break; /* only one drop element supported now */ + break; } } -- 2.30.2 From 21a07782fbb64857e7c6f6683bd09bc68ccb8ad2 Mon Sep 17 00:00:00 2001 From: Guillermo Venegas Date: Fri, 24 Nov 2023 09:29:57 -0600 Subject: [PATCH 11/12] Fix comments and cleanup --- source/blender/windowmanager/WM_api.hh | 6 +++--- source/blender/windowmanager/WM_types.hh | 4 ++-- source/blender/windowmanager/intern/wm_dragdrop.cc | 4 ++-- source/blender/windowmanager/intern/wm_dragdrop_test.cc | 2 +- source/blender/windowmanager/intern/wm_window.cc | 3 --- 5 files changed, 8 insertions(+), 11 deletions(-) diff --git a/source/blender/windowmanager/WM_api.hh b/source/blender/windowmanager/WM_api.hh index c229966ed75..f79363ad2fa 100644 --- a/source/blender/windowmanager/WM_api.hh +++ b/source/blender/windowmanager/WM_api.hh @@ -1427,11 +1427,11 @@ const char *WM_drag_get_item_name(wmDrag *drag); */ wmDragPath *WM_drag_create_path_data(blender::Span paths); const char *WM_drag_get_single_path(const wmDrag *drag); -const blender::Span WM_drag_get_paths(const wmDrag *drag); +blender::Span WM_drag_get_paths(const wmDrag *drag); /** * Note that even though the enum return type uses bit-flags, this should never have multiple - * type-bits set, so `ELEM()` like comparison is possible. For internal use only, and only - * indicates the file type of first path in `wmDragPath.paths`. + * type-bits set, so `ELEM()` like comparison is possible. Only indicates the file type of first + * path in `wmDragPath.paths`. */ int /* eFileSel_File_Types */ WM_drag_get_path_file_type(const wmDrag *drag); diff --git a/source/blender/windowmanager/WM_types.hh b/source/blender/windowmanager/WM_types.hh index e21c6edd0d9..8c8a50ac7a0 100644 --- a/source/blender/windowmanager/WM_types.hh +++ b/source/blender/windowmanager/WM_types.hh @@ -1175,8 +1175,8 @@ struct wmDragAssetListItem { struct wmDragPath { blender::Vector paths; /* Note that even though the enum type uses bit-flags, this should never have multiple type-bits - * set, so `ELEM()` like comparison is possible. For internal use only, and only indicates the - * file type of first path in `wmDragPath.paths`. */ + * set, so `ELEM()` like comparison is possible. Only indicates the file type of first path in + * `wmDragPath.paths`. */ int file_type; /* eFileSel_File_Types */ std::string tooltip; }; diff --git a/source/blender/windowmanager/intern/wm_dragdrop.cc b/source/blender/windowmanager/intern/wm_dragdrop.cc index 8a597e4d9cf..4d0d6beccc2 100644 --- a/source/blender/windowmanager/intern/wm_dragdrop.cc +++ b/source/blender/windowmanager/intern/wm_dragdrop.cc @@ -767,7 +767,7 @@ wmDragPath *WM_drag_create_path_data(blender::Span paths) path_data->file_type = ED_path_extension_type(paths[0]); - for (auto path : paths) { + for (const char *path : paths) { path_data->paths.append(path); } @@ -797,7 +797,7 @@ const char *WM_drag_get_single_path(const wmDrag *drag) return path_data->paths[0].c_str(); } -const blender::Span WM_drag_get_paths(const wmDrag *drag) +blender::Span WM_drag_get_paths(const wmDrag *drag) { if (drag->type != WM_DRAG_PATH) { return blender::Span(); diff --git a/source/blender/windowmanager/intern/wm_dragdrop_test.cc b/source/blender/windowmanager/intern/wm_dragdrop_test.cc index 76f070e7dee..c116bd0ad79 100644 --- a/source/blender/windowmanager/intern/wm_dragdrop_test.cc +++ b/source/blender/windowmanager/intern/wm_dragdrop_test.cc @@ -15,7 +15,7 @@ namespace blender::tests { -TEST(wm_dragdrop, create) +TEST(wm_drag, wmDragPath) { { /** diff --git a/source/blender/windowmanager/intern/wm_window.cc b/source/blender/windowmanager/intern/wm_window.cc index a60463db44a..149e588351b 100644 --- a/source/blender/windowmanager/intern/wm_window.cc +++ b/source/blender/windowmanager/intern/wm_window.cc @@ -65,8 +65,6 @@ #include "ED_scene.hh" #include "ED_screen.hh" -#include - #include "IMB_imbuf.h" #include "IMB_imbuf_types.h" @@ -1583,7 +1581,6 @@ static bool ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr C_void_pt blender::Span((char **)stra->strings, stra->count)); WM_event_start_drag(C, icon, WM_DRAG_PATH, path_data, 0.0, WM_DRAG_NOP); /* Void pointer should point to string, it makes a copy. */ - break; } } -- 2.30.2 From de25bca8ad2db7a5f64f23186dc0d1eca83722b5 Mon Sep 17 00:00:00 2001 From: Guillermo Venegas Date: Tue, 28 Nov 2023 11:10:40 -0600 Subject: [PATCH 12/12] Remove include and additions --- source/blender/windowmanager/WM_api.hh | 18 ++++++++-- source/blender/windowmanager/WM_types.hh | 8 ++--- .../windowmanager/intern/wm_dragdrop.cc | 35 +++++++++++++++++-- .../windowmanager/intern/wm_dragdrop_test.cc | 29 ++++++++++++--- 4 files changed, 76 insertions(+), 14 deletions(-) diff --git a/source/blender/windowmanager/WM_api.hh b/source/blender/windowmanager/WM_api.hh index f79363ad2fa..ea01ee7b23c 100644 --- a/source/blender/windowmanager/WM_api.hh +++ b/source/blender/windowmanager/WM_api.hh @@ -1426,12 +1426,26 @@ const char *WM_drag_get_item_name(wmDrag *drag); * may be destructed. */ wmDragPath *WM_drag_create_path_data(blender::Span paths); +/* If #drag contains path data, returns the first path int he path list. */ const char *WM_drag_get_single_path(const wmDrag *drag); +/* If #drag contains path data, returns the first path in the path list that maches a + * a `file_type`.*/ +/* + * \param drag: The drag that could contain drag path data. + * \param file_type: `eFileSel_File_Types` bit flag + */ +const char *WM_drag_get_single_path(const wmDrag *drag, int file_type); blender::Span WM_drag_get_paths(const wmDrag *drag); +/* If #drag contains path data, returns if any file path match a `file_type`.*/ +/* + * \param drag: The drag that could contain drag path data. + * \param file_type: `eFileSel_File_Types` bit flag + */ +bool WM_drag_has_path_file_type(const wmDrag *drag, int file_type); /** * Note that even though the enum return type uses bit-flags, this should never have multiple - * type-bits set, so `ELEM()` like comparison is possible. Only indicates the file type of first - * path in `wmDragPath.paths`. + * type-bits set, so `ELEM()` like comparison is possible. To check all paths or to do a bit-flag + * check use `WM_drag_has_path_file_type(drag,file_type)` instead. */ int /* eFileSel_File_Types */ WM_drag_get_path_file_type(const wmDrag *drag); diff --git a/source/blender/windowmanager/WM_types.hh b/source/blender/windowmanager/WM_types.hh index a6f59ecc6e9..a5ab29949ff 100644 --- a/source/blender/windowmanager/WM_types.hh +++ b/source/blender/windowmanager/WM_types.hh @@ -1174,10 +1174,10 @@ struct wmDragAssetListItem { struct wmDragPath { blender::Vector paths; - /* Note that even though the enum type uses bit-flags, this should never have multiple type-bits - * set, so `ELEM()` like comparison is possible. Only indicates the file type of first path in - * `wmDragPath.paths`. */ - int file_type; /* eFileSel_File_Types */ + /* File type of each path in #paths. */ + blender::Vector file_types; /* eFileSel_File_Types */ + /* Bit flag of file types in #paths. */ + int file_types_bit_flag; /* eFileSel_File_Types */ std::string tooltip; }; diff --git a/source/blender/windowmanager/intern/wm_dragdrop.cc b/source/blender/windowmanager/intern/wm_dragdrop.cc index 171df8f3c83..ad0b1df3293 100644 --- a/source/blender/windowmanager/intern/wm_dragdrop.cc +++ b/source/blender/windowmanager/intern/wm_dragdrop.cc @@ -768,10 +768,10 @@ wmDragPath *WM_drag_create_path_data(blender::Span paths) BLI_assert(!paths.is_empty()); wmDragPath *path_data = MEM_new("wmDragPath"); - path_data->file_type = ED_path_extension_type(paths[0]); - for (const char *path : paths) { path_data->paths.append(path); + path_data->file_types_bit_flag |= ED_path_extension_type(path); + path_data->file_types.append(ED_path_extension_type(path)); } path_data->tooltip = path_data->paths[0]; @@ -800,6 +800,35 @@ const char *WM_drag_get_single_path(const wmDrag *drag) return path_data->paths[0].c_str(); } +const char *WM_drag_get_single_path(const wmDrag *drag, int file_type) +{ + if (drag->type != WM_DRAG_PATH) { + return nullptr; + } + const wmDragPath *path_data = static_cast(drag->poin); + auto const file_types = path_data->file_types; + + auto itr = std::find_if( + file_types.begin(), file_types.end(), [file_type](const int file_fype_test) { + return file_fype_test & file_type; + }); + + if (itr == file_types.end()) { + return nullptr; + } + const int index = itr - file_types.begin(); + return path_data->paths[index].c_str(); +} + +bool WM_drag_has_path_file_type(const wmDrag *drag, int file_type) +{ + if (drag->type != WM_DRAG_PATH) { + return false; + } + const wmDragPath *path_data = static_cast(drag->poin); + return bool(path_data->file_types_bit_flag & file_type); +} + blender::Span WM_drag_get_paths(const wmDrag *drag) { if (drag->type != WM_DRAG_PATH) { @@ -817,7 +846,7 @@ int WM_drag_get_path_file_type(const wmDrag *drag) } const wmDragPath *path_data = static_cast(drag->poin); - return path_data->file_type; + return path_data->file_types[0]; } /* ************** draw ***************** */ diff --git a/source/blender/windowmanager/intern/wm_dragdrop_test.cc b/source/blender/windowmanager/intern/wm_dragdrop_test.cc index c116bd0ad79..215cef0d140 100644 --- a/source/blender/windowmanager/intern/wm_dragdrop_test.cc +++ b/source/blender/windowmanager/intern/wm_dragdrop_test.cc @@ -4,9 +4,6 @@ #include "testing/testing.h" -/* #bContextStore. */ -#include "BKE_context.h" - /* #eFileSel_File_Types. */ #include "DNA_space_types.h" @@ -38,7 +35,11 @@ TEST(wm_drag, wmDragPath) EXPECT_STREQ(WM_drag_get_single_path(&drag), "text_file.txt"); EXPECT_EQ(WM_drag_get_path_file_type(&drag), FILE_TYPE_TEXT); EXPECT_EQ(WM_drag_get_paths(&drag), expected_file_paths.as_span()); - + EXPECT_STREQ(WM_drag_get_single_path(&drag, FILE_TYPE_TEXT), "text_file.txt"); + EXPECT_EQ(WM_drag_get_single_path(&drag, FILE_TYPE_BLENDER), nullptr); + EXPECT_TRUE( + WM_drag_has_path_file_type(&drag, FILE_TYPE_BLENDER | FILE_TYPE_TEXT | FILE_TYPE_IMAGE)); + EXPECT_FALSE(WM_drag_has_path_file_type(&drag, FILE_TYPE_BLENDER | FILE_TYPE_IMAGE)); MEM_delete(path_data); } { @@ -58,7 +59,20 @@ TEST(wm_drag, wmDragPath) EXPECT_STREQ(WM_drag_get_single_path(&drag), "blender.blend"); EXPECT_EQ(WM_drag_get_path_file_type(&drag), FILE_TYPE_BLENDER); EXPECT_EQ(WM_drag_get_paths(&drag), expected_file_paths.as_span()); - + EXPECT_STREQ(WM_drag_get_single_path(&drag, FILE_TYPE_BLENDER), "blender.blend"); + EXPECT_STREQ(WM_drag_get_single_path(&drag, FILE_TYPE_IMAGE), "image.png"); + EXPECT_STREQ(WM_drag_get_single_path(&drag, FILE_TYPE_TEXT), "text_file.txt"); + EXPECT_STREQ( + WM_drag_get_single_path(&drag, FILE_TYPE_BLENDER | FILE_TYPE_TEXT | FILE_TYPE_IMAGE), + "blender.blend"); + EXPECT_STREQ(WM_drag_get_single_path(&drag, FILE_TYPE_TEXT | FILE_TYPE_IMAGE), + "text_file.txt"); + EXPECT_EQ(WM_drag_get_single_path(&drag, FILE_TYPE_ASSET), nullptr); + EXPECT_TRUE( + WM_drag_has_path_file_type(&drag, FILE_TYPE_BLENDER | FILE_TYPE_TEXT | FILE_TYPE_IMAGE)); + EXPECT_TRUE(WM_drag_has_path_file_type(&drag, FILE_TYPE_BLENDER | FILE_TYPE_IMAGE)); + EXPECT_TRUE(WM_drag_has_path_file_type(&drag, FILE_TYPE_IMAGE)); + EXPECT_FALSE(WM_drag_has_path_file_type(&drag, FILE_TYPE_ASSET)); MEM_delete(path_data); } { @@ -68,6 +82,11 @@ TEST(wm_drag, wmDragPath) EXPECT_EQ(WM_drag_get_single_path(&drag), nullptr); EXPECT_EQ(WM_drag_get_path_file_type(&drag), 0); EXPECT_EQ(WM_drag_get_paths(&drag).size(), 0); + EXPECT_EQ(WM_drag_get_single_path( + &drag, FILE_TYPE_BLENDER | FILE_TYPE_IMAGE | FILE_TYPE_TEXT | FILE_TYPE_ASSET), + nullptr); + EXPECT_FALSE(WM_drag_has_path_file_type( + &drag, FILE_TYPE_BLENDER | FILE_TYPE_IMAGE | FILE_TYPE_TEXT | FILE_TYPE_ASSET)); } } -- 2.30.2