This commit is contained in:
Hakoyu 2023-10-23 20:14:12 +08:00
parent 23ddacdeb1
commit 906faf69cf
5 changed files with 88 additions and 69 deletions

View File

@ -98,14 +98,6 @@ public class FoodAnimeTypeModel
: this() : this()
{ {
Name.Value = Path.GetFileName(path); Name.Value = Path.GetFileName(path);
//var infoFile = Path.Combine(path, ModMakerInfo.InfoFile);
//if (
// Directory.EnumerateFiles(path, ModMakerInfo.InfoFile, SearchOption.AllDirectories).Any()
// is false
//)
// throw new Exception("信息文件\n{0}\n不存在".Translate(infoFile));
//if (File.Exists(infoFile))
// ParseInfoFile(path, infoFile);
var infoFiles = Directory.EnumerateFiles( var infoFiles = Directory.EnumerateFiles(
path, path,
ModMakerInfo.InfoFile, ModMakerInfo.InfoFile,
@ -320,7 +312,7 @@ public class FoodAnimeTypeModel
var frontLayName = $"{Name.Value.ToLower()}_{FrontLayName}_{anime.Index}"; var frontLayName = $"{Name.Value.ToLower()}_{FrontLayName}_{anime.Index}";
var backLayName = $"{Name.Value.ToLower()}_{BackLayName}_{anime.Index}"; var backLayName = $"{Name.Value.ToLower()}_{BackLayName}_{anime.Index}";
SaveInfoFile(infoFile, frontLayName, backLayName, anime.Value, mode); SaveInfoFile(infoFile, frontLayName, backLayName, anime.Value, mode);
SaveImages(anime.Value, indexPath, frontLayName, backLayName); SaveImages(anime.Value, indexPath);
} }
} }
@ -331,15 +323,10 @@ public class FoodAnimeTypeModel
/// <param name="indexPath">索引路径</param> /// <param name="indexPath">索引路径</param>
/// <param name="frontLayName">顶层名称</param> /// <param name="frontLayName">顶层名称</param>
/// <param name="backLayName">底层名称</param> /// <param name="backLayName">底层名称</param>
private static void SaveImages( private static void SaveImages(FoodAnimeModel anime, string indexPath)
FoodAnimeModel anime,
string indexPath,
string frontLayName,
string backLayName
)
{ {
var frontLayPath = Path.Combine(indexPath, frontLayName); var frontLayPath = Path.Combine(indexPath, FrontLayName);
var backLayPath = Path.Combine(indexPath, backLayName); var backLayPath = Path.Combine(indexPath, BackLayName);
Directory.CreateDirectory(frontLayPath); Directory.CreateDirectory(frontLayPath);
Directory.CreateDirectory(backLayPath); Directory.CreateDirectory(backLayPath);
foreach (var frontImage in anime.FrontImages.Enumerate()) foreach (var frontImage in anime.FrontImages.Enumerate())
@ -401,27 +388,6 @@ public class FoodAnimeTypeModel
lps.Add(line); lps.Add(line);
File.WriteAllText(infoFile, lps.ToString()); File.WriteAllText(infoFile, lps.ToString());
} }
/// <summary>
/// 保存图片
/// </summary>
/// <param name="imagesPath"></param>
/// <param name="model"></param>
static void SaveImages(string imagesPath, AnimeModel model)
{
Directory.CreateDirectory(imagesPath);
var imageIndex = 0;
foreach (var image in model.Images)
{
image.Image.Value.SaveToPng(
Path.Combine(
imagesPath,
$"{model.Id.Value}_{imageIndex:000}_{image.Duration.Value}.png"
)
);
imageIndex++;
}
}
} }
public class PNGAnimeInfo public class PNGAnimeInfo

View File

@ -75,6 +75,8 @@ public class PetModel : I18nModel<I18nPetInfoModel>
/// </summary> /// </summary>
public ObservableCollection<FoodAnimeTypeModel> FoodAnimes { get; } = new(); public ObservableCollection<FoodAnimeTypeModel> FoodAnimes { get; } = new();
public ObservableValue<int> AnimeCount { get; } = new();
public bool IsSimplePetModel { get; } = false; public bool IsSimplePetModel { get; } = false;
public PetModel() public PetModel()
@ -84,6 +86,12 @@ public class PetModel : I18nModel<I18nPetInfoModel>
{ {
DescriptionId.Value = $"{n}_{nameof(DescriptionId)}"; DescriptionId.Value = $"{n}_{nameof(DescriptionId)}";
}; };
AnimeCount.AddNotifyReceiver(Animes);
AnimeCount.AddNotifyReceiver(FoodAnimes);
AnimeCount.NotifyReceived += (ref int v) =>
{
v = Animes.Count + FoodAnimes.Count;
};
} }
public PetModel(PetModel model) public PetModel(PetModel model)

View File

