Skip to content

Commit d705bda

Browse files
committed
Undo multiple actions at once in history
1 parent ebcef18 commit d705bda

File tree

7 files changed

+64
-15
lines changed

7 files changed

+64
-15
lines changed

DsmSuite.DsmViewer.Application/Actions/Management/ActionManager.cs

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public void Undo()
8888
_redoActionStack.Push(action);
8989
action.Undo();
9090
ActionPerformed?.Invoke(this, EventArgs.Empty);
91-
Logger.LogInfo("Undo :{action.Description}");
91+
Logger.LogInfo($"Undo :{action.Description}");
9292
}
9393
}
9494
}
@@ -118,11 +118,37 @@ public void Redo()
118118
_undoActionStack.Push(action);
119119
action.Do();
120120
ActionPerformed?.Invoke(this, EventArgs.Empty);
121-
Logger.LogInfo("Redo :{action.Description}");
121+
Logger.LogInfo($"Redo :{action.Description}");
122122
}
123123
}
124124
}
125125

126+
/// <summary>
127+
/// Undo/redo actions up to an including <c>action</c>.
128+
/// </summary>
129+
/// <param name="action"></param>
130+
public void Goto(IAction action)
131+
{
132+
if (_undoActionStack.Contains(action))
133+
{
134+
do
135+
{
136+
Undo();
137+
}
138+
while (_redoActionStack.Peek() != action);
139+
}
140+
else if (_redoActionStack.Contains(action))
141+
{
142+
do
143+
{
144+
Redo();
145+
}
146+
while (_undoActionStack.Peek() != action);
147+
}
148+
else
149+
Logger.LogError($"Action {action} not in ActionManager");
150+
}
151+
126152
public void Clear()
127153
{
128154
_undoActionStack.Clear();

DsmSuite.DsmViewer.Application/ApplicationClasses.cd

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
</MemberNameLabel>
2323
</AssociationLine>
2424
<TypeIdentifier>
25-
<HashCode>ApE2RAoAJoyABAiDABIbREkhoAhopYCERlAgBIUAQIA=</HashCode>
25+
<HashCode>ApE2RAoAJoyABAiDABIbREkhoIhopYCERlAgBIUAQIA=</HashCode>
2626
<FileName>Core\DsmApplication.cs</FileName>
2727
</TypeIdentifier>
2828
<ShowAsAssociation>
@@ -38,7 +38,7 @@
3838
<Class Name="DsmSuite.DsmViewer.Application.Actions.Management.ActionManager" Collapsed="true">
3939
<Position X="0.75" Y="2.5" Width="1.5" />
4040
<TypeIdentifier>
41-
<HashCode>AAIQAAQABACABASAAIAAEAIBAAAAAAAAECACAAFAAAA=</HashCode>
41+
<HashCode>AAIQAAQABACABASAAIAAEAIBAAAAAAAAECACAAFAAIA=</HashCode>
4242
<FileName>Actions\Management\ActionManager.cs</FileName>
4343
</TypeIdentifier>
4444
<Lollipop Orientation="Right" Position="0.2" Collapsed="true" />

DsmSuite.DsmViewer.Application/Core/DsmApplication.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ public void Undo()
6565
{
6666
_actionManager.Undo();
6767
}
68+
public void GotoAction(IAction action)
69+
{
70+
_actionManager.Goto(action);
71+
}
6872

6973
public bool CanRedo()
7074
{

DsmSuite.DsmViewer.Application/Interfaces/IDsmApplication.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public interface IDsmApplication
2020
bool CanUndo();
2121
string GetUndoActionDescription();
2222
void Undo();
23+
void GotoAction(IAction action);
2324
bool CanRedo();
2425
string GetRedoActionDescription();
2526
void Redo();

DsmSuite.DsmViewer.View/Lists/ActionListView.xaml

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,24 @@
1515
<RowDefinition Height="{StaticResource BottomRowHeight}" />
1616
</Grid.RowDefinitions>
1717
<TextBlock Grid.Row="0" Grid.Column="0" Style="{StaticResource DialogTitle}" Text="{Binding Title}" Margin="5"/>
18-
<ListView Grid.Row="1" ItemsSource="{Binding Actions}" Style="{StaticResource DialogListView}">
18+
<ListView Name="actionList" Grid.Row="1" SelectionMode="Single" ItemsSource="{Binding Actions}" Style="{StaticResource DialogListView}">
1919
<ListView.View>
2020
<GridView>
2121
<GridViewColumn Header="Index" Width="20" DisplayMemberBinding="{Binding Index}" />
22-
<GridViewColumn Header="Action" Width="200" DisplayMemberBinding="{Binding Action}" />
22+
<GridViewColumn Header="Action" Width="200" DisplayMemberBinding="{Binding Title}" />
2323
<GridViewColumn Header="Details" Width="600" DisplayMemberBinding="{Binding Details}" />
2424
</GridView>
2525
</ListView.View>
2626
</ListView>
2727
<DockPanel Grid.Row="2">
28-
<StackPanel DockPanel.Dock="Left" Orientation="Horizontal" HorizontalAlignment="Left">
29-
<Button Style="{StaticResource DialogButton}" Content="Clear" ToolTip="Clear action list" Command="{Binding ClearCommand}"/>
28+
<StackPanel DockPanel.Dock="Left" Orientation="Horizontal" HorizontalAlignment="Left" >
29+
<Button Style="{StaticResource DialogButton}" Content="Clear all" ToolTip="Clear action list" Command="{Binding ClearCommand}"/>
30+
<Button Style="{StaticResource DialogButton}" Content="Copy all" ToolTip="Copy action list to clipboard" Command="{Binding CopyToClipboardCommand}"/>
3031
</StackPanel>
31-
<StackPanel DockPanel.Dock="Right" Orientation="Horizontal" HorizontalAlignment="Right">
32-
<Button Style="{StaticResource DialogButton}" Content="Copy" ToolTip="Copy action list to clipboard" Command="{Binding CopyToClipboardCommand}"/>
32+
<StackPanel DockPanel.Dock="Right" Orientation="Horizontal" HorizontalAlignment="Right" >
33+
<Button Style="{StaticResource DialogButton}" Content="Goto" ToolTip="Undo up to the selected action"
34+
Command="{Binding GotoCommand}"
35+
CommandParameter="{Binding ElementName=actionList,Path=SelectedItem}"/>
3336
</StackPanel>
3437
</DockPanel>
3538
</Grid>

DsmSuite.DsmViewer.ViewModel/Lists/ActionListItemViewModel.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,17 @@ namespace DsmSuite.DsmViewer.ViewModel.Lists
55
{
66
public class ActionListItemViewModel : ViewModelBase
77
{
8+
private IAction _action;
9+
810
public ActionListItemViewModel(int index, IAction action)
911
{
1012
Index = index;
11-
Action = action.Title;
12-
Details = action.Description;
13+
_action = action;
1314
}
1415

1516
public int Index { get; }
16-
public string Action { get; }
17-
public string Details { get; }
17+
public IAction Action => _action;
18+
public string Title => _action.Title;
19+
public string Details => _action.Description;
1820
}
1921
}

DsmSuite.DsmViewer.ViewModel/Lists/ActionListViewModel.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Windows.Input;
55
using System.Windows;
66
using System.Text;
7+
using System;
78

89
namespace DsmSuite.DsmViewer.ViewModel.Lists
910
{
@@ -23,6 +24,7 @@ public ActionListViewModel(IDsmApplication application)
2324

2425
CopyToClipboardCommand = new RelayCommand<object>(CopyToClipboardExecute);
2526
ClearCommand = new RelayCommand<object>(ClearExecute);
27+
GotoCommand = new RelayCommand<object>(GotoExecute, GotoCanExecute);
2628
}
2729

2830
private void OnActionPerformed(object sender, System.EventArgs e)
@@ -41,17 +43,28 @@ public IEnumerable<ActionListItemViewModel> Actions
4143

4244
public ICommand CopyToClipboardCommand { get; }
4345
public ICommand ClearCommand { get; }
46+
public ICommand GotoCommand { get; }
4447

4548
private void CopyToClipboardExecute(object parameter)
4649
{
4750
StringBuilder builder = new StringBuilder();
4851
foreach(ActionListItemViewModel viewModel in Actions)
4952
{
50-
builder.AppendLine($"{viewModel.Index, -5}, {viewModel.Action, -30}, {viewModel.Details}");
53+
builder.AppendLine($"{viewModel.Index, -5}, {viewModel.Title, -30}, {viewModel.Details}");
5154
}
5255
Clipboard.SetText(builder.ToString());
5356
}
5457

58+
private void GotoExecute(object parameter)
59+
{
60+
_application.GotoAction(((ActionListItemViewModel)parameter).Action);
61+
}
62+
63+
private bool GotoCanExecute(object parameter)
64+
{
65+
return parameter != null;
66+
}
67+
5568
private void ClearExecute(object parameter)
5669
{
5770
_application.ClearActions();

0 commit comments

Comments
 (0)