File: UndoFileChangeTracker.h

package info (click to toggle)
darkradiant 3.9.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 41,080 kB
  • sloc: cpp: 264,743; ansic: 10,659; python: 1,852; xml: 1,650; sh: 92; makefile: 21
file content (74 lines) | stat: -rw-r--r-- 1,911 bytes parent folder | download | duplicates (3)
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
#pragma once

#include "iundo.h"
#include "imapfilechangetracker.h"
#include <limits>
#include <sigc++/signal.h>

class UndoFileChangeTracker :
    public IMapFileChangeTracker
{
private:
    constexpr static std::size_t MAPFILE_MAX_CHANGES = std::numeric_limits<std::size_t>::max();

	std::size_t _currentChangeCount;
	std::size_t _savedChangeCount;
    sigc::signal<void()> _changed;

public:
	UndoFileChangeTracker() :
        _currentChangeCount(0),
        _savedChangeCount(MAPFILE_MAX_CHANGES)
	{}

    void setSavedChangeCount() override
    {
        _savedChangeCount = _currentChangeCount;
        _changed.emit();
    }

    // Returns true if the current undo history position corresponds to the most recently saved state
    bool isAtSavedPosition() const override
    {
        return _savedChangeCount == _currentChangeCount;
    }

    sigc::signal<void()>& signal_changed() override
    {
        return _changed;
    }

    std::size_t getCurrentChangeCount() const override
    {
        return _currentChangeCount;
    }

    void onUndoEvent(IUndoSystem::EventType type, const std::string& operationName)
    {
        switch (type)
        {
        case IUndoSystem::EventType::OperationRecorded:
            if (_currentChangeCount < _savedChangeCount)
            {
                // redo queue has been flushed.. it is now impossible to get back to the saved state via undo/redo
                _savedChangeCount = MAPFILE_MAX_CHANGES;
            }
            ++_currentChangeCount;
            break;

        case IUndoSystem::EventType::OperationUndone:
            --_currentChangeCount;
            break;

        case IUndoSystem::EventType::OperationRedone:
            ++_currentChangeCount;
            break;

        case IUndoSystem::EventType::AllOperationsCleared:
            _currentChangeCount = 0;
            break;
        }

        _changed.emit();
    }
};