16 name += action->get_name();
49 if (!action->is_valid())
62 if(sub_actions.size() != prev_composite_action.sub_actions.size())
67 bool all_sub_actions_can_merge =
true;
68 for (
size_t i = 0; i < sub_actions.size() && i < prev_composite_action.sub_actions.size(); ++i)
70 if (sub_actions[i] && prev_composite_action.sub_actions[i] &&
71 sub_actions[i]->get_meta_type() == prev_composite_action.sub_actions[i]->get_meta_type())
73 if(!sub_actions[i]->is_mergeable(*prev_composite_action.sub_actions[i]))
75 all_sub_actions_can_merge =
false;
81 return all_sub_actions_can_merge;
91 for (
size_t i = 0; i <
sub_actions.size() && i < prev_composite_action.sub_actions.size(); ++i)
93 if (
sub_actions[i] && prev_composite_action.sub_actions[i] &&
94 sub_actions[i]->get_meta_type() == prev_composite_action.sub_actions[i]->get_meta_type())
96 sub_actions[i]->merge_with(*prev_composite_action.sub_actions[i]);
105 action->draw_in_inspector(ctx);
129 auto action = factory();
160 (*it)->undo_action();
177 if(!action || !action->is_valid())
196 action->draw_in_inspector(ctx);
void add_sub_action(std::shared_ptr< editing_action_t > action)
void undo_action() override
void draw_in_inspector(rtti::context &ctx) override
void do_action() override
void merge_with(const editing_action_t &previous) override
auto is_valid() const -> bool override
auto is_mergeable(const editing_action_t &previous) const -> bool override
std::vector< std::shared_ptr< editing_action_t > > sub_actions
void do_action() override
void draw_in_inspector(rtti::context &ctx) override
void undo_action() override
auto is_mergeable(const editing_action_t &previous) const -> bool override
std::vector< std::shared_ptr< editing_action_t > > sub_actions
Captured sub-actions after first execution, replayed on redo and reversed on undo.
auto is_valid() const -> bool override
std::vector< std::function< std::shared_ptr< editing_action_t >()> > step_factories
Factories evaluated lazily on the first execution. Cleared once consumed.
void add_step(std::function< std::shared_ptr< editing_action_t >()> factory)
Append a step to the sequence. Factory is invoked only on the first execution.