优化更新

This commit is contained in:
Hakoyu 2023-11-13 00:33:03 +08:00
parent 8462b1aab6
commit 7ffc9fcd7d
14 changed files with 195 additions and 312 deletions

View File

@ -1,4 +1,5 @@
using System; using System;
using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Drawing; using System.Drawing;
@ -204,6 +205,40 @@ public static class Extensions
return $"{cultureInfo.DisplayName} [{cultureInfo.Name}]"; return $"{cultureInfo.DisplayName} [{cultureInfo.Name}]";
} }
/// <summary>
/// 尝试使用索引获取值
/// </summary>
/// <typeparam name="T">值类型</typeparam>
/// <param name="list">列表</param>
/// <param name="index">索引</param>
/// <param name="value">值</param>
/// <returns>成功为 <see langword="true"/> 失败为 <see langword="false"/></returns>
public static bool TryGetValue<T>(this IList<T> list, int index, out T value)
{
value = default;
if (index < 0 || index >= list.Count)
return false;
value = list[index];
return true;
}
/// <summary>
/// 尝试使用索引获取值
/// </summary>
/// <typeparam name="T">值类型</typeparam>
/// <param name="list">列表</param>
/// <param name="index">索引</param>
/// <param name="value">值</param>
/// <returns>成功为 <see langword="true"/> 失败为 <see langword="false"/></returns>
public static bool TryGetValue<T>(this IList list, int index, out object value)
{
value = default;
if (index < 0 || index >= list.Count)
return false;
value = list[index];
return true;
}
/// <summary> /// <summary>
/// 获取目标 /// 获取目标
/// </summary> /// </summary>

View File

@ -62,6 +62,7 @@ public class ObservableValue<T>
/// <inheritdoc/> /// <inheritdoc/>
/// <param name="value">初始值</param> /// <param name="value">初始值</param>
public ObservableValue(T value) public ObservableValue(T value)
: this()
{ {
_value = value; _value = value;
} }

View File

@ -34,7 +34,7 @@ public class ObservableValueGroup<T> : IEnumerable<ObservableValue<T>?>
/// 在添加的时候改变值 (如果分组中存在值) /// 在添加的时候改变值 (如果分组中存在值)
/// </summary> /// </summary>
[DefaultValue(false)] [DefaultValue(false)]
public bool ChangeOnAdd { get; set; } = false; public bool ChangeOnAdd { get; set; } = true;
[DebuggerBrowsable(DebuggerBrowsableState.Never)] [DebuggerBrowsable(DebuggerBrowsableState.Never)]
private readonly Dictionary<Guid, WeakReference<ObservableValue<T>>> _bindingValues = new(); private readonly Dictionary<Guid, WeakReference<ObservableValue<T>>> _bindingValues = new();

View File

@ -193,16 +193,11 @@ public class AnimePageVM
window.ShowDialog(); window.ShowDialog();
if (window.IsCancel) if (window.IsCancel)
return; return;
if (ShowAnimes.Value.Count == Animes.Count)
{
Animes[Animes.IndexOf(animeTypeModel)] = newAnime; Animes[Animes.IndexOf(animeTypeModel)] = newAnime;
}
else
{
Animes[Animes.IndexOf(animeTypeModel)] = newAnime; Animes[Animes.IndexOf(animeTypeModel)] = newAnime;
if (ShowAnimes.Value.Count != Animes.Count)
ShowAnimes.Value[ShowAnimes.Value.IndexOf(animeTypeModel)] = newAnime; ShowAnimes.Value[ShowAnimes.Value.IndexOf(animeTypeModel)] = newAnime;
} }
}
else if (model is FoodAnimeTypeModel foodAnimeTypeModel) else if (model is FoodAnimeTypeModel foodAnimeTypeModel)
{ {
var window = new FoodAnimeEditWindow(); var window = new FoodAnimeEditWindow();
@ -214,17 +209,11 @@ public class AnimePageVM
window.ShowDialog(); window.ShowDialog();
if (window.IsCancel) if (window.IsCancel)
return; return;
if (ShowAnimes.Value.Count == FoodAnimes.Count)
{
FoodAnimes[FoodAnimes.IndexOf(foodAnimeTypeModel)] = newAnime;
}
else
{
FoodAnimes[FoodAnimes.IndexOf(foodAnimeTypeModel)] = newAnime; FoodAnimes[FoodAnimes.IndexOf(foodAnimeTypeModel)] = newAnime;
if (ShowAnimes.Value.Count != FoodAnimes.Count)
ShowAnimes.Value[ShowAnimes.Value.IndexOf(foodAnimeTypeModel)] = newAnime; ShowAnimes.Value[ShowAnimes.Value.IndexOf(foodAnimeTypeModel)] = newAnime;
} }
} }
}
/// <summary> /// <summary>
/// 删除动画 /// 删除动画

