1
0

feat: add converter for visibility

This commit is contained in:
2026-04-19 16:01:35 +08:00
parent b938fe6acc
commit 6cb984fa92
3 changed files with 137 additions and 70 deletions

View File

@@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Data;
namespace BallanceTasEditor.Frontend.Converters {
[ValueConversion(typeof(bool), typeof(Visibility))]
public class IsVisibleToVisibilityConverter : IValueConverter {
public static readonly IsVisibleToVisibilityConverter Instance = new IsVisibleToVisibilityConverter();
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
var susBool = value as bool?;
if (susBool is null) {
return Binding.DoNothing;
} else {
return susBool.Value ? Visibility.Visible : Visibility.Collapsed;
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
return Binding.DoNothing;
}
}
}

View File

@@ -33,7 +33,6 @@ namespace BallanceTasEditor.Frontend.ViewModels {
#region File Operation #region File Operation
[ObservableProperty] [ObservableProperty]
[NotifyPropertyChangedFor(nameof(WindowTitle))]
private Models.TasFile tasFile; private Models.TasFile tasFile;
[ObservableProperty] [ObservableProperty]
[NotifyPropertyChangedFor(nameof(WindowTitle))] [NotifyPropertyChangedFor(nameof(WindowTitle))]
@@ -42,11 +41,16 @@ namespace BallanceTasEditor.Frontend.ViewModels {
private void TasFile_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e) { private void TasFile_PropertyChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e) {
// YYC MARK: // YYC MARK:
// Due to the shitty limit of MVVM Toolkit, // Due to the shitty limit of MVVM Toolkit,
// I was forced trigger these command manually. // I was forced trigger these manually.
OnPropertyChanged(nameof(IsVisibleForLoadedFile));
OnPropertyChanged(nameof(WindowTitle));
OnPropertyChanged(nameof(IsVisibleForNotLoadedFile));
NewFileCommand.NotifyCanExecuteChanged(); NewFileCommand.NotifyCanExecuteChanged();
OpenFileCommand.NotifyCanExecuteChanged(); OpenFileCommand.NotifyCanExecuteChanged();
SaveFileCommand.NotifyCanExecuteChanged(); SaveFileCommand.NotifyCanExecuteChanged();
SaveFileAsCommand.NotifyCanExecuteChanged(); SaveFileAsCommand.NotifyCanExecuteChanged();
SaveFileThenRunGameCommand.NotifyCanExecuteChanged();
CloseFileCommand.NotifyCanExecuteChanged(); CloseFileCommand.NotifyCanExecuteChanged();
} }
@@ -159,6 +163,19 @@ namespace BallanceTasEditor.Frontend.ViewModels {
#endregion #endregion
#region Special Save with Running Game
[RelayCommand(CanExecute = nameof(CanSaveFileThenRunGame))]
private void SaveFileThenRunGame() {
SaveFile();
}
private bool CanSaveFileThenRunGame() {
return CanSaveFile() && true;
}
#endregion
#region Exit Stuff #region Exit Stuff
[RelayCommand] [RelayCommand]
@@ -378,6 +395,14 @@ namespace BallanceTasEditor.Frontend.ViewModels {
} }
} }
public bool IsVisibleForLoadedFile {
get => TasFile.IsFileLoaded;
}
public bool IsVisibleForNotLoadedFile {
get => TasFile.IsFileNotLoaded;
}
#endregion #endregion
} }

View File