@ -158,7 +158,7 @@ public class FoodAnimeEditWindowVM
/// <summary> /// <summary>
/// 添加食物定位命令 /// 添加食物定位命令
/// </summary> /// </summary>
public ObservableCommand<FoodAnimeModel> AddeFoodLocationCommand { get; } = new(); public ObservableCommand<FoodAnimeModel> AddFoodLocationCommand { get; } = new();
/// <summary> /// <summary>
/// 删除食物定位命令 /// 删除食物定位命令
@ -228,7 +228,7 @@ public class FoodAnimeEditWindowVM
ClearBackImageCommand.ExecuteEvent += ClearBackImageCommand_ExecuteEvent; ClearBackImageCommand.ExecuteEvent += ClearBackImageCommand_ExecuteEvent;
ChangeBackImageCommand.ExecuteEvent += ChangeBackImageCommand_ExecuteEvent; ChangeBackImageCommand.ExecuteEvent += ChangeBackImageCommand_ExecuteEvent;
AddeFoodLocationCommand.ExecuteEvent += AddeFoodLocationCommand_ExecuteEvent; AddFoodLocationCommand.ExecuteEvent += AddeFoodLocationCommand_ExecuteEvent;
RemoveFoodLocationCommand.ExecuteEvent += RemoveFoodLocationCommand_ExecuteEvent; RemoveFoodLocationCommand.ExecuteEvent += RemoveFoodLocationCommand_ExecuteEvent;
ClearFoodLocationCommand.ExecuteEvent += ClearFoodLocationCommand_ExecuteEvent; ClearFoodLocationCommand.ExecuteEvent += ClearFoodLocationCommand_ExecuteEvent;
} }

View File

