• Stars
    star
    130
  • Rank 276,146 (Top 6 %)
  • Language
    C#
  • License
    MIT License
  • Created about 8 years ago
  • Updated about 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Reactive undo/redo framework for .NET.

ReactiveHistory

Gitter

Build Status CI

NuGet NuGet MyGet

ReactiveHistory is an undo/redo framework for .NET.

About

The main design principle for ReactiveHistory is to provide easy to use undo functionality inside your view models and allow separation from data models when following the MVVM pattern for creation of modern and portable GUI applications.

The ReactiveHistory framework enables easy implementation of undo history for observable properties and collections. To enable quick conversion from standard .NET properties and collection helper extension methods are provided. For example the ObserveWithHistory extension method is intended to be used for IObservable<T> properties and the DeleteWithHistory for IList<T> collections.

Example Usage

For examples of ReactiveHistory usage please check the samples folder. Currently there are available samples for WPF and Avalonia frameworks. The samples follow MVVM pattern, the view models use ReactiveProperty framework to implement observable properties and commands. There are also available unit tests located in tests folder with all tests for each of the use cases.

MVVM

Model

public class Layer : BaseObject
{
    private ObservableCollection<LineShape> _shapes;

    public ObservableCollection<LineShape> Shapes
    {
        get { return _shapes; }
        set { Update(ref _shapes, value); }
    }

    public Layer(object owner = null, string name = null)
    {
        this.Owner = owner;
        this.Name = name;
        this.Shapes = new ObservableCollection<LineShape>();
    }
}

ViewModel

public class LayerViewModel : IDisposable
{
    private CompositeDisposable Disposable { get; set; }
    public ReactiveProperty<string> Name { get; set; }
    public ReadOnlyReactiveCollection<LineShapeViewModel> Shapes { get; set; }
    public ReactiveCommand UndoCommand { get; set; }
    public ReactiveCommand RedoCommand { get; set; }
    public ReactiveCommand ClearCommand { get; set; }

    public LayerViewModel(Layer layer, IHistory history)
    {
        Disposable = new CompositeDisposable();

        this.Name = layer.ToReactivePropertyAsSynchronized(l => l.Name)
            .SetValidateNotifyError(name => string.IsNullOrWhiteSpace(name) ? "Name can not be null or whitespace." : null)
            .AddTo(this.Disposable);

        this.Shapes = layer.Shapes
            .ToReadOnlyReactiveCollection(x => new LineShapeViewModel(x, history))
            .AddTo(this.Disposable);

        this.Name.ObserveWithHistory(name => layer.Name = name, layer.Name, history).AddTo(this.Disposable);
        
        UndoCommand = new ReactiveCommand(history.CanUndo, false);
        UndoCommand.Subscribe(_ => history.Undo()).AddTo(this.Disposable);

        RedoCommand = new ReactiveCommand(history.CanRedo, false);
        RedoCommand.Subscribe(_ => history.Redo()).AddTo(this.Disposable);

        ClearCommand = new ReactiveCommand(history.CanClear, false);
        ClearCommand.Subscribe(_ => history.Clear()).AddTo(this.Disposable);
    }

    public void Dispose()
    {
        this.Disposable.Dispose();
    }
}

Initialization

var layer1 = new Layer("layer1");

var line1 = new LineShape(layer1, "line1");
line1.Start = new PointShape(100, 100, line1, "start11");
line1.End = new PointShape(200, 100, line1, "end11");

var line2 = new LineShape(layer1, "line2");
line2.Start = new PointShape(100, 200, line2, "start21");
line2.End = new PointShape(200, 200, line2, "end21");

layer1.Shapes.Add(line1);
layer1.Shapes.Add(line2);

var history = new StackHistory();
var layerViewModel = new LayerViewModel(layer1, history).AddTo(disposable);

Building ReactiveHistory

First, clone the repository or download the latest zip.

git clone https://github.com/wieslawsoltes/ReactiveHistory.git
git submodule update --init --recursive

NuGet

ReactiveHistory is delivered as a NuGet package.