@@ -5,15 +5,15 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:BallanceTasEditor.Frontend.Views" xmlns:local="clr-namespace:BallanceTasEditor.Frontend.Views"
xmlns:vm="clr-namespace:BallanceTasEditor.Frontend.ViewModels" xmlns:vm="clr-namespace:BallanceTasEditor.Frontend.ViewModels"
xmlns:conveter="clr-namespace:BallanceTasEditor.Frontend.Converters"
xmlns:widget="clr-namespace:BallanceTasEditor.Frontend.Widgets" xmlns:widget="clr-namespace:BallanceTasEditor.Frontend.Widgets"
mc:Ignorable="d" mc:Ignorable="d"
d:DataContext="{d:DesignInstance vm:MainWindow}" d:DataContext="{d:DesignInstance vm:MainWindow}"
WindowStartupLocation="CenterScreen" WindowStartupLocation="CenterScreen"
Title="{Binding WindowTitle, Mode=OneWay}" Height="600" Width="800" Icon="/Frontend/Assets/App.ico"> Title="{Binding WindowTitle, Mode=OneWay}" Height="800" Width="600" Icon="/Frontend/Assets/App.ico">
<Grid> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/> <RowDefinition Height="auto"/>
<RowDefinition Height="*"/> <RowDefinition Height="*"/>
<RowDefinition Height="auto"/> <RowDefinition Height="auto"/>
@@ -52,7 +52,7 @@
<Separator/> <Separator/>
<MenuItem Header="_Save File" Icon="{StaticResource IconSaveFile}" InputGestureText="Ctrl+S" Command="{Binding SaveFileCommand}"/> <MenuItem Header="_Save File" Icon="{StaticResource IconSaveFile}" InputGestureText="Ctrl+S" Command="{Binding SaveFileCommand}"/>
<MenuItem Header="Save File as ..." Icon="{StaticResource IconSaveFileAs}" Command="{Binding SaveFileAsCommand}"/> <MenuItem Header="Save File as ..." Icon="{StaticResource IconSaveFileAs}" Command="{Binding SaveFileAsCommand}"/>
<MenuItem Header="Save File then _Run Game" Icon="{StaticResource IconSaveFileThenRunGame}" InputGestureText="B"/> <MenuItem Header="Save File then _Run Game" Icon="{StaticResource IconSaveFileThenRunGame}" InputGestureText="B" Command="{Binding SaveFileThenRunGameCommand}"/>
<Separator/> <Separator/>
<MenuItem Header="Close File" Icon="{StaticResource IconCloseFile}" Command="{Binding CloseFileCommand}"/> <MenuItem Header="Close File" Icon="{StaticResource IconCloseFile}" Command="{Binding CloseFileCommand}"/>
<MenuItem Header="Exit" Icon="{StaticResource IconExit}" Command="{Binding ExitCommand}"/> <MenuItem Header="Exit" Icon="{StaticResource IconExit}" Command="{Binding ExitCommand}"/>
@@ -82,31 +82,7 @@
</MenuItem> </MenuItem>
</Menu> </Menu>
<Grid Grid.Row="1"> <Grid Grid.Row="1" Visibility="{Binding IsVisibleForNotLoadedFile, Mode=OneWay, Converter={x:Static conveter:IsVisibleToVisibilityConverter.Instance}}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<StackPanel Orientation="Horizontal" Grid.Column="0">
<widget:IconButton ButtonText="Select Mode"
ButtonIcon="/Frontend/Assets/SelectMode.ico"
Margin="5" Padding="5"/>
<widget:IconButton ButtonText="Fill Mode"
ButtonIcon="/Frontend/Assets/FillMode.ico"
Margin="5" Padding="5"/>
<widget:IconButton ButtonText="Draw Mode"
ButtonIcon="/Frontend/Assets/DrawMode.ico"
Margin="5" Padding="5"/>
</StackPanel>
<widget:IconButton ButtonText="Save File then Run Game"
ButtonIcon="/Frontend/Assets/SaveFileThenRunGame.ico"
Grid.Column="1" Margin="5" Padding="5"/>
</Grid>
<Grid Grid.Row="2">
<Grid VerticalAlignment="Center" HorizontalAlignment="Center" AllowDrop="True"> <Grid VerticalAlignment="Center" HorizontalAlignment="Center" AllowDrop="True">
<Rectangle StrokeThickness="4" Stroke="Gray" StrokeDashArray="4 4" Fill="Transparent"/> <Rectangle StrokeThickness="4" Stroke="Gray" StrokeDashArray="4 4" Fill="Transparent"/>
<StackPanel Orientation="Horizontal" Margin="20"> <StackPanel Orientation="Horizontal" Margin="20">
@@ -114,46 +90,83 @@
<TextBlock Margin="5" Text="Create, Open or Drop a TAS File in There for Editing" Foreground="Gray" FontSize="16" VerticalAlignment="Center"/> <TextBlock Margin="5" Text="Create, Open or Drop a TAS File in There for Editing" Foreground="Gray" FontSize="16" VerticalAlignment="Center"/>
</StackPanel> </StackPanel>
</Grid> </Grid>
<local:TasViewer>
<local:TasViewer.ContextMenu>
<ContextMenu>
<ContextMenu.Resources>
<!-- Context Menu Icons -->
<Image x:Key="IconSet" Source="/Frontend/Assets/SetCell.ico" RenderOptions.BitmapScalingMode="HighQuality"/>
<Image x:Key="IconUnset" Source="/Frontend/Assets/UnsetCell.ico" RenderOptions.BitmapScalingMode="HighQuality"/>
<Image x:Key="IconFlip" Source="/Frontend/Assets/FlipCell.ico" RenderOptions.BitmapScalingMode="HighQuality"/>
<Image x:Key="IconCut" Source="/Frontend/Assets/CutFrame.ico" RenderOptions.BitmapScalingMode="HighQuality"/>
<Image x:Key="IconCopy" Source="/Frontend/Assets/CopyFrame.ico" RenderOptions.BitmapScalingMode="HighQuality"/>
<Image x:Key="IconPaste" Source="/Frontend/Assets/PasteFrame.ico" RenderOptions.BitmapScalingMode="HighQuality"/>
<Image x:Key="IconDelete" Source="/Frontend/Assets/DeleteFrame.ico" RenderOptions.BitmapScalingMode="HighQuality"/>
<Image x:Key="IconAdd" Source="/Frontend/Assets/AddFrame.ico" RenderOptions.BitmapScalingMode="HighQuality"/>
<Image x:Key="IconFps" Source="/Frontend/Assets/SetFps.ico" RenderOptions.BitmapScalingMode="HighQuality"/>
</ContextMenu.Resources>
<MenuItem Header="Set" Icon="{StaticResource IconSet}"/>
<MenuItem Header="Unset" Icon="{StaticResource IconUnset}"/>
<MenuItem Header="Flip" Icon="{StaticResource IconFlip}"/>
<Separator/>
<MenuItem Header="Cut" Icon="{StaticResource IconCut}" InputGestureText="Ctrl+X"/>
<MenuItem Header="Copy" Icon="{StaticResource IconCopy}" InputGestureText="Ctrl+C"/>
<MenuItem Header="Paste after This" Icon="{StaticResource IconPaste}" InputGestureText="Ctrl+V"/>
<MenuItem Header="Paste before This"/>
<Separator/>
<MenuItem Header="Delete" Icon="{StaticResource IconDelete}"/>
<MenuItem Header="Delete after This" InputGestureText="Del"/>
<MenuItem Header="Delete before This" InputGestureText="Backspace"/>
<Separator/>
<MenuItem Header="Add after This" Icon="{StaticResource IconAdd}"/>
<MenuItem Header="Add before This"/>
<Separator/>
<MenuItem Header="Set FPS" Icon="{StaticResource IconFps}"/>
</ContextMenu>
</local:TasViewer.ContextMenu>
</local:TasViewer>
</Grid> </Grid>
<StatusBar Grid.Row="3"> <Grid Grid.Row="1" Visibility="{Binding IsVisibleForLoadedFile, Mode=OneWay, Converter={x:Static conveter:IsVisibleToVisibilityConverter.Instance}}">
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<StackPanel Orientation="Horizontal" Grid.Column="0">
<widget:IconButton ButtonText="Select Mode"
ButtonIcon="/Frontend/Assets/SelectMode.ico"
Margin="5" Padding="5"
Command="{Binding SelectModeCommand}"/>
<widget:IconButton ButtonText="Fill Mode"
ButtonIcon="/Frontend/Assets/FillMode.ico"
Margin="5" Padding="5"
Command="{Binding FillModeCommand}"/>
<widget:IconButton ButtonText="Draw Mode"
ButtonIcon="/Frontend/Assets/DrawMode.ico"
Margin="5" Padding="5"
Command="{Binding DrawModeCommand}"/>
</StackPanel>
<widget:IconButton ButtonText="Save File then Run Game"
ButtonIcon="/Frontend/Assets/SaveFileThenRunGame.ico"
Grid.Column="1" Margin="5" Padding="5"
Command="{Binding SaveFileThenRunGameCommand}"/>
</Grid>
<Grid Grid.Row="1">
<local:TasViewer>
<local:TasViewer.ContextMenu>
<ContextMenu>
<ContextMenu.Resources>
<!-- Context Menu Icons -->
<Image x:Key="IconSet" Source="/Frontend/Assets/SetCell.ico" RenderOptions.BitmapScalingMode="HighQuality"/>
<Image x:Key="IconUnset" Source="/Frontend/Assets/UnsetCell.ico" RenderOptions.BitmapScalingMode="HighQuality"/>
<Image x:Key="IconFlip" Source="/Frontend/Assets/FlipCell.ico" RenderOptions.BitmapScalingMode="HighQuality"/>
<Image x:Key="IconCut" Source="/Frontend/Assets/CutFrame.ico" RenderOptions.BitmapScalingMode="HighQuality"/>
<Image x:Key="IconCopy" Source="/Frontend/Assets/CopyFrame.ico" RenderOptions.BitmapScalingMode="HighQuality"/>
<Image x:Key="IconPaste" Source="/Frontend/Assets/PasteFrame.ico" RenderOptions.BitmapScalingMode="HighQuality"/>
<Image x:Key="IconDelete" Source="/Frontend/Assets/DeleteFrame.ico" RenderOptions.BitmapScalingMode="HighQuality"/>
<Image x:Key="IconAdd" Source="/Frontend/Assets/AddFrame.ico" RenderOptions.BitmapScalingMode="HighQuality"/>
<Image x:Key="IconFps" Source="/Frontend/Assets/SetFps.ico" RenderOptions.BitmapScalingMode="HighQuality"/>
</ContextMenu.Resources>
<MenuItem Header="Set" Icon="{StaticResource IconSet}"/>
<MenuItem Header="Unset" Icon="{StaticResource IconUnset}"/>
<MenuItem Header="Flip" Icon="{StaticResource IconFlip}"/>
<Separator/>
<MenuItem Header="Cut" Icon="{StaticResource IconCut}" InputGestureText="Ctrl+X"/>
<MenuItem Header="Copy" Icon="{StaticResource IconCopy}" InputGestureText="Ctrl+C"/>
<MenuItem Header="Paste after This" Icon="{StaticResource IconPaste}" InputGestureText="Ctrl+V"/>
<MenuItem Header="Paste before This"/>
<Separator/>
<MenuItem Header="Delete" Icon="{StaticResource IconDelete}"/>
<MenuItem Header="Delete after This" InputGestureText="Del"/>
<MenuItem Header="Delete before This" InputGestureText="Backspace"/>
<Separator/>
<MenuItem Header="Add after This" Icon="{StaticResource IconAdd}"/>
<MenuItem Header="Add before This"/>
<Separator/>
<MenuItem Header="Set FPS" Icon="{StaticResource IconFps}"/>
</ContextMenu>
</local:TasViewer.ContextMenu>
</local:TasViewer>
</Grid>
</Grid>
<StatusBar Grid.Row="2">
<!-- 这玩意要逆序排列才能达到我想要的需求也是奇葩 --> <!-- 这玩意要逆序排列才能达到我想要的需求也是奇葩 -->
<StatusBarItem Content="v2.0 stable" DockPanel.Dock="Right" Foreground="Gray" FontStyle="Italic"/> <StatusBarItem Content="v2.0 stable" DockPanel.Dock="Right" Foreground="Gray" FontStyle="Italic"/>
<Separator DockPanel.Dock="Right"/> <Separator DockPanel.Dock="Right"/>