Welcome to mirror list, hosted at ThFree Co, Russian Federation.

ProjectDirtyStateManager.hpp « GUI « slic3r « src - github.com/prusa3d/PrusaSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: f7ce81a6239bd37592ff334960f05e41b99051ec (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#ifndef slic3r_ProjectDirtyStateManager_hpp_
#define slic3r_ProjectDirtyStateManager_hpp_

#include "libslic3r/Preset.hpp"

#if ENABLE_PROJECT_DIRTY_STATE

namespace Slic3r {
namespace UndoRedo {
class Stack;
struct Snapshot;
} // namespace UndoRedo

namespace GUI {
class ProjectDirtyStateManager
{
public:
    enum class UpdateType : unsigned char
    {
        TakeSnapshot,
        UndoRedoTo
    };

    struct DirtyState
    {
        struct Gizmos
        {
            struct Gizmo
            {
                std::vector<size_t> modified_timestamps;
            };

            bool current{ false };
            std::map<std::string, Gizmo> used;

            void add_used(const UndoRedo::Snapshot& snapshot);
            void remove_obsolete_used(const Slic3r::UndoRedo::Stack& main_stack);
#if ENABLE_PROJECT_DIRTY_STATE_DEBUG_WINDOW
            bool any_used_modified() const;
#endif // ENABLE_PROJECT_DIRTY_STATE_DEBUG_WINDOW
            bool is_used_and_modified(const UndoRedo::Snapshot& snapshot) const;
            void reset();
        };

        bool plater{ false };
        bool presets{ false };
        Gizmos gizmos;

        bool is_dirty() const { return plater || presets || gizmos.current; }
        void reset() {
            plater = false;
            presets = false;
            gizmos.current = false;
        }
    };

private:
    struct LastSaveTimestamps
    {
        size_t main{ 0 };
        size_t gizmo{ 0 };

        void reset() {
            main = 0;
            gizmo = 0;
        }
    };

    DirtyState m_state;
    LastSaveTimestamps m_last_save;

    // keeps track of initial selected presets
    std::array<std::string, Preset::TYPE_COUNT> m_initial_presets;

public:
    bool is_dirty() const { return m_state.is_dirty(); }
    void update_from_undo_redo_stack(UpdateType type);
    void update_from_presets();
    void reset_after_save();
    void reset_initial_presets();
#if ENABLE_PROJECT_DIRTY_STATE_DEBUG_WINDOW
    void render_debug_window() const;
#endif // ENABLE_PROJECT_DIRTY_STATE_DEBUG_WINDOW

private:
    void update_from_undo_redo_main_stack(UpdateType type, const Slic3r::UndoRedo::Stack& stack);
    void update_from_undo_redo_gizmo_stack(UpdateType type, const Slic3r::UndoRedo::Stack& stack);
};

} // namespace GUI
} // namespace Slic3r

#endif // ENABLE_PROJECT_DIRTY_STATE

#endif // slic3r_ProjectDirtyStateManager_hpp_