add next/prev buttons

This commit is contained in:
Haven1433 2022-09-13 22:49:38 -05:00
parent 3a9cf7ee92
commit 0cca2a6bad
3 changed files with 283 additions and 174 deletions

View File

@ -36,6 +36,7 @@ namespace HavenSoft.HexManiac.Core.ViewModels.Map {
set {
var oldValue = selectedEvent;
selectedEvent = value;
NotifyPropertyChanged();
HandleSelectedEventChanged(oldValue);
}
}
@ -44,15 +45,66 @@ namespace HavenSoft.HexManiac.Core.ViewModels.Map {
if (old == selectedEvent) return;
if (old != null) {
old.EventVisualUpdated -= RefreshFromEventChange;
old.CycleEvent -= CycleActiveEvent;
}
if (selectedEvent != null) {
selectedEvent.EventVisualUpdated += RefreshFromEventChange;
selectedEvent.CycleEvent += CycleActiveEvent;
}
RedrawEvents();
}
private void RefreshFromEventChange(object sender, EventArgs e) => RedrawEvents();
private void CycleActiveEvent(object sender, EventCycleDirection direction) {
// organize events into categories
var events = GetEvents(tokenFactory());
var categories = new List<List<IEventModel>> { new(), new(), new(), new() };
int selectionIndex = -1, selectedCategory = -1;
for (int i = 0; i < events.Count; i++) {
int currentCategory =
events[i] is ObjectEventModel ? 0 :
events[i] is WarpEventModel ? 1 :
events[i] is ScriptEventModel ? 2 :
events[i] is SignpostEventModel ? 3 :
-1;
categories[currentCategory].Add(events[i]);
if (events[i].Equals(selectedEvent)) {
selectionIndex = categories[currentCategory].Count - 1;
selectedCategory = currentCategory;
};
}
// remove unused categories
for (int i = 0; i < categories.Count; i++) {
if (categories[i].Count != 0) continue;
categories.RemoveAt(i);
if (selectedCategory > i) selectedCategory--;
i--;
}
// cycle
if (direction == EventCycleDirection.PreviousCategory) {
selectedCategory += categories.Count - 1;
selectionIndex = 0;
} else if (direction == EventCycleDirection.NextCategory) {
selectedCategory += 1;
selectionIndex = 0;
} else if (direction == EventCycleDirection.PreviousEvent) {
selectionIndex += categories[selectedCategory].Count - 1;
} else if (direction == EventCycleDirection.NextEvent) {
selectionIndex += 1;
} else {
throw new NotImplementedException();
}
selectedCategory %= categories.Count;
selectionIndex %= categories[selectedCategory].Count;
// update selection
SelectedEvent = categories[selectedCategory][selectionIndex];
}
#endregion
private static int MapSizeLimit => 0x2800; // (x+15)*(y+14) must be less that 0x2800 (5*2048). This can lead to limits like 113x66 or 497x6
@ -1163,8 +1215,11 @@ namespace HavenSoft.HexManiac.Core.ViewModels.Map {
*/
}
public interface IEventModel : INotifyPropertyChanged {
public interface IEventModel : IEquatable<IEventModel>, INotifyPropertyChanged {
event EventHandler EventVisualUpdated;
public event EventHandler<EventCycleDirection> CycleEvent;
string EventType { get; }
string EventIndex { get; }
int TopOffset { get; }
int LeftOffset { get; }
int X { get; set; }
@ -1175,14 +1230,28 @@ namespace HavenSoft.HexManiac.Core.ViewModels.Map {
void Delete();
}
public abstract class BaseEventModel : ViewModelCore, IEventModel {
// TODO text for event number / event count (1/4, 2/4, 3/4, 4/4, etc)
// TODO commands for switching selection to another event/group
public enum EventCycleDirection { PreviousCategory, PreviousEvent, NextEvent, NextCategory }
public abstract class BaseEventModel : ViewModelCore, IEventModel, IEquatable<IEventModel> {
public event EventHandler EventVisualUpdated;
public event EventHandler<EventCycleDirection> CycleEvent;
private StubCommand cycleEventCommand;
public ICommand CycleEventCommand => StubCommand<EventCycleDirection>(ref cycleEventCommand, direction => {
CycleEvent?.Invoke(this, direction);
});
protected readonly ModelArrayElement element;
private readonly string parentLengthField;
public string EventType => GetType().Name.Replace("EventModel", string.Empty);
public string EventIndex {
get {
var eventIndex = (element.Start - element.Table.Start) / element.Table.ElementLength + 1;
return $"{eventIndex}/{element.Table.ElementCount}";
}
}
public virtual int TopOffset => 0;
public virtual int LeftOffset => 0;
@ -1245,6 +1314,11 @@ namespace HavenSoft.HexManiac.Core.ViewModels.Map {
public void Delete() => DeleteElement(parentLengthField);
public bool Equals(IEventModel other) {
if (other is not BaseEventModel bem) return false;
return bem.element.Start == element.Start;
}
public abstract void Render(IDataModel model);
protected void RaiseEventVisualUpdated() => EventVisualUpdated.Raise(this);
@ -1473,7 +1547,6 @@ namespace HavenSoft.HexManiac.Core.ViewModels.Map {
}
public class ScriptEventModel : BaseEventModel {
// trigger: index:: script<`xse`>
public ScriptEventModel(ModelArrayElement scriptEvent) : base(scriptEvent, "scriptCount") { }
public int Trigger {

View File

@ -185,11 +185,13 @@ namespace HavenSoft.HexManiac.Core.ViewModels.Map {
if (primaryMap != map) {
if (primaryMap != null) {
primaryMap.NeighborsChanged -= PrimaryMapNeighborsChanged;
primaryMap.PropertyChanged -= PrimaryMapPropertyChanged;
primaryMap.CollisionHighlight = -1;
}
PrimaryMap = map;
if (primaryMap != null) {
primaryMap.NeighborsChanged += PrimaryMapNeighborsChanged;
primaryMap.PropertyChanged += PrimaryMapPropertyChanged;
primaryMap.CollisionHighlight = collisionIndex;
}
NotifyPropertyChanged(nameof(Blocks));
@ -232,6 +234,15 @@ namespace HavenSoft.HexManiac.Core.ViewModels.Map {
UpdatePrimaryMap(primaryMap);
}
private void PrimaryMapPropertyChanged(object sender, PropertyChangedEventArgs e) {
var map = (BlockMapViewModel)sender;
if (e.PropertyName == nameof(BlockMapViewModel.SelectedEvent)) {
if (map.SelectedEvent != selectedEvent) {
SelectedEvent = map.SelectedEvent;
}
}
}
private IEnumerable<BlockMapViewModel> GetMapNeighbors(BlockMapViewModel map, int recursionLevel) {
if (recursionLevel < 1) yield break;
var directions = new List<MapDirection> {

View File

@ -42,199 +42,224 @@
<ScrollViewer Grid.Column="0" Grid.RowSpan="2" Background="{DynamicResource Background}" Panel.ZIndex="1"
Width="{Binding ActualWidth, ElementName=BlockPanel}"
Visibility="{Binding ShowEventPanel, Converter={StaticResource BoolToVisibility}}">
<ContentControl DataContext="{Binding SelectedEvent}" Content="{Binding}">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type map:ObjectEventModel}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition /> <RowDefinition />
<RowDefinition /> <RowDefinition />
<RowDefinition /> <RowDefinition />
<RowDefinition /> <RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<DockPanel>
<Grid DockPanel.Dock="Top">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<local:AngleButton Grid.Column="0" Content="Group" Direction="Left" VerticalAlignment="Bottom"
Command="{Binding SelectedEvent.CycleEventCommand}" CommandParameter="{x:Static map:EventCycleDirection.PreviousCategory}" />
<local:AngleButton Grid.Column="1" Content="Event" Direction="Left" VerticalAlignment="Bottom"
Command="{Binding SelectedEvent.CycleEventCommand}" CommandParameter="{x:Static map:EventCycleDirection.PreviousEvent}" />
<StackPanel Grid.Column="2">
<TextBlock TextAlignment="Center" Text="{Binding SelectedEvent.EventType}" />
<local:AngleBorder Direction="Out">
<TextBlock TextAlignment="Center" Text="{Binding SelectedEvent.EventIndex}" />
</local:AngleBorder>
</StackPanel>
<local:AngleButton Grid.Column="3" Content="Event" Direction="Right" VerticalAlignment="Bottom"
Command="{Binding SelectedEvent.CycleEventCommand}" CommandParameter="{x:Static map:EventCycleDirection.NextEvent}" />
<local:AngleButton Grid.Column="4" Content="Group" Direction="Right" VerticalAlignment="Bottom"
Command="{Binding SelectedEvent.CycleEventCommand}" CommandParameter="{x:Static map:EventCycleDirection.NextCategory}" />
</Grid>
<ContentControl DataContext="{Binding SelectedEvent}" Content="{Binding}">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type map:ObjectEventModel}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition /> <RowDefinition />
<RowDefinition /> <RowDefinition />
<RowDefinition /> <RowDefinition />
<RowDefinition /> <RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<StackPanel>
<local:AngleBorder Direction="Out">
<TextBlock Text="ID:"/>
</local:AngleBorder>
<local:AngleTextBox Direction="Out" TextBinding="{Binding ObjectID}" />
</StackPanel>
<StackPanel>
<local:AngleBorder Direction="Out">
<TextBlock Text="ID:"/>
</local:AngleBorder>
<local:AngleTextBox Direction="Out" TextBinding="{Binding ObjectID}" />
</StackPanel>
<ComboBox Grid.Row="0" Grid.Column="1" SelectedIndex="{Binding Graphics}" ItemsSource="{Binding Options}">
<ComboBox.Resources>
<DataTemplate DataType="{x:Type tools:VisualComboOption}">
<local:PixelImage />
</DataTemplate>
</ComboBox.Resources>
</ComboBox>
<ComboBox Grid.Row="0" Grid.Column="1" SelectedIndex="{Binding Graphics}" ItemsSource="{Binding Options}">
<ComboBox.Resources>
<DataTemplate DataType="{x:Type tools:VisualComboOption}">
<local:PixelImage />
</DataTemplate>
</ComboBox.Resources>
</ComboBox>
<local:AngleBorder Grid.Row="1" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="(x, y):" />
</local:AngleBorder>
<local:AngleTextBox Grid.Row="1" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding XY, UpdateSourceTrigger=PropertyChanged}" />
<local:AngleBorder Grid.Row="1" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="(x, y):" />
</local:AngleBorder>
<local:AngleTextBox Grid.Row="1" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding XY, UpdateSourceTrigger=PropertyChanged}" />
<local:AngleBorder Grid.Row="2" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Elevation:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="2" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding Elevation}" />
<local:AngleBorder Grid.Row="2" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Elevation:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="2" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding Elevation}" />
<local:AngleBorder Grid.Row="3" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Movement Type:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="3" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding MoveType, UpdateSourceTrigger=PropertyChanged}" />
<local:AngleBorder Grid.Row="3" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Movement Type:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="3" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding MoveType, UpdateSourceTrigger=PropertyChanged}" />
<local:AngleBorder Grid.Row="4" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Range:" />
</local:AngleBorder>
<local:AngleTextBox Grid.Row="4" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding RangeXY, UpdateSourceTrigger=PropertyChanged}" />
<local:AngleBorder Grid.Row="4" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Range:" />
</local:AngleBorder>
<local:AngleTextBox Grid.Row="4" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding RangeXY, UpdateSourceTrigger=PropertyChanged}" />
<local:AngleBorder Grid.Row="5" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Trainer Type:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="5" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding TrainerType}" />
<local:AngleBorder Grid.Row="5" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Trainer Type:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="5" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding TrainerType}" />
<local:AngleBorder Grid.Row="6" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="TrainerRange / BerryID:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="6" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding TrainerRangeOrBerryID}" />
<local:AngleBorder Grid.Row="6" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="TrainerRange / BerryID:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="6" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding TrainerRangeOrBerryID}" />
<local:AngleBorder Grid.Row="7" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Script Address:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="7" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding ScriptAddressText, UpdateSourceTrigger=PropertyChanged}" />
<local:AngleBorder Grid.Row="7" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Script Address:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="7" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding ScriptAddressText, UpdateSourceTrigger=PropertyChanged}" />
<local:AngleBorder Grid.Row="8" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Flag:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="8" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding FlagText}" />
</Grid>
</DataTemplate>
<DataTemplate DataType="{x:Type map:WarpEventModel}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition /> <RowDefinition />
<RowDefinition /> <RowDefinition />
<RowDefinition /> <RowDefinition />
<RowDefinition /> <RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<local:AngleBorder Grid.Row="8" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Flag:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="8" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding FlagText}" />
</Grid>
</DataTemplate>
<DataTemplate DataType="{x:Type map:WarpEventModel}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition /> <RowDefinition />
<RowDefinition /> <RowDefinition />
<RowDefinition /> <RowDefinition />
<RowDefinition /> <RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<local:AngleBorder Grid.Row="1" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="(x, y):" />
</local:AngleBorder>
<local:AngleTextBox Grid.Row="1" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding XY, UpdateSourceTrigger=PropertyChanged}" />
<local:AngleBorder Grid.Row="1" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="(x, y):" />
</local:AngleBorder>
<local:AngleTextBox Grid.Row="1" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding XY, UpdateSourceTrigger=PropertyChanged}" />
<local:AngleBorder Grid.Row="2" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Elevation:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="2" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding Elevation}" />
<local:AngleBorder Grid.Row="2" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Elevation:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="2" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding Elevation}" />
<local:AngleBorder Grid.Row="3" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="(bank, map):"/>
</local:AngleBorder>
<StackPanel Grid.Row="3" Grid.Column="1" VerticalAlignment="Top">
<local:AngleTextBox Direction="Out" TextBinding="{Binding BankMap}" />
<TextBlock Text="{Binding TargetMapName}" />
</StackPanel>
<local:AngleBorder Grid.Row="3" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="(bank, map):"/>
</local:AngleBorder>
<StackPanel Grid.Row="3" Grid.Column="1" VerticalAlignment="Top">
<local:AngleTextBox Direction="Out" TextBinding="{Binding BankMap}" />
<TextBlock Text="{Binding TargetMapName}" />
</StackPanel>
<local:AngleBorder Grid.Row="4" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Destination ID:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="4" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding WarpID}" />
</Grid>
</DataTemplate>
<DataTemplate DataType="{x:Type map:ScriptEventModel}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition /> <RowDefinition />
<RowDefinition /> <RowDefinition />
<RowDefinition /> <RowDefinition />
<RowDefinition /> <RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<local:AngleBorder Grid.Row="4" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Destination ID:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="4" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding WarpID}" />
</Grid>
</DataTemplate>
<DataTemplate DataType="{x:Type map:ScriptEventModel}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition /> <RowDefinition />
<RowDefinition /> <RowDefinition />
<RowDefinition /> <RowDefinition />
<RowDefinition /> <RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<local:AngleBorder Grid.Row="1" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="(x, y):" />
</local:AngleBorder>
<local:AngleTextBox Grid.Row="1" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding XY, UpdateSourceTrigger=PropertyChanged}" />
<local:AngleBorder Grid.Row="1" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="(x, y):" />
</local:AngleBorder>
<local:AngleTextBox Grid.Row="1" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding XY, UpdateSourceTrigger=PropertyChanged}" />
<local:AngleBorder Grid.Row="2" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Elevation:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="2" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding Elevation}" />
<local:AngleBorder Grid.Row="2" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Elevation:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="2" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding Elevation}" />
<local:AngleBorder Grid.Row="3" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Trigger:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="3" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding Trigger}" />
<local:AngleBorder Grid.Row="3" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Trigger:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="3" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding Trigger}" />
<local:AngleBorder Grid.Row="4" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Index:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="4" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding Index}" />
<local:AngleBorder Grid.Row="4" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Index:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="4" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding Index}" />
<local:AngleBorder Grid.Row="7" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Script Address:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="7" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding ScriptAddressText, UpdateSourceTrigger=PropertyChanged}" />
</Grid>
</DataTemplate>
<DataTemplate DataType="{x:Type map:SignpostEventModel}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition /> <RowDefinition />
<RowDefinition /> <RowDefinition />
<RowDefinition /> <RowDefinition />
<RowDefinition /> <RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<local:AngleBorder Grid.Row="7" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Script Address:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="7" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding ScriptAddressText, UpdateSourceTrigger=PropertyChanged}" />
</Grid>
</DataTemplate>
<DataTemplate DataType="{x:Type map:SignpostEventModel}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition /> <RowDefinition />
<RowDefinition /> <RowDefinition />
<RowDefinition /> <RowDefinition />
<RowDefinition /> <RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<local:AngleBorder Grid.Row="1" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="(x, y):" />
</local:AngleBorder>
<local:AngleTextBox Grid.Row="1" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding XY, UpdateSourceTrigger=PropertyChanged}" />
<local:AngleBorder Grid.Row="1" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="(x, y):" />
</local:AngleBorder>
<local:AngleTextBox Grid.Row="1" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding XY, UpdateSourceTrigger=PropertyChanged}" />
<local:AngleBorder Grid.Row="2" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Elevation:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="2" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding Elevation}" />
<local:AngleBorder Grid.Row="2" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Elevation:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="2" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding Elevation}" />
<local:AngleBorder Grid.Row="3" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Kind:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="3" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding Kind}" />
<local:AngleBorder Grid.Row="3" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Kind:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="3" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding Kind}" />
<local:AngleBorder Grid.Row="4" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Arg:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="4" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding Arg}" />
<local:AngleBorder Grid.Row="4" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Arg:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="4" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding Arg}" />
<!-- TODO break Arg into multiple pieces and show individual UI based on the value of Kind -->
<!--<local:AngleBorder Grid.Row="7" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Script Address:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="7" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding ScriptAddressText, UpdateSourceTrigger=PropertyChanged}" />-->
</Grid>
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
<!-- TODO break Arg into multiple pieces and show individual UI based on the value of Kind -->
<!--<local:AngleBorder Grid.Row="7" VerticalAlignment="Top" Direction="Left">
<TextBlock Text="Script Address:"/>
</local:AngleBorder>
<local:AngleTextBox Grid.Row="7" Grid.Column="1" VerticalAlignment="Top" Direction="Out" TextBinding="{Binding ScriptAddressText, UpdateSourceTrigger=PropertyChanged}" />-->
</Grid>
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
</DockPanel>
</ScrollViewer>
<ItemsControl Grid.Column="1" Grid.Row="1" Name="MapView" ItemsSource="{Binding VisibleMaps}"
SnapsToDevicePixels="True" ClipToBounds="True" Focusable="False"