Blender  V3.3
BKE_undo_system.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 #pragma once
3 
8 #include "DNA_ID.h"
9 #include "DNA_listBase.h"
10 
11 #ifdef __cplusplus
12 extern "C" {
13 #endif
14 
15 struct Main;
16 struct UndoStep;
17 struct bContext;
18 
19 /* ID's */
20 struct Main;
21 struct Mesh;
22 struct Object;
23 struct Scene;
24 struct Text;
25 
26 typedef struct UndoRefID {
27  struct ID *ptr;
30 /* UndoRefID_Mesh & friends. */
31 #define UNDO_REF_ID_TYPE(ptr_ty) \
32  typedef struct UndoRefID_##ptr_ty { \
33  struct ptr_ty *ptr; \
34  char name[MAX_ID_NAME]; \
35  } UndoRefID_##ptr_ty
42 
43 typedef struct UndoStack {
51 
59 
66 
67 typedef struct UndoStep {
68  struct UndoStep *next, *prev;
69  char name[64];
70  const struct UndoType *type;
72  size_t data_size;
74  bool skip;
81  bool is_applied;
82  /* Over alloc 'type->struct_size'. */
84 
85 typedef enum eUndoStepDir {
86  STEP_REDO = 1,
87  STEP_UNDO = -1,
90 
91 typedef enum eUndoPushReturn {
96 
97 typedef void (*UndoTypeForEachIDRefFn)(void *user_data, struct UndoRefID *id_ref);
98 
99 typedef struct UndoType {
100  struct UndoType *next, *prev;
102  const char *name;
103 
110  bool (*poll)(struct bContext *C);
111 
119 
120  bool (*step_encode)(struct bContext *C, struct Main *bmain, UndoStep *us);
122  struct bContext *C, struct Main *bmain, UndoStep *us, eUndoStepDir dir, bool is_final);
123 
130 
132  UndoTypeForEachIDRefFn foreach_ID_ref_fn,
133  void *user_data);
134 
137 
141  size_t step_size;
143 
145 typedef enum eUndoTypeFlags {
151 
159 
160 /* -------------------------------------------------------------------- */
166 extern const UndoType *BKE_UNDOSYS_TYPE_IMAGE;
167 extern const UndoType *BKE_UNDOSYS_TYPE_MEMFILE;
169 extern const UndoType *BKE_UNDOSYS_TYPE_PARTICLE;
170 extern const UndoType *BKE_UNDOSYS_TYPE_SCULPT;
171 extern const UndoType *BKE_UNDOSYS_TYPE_TEXT;
172 
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 /* name optional */
182 bool BKE_undosys_stack_has_undo(const UndoStack *ustack, const char *name);
183 void BKE_undosys_stack_init_from_main(UndoStack *ustack, struct Main *bmain);
184 /* called after 'BKE_undosys_stack_init_from_main' */
193 #define BKE_undosys_stack_limit_steps_and_memory_defaults(ustack) \
194  BKE_undosys_stack_limit_steps_and_memory(ustack, U.undosteps, (size_t)U.undomemory * 1024 * 1024)
195 
198 
203  struct bContext *C,
204  const char *name,
205  const UndoType *ut);
206 UndoStep *BKE_undosys_step_push_init(UndoStack *ustack, struct bContext *C, const char *name);
207 
212  struct bContext *C,
213  const char *name,
214  const UndoType *ut);
215 eUndoPushReturn BKE_undosys_step_push(UndoStack *ustack, struct bContext *C, const char *name);
216 
218  const char *name,
219  const UndoType *ut);
221 UndoStep *BKE_undosys_step_find_by_name(UndoStack *ustack, const char *name);
222 
232  const UndoStep *us_target,
233  const UndoStep *us_reference);
234 
249  struct bContext *C,
250  UndoStep *us_target,
251  UndoStep *us_reference,
252  bool use_skip);
256 bool BKE_undosys_step_load_data(UndoStack *ustack, struct bContext *C, UndoStep *us_target);
261 void BKE_undosys_step_load_from_index(UndoStack *ustack, struct bContext *C, int index);
262 
275  struct bContext *C,
276  UndoStep *us,
277  bool use_skip);
283 bool BKE_undosys_step_undo_with_data(UndoStack *ustack, struct bContext *C, UndoStep *us_target);
287 bool BKE_undosys_step_undo(UndoStack *ustack, struct bContext *C);
288 
301  struct bContext *C,
302  UndoStep *us,
303  bool use_skip);
309 bool BKE_undosys_step_redo_with_data(UndoStack *ustack, struct bContext *C, UndoStep *us_target);
313 bool BKE_undosys_step_redo(UndoStack *ustack, struct bContext *C);
314 
323 
324 /* Type System. */
325 
329 UndoType *BKE_undosys_type_append(void (*undosys_fn)(UndoType *));
330 void BKE_undosys_type_free_all(void);
331 
332 /* ID Accessor. */
333 
334 #if 0 /* functionality is only used internally for now. */
335 void BKE_undosys_foreach_ID_ref(UndoStack *ustack,
336  UndoTypeForEachIDRefFn foreach_ID_ref_fn,
337  void *user_data);
338 #endif
339 
340 void BKE_undosys_print(UndoStack *ustack);
341 
342 #ifdef __cplusplus
343 }
344 #endif
UndoType * BKE_undosys_type_append(void(*undosys_fn)(UndoType *))
Definition: undo_system.c:877
struct UndoRefID UndoRefID
eUndoTypeFlags
@ UNDOTYPE_FLAG_NEED_CONTEXT_FOR_ENCODE
@ UNDOTYPE_FLAG_DECODE_ACTIVE_STEP
bool BKE_undosys_stack_has_undo(const UndoStack *ustack, const char *name)
Definition: undo_system.c:354
#define UNDO_REF_ID_TYPE(ptr_ty)
const UndoType * BKE_UNDOSYS_TYPE_SCULPT
Definition: undo_system.c:57
bool BKE_undosys_step_undo_with_data_ex(UndoStack *ustack, struct bContext *C, UndoStep *us, bool use_skip)
Definition: undo_system.c:822
UndoStep * BKE_undosys_step_push_init_with_type(UndoStack *ustack, struct bContext *C, const char *name, const UndoType *ut)
Definition: undo_system.c:449
struct UndoType UndoType
UndoStep * BKE_undosys_step_push_init(UndoStack *ustack, struct bContext *C, const char *name)
Definition: undo_system.c:479
struct UndoStack UndoStack
void BKE_undosys_stack_clear_active(UndoStack *ustack)
Definition: undo_system.c:274
eUndoPushReturn BKE_undosys_step_push(UndoStack *ustack, struct bContext *C, const char *name)
Definition: undo_system.c:593
UndoStack * BKE_undosys_stack_create(void)
Definition: undo_system.c:250
eUndoStepDir BKE_undosys_step_calc_direction(const UndoStack *ustack, const UndoStep *us_target, const UndoStep *us_reference)
Definition: undo_system.c:659
UndoStep * BKE_undosys_step_same_type_prev(UndoStep *us)
Definition: undo_system.c:617
UndoStep * BKE_undosys_stack_init_or_active_with_type(UndoStack *ustack, const UndoType *ut)
Definition: undo_system.c:373
eUndoPushReturn BKE_undosys_step_push_with_type(UndoStack *ustack, struct bContext *C, const char *name, const UndoType *ut)
Definition: undo_system.c:491
void BKE_undosys_stack_init_from_context(UndoStack *ustack, struct bContext *C)
Definition: undo_system.c:346
const UndoType * BKE_UNDOSYS_TYPE_MEMFILE
Definition: undo_system.c:54
bool BKE_undosys_step_undo(UndoStack *ustack, struct bContext *C)
Definition: undo_system.c:842
const UndoType * BKE_UNDOSYS_TYPE_PARTICLE
Definition: undo_system.c:56
eUndoStepDir
@ STEP_INVALID
@ STEP_UNDO
@ STEP_REDO
struct UndoStep UndoStep
void BKE_undosys_stack_clear(UndoStack *ustack)
Definition: undo_system.c:262
const UndoType * BKE_UNDOSYS_TYPE_TEXT
Definition: undo_system.c:58
bool BKE_undosys_step_load_data_ex(UndoStack *ustack, struct bContext *C, UndoStep *us_target, UndoStep *us_reference, bool use_skip)
Definition: undo_system.c:718
UndoStep * BKE_undosys_step_find_by_name(UndoStack *ustack, const char *name)
Definition: undo_system.c:644
void BKE_undosys_stack_limit_steps_and_memory(UndoStack *ustack, int steps, size_t memory_limit)
Definition: undo_system.c:383
UndoStep * BKE_undosys_stack_active_with_type(UndoStack *ustack, const UndoType *ut)
Definition: undo_system.c:364
UndoStep * BKE_undosys_step_find_by_name_with_type(UndoStack *ustack, const char *name, const UndoType *ut)
Definition: undo_system.c:630
UndoStep * BKE_undosys_step_same_type_next(UndoStep *us)
Definition: undo_system.c:604
eUndoPushReturn
@ UNDO_PUSH_RET_SUCCESS
@ UNDO_PUSH_RET_OVERRIDE_CHANGED
@ UNDO_PUSH_RET_FAILURE
UndoStep * BKE_undosys_step_find_by_type(UndoStack *ustack, const UndoType *ut)
Definition: undo_system.c:649
bool BKE_undosys_step_load_data(UndoStack *ustack, struct bContext *C, UndoStep *us_target)
Definition: undo_system.c:806
bool BKE_undosys_step_redo_with_data(UndoStack *ustack, struct bContext *C, UndoStep *us_target)
Definition: undo_system.c:864
void BKE_undosys_stack_destroy(UndoStack *ustack)
Definition: undo_system.c:256
bool BKE_undosys_step_redo_with_data_ex(UndoStack *ustack, struct bContext *C, UndoStep *us, bool use_skip)
Definition: undo_system.c:850
void BKE_undosys_stack_group_end(UndoStack *ustack)
Definition: undo_system.c:925
void BKE_undosys_step_load_from_index(UndoStack *ustack, struct bContext *C, int index)
Definition: undo_system.c:812
bool BKE_undosys_step_redo(UndoStack *ustack, struct bContext *C)
Definition: undo_system.c:869
const UndoType * BKE_UNDOSYS_TYPE_PAINTCURVE
Definition: undo_system.c:55
void BKE_undosys_type_free_all(void)
Definition: undo_system.c:890
void BKE_undosys_stack_init_from_main(UndoStack *ustack, struct Main *bmain)
Definition: undo_system.c:340
void BKE_undosys_print(UndoStack *ustack)
Definition: undo_system.c:963
bool BKE_undosys_step_undo_with_data(UndoStack *ustack, struct bContext *C, UndoStep *us_target)
Definition: undo_system.c:837
void BKE_undosys_stack_group_begin(UndoStack *ustack)
Definition: undo_system.c:919
const UndoType * BKE_UNDOSYS_TYPE_IMAGE
Definition: undo_system.c:53
void(* UndoTypeForEachIDRefFn)(void *user_data, struct UndoRefID *id_ref)
unsigned int uint
Definition: BLI_sys_types.h:67
ID and Library types, which are fundamental for sdna.
#define MAX_ID_NAME
Definition: DNA_ID.h:337
These structs are the foundation for all linked lists in the library system.
#define C
Definition: RandGen.cpp:25
void * user_data
SyclQueue void void size_t num_bytes void
static const int steps
Definition: sky_nishita.cpp:19
Definition: DNA_ID.h:368
Definition: BKE_main.h:121
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, 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:273