You can find the packages here NuGet or by using nightly build feed:

  • Add https://www.myget.org/F/reactivehistory-nightly/api/v2 to your package sources
  • Alternative nightly build feed https://pkgs.dev.azure.com/wieslawsoltes/GitHub/_packaging/Nightly/nuget/v3/index.json
  • Update your package using ReactiveHistory feed

You can install the package like this:

Install-Package ReactiveHistory -Pre

Package Sources

License

ReactiveHistory is licensed under the MIT license.

More Repositories

1

ChatGPT

A ChatGPT C# client for MacOS, Windows, Linux, Android, iOS and Browser. Powered by Avalonia UI framework.
C#
1,376
star
2

Core2D

A multi-platform data driven 2D diagram editor.
C#
835
star
3

Dock

A docking layout system.
C#
771
star
4

Svg.Skia

An SVG rendering library.
C#
382
star
5

PanAndZoom

Pan and zoom control for Avalonia.
C#
285
star
6

ColorPicker

Avalonia ColorPicker control
C#
174
star
7

BatchEncoder

BatchEncoder is an audio files conversion software.
C++
145
star
8

NodeEditor

A node editor control for Avalonia.
C#
144
star
9

NXUI

NXUI (nex-ui), next-gen UI - Create minimal Avalonia applications using C# 10 and .NET 6, 7 & 8
C#
136
star
10

Avalonia.ThemeManager

Theme manager for Avalonia applications.
C#
87
star
11

AvaloniaDockApplication

Sample Dock application.
C#
60
star
12

wavtoac3encoder

WAV to AC3 Encoder an audio encoder which generates compressed audio streams based on ATSC A/52 specification
C++
35
star
13

HackerNews

HackerNews reader.
C#
34
star
14

DataBox

A DataGrid control based on ListBox control
C#
31
star
15

TreeDataGridEx

TreeDataGridEx is an experimental version of TreeDataGrid for Avalonia with added XAML syntax.
C#
30
star
16

SvgToXaml

Svg to xaml conveter.
C#
23
star
17

Avalonia.Skia.Lottie

An lottie animation player control for Avalonia.
C#
22
star
18

SpiroNet

The .NET C# port of libspiro - conversion between spiro control points and bezier's.
C#
19
star
19

SimpleWavSplitter

Split multi-channel WAV files into single channel WAV files.
C#
18
star
20

PackageReferenceEditor

MSBuild, csproj and props package reference editor.
C#
18
star
21

AwesomeWebAvalonia

Awesome Web Avalonia
17
star
22

EffectsDemo

Effect Demo for Avalonia using SkiaSharp
C#
16
star
23

HexView

HexView control for Avalonia.
C#
13
star
24

Draw2D

C#
11
star
25

WebDemos

C#
11
star
26

WpfUnitTests

Unit tests for WPF controls
C#
9
star
27

Spreadsheet

An experimental virtualized rows and columns DataGrid control created using ItemsRepeater/ListBox.
C#
9
star
28

VariableSizedWrapGrid

VariableSizedWrapGrid is a port of Windows UWP version of VariableSizedWrapGrid control for Avalonia based on WPF implemantation.
C#
8
star
29

MicroStationTagExplorer

MicroStation Tag Explorer
C#
7
star
30

Trace

Trace is an application for transforming bitmaps into vector graphics using BitmapToVector library.
C#
7
star
31

RivePlayer

A rive animation player control for Avalonia.
C#
7
star
32

YawPitchRollTransform

Yaw, Pitch and Roll transform for Avalonia
C#
6
star
33

AvaloniaDialog

C#
6
star
34

FastDraw2D

C#
6
star
35

Avalonia.Xaml.Behaviors

C#
6
star
36

AvaloniaWhatKey

Press any key to see Key enum value for Avalonia UI framework.
C#
5
star
37

DotNetCompress

An .NET compression tool. Supported file formats are Brotli and GZip.
C#
5
star
38

AvaloniaTutorialSamples

C#
5
star
39

wrpc

A Graphical User Interface for using the Wasabi Wallet RPC
C#
5
star
40

CustomControlDemo