View File

@ -98,16 +98,10 @@ public class ClickTextPageVM
window.ShowDialog(); window.ShowDialog();
if (window.IsCancel) if (window.IsCancel)
return; return;
if (ShowClickTexts.Value.Count == ClickTexts.Count)
{
ClickTexts[ClickTexts.IndexOf(model)] = newLowTest;
}
else
{
ClickTexts[ClickTexts.IndexOf(model)] = newLowTest; ClickTexts[ClickTexts.IndexOf(model)] = newLowTest;
if (ShowClickTexts.Value.Count != ClickTexts.Count)
ShowClickTexts.Value[ShowClickTexts.Value.IndexOf(model)] = newLowTest; ShowClickTexts.Value[ShowClickTexts.Value.IndexOf(model)] = newLowTest;
} }
}
/// <summary> /// <summary>
/// 删除点击文本 /// 删除点击文本

View File

@ -71,15 +71,9 @@ public class FoodPageVM
window.ShowDialog(); window.ShowDialog();
if (window.IsCancel) if (window.IsCancel)
return; return;
if (ShowFoods.Value.Count == Foods.Count)
{
Foods[Foods.IndexOf(food)] = newFood;
}
else
{
Foods[Foods.IndexOf(food)] = newFood; Foods[Foods.IndexOf(food)] = newFood;
if (ShowFoods.Value.Count != Foods.Count)
ShowFoods.Value[ShowFoods.Value.IndexOf(food)] = newFood; ShowFoods.Value[ShowFoods.Value.IndexOf(food)] = newFood;
}
food.Close(); food.Close();
} }

View File

@ -72,16 +72,10 @@ public class LowTextPageVM
window.ShowDialog(); window.ShowDialog();
if (window.IsCancel) if (window.IsCancel)
return; return;
if (ShowLowTexts.Value.Count == LowTexts.Count)
{
LowTexts[LowTexts.IndexOf(model)] = newLowTest;
}
else
{
LowTexts[LowTexts.IndexOf(model)] = newLowTest; LowTexts[LowTexts.IndexOf(model)] = newLowTest;
if (ShowLowTexts.Value.Count != LowTexts.Count)
ShowLowTexts.Value[ShowLowTexts.Value.IndexOf(model)] = newLowTest; ShowLowTexts.Value[ShowLowTexts.Value.IndexOf(model)] = newLowTest;
} }
}
private void Remove(LowTextModel model) private void Remove(LowTextModel model)
{ {

View File

@ -82,16 +82,10 @@ public class MovePageVM
window.ShowDialog(); window.ShowDialog();
if (window.IsCancel) if (window.IsCancel)
return; return;
if (ShowMoves.Value.Count == Moves.Count)
{
Moves[Moves.IndexOf(model)] = newMove;
}
else
{
Moves[Moves.IndexOf(model)] = newMove; Moves[Moves.IndexOf(model)] = newMove;
if (ShowMoves.Value.Count != Moves.Count)
ShowMoves.Value[ShowMoves.Value.IndexOf(model)] = newMove; ShowMoves.Value[ShowMoves.Value.IndexOf(model)] = newMove;
} }
}
private void Remove(MoveModel model) private void Remove(MoveModel model)
{ {

View File

@ -74,15 +74,9 @@ public class PetPageVM
window.ShowDialog(); window.ShowDialog();
if (window.IsCancel) if (window.IsCancel)
return; return;
if (ShowPets.Value.Count == Pets.Count)
{
Pets[Pets.IndexOf(model)] = newPet;
}
else
{
Pets[Pets.IndexOf(model)] = newPet; Pets[Pets.IndexOf(model)] = newPet;
if (ShowPets.Value.Count != Pets.Count)
ShowPets.Value[ShowPets.Value.IndexOf(model)] = newPet; ShowPets.Value[ShowPets.Value.IndexOf(model)] = newPet;
}
model.Close(); model.Close();
} }

