Implement moving of elements.
- NEU: Elemente können verschoben werden.
This commit is contained in:
parent
12c2412e38
commit
2bb0452a87
BIN
gimp/down.xcf
Normal file
BIN
gimp/down.xcf
Normal file
Binary file not shown.
BIN
gimp/up.xcf
Normal file
BIN
gimp/up.xcf
Normal file
Binary file not shown.
BIN
zaaReloaded2/Icons/down.png
Normal file
BIN
zaaReloaded2/Icons/down.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 545 B |
BIN
zaaReloaded2/Icons/up.png
Normal file
BIN
zaaReloaded2/Icons/up.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 537 B |
@ -280,6 +280,34 @@ namespace zaaReloaded2.ViewModels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public DelegatingCommand MoveElementUpCommand
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_moveElementUpCommand == null)
|
||||||
|
{
|
||||||
|
_moveElementUpCommand = new DelegatingCommand(
|
||||||
|
param => DoMoveElementUp(),
|
||||||
|
param => CanMoveElementUp());
|
||||||
|
}
|
||||||
|
return _moveElementUpCommand;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public DelegatingCommand MoveElementDownCommand
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_moveElementDownCommand == null)
|
||||||
|
{
|
||||||
|
_moveElementDownCommand = new DelegatingCommand(
|
||||||
|
param => DoMoveElementDown(),
|
||||||
|
param => CanMoveElementDown());
|
||||||
|
}
|
||||||
|
return _moveElementDownCommand;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Public methods
|
#region Public methods
|
||||||
@ -436,6 +464,201 @@ namespace zaaReloaded2.ViewModels
|
|||||||
|
|
||||||
bool CanCopyElement() { return LastSelectedElement != null && LastSelectedElement.IsSelected; }
|
bool CanCopyElement() { return LastSelectedElement != null && LastSelectedElement.IsSelected; }
|
||||||
|
|
||||||
|
void DoMoveElementUp()
|
||||||
|
{
|
||||||
|
if (CanMoveElementUp())
|
||||||
|
{
|
||||||
|
// We need to get a hold of the LastSelectedElement because a TreeView
|
||||||
|
// might reset the selection when we move elements around.
|
||||||
|
ElementViewModel lastSelectedElement = LastSelectedElement;
|
||||||
|
// Top-level elements are either control elements or format elements;
|
||||||
|
// child elements on the second level however are always format elements
|
||||||
|
// and must be treated differently.
|
||||||
|
if (IsTopLevelElement())
|
||||||
|
{
|
||||||
|
int index = Elements.IndexOf(lastSelectedElement);
|
||||||
|
if (lastSelectedElement is ControlElementViewModel ||
|
||||||
|
Elements[index - 1] is FormatElementViewModel ||
|
||||||
|
!((ControlElementViewModel)Elements[index - 1]).CanHaveChildren
|
||||||
|
)
|
||||||
|
{
|
||||||
|
// Simple case: top-level control element -- just move it up;
|
||||||
|
// if the selected element is a format element and the element
|
||||||
|
// above it is a format element too, just move it up as well.
|
||||||
|
// If the element above the selected element is a control element,
|
||||||
|
// but cannot have children, move the selected element up as well.
|
||||||
|
Elements.RemoveAt(index);
|
||||||
|
Elements.Insert(index - 1, lastSelectedElement);
|
||||||
|
_settings.Elements.RemoveAt(index);
|
||||||
|
_settings.Elements.Insert(
|
||||||
|
index - 1,
|
||||||
|
LastSelectedElement.RevealModelObject() as ElementBase);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// If we get here, the selected element is a format element
|
||||||
|
// and the element above it is a control element that can
|
||||||
|
// have child elements, i.e. the selected element is demoted
|
||||||
|
// to a child element of the control element above it.
|
||||||
|
ControlElementViewModel controlElementAbove =
|
||||||
|
Elements[index - 1] as ControlElementViewModel;
|
||||||
|
Elements.RemoveAt(index);
|
||||||
|
controlElementAbove.AddChildElement(
|
||||||
|
lastSelectedElement as FormatElementViewModel);
|
||||||
|
FormatElementBase model = lastSelectedElement.RevealModelObject() as FormatElementBase;
|
||||||
|
ControlElementBase modelAbove = _settings.Elements[index - 1] as ControlElementBase;
|
||||||
|
_settings.Elements.RemoveAt(index);
|
||||||
|
modelAbove.Children.Add(model);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// The selected element is a child element.
|
||||||
|
// If it is at the top of the child elements list, promote it
|
||||||
|
// to a top-level element; if not, just move it up in the
|
||||||
|
// child elements list.
|
||||||
|
FormatElementViewModel selected = lastSelectedElement as FormatElementViewModel;
|
||||||
|
int index = selected.Parent.Elements.IndexOf(selected);
|
||||||
|
if (index == 0)
|
||||||
|
{
|
||||||
|
// Promote the element from the top of the children list
|
||||||
|
// to a top-level element above its parent.
|
||||||
|
int parentIndex = Elements.IndexOf(selected.Parent);
|
||||||
|
selected.Parent.Elements.RemoveAt(0);
|
||||||
|
Elements.Insert(parentIndex, selected);
|
||||||
|
FormatElementBase model = selected.RevealModelObject() as FormatElementBase;
|
||||||
|
ControlElementBase parentModel = selected.Parent.RevealModelObject() as ControlElementBase;
|
||||||
|
parentModel.Children.RemoveAt(0);
|
||||||
|
_settings.Elements.Insert(parentIndex, model);
|
||||||
|
selected.Parent = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
selected.Parent.Elements.Move(index, index - 1);
|
||||||
|
ControlElementBase parentModel = selected.Parent.RevealModelObject() as ControlElementBase;
|
||||||
|
FormatElementBase selectedModel = parentModel.Children[index];
|
||||||
|
parentModel.Children.RemoveAt(index);
|
||||||
|
parentModel.Children.Insert(index - 1, selectedModel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Select the last selected element again.
|
||||||
|
lastSelectedElement.IsSelected = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CanMoveElementUp()
|
||||||
|
{
|
||||||
|
if (IsTopLevelElement())
|
||||||
|
{
|
||||||
|
return Elements.IndexOf(LastSelectedElement) > 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// If the selected element is a child element, it can always be moved
|
||||||
|
// up before the parent element.
|
||||||
|
return LastSelectedElement != null && LastSelectedElement.IsSelected;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DoMoveElementDown()
|
||||||
|
{
|
||||||
|
if (CanMoveElementDown())
|
||||||
|
{
|
||||||
|
// We need to get a hold of the LastSelectedElement because a TreeView
|
||||||
|
// might reset the selection when we move elements around.
|
||||||
|
ElementViewModel lastSelectedElement = LastSelectedElement;
|
||||||
|
// Top-level elements are either control elements or format elements;
|
||||||
|
// child elements on the second level however are always format elements
|
||||||
|
// and must be treated differently.
|
||||||
|
if (IsTopLevelElement())
|
||||||
|
{
|
||||||
|
int index = Elements.IndexOf(lastSelectedElement);
|
||||||
|
if (lastSelectedElement is ControlElementViewModel ||
|
||||||
|
Elements[index + 1 ] is FormatElementViewModel ||
|
||||||
|
!((ControlElementViewModel)Elements[index + 1]).CanHaveChildren
|
||||||
|
)
|
||||||
|
{
|
||||||
|
// Simple case: top-level control element -- just move it down;
|
||||||
|
// if the selected element is a format element and the element
|
||||||
|
// below it is a format element too, just move it down as well.
|
||||||
|
// If the element below the selected element is a control element,
|
||||||
|
// but cannot have children, move the selected element down as well.
|
||||||
|
Elements.RemoveAt(index);
|
||||||
|
Elements.Insert(index + 1, lastSelectedElement);
|
||||||
|
_settings.Elements.RemoveAt(index);
|
||||||
|
_settings.Elements.Insert(
|
||||||
|
index + 1,
|
||||||
|
LastSelectedElement.RevealModelObject() as ElementBase);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// If we get here, the selected element is a format element
|
||||||
|
// and the element below it is a control element that can
|
||||||
|
// have child elements, i.e. the selected element is demoted
|
||||||
|
// to a child element of the control element below it.
|
||||||
|
ControlElementViewModel controlElementBelow =
|
||||||
|
Elements[index + 1] as ControlElementViewModel;
|
||||||
|
Elements.RemoveAt(index);
|
||||||
|
controlElementBelow.Elements.Insert(
|
||||||
|
0,
|
||||||
|
lastSelectedElement as FormatElementViewModel);
|
||||||
|
((FormatElementViewModel)lastSelectedElement).Parent = controlElementBelow;
|
||||||
|
FormatElementBase model = lastSelectedElement.RevealModelObject() as FormatElementBase;
|
||||||
|
ControlElementBase modelBelow = _settings.Elements[index + 1] as ControlElementBase;
|
||||||
|
_settings.Elements.RemoveAt(index);
|
||||||
|
modelBelow.Children.Insert(0, model);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// The selected element is a child element.
|
||||||
|
// If it is at the bottom of the child elements list, promote it
|
||||||
|
// to a top-level element; if not, just move it down in the
|
||||||
|
// child elements list.
|
||||||
|
FormatElementViewModel selected = lastSelectedElement as FormatElementViewModel;
|
||||||
|
int index = selected.Parent.Elements.IndexOf(selected);
|
||||||
|
if (index == selected.Parent.Elements.Count - 1)
|
||||||
|
{
|
||||||
|
// Promote the element from the bottom of the children list
|
||||||
|
// to a top-level element below its parent.
|
||||||
|
int parentIndex = Elements.IndexOf(selected.Parent);
|
||||||
|
selected.Parent.Elements.RemoveAt(selected.Parent.Elements.Count - 1);
|
||||||
|
Elements.Insert(parentIndex + 1, selected);
|
||||||
|
FormatElementBase model = selected.RevealModelObject() as FormatElementBase;
|
||||||
|
ControlElementBase parentModel = selected.Parent.RevealModelObject() as ControlElementBase;
|
||||||
|
parentModel.Children.RemoveAt(parentModel.Children.Count - 1);
|
||||||
|
_settings.Elements.Insert(parentIndex + 1, model);
|
||||||
|
selected.Parent = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
selected.Parent.Elements.Move(index, index + 1);
|
||||||
|
ControlElementBase parentModel = selected.Parent.RevealModelObject() as ControlElementBase;
|
||||||
|
FormatElementBase selectedModel = parentModel.Children[index];
|
||||||
|
parentModel.Children.RemoveAt(index);
|
||||||
|
parentModel.Children.Insert(index + 1, selectedModel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Select the last selected element again.
|
||||||
|
lastSelectedElement.IsSelected = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CanMoveElementDown()
|
||||||
|
{
|
||||||
|
if (IsTopLevelElement())
|
||||||
|
{
|
||||||
|
return Elements.IndexOf(LastSelectedElement) < Elements.Count - 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// If the selected element is a child element, it can always be moved
|
||||||
|
// down after the parent element.
|
||||||
|
return LastSelectedElement != null && LastSelectedElement.IsSelected;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets LastSelectedElement property whenever the IsSelected
|
/// Sets LastSelectedElement property whenever the IsSelected
|
||||||
/// property of an ElementViewModel changes
|
/// property of an ElementViewModel changes
|
||||||
@ -458,7 +681,8 @@ namespace zaaReloaded2.ViewModels
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
bool IsTopLevelElement()
|
bool IsTopLevelElement()
|
||||||
{
|
{
|
||||||
return (LastSelectedElement is ControlElementViewModel ||
|
return LastSelectedElement != null &&
|
||||||
|
(LastSelectedElement is ControlElementViewModel ||
|
||||||
((FormatElementViewModel)LastSelectedElement).Parent == null);
|
((FormatElementViewModel)LastSelectedElement).Parent == null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -490,6 +714,8 @@ namespace zaaReloaded2.ViewModels
|
|||||||
DelegatingCommand _editElementCommand;
|
DelegatingCommand _editElementCommand;
|
||||||
DelegatingCommand _deleteElementCommand;
|
DelegatingCommand _deleteElementCommand;
|
||||||
DelegatingCommand _copyElementCommand;
|
DelegatingCommand _copyElementCommand;
|
||||||
|
DelegatingCommand _moveElementUpCommand;
|
||||||
|
DelegatingCommand _moveElementDownCommand;
|
||||||
Message<ViewModelMessageContent> _addElementMessage;
|
Message<ViewModelMessageContent> _addElementMessage;
|
||||||
Message<ViewModelMessageContent> _addChildElementMessage;
|
Message<ViewModelMessageContent> _addChildElementMessage;
|
||||||
Message<ViewModelMessageContent> _editElementMessage;
|
Message<ViewModelMessageContent> _editElementMessage;
|
||||||
|
@ -23,7 +23,8 @@
|
|||||||
xmlns:b="clr-namespace:Bovender.Mvvm.Views.Settings;assembly=Bovender"
|
xmlns:b="clr-namespace:Bovender.Mvvm.Views.Settings;assembly=Bovender"
|
||||||
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
|
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
|
||||||
xmlns:action="clr-namespace:Bovender.Mvvm.Actions;assembly=Bovender"
|
xmlns:action="clr-namespace:Bovender.Mvvm.Actions;assembly=Bovender"
|
||||||
Width="500" Height="440" ResizeMode="CanResizeWithGrip" ShowInTaskbar="False"
|
Width="460" Height="400" ResizeMode="CanResizeWithGrip" ShowInTaskbar="False"
|
||||||
|
MinWidth="460" MinHeight="400"
|
||||||
WindowStyle="ToolWindow" Topmost="True"
|
WindowStyle="ToolWindow" Topmost="True"
|
||||||
b:WindowState.CenterScreen="True" b:WindowState.Save="True"
|
b:WindowState.CenterScreen="True" b:WindowState.Save="True"
|
||||||
Title="Stil bearbeiten"
|
Title="Stil bearbeiten"
|
||||||
@ -66,21 +67,30 @@
|
|||||||
<GroupBox Header="Elemente" Margin="0 10 0 0">
|
<GroupBox Header="Elemente" Margin="0 10 0 0">
|
||||||
<DockPanel LastChildFill="True">
|
<DockPanel LastChildFill="True">
|
||||||
<StackPanel DockPanel.Dock="Right" Margin="10 0 0 0">
|
<StackPanel DockPanel.Dock="Right" Margin="10 0 0 0">
|
||||||
<Button Command="{Binding AddElementCommand}" ToolTip="Neues Element" Margin="0 0 0 10">
|
<!-- need the stack panel to prevent stretching of the uniform grid -->
|
||||||
<Image Source="/zaaReloaded2;component/Icons/plus.png" Width="24" />
|
<UniformGrid Columns="2">
|
||||||
</Button>
|
<Button Command="{Binding AddElementCommand}" ToolTip="Neues Element" Margin="0 0 5 10">
|
||||||
<Button Command="{Binding AddChildElementCommand}" ToolTip="Neues Kindelement" Margin="0 0 0 10">
|
<Image Source="/zaaReloaded2;component/Icons/plus.png" Width="24" />
|
||||||
<Image Source="/zaaReloaded2;component/Icons/plus-child.png" Width="24" />
|
</Button>
|
||||||
</Button>
|
<Button Command="{Binding EditElementCommand}" IsDefault="True" ToolTip="Bearbeiten" Margin="5 0 0 10">
|
||||||
<Button Command="{Binding DeleteElementCommand}" ToolTip="Entfernen" Margin="0 0 0 10">
|
<Image Source="/zaaReloaded2;component/Icons/pen.png" Width="24" />
|
||||||
<Image Source="/zaaReloaded2;component/Icons/minus.png" Width="24" />
|
</Button>
|
||||||
</Button>
|
<Button Command="{Binding AddChildElementCommand}" ToolTip="Neues Kindelement" Margin="0 0 5 10">
|
||||||
<Button Command="{Binding EditElementCommand}" IsDefault="True" ToolTip="Bearbeiten" Margin="0 0 0 10">
|
<Image Source="/zaaReloaded2;component/Icons/plus-child.png" Width="24" />
|
||||||
<Image Source="/zaaReloaded2;component/Icons/pen.png" Width="24" />
|
</Button>
|
||||||
</Button>
|
<Button Command="{Binding MoveElementUpCommand}" ToolTip="Nach oben" Margin="5 0 0 10">
|
||||||
<Button Command="{Binding CopyElementCommand}" ToolTip="Kopieren" Margin="0 0 0 10">
|
<Image Source="/zaaReloaded2;component/Icons/up.png" Width="24" />
|
||||||
<Image Source="/zaaReloaded2;component/Icons/duplicate.png" Width="24" />
|
</Button>
|
||||||
</Button>
|
<Button Command="{Binding DeleteElementCommand}" ToolTip="Entfernen" Margin="0 0 5 10">
|
||||||
|
<Image Source="/zaaReloaded2;component/Icons/minus.png" Width="24" />
|
||||||
|
</Button>
|
||||||
|
<Button Command="{Binding MoveElementDownCommand}" ToolTip="Nach unten" Margin="5 0 0 10">
|
||||||
|
<Image Source="/zaaReloaded2;component/Icons/down.png" Width="24" />
|
||||||
|
</Button>
|
||||||
|
<Button Command="{Binding CopyElementCommand}" ToolTip="Kopieren" Margin="0 0 5 10">
|
||||||
|
<Image Source="/zaaReloaded2;component/Icons/duplicate.png" Width="24" />
|
||||||
|
</Button>
|
||||||
|
</UniformGrid>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<TreeView ItemsSource="{Binding Elements}">
|
<TreeView ItemsSource="{Binding Elements}">
|
||||||
<TreeView.ItemContainerStyle>
|
<TreeView.ItemContainerStyle>
|
||||||
|
@ -401,6 +401,10 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Resource Include="Icons\plus-child.png" />
|
<Resource Include="Icons\plus-child.png" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Resource Include="Icons\down.png" />
|
||||||
|
<Resource Include="Icons\up.png" />
|
||||||
|
</ItemGroup>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
|
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
|
||||||
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||||
|
Loading…
Reference in New Issue
Block a user