Custom control demo for AvaloniaUI
C#
5
star
41

AvsDec

Decode avisynth audio stream to raw audio file and split multi-channel WAV files into single channel WAV files.
C++
5
star
42

MfcToolkit

MFC toolkit.
C++
4
star
43

AftenWindowsBuilds

๏ปฟAften Windows Win32 and Win64 builds.
C
4
star
44

LayoutDemo

Experimental layout controls for AvaloniaUI
C#
4
star
45

LanguageEditor

A dedicated xml language translation files editor.
C#
4
star
46

PaletteGenerator

Palette generator using K-Means clustering algorithm for getting colors from images
C#
4
star
47

CompositorDemos

Avalonia compositor demos
C#
4
star
48

BasicDemo

C#
4
star
49

lols

Performance test: LOLs per second
C#
3
star
50

ImplicitCanvasAnimations

C#
3
star
51

SourceGenerators

Svg to C# Source Generators
C#
3
star
52

TemplatedDataGrid

A DataGrid control based on ListBox and Grid panels.
C#
3
star
53

GesturesDemo

Avalonia gesture recognizers generated by ChatGPT
C#
3
star
54

TypeArgumentsDemo

C#
2
star
55

TilePanelDemo

Experimental tile panel control.
C#
2
star
56

XamlAdorner

Set control adorner from xaml in Avalonia
C#
2
star
57

AttachedPropertyDemo

C#
2
star
58

VectorPaint

C#
2
star
59

SmoothPanelSample

C#
2
star
60

XmlParser

Experimental Xml parser for .NET
C#
2
star
61

CustomVirtualizingLayout

C#
2
star
62

KnobControlDemo

C#
2
star
63

DraggableControls

Draggable controls demo.
C#
2
star
64

SimpleDraw

C#
2
star
65

ReactiveNavigation

An navigation control for Avalonia
C#
2
star
66

GridDemo

Experimental tile control for Avalonia based on Grid panel.
C#
2
star
67

TestCustomDrawing

C#
2
star
68

CatML

A CatML is an alternative Xaml controls toolkit for Avalonia.
C#
2
star
69

SqlExtensions

C#
2
star
70

NonAffineImageTransform2

Port of Non-Affine Transforms in 2D by Charles Petzold to WPF
C#
2
star
71

MorphingDemo

Geometry morphing demo for AvaloniaUI
C#
1
star
72

SvgGradientsDemo

C#
1
star
73

TreeDemo

TreeDataGrid node tree demo
C#
1
star
74

StylingParentRepro

C#
1
star
75

TypefaceUtil

An OpenType typeface utilities.
C#
1
star
76

BatchEncoderWx

BatchEncoder is an audio files conversion software (wxWidgets Demo).
C++
1
star
77

DbDemo

C#
1
star
78

AvaloniaMinimized

C#
1
star
79

DataGridDemo

C#
1
star
80

LineEditor

Line Editor
C#
1
star
81

RenderLoopTaskDemo

C#
1
star
82

HelloAvaloniaNdc

C#
1
star
83

Svg.Maui

Svg rendering support for Microsoft.Maui.Graphics
C#
1
star
84

WalletWasabiSandbox

C#
1
star
85

AvaloniaResponsiveLayout

C#
1
star
86

LogicSimulator

Asynchronous event-driven digital logic simulator
C#
1
star
87

InertiaDemo

C#
1
star
88

SpringAnimator

C#
1
star
89

PerspectiveDemo

C#
1
star
90

TicTacToeAI

C#
1
star
91

Painter

C#
1
star
92

merge

C#
1
star
93

DirectorySize

C#
1
star
94

Pong

Pong console and Avalonia game generated by ChatGPT
C#
1
star
95

FuzzyXaml

C#
1
star
96

PriorityChart

C#
1
star
97

Breakout

Atari Breakout game made by ChatGPT using Avalonia
C#
1
star
98

Spacewar

Spacewar! game made by ChatGPT using Avalonia
C#
1
star
99

ColorBlender

A .NET library for color matching and palette design.
C#
1
star
100

Paint

C#
1
star