Blender V5.0
io_utils.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2024 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#include <fmt/format.h>
6
7#include "BLI_path_utils.hh"
8#include "BLI_string_utf8.h"
9
10#include "BLT_translation.hh"
11
12#include "BKE_context.hh"
13#include "BKE_main.hh"
14
15#include "DNA_space_types.h"
16
17#include "RNA_access.hh"
18#include "RNA_prototypes.hh"
19
20#include "WM_api.hh"
21
22#include "io_utils.hh"
23
24namespace blender::ed::io {
25
27{
28
29 PropertyRNA *filepath_prop = RNA_struct_find_property(op->ptr, "filepath");
30 PropertyRNA *directory_prop = RNA_struct_find_property(op->ptr, "directory");
31 if ((filepath_prop && RNA_property_is_set(op->ptr, filepath_prop)) ||
32 (directory_prop && RNA_property_is_set(op->ptr, directory_prop)))
33 {
34 std::string title;
35 PropertyRNA *files_prop = RNA_struct_find_property(op->ptr, "files");
36 if (directory_prop && files_prop) {
37 const auto files = paths_from_operator_properties(op->ptr);
38 if (files.size() == 1) {
39 title = files[0];
40 }
41 else {
42 title = fmt::format(fmt::runtime(TIP_("Import {} files")), files.size());
43 }
44 }
45 else {
46 char filepath[FILE_MAX];
47 RNA_string_get(op->ptr, "filepath", filepath);
48 title = filepath;
49 }
51 C, op, 350, std::move(title), WM_operatortype_name(op->type, op->ptr));
52 }
53
56}
57
59{
60 View3D *v3d = CTX_wm_view3d(C);
61 SpaceOutliner *space_outliner = CTX_wm_space_outliner(C);
62 ARegion *region = CTX_wm_region(C);
63 if (!region || region->regiontype != RGN_TYPE_WINDOW) {
64 return false;
65 }
66 if (v3d) {
67 return true;
68 }
69 if (space_outliner && space_outliner->outlinevis == SO_VIEW_LAYER) {
70 return true;
71 }
72 return false;
73}
74
76{
78 PropertyRNA *directory_prop = RNA_struct_find_property(ptr, "directory");
79 PropertyRNA *relative_path_prop = RNA_struct_find_property(ptr, "relative_path");
80 const bool is_relative_path = relative_path_prop ?
81 RNA_property_boolean_get(ptr, relative_path_prop) :
82 false;
83 if (RNA_property_is_set(ptr, directory_prop)) {
84 char directory[FILE_MAX], name[FILE_MAX];
85
86 RNA_string_get(ptr, "directory", directory);
87 if (is_relative_path && !BLI_path_is_rel(directory)) {
89 }
90
92 *ptr, "files", &RNA_OperatorFileListElement);
93
94 BLI_assert(files_prop);
95
96 RNA_PROP_BEGIN (ptr, file_ptr, files_prop) {
97 RNA_string_get(&file_ptr, "name", name);
98 char path[FILE_MAX];
99 BLI_path_join(path, sizeof(path), directory, name);
100 BLI_path_normalize(path);
101 paths.append_non_duplicates(path);
102 }
104 }
105 PropertyRNA *filepath_prop = RNA_struct_find_property(ptr, "filepath");
106 if (filepath_prop && RNA_property_is_set(ptr, filepath_prop)) {
107 char filepath[FILE_MAX];
108 RNA_string_get(ptr, "filepath", filepath);
109 if (is_relative_path && !BLI_path_is_rel(filepath)) {
111 }
112 paths.append_non_duplicates(filepath);
113 }
114 return paths;
115}
116
118{
119 char dir[FILE_MAX];
120 BLI_path_split_dir_part(paths[0].c_str(), dir, sizeof(dir));
121 RNA_string_set(ptr, "directory", dir);
122
123 RNA_collection_clear(ptr, "files");
124 for (const auto &path : paths) {
125 char file[FILE_MAX];
126 STRNCPY_UTF8(file, path.c_str());
127 BLI_path_rel(file, dir);
128
129 PointerRNA itemptr{};
130 RNA_collection_add(ptr, "files", &itemptr);
131 BLI_assert_msg(BLI_path_is_rel(file), "Expected path to be relative (start with '//')");
132 RNA_string_set(&itemptr, "name", file + 2);
133 }
134}
135
136} // namespace blender::ed::io
SpaceOutliner * CTX_wm_space_outliner(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
View3D * CTX_wm_view3d(const bContext *C)
const char * BKE_main_blendfile_path_from_global()
Definition main.cc:892
#define BLI_assert(a)
Definition BLI_assert.h:46
#define BLI_assert_msg(a, msg)
Definition BLI_assert.h:53
#define FILE_MAX
int BLI_path_normalize(char *path) ATTR_NONNULL(1)
#define BLI_path_join(...)
bool BLI_path_is_rel(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
void void BLI_path_split_dir_part(const char *filepath, char *dir, size_t dir_maxncpy) ATTR_NONNULL(1
bool void BLI_path_rel(char path[FILE_MAX], const char *basepath) ATTR_NONNULL(1)
#define STRNCPY_UTF8(dst, src)
#define TIP_(msgid)
@ RGN_TYPE_WINDOW
@ SO_VIEW_LAYER
@ OPERATOR_RUNNING_MODAL
#define RNA_PROP_END
#define RNA_PROP_BEGIN(sptr, itemptr, prop)
#define C
Definition RandGen.cpp:29
void append_non_duplicates(const T &value)
bool poll_file_object_drop(const bContext *C, blender::bke::FileHandlerType *)
Definition io_utils.cc:58
Vector< std::string > paths_from_operator_properties(PointerRNA *ptr)
Definition io_utils.cc:75
void paths_to_operator_properties(PointerRNA *ptr, const Span< std::string > paths)
Definition io_utils.cc:117
wmOperatorStatus filesel_drop_import_invoke(bContext *C, wmOperator *op, const wmEvent *)
Definition io_utils.cc:26
const char * name
PropertyRNA * RNA_struct_find_collection_property_check(PointerRNA &props, const char *name, const StructRNA *struct_type_check)
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
void RNA_collection_clear(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
bool RNA_property_is_set(PointerRNA *ptr, PropertyRNA *prop)
bool RNA_property_boolean_get(PointerRNA *ptr, PropertyRNA *prop)
void RNA_collection_add(PointerRNA *ptr, const char *name, PointerRNA *r_value)
std::string RNA_string_get(PointerRNA *ptr, const char *name)
struct wmOperatorType * type
struct PointerRNA * ptr
void WM_event_add_fileselect(bContext *C, wmOperator *op)
PointerRNA * ptr
Definition wm_files.cc:4238
std::string WM_operatortype_name(wmOperatorType *ot, PointerRNA *properties)
wmOperatorStatus WM_operator_props_dialog_popup(bContext *C, wmOperator *op, int width, std::optional< std::string > title, std::optional< std::string > confirm_text, const bool cancel_default, std::optional< std::string > message)