Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Room object context menu #1301

Merged
merged 5 commits into from
Apr 11, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 64 additions & 4 deletions UndertaleModTool/Editors/UndertaleRoomEditor.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,11 @@
<Binding Path="ObjectDefinition.Name.Content" Mode="OneWay" TargetNullValue="?" FallbackValue="EmptyInstance"/>
</MultiBinding>
</TextBlock.Text>
<TextBlock.ContextMenu>
<local:ContextMenuDark>
<MenuItem Header="Delete object" Click="MenuItem_Delete_Click"/>
</local:ContextMenuDark>
</TextBlock.ContextMenu>
</TextBlock>
</DataTemplate>
<DataTemplate DataType="{x:Type undertale:UndertaleRoom+Tile}">
Expand All @@ -98,6 +103,11 @@
<Binding Path="ObjectDefinition.Name.Content" Mode="OneWay" TargetNullValue="?" FallbackValue="EmptyTile"/>
</MultiBinding>
</TextBlock.Text>
<TextBlock.ContextMenu>
<local:ContextMenuDark>
<MenuItem Header="Delete tile" Click="MenuItem_Delete_Click"/>
</local:ContextMenuDark>
</TextBlock.ContextMenu>
</TextBlock>
</DataTemplate>
<DataTemplate DataType="{x:Type undertale:UndertaleRoom+SpriteInstance}">
Expand All @@ -108,25 +118,43 @@
<Binding Path="Sprite.Name.Content" Mode="OneWay" TargetNullValue="?" FallbackValue="EmptySprite"/>
</MultiBinding>
</TextBlock.Text>
<TextBlock.ContextMenu>
<local:ContextMenuDark>
<MenuItem Header="Delete sprite instance" Click="MenuItem_Delete_Click"/>
</local:ContextMenuDark>
</TextBlock.ContextMenu>
</TextBlock>
</DataTemplate>
<DataTemplate DataType="{x:Type undertale:UndertaleRoom+ParticleSystemInstance}">
<TextBlock Text="ParticleSystemInstance (unsupported)"
Foreground="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
Foreground="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}">
<TextBlock.ContextMenu>
<local:ContextMenuDark>
<MenuItem Header="Delete particle system instance" Click="MenuItem_Delete_Click"/>
</local:ContextMenuDark>
</TextBlock.ContextMenu>
</TextBlock>
</DataTemplate>
</TreeView.Resources>

