#pragma once #include #include #include #include #include #include #include #include "ui_OBSBasic.h" class undo_stack : public QObject { Q_OBJECT typedef std::function undo_redo_cb; typedef std::function func; typedef std::unique_ptr &ui_ptr; struct undo_redo_t { QString name; std::string undo_data; std::string redo_data; undo_redo_cb undo; undo_redo_cb redo; }; ui_ptr ui; std::deque undo_items; std::deque redo_items; bool disabled = false; bool last_is_repeatable = false; QTimer repeat_reset_timer; void clear_redo(); private slots: void reset_repeatable_state(); public: undo_stack(ui_ptr ui); void enable_undo_redo(); void disable_undo_redo(); void clear(); void add_action(const QString &name, undo_redo_cb undo, undo_redo_cb redo, std::string undo_data, std::string redo_data, bool repeatable = false); void undo(); void redo(); };