Blender V4.3
BKE_undo_system.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4#pragma once
5
10#include "BLI_path_utils.hh"
11#include "BLI_utildefines.h"
12#include "DNA_ID.h"
13#include "DNA_listBase.h"
14
15struct Main;
16struct UndoStep;
17struct UndoType;
18struct bContext;
19
20/* IDs */
21struct GreasePencil;
22struct Main;
23struct Mesh;
24struct Object;
25struct Scene;
26struct Text;
27
28struct UndoRefID {
29 struct ID *ptr;
30 char name[MAX_ID_NAME];
32};
33/* UndoRefID_Mesh & friends. */
34#define UNDO_REF_ID_TYPE(ptr_ty) \
35 struct UndoRefID_##ptr_ty { \
36 struct ptr_ty *ptr; \
37 char name[MAX_ID_NAME]; \
38 char library_filepath_abs[FILE_MAX]; \
39 }
47
71
72struct UndoStep {
74 char name[64];
75 const UndoType *type;
77 size_t data_size;
79 bool skip;
87 /* Over alloc 'type->struct_size'. */
88};
89
95
102
103using UndoTypeForEachIDRefFn = void (*)(void *user_data, UndoRefID *id_ref);
104
105struct UndoType {
106 UndoType *next, *prev;
108 const char *name;
109
116 bool (*poll)(struct bContext *C);
117
124 void (*step_encode_init)(bContext *C, UndoStep *us);
125
126 bool (*step_encode)(bContext *C, Main *bmain, UndoStep *us);
127 void (*step_decode)(bContext *C, Main *bmain, UndoStep *us, eUndoStepDir dir, bool is_final);
128
134 void (*step_free)(UndoStep *us);
135
136 void (*step_foreach_ID_ref)(UndoStep *us,
137 UndoTypeForEachIDRefFn foreach_ID_ref_fn,
138 void *user_data);
139
142
146 size_t step_size;
147};
148
164
165/* -------------------------------------------------------------------- */
171extern const UndoType *BKE_UNDOSYS_TYPE_IMAGE;
176extern const UndoType *BKE_UNDOSYS_TYPE_TEXT;
177
180#define BKE_UNDOSYS_TYPE_IS_MEMFILE_SKIP(ty) ELEM(ty, BKE_UNDOSYS_TYPE_IMAGE)
181
186/* name optional */
187bool BKE_undosys_stack_has_undo(const UndoStack *ustack, const char *name);
189/* called after 'BKE_undosys_stack_init_from_main' */
198#define BKE_undosys_stack_limit_steps_and_memory_defaults(ustack) \
199 BKE_undosys_stack_limit_steps_and_memory(ustack, U.undosteps, (size_t)U.undomemory * 1024 * 1024)
200
203
208 bContext *C,
209 const char *name,
210 const UndoType *ut);
211UndoStep *BKE_undosys_step_push_init(UndoStack *ustack, bContext *C, const char *name);
212
217 bContext *C,
218 const char *name,
219 const UndoType *ut);
220eUndoPushReturn BKE_undosys_step_push(UndoStack *ustack, bContext *C, const char *name);
221
223 const char *name,
224 const UndoType *ut);
226UndoStep *BKE_undosys_step_find_by_name(UndoStack *ustack, const char *name);
227
237 const UndoStep *us_target,
238 const UndoStep *us_reference);
239
254 UndoStack *ustack, bContext *C, UndoStep *us_target, UndoStep *us_reference, bool use_skip);
258bool BKE_undosys_step_load_data(UndoStack *ustack, bContext *C, UndoStep *us_target);
263void BKE_undosys_step_load_from_index(UndoStack *ustack, bContext *C, int index);
264
277 bContext *C,
278 UndoStep *us_target,
279 bool use_skip);
285bool BKE_undosys_step_undo_with_data(UndoStack *ustack, bContext *C, UndoStep *us_target);
290
303 bContext *C,
304 UndoStep *us_target,
305 bool use_skip);
311bool BKE_undosys_step_redo_with_data(UndoStack *ustack, bContext *C, UndoStep *us_target);
316
325
326/* Type System. */
327
331UndoType *BKE_undosys_type_append(void (*undosys_fn)(UndoType *));
333
334/* ID Accessor. */
335
336#if 0 /* functionality is only used internally for now. */
337void BKE_undosys_foreach_ID_ref(UndoStack *ustack,
338 UndoTypeForEachIDRefFn foreach_ID_ref_fn,
339 void *user_data);
340#endif
341
342void BKE_undosys_print(UndoStack *ustack);
void BKE_undosys_step_load_from_index(UndoStack *ustack, bContext *C, int index)
eUndoTypeFlags
@ UNDOTYPE_FLAG_NEED_CONTEXT_FOR_ENCODE
@ UNDOTYPE_FLAG_DECODE_ACTIVE_STEP
bool BKE_undosys_step_undo_with_data_ex(UndoStack *ustack, bContext *C, UndoStep *us_target, bool use_skip)
bool BKE_undosys_stack_has_undo(const UndoStack *ustack, const char *name)
#define UNDO_REF_ID_TYPE(ptr_ty)
const UndoType * BKE_UNDOSYS_TYPE_SCULPT
bool BKE_undosys_step_redo_with_data(UndoStack *ustack, bContext *C, UndoStep *us_target)
void BKE_undosys_stack_init_from_context(UndoStack *ustack, bContext *C)
UndoStep * BKE_undosys_step_find_by_name_with_type(UndoStack *ustack, const char *name, const UndoType *ut)
bool BKE_undosys_step_redo(UndoStack *ustack, bContext *C)
UndoStep * BKE_undosys_step_find_by_type(UndoStack *ustack, const UndoType *ut)
UndoStep * BKE_undosys_step_same_type_next(UndoStep *us)
bool BKE_undosys_step_undo(UndoStack *ustack, bContext *C)
void BKE_undosys_stack_clear_active(UndoStack *ustack)
bool BKE_undosys_step_undo_with_data(UndoStack *ustack, bContext *C, UndoStep *us_target)
void(*)(void *user_data, UndoRefID *id_ref) UndoTypeForEachIDRefFn
eUndoPushReturn BKE_undosys_step_push(UndoStack *ustack, bContext *C, const char *name)
eUndoStepDir BKE_undosys_step_calc_direction(const UndoStack *ustack, const UndoStep *us_target, const UndoStep *us_reference)
const UndoType * BKE_UNDOSYS_TYPE_MEMFILE
UndoStep * BKE_undosys_step_same_type_prev(UndoStep *us)
const UndoType * BKE_UNDOSYS_TYPE_PARTICLE
eUndoStepDir
@ STEP_INVALID
@ STEP_UNDO
@ STEP_REDO
void BKE_undosys_type_free_all()
void BKE_undosys_stack_clear(UndoStack *ustack)
const UndoType * BKE_UNDOSYS_TYPE_TEXT
void BKE_undosys_stack_limit_steps_and_memory(UndoStack *ustack, int steps, size_t memory_limit)
UndoStep * BKE_undosys_step_find_by_name(UndoStack *ustack, const char *name)
bool BKE_undosys_step_load_data_ex(UndoStack *ustack, bContext *C, UndoStep *us_target, UndoStep *us_reference, bool use_skip)
eUndoPushReturn
@ UNDO_PUSH_RET_SUCCESS
@ UNDO_PUSH_RET_OVERRIDE_CHANGED
@ UNDO_PUSH_RET_FAILURE
eUndoPushReturn BKE_undosys_step_push_with_type(UndoStack *ustack, bContext *C, const char *name, const UndoType *ut)
UndoStep * BKE_undosys_step_push_init_with_type(UndoStack *ustack, bContext *C, const char *name, const UndoType *ut)
void BKE_undosys_stack_destroy(UndoStack *ustack)
void BKE_undosys_stack_init_from_main(UndoStack *ustack, Main *bmain)
void BKE_undosys_stack_group_end(UndoStack *ustack)
UndoStep * BKE_undosys_stack_active_with_type(UndoStack *ustack, const UndoType *ut)
bool BKE_undosys_step_load_data(UndoStack *ustack, bContext *C, UndoStep *us_target)
UndoStack * BKE_undosys_stack_create()
const UndoType * BKE_UNDOSYS_TYPE_PAINTCURVE
bool BKE_undosys_step_redo_with_data_ex(UndoStack *ustack, bContext *C, UndoStep *us_target, bool use_skip)
UndoType * BKE_undosys_type_append(void(*undosys_fn)(UndoType *))
void BKE_undosys_print(UndoStack *ustack)
UndoStep * BKE_undosys_stack_init_or_active_with_type(UndoStack *ustack, const UndoType *ut)
UndoStep * BKE_undosys_step_push_init(UndoStack *ustack, bContext *C, const char *name)
void BKE_undosys_stack_group_begin(UndoStack *ustack)
const UndoType * BKE_UNDOSYS_TYPE_IMAGE
#define FILE_MAX
unsigned int uint
#define ENUM_OPERATORS(_type, _max)
ID and Library types, which are fundamental for SDNA.
#define MAX_ID_NAME
Definition DNA_ID.h:377
These structs are the foundation for all linked lists in the library system.
#define C
Definition RandGen.cpp:29
static const int steps
Definition DNA_ID.h:413
struct ID * ptr
char library_filepath_abs[FILE_MAX]
UndoStep * step_init
UndoStep * step_active_memfile
UndoStep * step_active
ListBase steps
size_t data_size
UndoStep * prev
bool use_old_bmain_data
UndoStep * next
const UndoType * type
bool use_memfile_step
const char * name
UndoType * next
size_t memory_limit