Bonjour, un exemple tout simple d'utilisation d' "UndoManager" et de "ValueTree"


Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
class MainComponent   : public Component,private ValueTree::Listener, private Timer, public KeyListener
{
public:
    //==============================================================================
    MainComponent()
    {
        setOpaque (true);
        setSize (640, 480);
 
 
        addAndMakeVisible(mySlider);
        addAndMakeVisible(mySlider2);
 
        mySlider.setSliderStyle(Slider::SliderStyle::LinearVertical);
        mySlider2.setSliderStyle(Slider::SliderStyle::LinearVertical);
 
 
        addAndMakeVisible (undoButton);
        addAndMakeVisible (redoButton);
        undoButton.setButtonText("Undo");
        redoButton.setButtonText ("Redo");
 
        undoButton.onClick = [this] { undoManager.undo(); };
        redoButton.onClick = [this] { undoManager.redo(); };
 
        ValueTree myValueTree ("myApp");
 
        myValueTree.setProperty("mySlider", mySlider.getValue(), &undoManager);
        myValueTree.setProperty("mySlider2", mySlider2.getValue(), &undoManager);
 
        Value valueTreeObj = myValueTree.getPropertyAsValue("mySlider", &undoManager);
        Value valueTreeObj2 = myValueTree.getPropertyAsValue("mySlider2", &undoManager);
 
        mySlider.getValueObject().referTo(valueTreeObj);
        mySlider2.getValueObject().referTo(valueTreeObj2);
 
        myValueTree.addListener(this);
        addKeyListener(this);
        startTimer (500);
    }
 
    ~MainComponent()
    {
 
 
    }
    bool keyPressed (const KeyPress& key,
                     Component* originatingComponent) override
    {
        if(key.getKeyCode() == 90)
        {
            if(key.getModifiers() == ModifierKeys::commandModifier)
                undoManager.undo();
 
                if(key.getModifiers() == ModifierKeys::shiftModifier + ModifierKeys::commandModifier)
                    undoManager.redo();
                    }
 
        return 0;
    }
 
 
    void valueTreePropertyChanged (ValueTree&, const Identifier&) override
    {
        repaint();
    }
    void valueTreeChildAdded (ValueTree& parentTree,
                              ValueTree& childWhichHasBeenAdded) override
    {
    }
 
 
    void valueTreeChildRemoved (ValueTree& parentTree,
                                ValueTree& childWhichHasBeenRemoved,
                                int indexFromWhichChildWasRemoved) override
    {
 
    }
 
    virtual void valueTreeChildOrderChanged (ValueTree& parentTreeWhoseChildrenHaveMoved,
                                             int oldIndex, int newIndex) override
    {
 
    }
 
    void valueTreeParentChanged (ValueTree& treeWhoseParentHasChanged) override
    {
 
    }
 
 
 
    void paint (Graphics& g) override
    {
        g.fillAll (findColour (ResizableWindow::backgroundColourId));
    }
 
    void resized() override
    {
 
        auto r = getLocalBounds();
 
        auto buttons = r.removeFromBottom (20);
        undoButton.setBounds (buttons.removeFromLeft (100));
        redoButton.setBounds (buttons.removeFromLeft (100));
        mySlider.setBounds(0, 10, getWidth()/2, getHeight()-80);
        mySlider2.setBounds(getWidth()/2, 10, getWidth()/2, getHeight()-80);
 
    }
 
private:
    Slider   mySlider;
    Slider mySlider2;
    TextButton undoButton, redoButton;
    ApplicationProperties props;
    UndoManager undoManager;
 
    void timerCallback() override
    {
        undoManager.beginNewTransaction();
    }
 
    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainComponent)
};