doxygen: add newline after \file
[blender.git] / source / blender / blenkernel / intern / blender_copybuffer.c
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  */
16
17 /** \file
18  * \ingroup bke
19  *
20  * Used for copy/paste operator, (using a temporary file).
21  */
22
23 #include <stdlib.h>
24
25 #include "MEM_guardedalloc.h"
26
27 #include "DNA_userdef_types.h"
28 #include "DNA_scene_types.h"
29 #include "DNA_screen_types.h"
30 #include "DNA_view3d_types.h"
31 #include "DNA_windowmanager_types.h"
32
33 #include "BLI_blenlib.h"
34 #include "BLI_utildefines.h"
35
36 #include "IMB_imbuf.h"
37 #include "IMB_moviecache.h"
38
39 #include "BKE_blender_copybuffer.h"  /* own include */
40 #include "BKE_blendfile.h"
41 #include "BKE_context.h"
42 #include "BKE_global.h"
43 #include "BKE_layer.h"
44 #include "BKE_library.h"
45 #include "BKE_main.h"
46 #include "BKE_scene.h"
47
48 #include "DEG_depsgraph.h"
49 #include "DEG_depsgraph_build.h"
50
51 #include "BLO_readfile.h"
52 #include "BLO_writefile.h"
53
54 #include "IMB_colormanagement.h"
55
56
57 /* -------------------------------------------------------------------- */
58 /** \name Copy/Paste `.blend`, partial saves.
59  * \{ */
60
61 void BKE_copybuffer_begin(Main *bmain_src)
62 {
63         BKE_blendfile_write_partial_begin(bmain_src);
64 }
65
66 void BKE_copybuffer_tag_ID(ID *id)
67 {
68         BKE_blendfile_write_partial_tag_ID(id, true);
69 }
70
71 /**
72  * \return Success.
73  */
74 bool BKE_copybuffer_save(Main *bmain_src, const char *filename, ReportList *reports)
75 {
76         const int write_flags = G_FILE_RELATIVE_REMAP;
77
78         bool retval = BKE_blendfile_write_partial(bmain_src, filename, write_flags, reports);
79
80         BKE_blendfile_write_partial_end(bmain_src);
81
82         return retval;
83 }
84
85 bool BKE_copybuffer_read(Main *bmain_dst, const char *libname, ReportList *reports)
86 {
87         BlendHandle *bh = BLO_blendhandle_from_file(libname, reports);
88         if (bh == NULL) {
89                 /* Error reports will have been made by BLO_blendhandle_from_file(). */
90                 return false;
91         }
92         /* Here appending/linking starts. */
93         Main *mainl = BLO_library_link_begin(bmain_dst, &bh, libname);
94         BLO_library_link_copypaste(mainl, bh);
95         BLO_library_link_end(mainl, &bh, 0, NULL, NULL, NULL, NULL);
96         /* Mark all library linked objects to be updated. */
97         BKE_main_lib_objects_recalc_all(bmain_dst);
98         IMB_colormanagement_check_file_config(bmain_dst);
99         /* Append, rather than linking. */
100         Library *lib = BLI_findstring(&bmain_dst->library, libname, offsetof(Library, filepath));
101         BKE_library_make_local(bmain_dst, lib, NULL, true, false);
102         /* Important we unset, otherwise these object wont
103          * link into other scenes from this blend file.
104          */
105         BKE_main_id_tag_all(bmain_dst, LIB_TAG_PRE_EXISTING, false);
106         BLO_blendhandle_close(bh);
107         return true;
108 }
109
110 /**
111  * \return Success.
112  */
113 bool BKE_copybuffer_paste(bContext *C, const char *libname, const short flag, ReportList *reports)
114 {
115         Main *bmain = CTX_data_main(C);
116         Scene *scene = CTX_data_scene(C);
117         ViewLayer *view_layer = CTX_data_view_layer(C);
118         View3D *v3d = CTX_wm_view3d(C);  /* may be NULL. */
119         Main *mainl = NULL;
120         Library *lib;
121         BlendHandle *bh;
122
123         bh = BLO_blendhandle_from_file(libname, reports);
124
125         if (bh == NULL) {
126                 /* error reports will have been made by BLO_blendhandle_from_file() */
127                 return false;
128         }
129
130         BKE_view_layer_base_deselect_all(view_layer);
131
132         /* tag everything, all untagged data can be made local
133          * its also generally useful to know what is new
134          *
135          * take extra care BKE_main_id_flag_all(bmain, LIB_TAG_PRE_EXISTING, false) is called after! */
136         BKE_main_id_tag_all(bmain, LIB_TAG_PRE_EXISTING, true);
137
138         /* here appending/linking starts */
139         mainl = BLO_library_link_begin(bmain, &bh, libname);
140
141         BLO_library_link_copypaste(mainl, bh);
142
143         BLO_library_link_end(mainl, &bh, flag, bmain, scene, view_layer, v3d);
144
145         /* mark all library linked objects to be updated */
146         BKE_main_lib_objects_recalc_all(bmain);
147         IMB_colormanagement_check_file_config(bmain);
148
149         /* append, rather than linking */
150         lib = BLI_findstring(&bmain->library, libname, offsetof(Library, filepath));
151         BKE_library_make_local(bmain, lib, NULL, true, false);
152
153         /* important we unset, otherwise these object wont
154          * link into other scenes from this blend file */
155         BKE_main_id_tag_all(bmain, LIB_TAG_PRE_EXISTING, false);
156
157         /* recreate dependency graph to include new objects */
158         DEG_relations_tag_update(bmain);
159
160         /* Tag update the scene to flush base collection settings, since the new object is added to a
161          * new (active) collection, not its original collection, thus need recalculation. */
162         DEG_id_tag_update(&scene->id, 0);
163
164         BLO_blendhandle_close(bh);
165         /* remove library... */
166
167         return true;
168 }
169
170 /** \} */