Blender  V2.93
BKE_undo_system.h
Go to the documentation of this file.
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 #pragma once
17 
22 #include "DNA_ID.h"
23 #include "DNA_listBase.h"
24 
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28 
29 struct Main;
30 struct UndoStep;
31 struct bContext;
32 
33 /* ID's */
34 struct Main;
35 struct Mesh;
36 struct Object;
37 struct Scene;
38 struct Text;
39 
40 typedef struct UndoRefID {
41  struct ID *ptr;
44 /* UndoRefID_Mesh & friends. */
45 #define UNDO_REF_ID_TYPE(ptr_ty) \
46  typedef struct UndoRefID_##ptr_ty { \
47  struct ptr_ty *ptr; \
48  char name[MAX_ID_NAME]; \
49  } UndoRefID_##ptr_ty
56 
57 typedef struct UndoStack {
65 
73 
80 
81 typedef struct UndoStep {
82  struct UndoStep *next, *prev;
83  char name[64];
84  const struct UndoType *type;
86  size_t data_size;
88  bool skip;
95  bool is_applied;
96  /* Over alloc 'type->struct_size'. */
98 
99 typedef enum eUndoStepDir {
101  STEP_UNDO = -1,
104 
105 typedef enum UndoPushReturn {
110 
111 typedef void (*UndoTypeForEachIDRefFn)(void *user_data, struct UndoRefID *id_ref);
112 
113 typedef struct UndoType {
114  struct UndoType *next, *prev;
116  const char *name;
117 
124  bool (*poll)(struct bContext *C);
125 
132  void (*step_encode_init)(struct bContext *C, UndoStep *us);
133 
134  bool (*step_encode)(struct bContext *C, struct Main *bmain, UndoStep *us);
135  void (*step_decode)(
136  struct bContext *C, struct Main *bmain, UndoStep *us, const eUndoStepDir dir, bool is_final);
137 
143  void (*step_free)(UndoStep *us);
144 
146  UndoTypeForEachIDRefFn foreach_ID_ref_fn,
147  void *user_data);
148 
151 
155  size_t step_size;
157 
159 typedef enum UndoTypeFlags {
166 
167 /* Expose since we need to perform operations on specific undo types (rarely). */
168 extern const UndoType *BKE_UNDOSYS_TYPE_IMAGE;
169 extern const UndoType *BKE_UNDOSYS_TYPE_MEMFILE;
171 extern const UndoType *BKE_UNDOSYS_TYPE_PARTICLE;
172 extern const UndoType *BKE_UNDOSYS_TYPE_SCULPT;
173 extern const UndoType *BKE_UNDOSYS_TYPE_TEXT;
174 
175 #define BKE_UNDOSYS_TYPE_IS_MEMFILE_SKIP(ty) ELEM(ty, BKE_UNDOSYS_TYPE_IMAGE)
176 
179 void BKE_undosys_stack_clear(UndoStack *ustack);
181 bool BKE_undosys_stack_has_undo(UndoStack *ustack, const char *name);
182 void BKE_undosys_stack_init_from_main(UndoStack *ustack, struct Main *bmain);
187 #define BKE_undosys_stack_limit_steps_and_memory_defaults(ustack) \
188  BKE_undosys_stack_limit_steps_and_memory(ustack, U.undosteps, (size_t)U.undomemory * 1024 * 1024)
189 
192 
193 /* Only some UndoType's require init. */
195  struct bContext *C,
196  const char *name,
197  const UndoType *ut);
198 UndoStep *BKE_undosys_step_push_init(UndoStack *ustack, struct bContext *C, const char *name);
199 
201  struct bContext *C,
202  const char *name,
203  const UndoType *ut);
204 UndoPushReturn BKE_undosys_step_push(UndoStack *ustack, struct bContext *C, const char *name);
205 
207  const char *name,
208  const UndoType *ut);
211 
213  const UndoStep *us_target,
214  const UndoStep *us_reference);
215 
217  struct bContext *C,
218  UndoStep *us_target,
219  UndoStep *us_reference,
220  const bool use_skip);
221 bool BKE_undosys_step_load_data(UndoStack *ustack, struct bContext *C, UndoStep *us_target);
222 void BKE_undosys_step_load_from_index(UndoStack *ustack, struct bContext *C, const int index);
223 
225  struct bContext *C,
226  UndoStep *us,
227  bool use_skip);
228 bool BKE_undosys_step_undo_with_data(UndoStack *ustack, struct bContext *C, UndoStep *us_target);
229 bool BKE_undosys_step_undo(UndoStack *ustack, struct bContext *C);
230 
232  struct bContext *C,
233  UndoStep *us,
234  bool use_skip);
235 bool BKE_undosys_step_redo_with_data(UndoStack *ustack, struct bContext *C, UndoStep *us_target);
236 bool BKE_undosys_step_redo(UndoStack *ustack, struct bContext *C);
237 
240 
241 /* Type System */
242 UndoType *BKE_undosys_type_append(void (*undosys_fn)(UndoType *));
243 void BKE_undosys_type_free_all(void);
244 
245 /* ID Accessor */
246 #if 0 /* functionality is only used internally for now. */
247 void BKE_undosys_foreach_ID_ref(UndoStack *ustack,
248  UndoTypeForEachIDRefFn foreach_ID_ref_fn,
249  void *user_data);
250 #endif
251 
252 void BKE_undosys_print(UndoStack *ustack);
253 
254 #ifdef __cplusplus
255 }
256 #endif
UndoType * BKE_undosys_type_append(void(*undosys_fn)(UndoType *))
Definition: undo_system.c:947
struct UndoRefID UndoRefID
#define UNDO_REF_ID_TYPE(ptr_ty)
const UndoType * BKE_UNDOSYS_TYPE_SCULPT
Definition: undo_system.c:104
bool BKE_undosys_step_undo_with_data_ex(UndoStack *ustack, struct bContext *C, UndoStep *us, bool use_skip)
Definition: undo_system.c:862
UndoStep * BKE_undosys_step_push_init_with_type(UndoStack *ustack, struct bContext *C, const char *name, const UndoType *ut)
Definition: undo_system.c:458
struct UndoType UndoType
UndoStep * BKE_undosys_step_push_init(UndoStack *ustack, struct bContext *C, const char *name)
Definition: undo_system.c:488
struct UndoStack UndoStack
void BKE_undosys_stack_clear_active(UndoStack *ustack)
Definition: undo_system.c:289
UndoStack * BKE_undosys_stack_create(void)
Definition: undo_system.c:265
eUndoStepDir BKE_undosys_step_calc_direction(const UndoStack *ustack, const UndoStep *us_target, const UndoStep *us_reference)
Definition: undo_system.c:685
UndoStep * BKE_undosys_step_same_type_prev(UndoStep *us)
Definition: undo_system.c:635
UndoStep * BKE_undosys_stack_init_or_active_with_type(UndoStack *ustack, const UndoType *ut)
Definition: undo_system.c:390
void BKE_undosys_stack_init_from_context(UndoStack *ustack, struct bContext *C)
Definition: undo_system.c:362
const UndoType * BKE_UNDOSYS_TYPE_MEMFILE
Definition: undo_system.c:101
bool BKE_undosys_step_undo(UndoStack *ustack, struct bContext *C)
Definition: undo_system.c:890
UndoPushReturn BKE_undosys_step_push_with_type(UndoStack *ustack, struct bContext *C, const char *name, const UndoType *ut)
Definition: undo_system.c:503
const UndoType * BKE_UNDOSYS_TYPE_PARTICLE
Definition: undo_system.c:103
eUndoStepDir
@ STEP_INVALID
@ STEP_UNDO
@ STEP_REDO
struct UndoStep UndoStep
void BKE_undosys_stack_clear(UndoStack *ustack)
Definition: undo_system.c:277
const UndoType * BKE_UNDOSYS_TYPE_TEXT
Definition: undo_system.c:105
UndoStep * BKE_undosys_step_find_by_name(UndoStack *ustack, const char *name)
Definition: undo_system.c:662
void BKE_undosys_stack_limit_steps_and_memory(UndoStack *ustack, int steps, size_t memory_limit)
Definition: undo_system.c:404
UndoStep * BKE_undosys_stack_active_with_type(UndoStack *ustack, const UndoType *ut)
Definition: undo_system.c:381
UndoStep * BKE_undosys_step_find_by_name_with_type(UndoStack *ustack, const char *name, const UndoType *ut)
Definition: undo_system.c:648
UndoPushReturn
@ UNDO_PUSH_RET_SUCCESS
@ UNDO_PUSH_RET_OVERRIDE_CHANGED
@ UNDO_PUSH_RET_FAILURE
UndoStep * BKE_undosys_step_same_type_next(UndoStep *us)
Definition: undo_system.c:619
bool BKE_undosys_stack_has_undo(UndoStack *ustack, const char *name)
Definition: undo_system.c:371
UndoStep * BKE_undosys_step_find_by_type(UndoStack *ustack, const UndoType *ut)
Definition: undo_system.c:667
bool BKE_undosys_step_load_data(UndoStack *ustack, struct bContext *C, UndoStep *us_target)
Definition: undo_system.c:834
bool BKE_undosys_step_redo_with_data(UndoStack *ustack, struct bContext *C, UndoStep *us_target)
Definition: undo_system.c:928
void BKE_undosys_stack_destroy(UndoStack *ustack)
Definition: undo_system.c:271
bool BKE_undosys_step_redo_with_data_ex(UndoStack *ustack, struct bContext *C, UndoStep *us, bool use_skip)
Definition: undo_system.c:909
void BKE_undosys_stack_group_end(UndoStack *ustack)
Definition: undo_system.c:995
bool BKE_undosys_step_load_data_ex(UndoStack *ustack, struct bContext *C, UndoStep *us_target, UndoStep *us_reference, const bool use_skip)
Definition: undo_system.c:738
bool BKE_undosys_step_redo(UndoStack *ustack, struct bContext *C)
Definition: undo_system.c:936
UndoPushReturn BKE_undosys_step_push(UndoStack *ustack, struct bContext *C, const char *name)
Definition: undo_system.c:605
void BKE_undosys_step_load_from_index(UndoStack *ustack, struct bContext *C, const int index)
Definition: undo_system.c:844
const UndoType * BKE_UNDOSYS_TYPE_PAINTCURVE
Definition: undo_system.c:102
void BKE_undosys_type_free_all(void)
Definition: undo_system.c:960
UndoTypeFlags
@ UNDOTYPE_FLAG_NEED_CONTEXT_FOR_ENCODE
void BKE_undosys_stack_init_from_main(UndoStack *ustack, struct Main *bmain)
Definition: undo_system.c:355
void BKE_undosys_print(UndoStack *ustack)
Definition: undo_system.c:1033
bool BKE_undosys_step_undo_with_data(UndoStack *ustack, struct bContext *C, UndoStep *us_target)
Definition: undo_system.c:882
void BKE_undosys_stack_group_begin(UndoStack *ustack)
Definition: undo_system.c:989
const UndoType * BKE_UNDOSYS_TYPE_IMAGE
Definition: undo_system.c:100
void(* UndoTypeForEachIDRefFn)(void *user_data, struct UndoRefID *id_ref)
unsigned int uint
Definition: BLI_sys_types.h:83
ID and Library types, which are fundamental for sdna.
#define MAX_ID_NAME
Definition: DNA_ID.h:269
These structs are the foundation for all linked lists in the library system.
#define C
Definition: RandGen.cpp:39
void * user_data
static const int steps
Definition: sky_nishita.cpp:28
Definition: DNA_ID.h:273
Definition: BKE_main.h:116
char name[1024]
Definition: BKE_main.h:118
char name[MAX_ID_NAME]
struct ID * ptr
struct UndoStep * step_active
struct UndoStep * step_active_memfile
struct UndoStep * step_init
ListBase steps
const struct UndoType * type
bool is_applied
size_t data_size
struct UndoStep * prev
bool use_old_bmain_data
struct UndoStep * next
bool use_memfile_step
char name[64]
struct UndoType * prev
size_t step_size
void(* step_decode)(struct bContext *C, struct Main *bmain, UndoStep *us, const eUndoStepDir dir, bool is_final)
bool(* step_encode)(struct bContext *C, struct Main *bmain, UndoStep *us)
void(* step_encode_init)(struct bContext *C, UndoStep *us)
void(* step_foreach_ID_ref)(UndoStep *us, UndoTypeForEachIDRefFn foreach_ID_ref_fn, void *user_data)
const char * name
void(* step_free)(UndoStep *us)
bool(* poll)(struct bContext *C)
struct UndoType * next
size_t memory_limit
Definition: wm_playanim.c:267