View File

@ -69,16 +69,10 @@ public class SelectTextPageVM
window.ShowDialog(); window.ShowDialog();
if (window.IsCancel) if (window.IsCancel)
return; return;
if (ShowSelectTexts.Value.Count == SelectTexts.Count)
{
SelectTexts[SelectTexts.IndexOf(model)] = newLowTest;
}
else
{
SelectTexts[SelectTexts.IndexOf(model)] = newLowTest; SelectTexts[SelectTexts.IndexOf(model)] = newLowTest;
if (ShowSelectTexts.Value.Count != SelectTexts.Count)
ShowSelectTexts.Value[ShowSelectTexts.Value.IndexOf(model)] = newLowTest; ShowSelectTexts.Value[ShowSelectTexts.Value.IndexOf(model)] = newLowTest;
} }
}
private void Remove(SelectTextModel model) private void Remove(SelectTextModel model)
{ {

View File

@ -80,16 +80,10 @@ public class WorkPageVM
window.ShowDialog(); window.ShowDialog();
if (window.IsCancel) if (window.IsCancel)
return; return;
if (ShowWorks.Value.Count == Works.Count)
{
Works[Works.IndexOf(model)] = newWork;
}
else
{
Works[Works.IndexOf(model)] = newWork; Works[Works.IndexOf(model)] = newWork;
if (ShowWorks.Value.Count != Works.Count)
ShowWorks.Value[ShowWorks.Value.IndexOf(model)] = newWork; ShowWorks.Value[ShowWorks.Value.IndexOf(model)] = newWork;
} }
}
private void Remove(WorkModel model) private void Remove(WorkModel model)
{ {

View File

@ -113,21 +113,10 @@ public class ModMakerWindowVM
Directory.CreateDirectory(nameof(ModMaker)); Directory.CreateDirectory(nameof(ModMaker));
if (File.Exists(ModMakerInfo.HistoryFile) is false) if (File.Exists(ModMakerInfo.HistoryFile) is false)
File.Create(ModMakerInfo.HistoryFile).Close(); File.Create(ModMakerInfo.HistoryFile).Close();
var lps = new LPS(); var lps = new LPS();
foreach (var history in Histories) foreach (var history in Histories)
{ lps.Add(LPSConvert.SerializeObjectToLine<Line>(history, nameof(history)));
lps.Add(
new Line(nameof(history))
{
new Sub(nameof(ModMakeHistory.Id), history.Id),
new Sub(nameof(ModMakeHistory.SourcePath), history.SourcePath),
new Sub(
nameof(ModMakeHistory.LastTime),
history.LastTime.ToString("yyyy/MM/dd HH:mm")
)
}
);
}
File.WriteAllText(ModMakerInfo.HistoryFile, lps.ToString()); File.WriteAllText(ModMakerInfo.HistoryFile, lps.ToString());
} }

View File

@ -32,6 +32,7 @@
<ComboBox <ComboBox
Grid.Column="1" Grid.Column="1"
ItemsSource="{Binding SearchTargets}" ItemsSource="{Binding SearchTargets}"
SelectedIndex="0"
SelectedItem="{Binding SearchTarget.Value}" /> SelectedItem="{Binding SearchTarget.Value}" />
</Grid> </Grid>
<DataGrid <DataGrid

View File