<TreeViewItem Header="{Binding Name.Content}" Name="RoomRootItem" IsExpanded="True">
<TreeViewItem Name="BGItems" Header="Backgrounds" ItemsSource="{Binding Backgrounds, Mode=OneWay}" Visibility="{Binding Flags, Mode=OneTime, Converter={StaticResource IsGMS2Converter}}" IsExpanded="True">
<TreeViewItem.Resources>
<local:ContextMenuDark x:Key="bgContextMenu">
<MenuItem Header="Delete background" Click="MenuItem_Delete_Click"/>
</local:ContextMenuDark>
</TreeViewItem.Resources>
<TreeViewItem.ItemTemplate>
<HierarchicalDataTemplate>
<TextBlock Text="{Binding BackgroundDefinition, Mode=OneWay, TargetNullValue='(no name)'}">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="ContextMenu" Value="{StaticResource bgContextMenu}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Enabled, Mode=OneWay}" Value="False">
<Setter Property="Foreground"
Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
<Setter Property="ContextMenu" Value="{x:Null}"/>
</DataTrigger>
</Style.Triggers>
</Style>
Expand All @@ -136,15 +164,22 @@
</TreeViewItem.ItemTemplate>
</TreeViewItem>
<TreeViewItem Name="ViewItems" Header="Views" ItemsSource="{Binding Views, Mode=OneWay}" IsExpanded="True">
<TreeViewItem.Resources>
<local:ContextMenuDark x:Key="viewContextMenu">
<MenuItem Header="Delete view" Click="MenuItem_Delete_Click"/>
</local:ContextMenuDark>
</TreeViewItem.Resources>
<TreeViewItem.ItemTemplate>
<HierarchicalDataTemplate>
<TextBlock Text="View">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="ContextMenu" Value="{StaticResource viewContextMenu}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Enabled, Mode=OneWay}" Value="False">
<Setter Property="Foreground"
Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
<Setter Property="ContextMenu" Value="{x:Null}"/>
</DataTrigger>
</Style.Triggers>
</Style>
Expand Down Expand Up @@ -185,6 +220,11 @@
<Binding Path="ObjectDefinition.Name.Content" TargetNullValue="?" FallbackValue="EmptyTile"/>
</MultiBinding>
</TextBlock.Text>
<TextBlock.ContextMenu>
<local:ContextMenuDark>
<MenuItem Header="Delete tile" Click="MenuItem_Delete_Click"/>
</local:ContextMenuDark>
</TextBlock.ContextMenu>
</TextBlock>
</HierarchicalDataTemplate>
</TreeViewItem.ItemTemplate>
Expand Down Expand Up @@ -226,14 +266,21 @@
<TextBlock.ContextMenu>
<local:ContextMenuDark>
<MenuItem Header="New Object Instance" Click="MenuItem_NewGMS2ObjectInstance_Click"/>
<MenuItem Header="Delete layer" Click="MenuItem_Delete_Click"/>
</local:ContextMenuDark>
</TextBlock.ContextMenu>
</TextBlock>
</HierarchicalDataTemplate>
</local:LayerDataTemplateSelector.InstancesDataTemplate>
<local:LayerDataTemplateSelector.TilesDataTemplate>
<HierarchicalDataTemplate ItemTemplateSelector="{x:Null}">
<TextBlock Text="{Binding LayerName.Content, Mode=OneWay}" Style="{StaticResource LayerItemStyle}"/>
<TextBlock Text="{Binding LayerName.Content, Mode=OneWay}" Style="{StaticResource LayerItemStyle}">
<TextBlock.ContextMenu>
<local:ContextMenuDark>
<MenuItem Header="Delete layer" Click="MenuItem_Delete_Click"/>
</local:ContextMenuDark>
</TextBlock.ContextMenu>
</TextBlock>
</HierarchicalDataTemplate>
</local:LayerDataTemplateSelector.TilesDataTemplate>
<local:LayerDataTemplateSelector.AssetsDataTemplate>
Expand All @@ -256,19 +303,32 @@
<local:ContextMenuDark>
<MenuItem Header="New Legacy Tile" Click="MenuItem_NewLegacyTile_Click"/>
<MenuItem Header="New Sprite Instance" Click="MenuItem_NewSprite_Click"/>
<MenuItem Header="Delete layer" Click="MenuItem_Delete_Click"/>
</local:ContextMenuDark>
</TextBlock.ContextMenu>
</TextBlock>
</HierarchicalDataTemplate>
</local:LayerDataTemplateSelector.AssetsDataTemplate>
<local:LayerDataTemplateSelector.BackgroundDataTemplate>
<HierarchicalDataTemplate ItemTemplateSelector="{x:Null}">
<TextBlock Text="{Binding LayerName.Content, Mode=OneWay}" Style="{StaticResource LayerItemStyle}" />
<TextBlock Text="{Binding LayerName.Content, Mode=OneWay}" Style="{StaticResource LayerItemStyle}">
<TextBlock.ContextMenu>
<local:ContextMenuDark>
<MenuItem Header="Delete layer" Click="MenuItem_Delete_Click"/>
</local:ContextMenuDark>
</TextBlock.ContextMenu>
</TextBlock>
</HierarchicalDataTemplate>
</local:LayerDataTemplateSelector.BackgroundDataTemplate>
<local:LayerDataTemplateSelector.EffectDataTemplate>
<HierarchicalDataTemplate ItemTemplateSelector="{x:Null}">
<TextBlock Text="{Binding LayerName.Content, Mode=OneWay}" Style="{StaticResource LayerItemStyle}" />
<TextBlock Text="{Binding LayerName.Content, Mode=OneWay}" Style="{StaticResource LayerItemStyle}">
<TextBlock.ContextMenu>
<local:ContextMenuDark>
<MenuItem Header="Delete layer" Click="MenuItem_Delete_Click"/>
</local:ContextMenuDark>
</TextBlock.ContextMenu>
</TextBlock>
</HierarchicalDataTemplate>
</local:LayerDataTemplateSelector.EffectDataTemplate>
</local:LayerDataTemplateSelector>
Expand Down
159 changes: 85 additions & 74 deletions UndertaleModTool/Editors/UndertaleRoomEditor.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -998,81 +998,8 @@ private void RoomObjectsTree_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Delete)
{
UndertaleRoom room = this.DataContext as UndertaleRoom;
UndertaleObject selectedObj = ObjectEditor.Content as UndertaleObject;

if (selectedObj is Background bg)
{
bg.Enabled = false;
bg.BackgroundDefinition = null;

ObjectEditor.Content = null;
}
else if (selectedObj is View view)
{
view.Enabled = false;

ObjectEditor.Content = null;
}
else if (selectedObj is Tile tile)
{
if (mainWindow.IsGMS2 == Visibility.Visible)
{
foreach (var layer in room.Layers)
if (layer.AssetsData != null)
layer.AssetsData.LegacyTiles.Remove(tile);
roomObjDict.Remove(tile.InstanceID, out _);
}

room.Tiles.Remove(tile);

ObjectEditor.Content = null;
}
else if (selectedObj is GameObject gameObj)
{
if (mainWindow.IsGMS2 == Visibility.Visible)
{
foreach (var layer in room.Layers)
if (layer.InstancesData != null)
layer.InstancesData.Instances.Remove(gameObj);
roomObjDict.Remove(gameObj.InstanceID, out _);
}

room.GameObjects.Remove(gameObj);

ObjectEditor.Content = null;
}
else if (selectedObj is SpriteInstance sprInst)
{
foreach (var layer in room.Layers)
if (layer.AssetsData != null)
layer.AssetsData.Sprites.Remove(sprInst);

sprInstDict.Remove(sprInst, out _);

ObjectEditor.Content = null;
}
else if (selectedObj is Layer layer)
{
if (layer.InstancesData != null)
foreach (var go in layer.InstancesData.Instances)
room.GameObjects.Remove(go);

foreach (var pair in roomObjDict)
if (pair.Value == layer)
roomObjDict.Remove(pair.Key, out _);

foreach (var pair in sprInstDict)
if (pair.Value == layer)
sprInstDict.Remove(pair.Key, out _);

room.Layers.Remove(layer);

if (layer.LayerType == LayerType.Background)
room.UpdateBGColorLayer();

ObjectEditor.Content = null;
}
DeleteItem(selectedObj);
}