@ -26,32 +26,19 @@
<Expander <Expander
HorizontalAlignment="Stretch" HorizontalAlignment="Stretch"
VerticalAlignment="Top" VerticalAlignment="Top"
d:DataContext="" d:DataContext="">
Tag="{Binding DataContext, RelativeSource={RelativeSource AncestorType=Window, Mode=FindAncestor}}"> <Expander.Header>
<Expander.ContextMenu> <Grid Tag="{Binding DataContext, RelativeSource={RelativeSource AncestorType=Window, Mode=FindAncestor}}">
<Grid.ContextMenu>
<ContextMenu d:DataContext=""> <ContextMenu d:DataContext="">
<MenuItem
d:Header="添加图片"
Command="{Binding PlacementTarget.Tag.AddImageCommand, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}"
CommandParameter="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}"
Header="{ll:Str 添加图片}"
IsEnabled="{Binding PlacementTarget.Tag.PlayCommand.CurrentCanExecute.Value, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}" />
<MenuItem
d:Header="添加图片"
Command="{Binding PlacementTarget.Tag.ClearImageCommand, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}"
CommandParameter="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}"
Header="{ll:Str 清空图片}"
IsEnabled="{Binding PlacementTarget.Tag.PlayCommand.CurrentCanExecute.Value, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}" />
<MenuItem <MenuItem
d:Header="添加图片" d:Header="添加图片"
Command="{Binding PlacementTarget.Tag.RemoveAnimeCommand, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}" Command="{Binding PlacementTarget.Tag.RemoveAnimeCommand, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}"
CommandParameter="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}" CommandParameter="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}"
Header="{ll:Str 删除此项}" Header="{ll:Str 删除此动画}"
IsEnabled="{Binding PlacementTarget.Tag.PlayCommand.CurrentCanExecute.Value, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}" /> IsEnabled="{Binding PlacementTarget.Tag.PlayCommand.CurrentCanExecute.Value, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}" />
</ContextMenu> </ContextMenu>
</Expander.ContextMenu> </Grid.ContextMenu>
<Expander.Header>
<Grid>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" />
@ -80,7 +67,23 @@
</Grid.RowDefinitions> </Grid.RowDefinitions>
<GroupBox> <GroupBox>
<GroupBox.Header> <GroupBox.Header>
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal" Tag="{Binding DataContext, RelativeSource={RelativeSource AncestorType=Window, Mode=FindAncestor}}">
<StackPanel.ContextMenu>
<ContextMenu d:DataContext="">
<MenuItem
d:Header="添加图片"
Command="{Binding PlacementTarget.Tag.AddFrontImageCommand, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}"
CommandParameter="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}"
Header="{ll:Str 添加图片}"
IsEnabled="{Binding PlacementTarget.Tag.PlayCommand.CurrentCanExecute.Value, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}" />
<MenuItem
d:Header="添加图片"
Command="{Binding PlacementTarget.Tag.ClearFrontImageCommand, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}"
CommandParameter="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}"
Header="{ll:Str 清空图片}"
IsEnabled="{Binding PlacementTarget.Tag.PlayCommand.CurrentCanExecute.Value, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}" />
</ContextMenu>
</StackPanel.ContextMenu>
<Label d:Content="顶层图片" Content="{ll:Str 顶层图片}" /> <Label d:Content="顶层图片" Content="{ll:Str 顶层图片}" />
<TextBlock Margin="10,0,0,0"> <TextBlock Margin="10,0,0,0">
<TextBlock.Text> <TextBlock.Text>
@ -158,7 +161,23 @@
</GroupBox> </GroupBox>
<GroupBox Grid.Row="1"> <GroupBox Grid.Row="1">
<GroupBox.Header> <GroupBox.Header>
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal" Tag="{Binding DataContext, RelativeSource={RelativeSource AncestorType=Window, Mode=FindAncestor}}">
<StackPanel.ContextMenu>
<ContextMenu d:DataContext="">
<MenuItem
d:Header="添加图片"
Command="{Binding PlacementTarget.Tag.AddBackImageCommand, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}"
CommandParameter="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}"
Header="{ll:Str 添加图片}"
IsEnabled="{Binding PlacementTarget.Tag.PlayCommand.CurrentCanExecute.Value, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}" />
<MenuItem
d:Header="添加图片"
Command="{Binding PlacementTarget.Tag.ClearBackImageCommand, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}"
CommandParameter="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}"
Header="{ll:Str 清空图片}"
IsEnabled="{Binding PlacementTarget.Tag.PlayCommand.CurrentCanExecute.Value, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}" />
</ContextMenu>
</StackPanel.ContextMenu>
<Label d:Content="底层图片" Content="{ll:Str 底层图片}" /> <Label d:Content="底层图片" Content="{ll:Str 底层图片}" />
<TextBlock Margin="10,0,0,0"> <TextBlock Margin="10,0,0,0">
<TextBlock.Text> <TextBlock.Text>
@ -236,7 +255,23 @@
</GroupBox> </GroupBox>
<GroupBox Grid.Row="2"> <GroupBox Grid.Row="2">
<GroupBox.Header> <GroupBox.Header>
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal" Tag="{Binding DataContext, RelativeSource={RelativeSource AncestorType=Window, Mode=FindAncestor}}">
<StackPanel.ContextMenu>
<ContextMenu d:DataContext="">
<MenuItem
d:Header="添加食物定位"
Command="{Binding PlacementTarget.Tag.AddFoodLocationCommand, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}"
CommandParameter="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}"
Header="{ll:Str 添加食物定位}"
IsEnabled="{Binding PlacementTarget.Tag.PlayCommand.CurrentCanExecute.Value, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}" />
<MenuItem
d:Header="清空食物定位"
Command="{Binding PlacementTarget.Tag.ClearFoodLocationCommand, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}"
CommandParameter="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}"
Header="{ll:Str 清空食物定位}"
IsEnabled="{Binding PlacementTarget.Tag.PlayCommand.CurrentCanExecute.Value, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}" />
</ContextMenu>
</StackPanel.ContextMenu>
<Label d:Content="食物位置" Content="{ll:Str 食物位置}" /> <Label d:Content="食物位置" Content="{ll:Str 食物位置}" />
<TextBlock Margin="10,0,0,0"> <TextBlock Margin="10,0,0,0">
<TextBlock.Text> <TextBlock.Text>
@ -262,6 +297,16 @@
<ListBox.ItemTemplate> <ListBox.ItemTemplate>
<DataTemplate> <DataTemplate>
<Grid> <Grid>
<Grid.ContextMenu>
<ContextMenu>
<MenuItem
d:Header="删除食物定位"
Command="{Binding PlacementTarget.Tag.RemoveFoodLocationCommand, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}"
CommandParameter="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}"
Header="{ll:Str 删除食物定位}"
IsEnabled="{Binding PlacementTarget.Tag.PlayCommand.CurrentCanExecute.Value, RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}" />
</ContextMenu>
</Grid.ContextMenu>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" /> <ColumnDefinition Width="Auto" />
<ColumnDefinition /> <ColumnDefinition />

View File

@ -200,7 +200,7 @@
<TabItem.Header> <TabItem.Header>
<MultiBinding Converter="{StaticResource StringFormatConverter}" ConverterParameter="{}{0} ({1})"> <MultiBinding Converter="{StaticResource StringFormatConverter}" ConverterParameter="{}{0} ({1})">
<Binding Path="Tag" RelativeSource="{RelativeSource Mode=Self}" /> <Binding Path="Tag" RelativeSource="{RelativeSource Mode=Self}" />
<Binding Path="ModEditWindow.AnimePage.ViewModel.CurrentPet.Value.Animes.Count" /> <Binding Path="ModEditWindow.AnimePage.ViewModel.CurrentPet.Value.AnimeCount" />
</MultiBinding> </MultiBinding>
</TabItem.Header> </TabItem.Header>
<Frame Content="{Binding ModEditWindow.AnimePage}" /> <Frame Content="{Binding ModEditWindow.AnimePage}" />