@ -3,6 +3,7 @@ using Panuon.WPF.UI;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Linq; using System.Linq;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
@ -89,88 +90,146 @@ public partial class I18nEditWindow : WindowX
LoadPets(model); LoadPets(model);
} }
private void LoadFood(ModInfoModel model) private void AddData<T>(
ObservableValue<string> id,
I18nModel<T> i18nModel,
Func<T, ObservableValue<string>> i18nValue
)
where T : class, new()
{ {
foreach (var food in model.Foods) if (AllData.TryGetValue(id.Value, out var outData))
{
if (AllData.TryGetValue(food.Id.Value, out var outData))
{ {
foreach (var culture in I18nHelper.Current.CultureNames.Enumerate()) foreach (var culture in I18nHelper.Current.CultureNames.Enumerate())
{ {
if (outData.Datas[culture.Index].Group is null) if (outData.Datas[culture.Index].Group is null)
{ {
var group = new ObservableValueGroup<string>() var group = new ObservableValueGroup<string>() { outData.Datas[culture.Index] };
{
outData.Datas[culture.Index]
};
} }
outData.Datas[culture.Index].Group!.Add(food.I18nDatas[culture.Value].Name); outData.Datas[culture.Index].Group!.Add(
} i18nValue(i18nModel.I18nDatas[culture.Value])
}
else
{
var data = new I18nData();
data.Id.Value = food.Id.Value;
foreach (var culture in I18nHelper.Current.CultureNames)
data.Datas.Add(food.I18nDatas[culture].Name);
I18nDatas.Add(data);
AllData.Add(food.Id.Value, data);
}
if (AllData.TryGetValue(food.DescriptionId.Value, out var outData1))
{
foreach (var culture in I18nHelper.Current.CultureNames.Enumerate())
{
if (outData1.Datas[culture.Index].Group is null)
{
var group = new ObservableValueGroup<string>()
{
outData1.Datas[culture.Index]
};
}
outData1.Datas[culture.Index].Group!.Add(
food.I18nDatas[culture.Value].Description
); );
} }
} }
else else
{ {
var data = new I18nData(); var data = new I18nData();
data.Id.Value = food.DescriptionId.Value; data.Id.Value = id.Value;
foreach (var culture in I18nHelper.Current.CultureNames) foreach (var culture in I18nHelper.Current.CultureNames)
data.Datas.Add(food.I18nDatas[culture].Description); data.Datas.Add(i18nValue(i18nModel.I18nDatas[culture]));
I18nDatas.Add(data); I18nDatas.Add(data);
AllData.Add(food.DescriptionId.Value, data); AllData.Add(id.Value, data);
//id.ValueChanged += IdChange;
} }
} }
private void IdChange(string oldValue, string newValue)
{
var sourceData = AllData[oldValue];
sourceData.Id.Group?.Remove(sourceData.Id);
if (AllData.TryGetValue(oldValue, out var outData))
{
foreach (var culture in I18nHelper.Current.CultureNames.Enumerate())
{
if (outData.Datas[culture.Index].Group is null)
{
var group = new ObservableValueGroup<string>() { outData.Datas[culture.Index] };
}
outData.Datas[culture.Index].Group!.Add(sourceData.Datas[culture.Index]);
}
}
else
{
sourceData.Id.Value = newValue;
AllData.Remove(oldValue);
AllData.Add(newValue, sourceData);
}
}
private void RemoveData<T>(
ObservableValue<string> id,
I18nModel<T> i18nModel,
Func<T, ObservableValue<string>> i18nValue
)
where T : class, new()
{
var data = AllData[id.Value];
foreach (var culture in I18nHelper.Current.CultureNames.Enumerate())
{
if (data.Datas[culture.Index].Group is ObservableValueGroup<string> group)
{
group.Remove(i18nValue(i18nModel.I18nDatas[culture.Value]));
if (group.Count == 1)
{
group.Clear();
return;
}
}
else
{
I18nDatas.Remove(data);
AllData.Remove(id.Value);
return;
}
}
}
private void ReplaceData<T>(
ObservableValue<string> id,
I18nModel<T> i18nModel,
Func<T, ObservableValue<string>> i18nValue
)
where T : class, new()
{
var data = AllData[id.Value];
foreach (var culture in I18nHelper.Current.CultureNames.Enumerate())
{
var oldValue = data.Datas[culture.Index];
var newValue = i18nValue(i18nModel.I18nDatas[culture.Value]);
if (oldValue.Group is ObservableValueGroup<string> group)
{
group.Add(newValue);
group.Remove(oldValue);
}
data.Datas[culture.Index] = newValue;
}
}
private void LoadFood(ModInfoModel model)
{
foreach (var food in model.Foods)
{
AddData(food.Id, food, (m) => m.Name);
AddData(food.DescriptionId, food, (m) => m.Description);
}
model.Foods.CollectionChanged += (s, e) =>
{
if (e.Action is NotifyCollectionChangedAction.Add)
{
var newFood = (FoodModel)e.NewItems[0];
AddData(newFood.Id, newFood, (m) => m.Name);
AddData(newFood.DescriptionId, newFood, (m) => m.Description);
}
else if (e.Action is NotifyCollectionChangedAction.Remove)
{
var oldFood = (FoodModel)e.OldItems[0];
RemoveData(oldFood.Id, oldFood, (m) => m.Name);
RemoveData(oldFood.DescriptionId, oldFood, (m) => m.Description);
}
else if (e.Action is NotifyCollectionChangedAction.Replace)
{
var newFood = (FoodModel)e.NewItems[0];
var oldFood = (FoodModel)e.OldItems[0];
ReplaceData(newFood.Id, newFood, (m) => m.Name);
ReplaceData(newFood.DescriptionId, newFood, (m) => m.Description);
}
};
} }
private void LoadClickText(ModInfoModel model) private void LoadClickText(ModInfoModel model)
{ {
foreach (var text in model.ClickTexts) foreach (var text in model.ClickTexts)
{ {
if (AllData.TryGetValue(text.Id.Value, out var outData)) AddData(text.Id, text, (m) => m.Text);
{
foreach (var culture in I18nHelper.Current.CultureNames.Enumerate())
{
if (outData.Datas[culture.Index].Group is null)
{
var group = new ObservableValueGroup<string>()
{
outData.Datas[culture.Index]
};
}
outData.Datas[culture.Index].Group!.Add(text.I18nDatas[culture.Value].Text);
}
}
else
{
var data = new I18nData();
data.Id.Value = text.Id.Value;
foreach (var culture in I18nHelper.Current.CultureNames)
data.Datas.Add(text.I18nDatas[culture].Text);
I18nDatas.Add(data);
AllData.Add(text.Id.Value, data);
}
} }
} }
@ -178,29 +237,7 @@ public partial class I18nEditWindow : WindowX
{ {
foreach (var text in model.LowTexts) foreach (var text in model.LowTexts)
{ {
if (AllData.TryGetValue(text.Id.Value, out var outData)) AddData(text.Id, text, (m) => m.Text);
{
foreach (var culture in I18nHelper.Current.CultureNames.Enumerate())
{
if (outData.Datas[culture.Index].Group is null)
{
var group = new ObservableValueGroup<string>()
{
outData.Datas[culture.Index]
};
}
outData.Datas[culture.Index].Group!.Add(text.I18nDatas[culture.Value].Text);
}
}
else
{
var data = new I18nData();
data.Id.Value = text.Id.Value;
foreach (var culture in I18nHelper.Current.CultureNames)
data.Datas.Add(text.I18nDatas[culture].Text);
I18nDatas.Add(data);
AllData.Add(text.Id.Value, data);
}
} }
} }
@ -208,52 +245,8 @@ public partial class I18nEditWindow : WindowX
{ {
foreach (var text in model.SelectTexts) foreach (var text in model.SelectTexts)
{ {
if (AllData.TryGetValue(text.Id.Value, out var outData)) AddData(text.Id, text, (m) => m.Text);
{ AddData(text.ChooseId, text, (m) => m.Choose);
foreach (var culture in I18nHelper.Current.CultureNames.Enumerate())
{
if (outData.Datas[culture.Index].Group is null)
{
var group = new ObservableValueGroup<string>()
{
outData.Datas[culture.Index]
};
}
outData.Datas[culture.Index].Group!.Add(text.I18nDatas[culture.Value].Text);
}
}
else
{
var data = new I18nData();
data.Id.Value = text.Id.Value;
foreach (var culture in I18nHelper.Current.CultureNames)
data.Datas.Add(text.I18nDatas[culture].Text);
I18nDatas.Add(data);
AllData.Add(text.Id.Value, data);
}
if (AllData.TryGetValue(text.ChooseId.Value, out var outData1))
{
foreach (var culture in I18nHelper.Current.CultureNames.Enumerate())
{
if (outData1.Datas[culture.Index].Group is null)
{
var group = new ObservableValueGroup<string>()
{
outData1.Datas[culture.Index]
};
}
outData1.Datas[culture.Index].Group!.Add(text.I18nDatas[culture.Value].Choose);
}
}
else
{
var data = new I18nData();
data.Id.Value = text.ChooseId.Value;
foreach (var culture in I18nHelper.Current.CultureNames)
data.Datas.Add(text.I18nDatas[culture].Choose);
I18nDatas.Add(data);
AllData.Add(text.ChooseId.Value, data);
}
} }
} }
@ -263,92 +256,9 @@ public partial class I18nEditWindow : WindowX
{ {
if (pet.IsSimplePetModel) if (pet.IsSimplePetModel)
continue; continue;
if (AllData.TryGetValue(pet.Id.Value, out var outData)) AddData(pet.Id, pet, (m) => m.Name);
{ AddData(pet.PetNameId, pet, (m) => m.PetName);
foreach (var culture in I18nHelper.Current.CultureNames.Enumerate()) AddData(pet.DescriptionId, pet, (m) => m.Description);
{
if (outData.Datas[culture.Index].Group is null)
{
var group = new ObservableValueGroup<string>()
{
outData.Datas[culture.Index]
};
}
outData.Datas[culture.Index].Group!.Add(pet.I18nDatas[culture.Value].Name);
}
}
else
{
var data = new I18nData();
data.Id.Value = pet.Id.Value;
foreach (var culture in I18nHelper.Current.CultureNames)
data.Datas.Add(pet.I18nDatas[culture].Name);
I18nDatas.Add(data);
AllData.Add(pet.Id.Value, data);
}
if (AllData.TryGetValue(pet.PetNameId.Value, out var outData1))
{
foreach (var culture in I18nHelper.Current.CultureNames.Enumerate())
{
if (outData1.Datas[culture.Index].Group is null)
{
var group = new ObservableValueGroup<string>()
{
outData1.Datas[culture.Index]
};
}
outData1.Datas[culture.Index].Group!.Add(pet.I18nDatas[culture.Value].PetName);
}
}
else
{
var data = new I18nData();
data.Id.Value = pet.PetNameId.Value;
foreach (var culture in I18nHelper.Current.CultureNames)
data.Datas.Add(pet.I18nDatas[culture].PetName);
I18nDatas.Add(data);
AllData.Add(pet.PetNameId.Value, data);
}
if (AllData.TryGetValue(pet.DescriptionId.Value, out var outData2))
{
foreach (var culture in I18nHelper.Current.CultureNames.Enumerate())
{
if (outData2.Datas[culture.Index].Group is null)
{
var group = new ObservableValueGroup<string>()
{
outData2.Datas[culture.Index]
};
}
outData2.Datas[culture.Index].Group!.Add(
pet.I18nDatas[culture.Value].Description
);
}
}
else
{
var data = new I18nData();
data.Id.Value = pet.DescriptionId.Value;
foreach (var culture in I18nHelper.Current.CultureNames)
data.Datas.Add(pet.I18nDatas[culture].Description);
I18nDatas.Add(data);
AllData.Add(pet.DescriptionId.Value, data);
}
//var data = new I18nData();
//var petNameData = new I18nData();
//var descriptionData = new I18nData();
//data.Id.Value = pet.Id.Value;
//petNameData.Id.Value = pet.PetNameId.Value;
//descriptionData.Id.Value = pet.DescriptionId.Value;
//foreach (var culture in I18nHelper.Current.CultureNames)
//{
// data.Datas.Add(pet.I18nDatas[culture].Name);
// petNameData.Datas.Add(pet.I18nDatas[culture].PetName);
// descriptionData.Datas.Add(pet.I18nDatas[culture].Description);
//}
//I18nDatas.Add(data);
//I18nDatas.Add(petNameData);
//I18nDatas.Add(descriptionData);
} }
} }