int dir = 0;
Expand Down Expand Up @@ -1436,6 +1363,84 @@ private void AddGMS1Tile(UndertaleRoom room)
SelectObject(tile);
}

private void DeleteItem(UndertaleObject obj)
{
UndertaleRoom room = this.DataContext as UndertaleRoom;

// We need to check before deleting the object but can only clear the editor after deleting the object
bool clearEditor = (obj == (ObjectEditor.Content as UndertaleObject));

if (obj is Background bg)
{
bg.Enabled = false;
bg.BackgroundDefinition = null;
}
else if (obj is View view)
{
view.Enabled = false;
}
else if (obj is Tile tile)
{
if (mainWindow.IsGMS2 == Visibility.Visible)
{
foreach (var layer in room.Layers)
if (layer.AssetsData != null)
layer.AssetsData.LegacyTiles.Remove(tile);
roomObjDict.Remove(tile.InstanceID, out _);
}

room.Tiles.Remove(tile);
}
else if (obj is GameObject gameObj)
{
if (mainWindow.IsGMS2 == Visibility.Visible)
{
foreach (var layer in room.Layers)
if (layer.InstancesData != null)
layer.InstancesData.Instances.Remove(gameObj);
roomObjDict.Remove(gameObj.InstanceID, out _);
}

room.GameObjects.Remove(gameObj);
}
else if (obj is SpriteInstance sprInst)
{
foreach (var layer in room.Layers)
if (layer.AssetsData != null)
layer.AssetsData.Sprites.Remove(sprInst);

sprInstDict.Remove(sprInst, out _);
}
else if (obj is ParticleSystemInstance partSysInst)
{
foreach (var layer in room.Layers)
if (layer.AssetsData != null)
layer.AssetsData.ParticleSystems.Remove(partSysInst);
}
else if (obj is Layer layer)
{
if (layer.InstancesData != null)
foreach (var go in layer.InstancesData.Instances)
room.GameObjects.Remove(go);

foreach (var pair in roomObjDict)
if (pair.Value == layer)
roomObjDict.Remove(pair.Key, out _);

foreach (var pair in sprInstDict)
if (pair.Value == layer)
sprInstDict.Remove(pair.Key, out _);

room.Layers.Remove(layer);

if (layer.LayerType == LayerType.Background)
room.UpdateBGColorLayer();
}

if (clearEditor)
ObjectEditor.Content = null;
}

private void MenuItem_NewLayerInstances_Click(object sender, RoutedEventArgs e)
{
AddLayer<Layer.LayerInstancesData>(LayerType.Instances, "NewInstancesLayer");
Expand Down Expand Up @@ -1482,6 +1487,12 @@ private void MenuItem_NewGMS1Tile_Click(object sender, RoutedEventArgs e)
{
AddGMS1Tile(this.DataContext as UndertaleRoom);
}
private void MenuItem_Delete_Click(Object sender, RoutedEventArgs e)
{
MenuItem menuitem = sender as MenuItem;
if (menuitem.DataContext is UndertaleObject obj)
DeleteItem(obj);
}

public static void GenerateSpriteCache(UndertaleRoom room)
{
Expand Down