diff --git a/VPet.ModMaker/Converters.xaml b/VPet.ModMaker/Converters.xaml
index 73c5a31..78c7b7d 100644
--- a/VPet.ModMaker/Converters.xaml
+++ b/VPet.ModMaker/Converters.xaml
@@ -5,5 +5,7 @@
+
+
\ No newline at end of file
diff --git a/VPet.ModMaker/Converters/BrushToMediaColorConverter.cs b/VPet.ModMaker/Converters/BrushToMediaColorConverter.cs
new file mode 100644
index 0000000..580ca2a
--- /dev/null
+++ b/VPet.ModMaker/Converters/BrushToMediaColorConverter.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Data;
+using System.Windows.Media;
+
+namespace VPet.ModMaker.Converters;
+
+public class BrushToMediaColorConverter : IValueConverter
+{
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ if (value is not SolidColorBrush brush)
+ throw new ArgumentException("Not SolidColorBrush", nameof(value));
+ return brush.Color;
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ if (value is not Color color)
+ throw new ArgumentException("Not media color", nameof(value));
+ return new SolidColorBrush(color);
+ }
+}
diff --git a/VPet.ModMaker/Converters/MediaColorToBrushConverter.cs b/VPet.ModMaker/Converters/MediaColorToBrushConverter.cs
new file mode 100644
index 0000000..311e866
--- /dev/null
+++ b/VPet.ModMaker/Converters/MediaColorToBrushConverter.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Data;
+using System.Windows.Media;
+
+namespace VPet.ModMaker.Converters;
+
+public class MediaColorToBrushConverter : IValueConverter
+{
+ public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ if (value is not Color color)
+ throw new ArgumentException("Not media color", nameof(value));
+ return new SolidColorBrush(color);
+ }
+
+ public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+ {
+ if (value is not SolidColorBrush brush)
+ throw new ArgumentException("Not SolidColorBrush", nameof(value));
+ return brush.Color;
+ }
+}
diff --git a/VPet.ModMaker/Converters/StringFormatConverter.cs b/VPet.ModMaker/Converters/StringFormatConverter.cs
new file mode 100644
index 0000000..599e7d3
--- /dev/null
+++ b/VPet.ModMaker/Converters/StringFormatConverter.cs
@@ -0,0 +1,57 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Data;
+
+namespace VPet.ModMaker.Converters;
+
+///
+/// 边距转换器
+/// 示例:
+///
+///
+///
+///
+///
+/// OR
+///
+///
+///
+///
+/// ]]>
+///
+public class StringFormatConverter : IMultiValueConverter
+{
+ public object Convert(
+ object[] values,
+ Type targetType,
+ object parameter,
+ System.Globalization.CultureInfo culture
+ )
+ {
+ var formatStr = (string)parameter;
+ if (string.IsNullOrWhiteSpace(formatStr))
+ {
+ formatStr = (string)values[0];
+ return string.Format(formatStr, values.Skip(1).ToArray());
+ }
+ else
+ {
+ return string.Format(formatStr, values);
+ }
+ }
+
+ public object[] ConvertBack(
+ object value,
+ Type[] targetTypes,
+ object parameter,
+ System.Globalization.CultureInfo culture
+ )
+ {
+ throw new NotImplementedException();
+ }
+}
diff --git a/VPet.ModMaker/Models/ClickTextModel.cs b/VPet.ModMaker/Models/ClickTextModel.cs
index 283c2a0..a5d690e 100644
--- a/VPet.ModMaker/Models/ClickTextModel.cs
+++ b/VPet.ModMaker/Models/ClickTextModel.cs
@@ -22,7 +22,7 @@ public class ClickTextModel : I18nModel
.Cast()
);
- public ObservableValue Name { get; } = new();
+ public ObservableValue Id { get; } = new();
public ObservableValue Working { get; } = new();
public ObservableValue Mode { get; } = new();
public ObservableValue WorkingState { get; } = new();
@@ -42,7 +42,7 @@ public class ClickTextModel : I18nModel
public ClickTextModel(ClickTextModel clickText)
: this()
{
- Name.Value = clickText.Name.Value;
+ Id.Value = clickText.Id.Value;
Mode.Value = clickText.Mode.Value;
Working.Value = clickText.Working.Value;
WorkingState.Value = clickText.WorkingState.Value;
@@ -63,7 +63,7 @@ public class ClickTextModel : I18nModel
public ClickTextModel(ClickText clickText)
: this()
{
- Name.Value = clickText.Text;
+ Id.Value = clickText.Text;
Mode.Value = clickText.Mode;
Working.Value = clickText.Working;
WorkingState.Value = clickText.State;
@@ -82,7 +82,7 @@ public class ClickTextModel : I18nModel
{
return new()
{
- Text = Name.Value,
+ Text = Id.Value,
Mode = Mode.Value,
Working = Working.Value,
State = WorkingState.Value,
diff --git a/VPet.ModMaker/Models/FoodModel.cs b/VPet.ModMaker/Models/FoodModel.cs
index e6b859d..59b959c 100644
--- a/VPet.ModMaker/Models/FoodModel.cs
+++ b/VPet.ModMaker/Models/FoodModel.cs
@@ -16,8 +16,8 @@ public class FoodModel : I18nModel
public static ObservableCollection FoodTypes { get; } =
new(Enum.GetValues(typeof(Food.FoodType)).Cast());
- public ObservableValue Name { get; } = new();
- public ObservableValue Description { get; } = new();
+ public ObservableValue Id { get; } = new();
+ public ObservableValue DescriptionId { get; } = new();
public ObservableValue Graph { get; } = new();
public ObservableValue Type { get; } = new();
public ObservableValue Strength { get; } = new();
@@ -32,18 +32,18 @@ public class FoodModel : I18nModel
public FoodModel()
{
- Description.Value = $"{Name.Value}_{nameof(Description)}";
- Name.ValueChanged += (v) =>
+ DescriptionId.Value = $"{Id.Value}_{nameof(DescriptionId)}";
+ Id.ValueChanged += (v) =>
{
- Description.Value = $"{v}_{nameof(Description)}";
+ DescriptionId.Value = $"{v}_{nameof(DescriptionId)}";
};
}
public FoodModel(FoodModel model)
: this()
{
- Name.Value = model.Name.Value;
- Description.Value = model.Description.Value;
+ Id.Value = model.Id.Value;
+ DescriptionId.Value = model.DescriptionId.Value;
Graph.Value = model.Graph.Value;
Type.Value = model.Type.Value;
Strength.Value = model.Strength.Value;
@@ -63,8 +63,8 @@ public class FoodModel : I18nModel
public FoodModel(Food food)
: this()
{
- Name.Value = food.Name;
- Description.Value = food.Desc;
+ Id.Value = food.Name;
+ DescriptionId.Value = food.Desc;
Graph.Value = food.Graph;
Type.Value = food.Type;
Strength.Value = food.Strength;
@@ -83,8 +83,8 @@ public class FoodModel : I18nModel
{
return new Food()
{
- Name = Name.Value,
- Desc = Description.Value,
+ Name = Id.Value,
+ Desc = DescriptionId.Value,
Graph = Graph.Value,
Type = Type.Value,
Strength = Strength.Value,
diff --git a/VPet.ModMaker/Models/LowTextModel.cs b/VPet.ModMaker/Models/LowTextModel.cs
index f415577..f72e344 100644
--- a/VPet.ModMaker/Models/LowTextModel.cs
+++ b/VPet.ModMaker/Models/LowTextModel.cs
@@ -19,7 +19,7 @@ public class LowTextModel : I18nModel
public static ObservableCollection StrengthTypes { get; } =
new(Enum.GetValues(typeof(LowText.StrengthType)).Cast());
- public ObservableValue Name { get; } = new();
+ public ObservableValue Id { get; } = new();
public ObservableValue Mode { get; } = new();
public ObservableValue Strength { get; } = new();
public ObservableValue Like { get; } = new();
@@ -29,7 +29,7 @@ public class LowTextModel : I18nModel
public LowTextModel(LowTextModel lowText)
: this()
{
- Name.Value = lowText.Name.Value;
+ Id.Value = lowText.Id.Value;
Mode.Value = lowText.Mode.Value;
Strength.Value = lowText.Strength.Value;
Like.Value = lowText.Like.Value;
@@ -42,7 +42,7 @@ public class LowTextModel : I18nModel
public LowTextModel(LowText lowText)
: this()
{
- Name.Value = lowText.Text;
+ Id.Value = lowText.Text;
Mode.Value = lowText.Mode;
Strength.Value = lowText.Strength;
Like.Value = lowText.Like;
@@ -54,7 +54,7 @@ public class LowTextModel : I18nModel
{
return new()
{
- Text = Name.Value,
+ Text = Id.Value,
Mode = Mode.Value,
Strength = Strength.Value,
Like = Like.Value,
diff --git a/VPet.ModMaker/Models/ModInfoModel.cs b/VPet.ModMaker/Models/ModInfoModel.cs
index 052fc77..7fd242c 100644
--- a/VPet.ModMaker/Models/ModInfoModel.cs
+++ b/VPet.ModMaker/Models/ModInfoModel.cs
@@ -20,9 +20,8 @@ public class ModInfoModel : I18nModel
public const string ModInfoFile = "info.lps";
public static ModInfoModel Current { get; set; } = new();
- public ObservableValue Name { get; } = new();
- public ObservableValue Description { get; } = new();
- public ObservableValue Summary { get; } = new();
+ public ObservableValue Id { get; } = new();
+ public ObservableValue DescriptionId { get; } = new();
public ObservableValue Author { get; } = new();
public ObservableValue GameVersion { get; } = new();
public ObservableValue ModVersion { get; } = new();
@@ -39,10 +38,10 @@ public class ModInfoModel : I18nModel
public ModInfoModel()
{
- Description.Value = $"{Name.Value}_{nameof(Description)}";
- Name.ValueChanged += (v) =>
+ DescriptionId.Value = $"{Id.Value}_{nameof(DescriptionId)}";
+ Id.ValueChanged += (v) =>
{
- Description.Value = $"{v}_{nameof(Description)}";
+ DescriptionId.Value = $"{v}_{nameof(DescriptionId)}";
};
}
@@ -50,8 +49,8 @@ public class ModInfoModel : I18nModel
: this()
{
SourcePath.Value = loader.Path.FullName;
- Name.Value = loader.Name;
- Description.Value = loader.Intro;
+ Id.Value = loader.Name;
+ DescriptionId.Value = loader.Intro;
Author.Value = loader.Author;
GameVersion.Value = loader.GameVer.ToString();
ModVersion.Value = loader.Ver.ToString();
@@ -91,39 +90,39 @@ public class ModInfoModel : I18nModel
foreach (var food in Foods)
{
var foodI18n = food.I18nDatas[i18nData.Key];
- if (i18nData.Value.TryGetValue(food.Name.Value, out var name))
+ if (i18nData.Value.TryGetValue(food.Id.Value, out var name))
foodI18n.Name.Value = name;
- if (i18nData.Value.TryGetValue(food.Description.Value, out var description))
+ if (i18nData.Value.TryGetValue(food.DescriptionId.Value, out var description))
foodI18n.Description.Value = description;
}
foreach (var lowText in LowTexts)
{
var lowTextI18n = lowText.I18nDatas[i18nData.Key];
- if (i18nData.Value.TryGetValue(lowText.Name.Value, out var text))
+ if (i18nData.Value.TryGetValue(lowText.Id.Value, out var text))
lowTextI18n.Text.Value = text;
}
foreach (var clickText in ClickTexts)
{
var clickTextI18n = clickText.I18nDatas[i18nData.Key];
- if (i18nData.Value.TryGetValue(clickText.Name.Value, out var text))
+ if (i18nData.Value.TryGetValue(clickText.Id.Value, out var text))
clickTextI18n.Text.Value = text;
}
foreach (var selectText in SelectTexts)
{
var selectTextI18n = selectText.I18nDatas[i18nData.Key];
- if (i18nData.Value.TryGetValue(selectText.Name.Value, out var text))
+ if (i18nData.Value.TryGetValue(selectText.Id.Value, out var text))
selectTextI18n.Text.Value = text;
- if (i18nData.Value.TryGetValue(selectText.Choose.Value, out var choose))
+ if (i18nData.Value.TryGetValue(selectText.ChooseId.Value, out var choose))
selectTextI18n.Choose.Value = choose;
}
foreach (var pet in Pets)
{
var petI18n = pet.I18nDatas[i18nData.Key];
- if (i18nData.Value.TryGetValue(pet.Name.Value, out var name))
+ if (i18nData.Value.TryGetValue(pet.Id.Value, out var name))
petI18n.Name.Value = name;
- if (i18nData.Value.TryGetValue(pet.PetName.Value, out var petName))
+ if (i18nData.Value.TryGetValue(pet.PetNameId.Value, out var petName))
petI18n.PetName.Value = petName;
- if (i18nData.Value.TryGetValue(pet.Description.Value, out var description))
+ if (i18nData.Value.TryGetValue(pet.DescriptionId.Value, out var description))
petI18n.Description.Value = description;
foreach (var work in pet.Works)
{
@@ -149,13 +148,13 @@ public class ModInfoModel : I18nModel
//var lps = new LpsDocument(File.ReadAllText(modInfoFile));
var lps = new LPS()
{
- new Line("vupmod", Name.Value)
+ new Line("vupmod", Id.Value)
{
new Sub("author", Author.Value),
new Sub("gamever", GameVersion.Value),
new Sub("ver", ModVersion.Value)
},
- new Line("intro", Description.Value),
+ new Line("intro", DescriptionId.Value),
new Line("authorid", "0"),
new Line("itemid", "0"),
new Line("cachedate", DateTime.Now.Date.ToString())
@@ -165,8 +164,8 @@ public class ModInfoModel : I18nModel
lps.Add(
new Line("lang", cultureName)
{
- new Sub(Name.Value, I18nDatas[cultureName].Name.Value),
- new Sub(Description.Value, I18nDatas[cultureName].Description.Value),
+ new Sub(Id.Value, I18nDatas[cultureName].Name.Value),
+ new Sub(DescriptionId.Value, I18nDatas[cultureName].Description.Value),
}
);
}
@@ -175,7 +174,7 @@ public class ModInfoModel : I18nModel
if (imagePath != targetImagePath)
File.Copy(imagePath, targetImagePath, true);
//lps.FindLine("vupmod").Info = Id.Value;
- //lps.FindLine("intro").Info = Description.Value;
+ //lps.FindLine("intro").Info = DescriptionId.Value;
//lps.FindSub("gamever").Info = GameVersion.Value;
//lps.FindSub("ver").Info = ModVersion.Value;
//lps.FindSub("author").Info = Author.Value;
@@ -277,23 +276,26 @@ public class ModInfoModel : I18nModel
var lps = new LPS();
foreach (var food in Foods)
{
- lps.Add(new Line(food.Name.Value, food.I18nDatas[cultureName].Name.Value));
+ lps.Add(new Line(food.Id.Value, food.I18nDatas[cultureName].Name.Value));
lps.Add(
- new Line(food.Description.Value, food.I18nDatas[cultureName].Description.Value)
+ new Line(
+ food.DescriptionId.Value,
+ food.I18nDatas[cultureName].Description.Value
+ )
);
}
foreach (var text in LowTexts)
{
- lps.Add(new Line(text.Name.Value, text.I18nDatas[cultureName].Text.Value));
+ lps.Add(new Line(text.Id.Value, text.I18nDatas[cultureName].Text.Value));
}
foreach (var text in ClickTexts)
{
- lps.Add(new Line(text.Name.Value, text.I18nDatas[cultureName].Text.Value));
+ lps.Add(new Line(text.Id.Value, text.I18nDatas[cultureName].Text.Value));
}
foreach (var text in SelectTexts)
{
- lps.Add(new Line(text.Name.Value, text.I18nDatas[cultureName].Text.Value));
- lps.Add(new Line(text.Choose.Value, text.I18nDatas[cultureName].Choose.Value));
+ lps.Add(new Line(text.Id.Value, text.I18nDatas[cultureName].Text.Value));
+ lps.Add(new Line(text.ChooseId.Value, text.I18nDatas[cultureName].Choose.Value));
}
File.WriteAllText(cultureFile, lps.ToString());
}
@@ -312,7 +314,7 @@ public class ModInfoModel : I18nModel
var foodImagePath = Utils.GetImageSourceFile(food.Image.Value);
var targetImagePath = Path.Combine(
foodPath,
- $"{food.Name.Value}{Path.GetExtension(foodImagePath)}"
+ $"{food.Id.Value}{Path.GetExtension(foodImagePath)}"
);
if (foodImagePath != targetImagePath)
File.Copy(foodImagePath, targetImagePath, true);
diff --git a/VPet.ModMaker/Models/ModMakerHistory.cs b/VPet.ModMaker/Models/ModMakerHistory.cs
index 144713e..7466060 100644
--- a/VPet.ModMaker/Models/ModMakerHistory.cs
+++ b/VPet.ModMaker/Models/ModMakerHistory.cs
@@ -14,7 +14,7 @@ public class ModMakerHistory
public BitmapImage Image { get; set; }
[Line(ignoreCase: true)]
- public string Name { get; set; }
+ public string Id { get; set; }
private string _path;
diff --git a/VPet.ModMaker/Models/PetModel.cs b/VPet.ModMaker/Models/PetModel.cs
index 82996ba..8c931a0 100644
--- a/VPet.ModMaker/Models/PetModel.cs
+++ b/VPet.ModMaker/Models/PetModel.cs
@@ -13,9 +13,9 @@ namespace VPet.ModMaker.Models;
public class PetModel : I18nModel
{
- public ObservableValue Name { get; } = new();
- public ObservableValue PetName { get; } = new();
- public ObservableValue Description { get; } = new();
+ public ObservableValue Id { get; } = new();
+ public ObservableValue PetNameId { get; } = new();
+ public ObservableValue DescriptionId { get; } = new();
public ObservableValue> TouchHeadRect { get; } = new(new());
public ObservableValue TouchRaisedRect { get; } = new(new());
public ObservableValue RaisePoint { get; } = new(new());
@@ -24,19 +24,19 @@ public class PetModel : I18nModel
public PetModel()
{
- PetName.Value = $"{Name.Value}_{nameof(PetName)}";
- Description.Value = $"{Name.Value}_{nameof(Description)}";
- Name.ValueChanged += (v) =>
+ PetNameId.Value = $"{Id.Value}_{nameof(PetNameId)}";
+ DescriptionId.Value = $"{Id.Value}_{nameof(DescriptionId)}";
+ Id.ValueChanged += (v) =>
{
- PetName.Value = $"{v}_{nameof(PetName)}";
- Description.Value = $"{v}_{nameof(Description)}";
+ PetNameId.Value = $"{v}_{nameof(PetNameId)}";
+ DescriptionId.Value = $"{v}_{nameof(DescriptionId)}";
};
}
public PetModel(PetModel model)
: this()
{
- Name.Value = model.Name.Value;
+ Id.Value = model.Id.Value;
TouchHeadRect.Value = model.TouchHeadRect.Value.Copy();
TouchRaisedRect.Value = model.TouchRaisedRect.Value.Copy();
RaisePoint.Value = model.RaisePoint.Value.Copy();
@@ -51,9 +51,9 @@ public class PetModel : I18nModel
public PetModel(PetLoader loader)
: this()
{
- Name.Value = loader.Name;
- PetName.Value = loader.PetName;
- Description.Value = loader.Intor;
+ Id.Value = loader.Name;
+ PetNameId.Value = loader.PetName;
+ DescriptionId.Value = loader.Intor;
TouchHeadRect.Value.SetValue(
loader.Config.TouchHeadLocate.X,
diff --git a/VPet.ModMaker/Models/SelectTextModel.cs b/VPet.ModMaker/Models/SelectTextModel.cs
index 1032b17..875b6df 100644
--- a/VPet.ModMaker/Models/SelectTextModel.cs
+++ b/VPet.ModMaker/Models/SelectTextModel.cs
@@ -26,8 +26,8 @@ public class SelectTextModel : I18nModel
public ObservableValue Tags { get; } = new();
public ObservableValue ToTags { get; } = new();
- public ObservableValue Name { get; } = new();
- public ObservableValue Choose { get; } = new();
+ public ObservableValue Id { get; } = new();
+ public ObservableValue ChooseId { get; } = new();
public ObservableValue Mode { get; } = new();
//public ObservableValue Working { get; } = new();
@@ -45,17 +45,17 @@ public class SelectTextModel : I18nModel
public SelectTextModel()
{
- Choose.Value = $"{Name.Value}_{nameof(Choose)}";
- Name.ValueChanged += (v) =>
+ ChooseId.Value = $"{Id.Value}_{nameof(ChooseId)}";
+ Id.ValueChanged += (v) =>
{
- Choose.Value = $"{v}_{nameof(Choose)}";
+ ChooseId.Value = $"{v}_{nameof(ChooseId)}";
};
}
public SelectTextModel(SelectTextModel model)
: this()
{
- Name.Value = model.Name.Value;
+ Id.Value = model.Id.Value;
Mode.Value = model.Mode.Value;
Tags.Value = model.Tags.Value;
ToTags.Value = model.ToTags.Value;
@@ -79,8 +79,8 @@ public class SelectTextModel : I18nModel
public SelectTextModel(SelectText text)
: this()
{
- Name.Value = text.Text;
- Choose.Value = text.Choose ?? string.Empty;
+ Id.Value = text.Text;
+ ChooseId.Value = text.Choose ?? string.Empty;
Mode.Value = text.Mode;
Tags.Value = text.Tags is null ? string.Empty : string.Join(", ", text.Tags);
ToTags.Value = text.ToTags is null ? string.Empty : string.Join(", ", text.ToTags);
@@ -103,8 +103,8 @@ public class SelectTextModel : I18nModel
{
return new()
{
- Text = Name.Value,
- Choose = Choose.Value,
+ Text = Id.Value,
+ Choose = ChooseId.Value,
Mode = Mode.Value,
Tags = new(Tags.Value.Split(rs_splitChar, StringSplitOptions.RemoveEmptyEntries)),
ToTags = new(ToTags.Value.Split(rs_splitChar, StringSplitOptions.RemoveEmptyEntries)),
diff --git a/VPet.ModMaker/Models/WorkModel.cs b/VPet.ModMaker/Models/WorkModel.cs
index 029f056..32ef684 100644
--- a/VPet.ModMaker/Models/WorkModel.cs
+++ b/VPet.ModMaker/Models/WorkModel.cs
@@ -5,6 +5,7 @@ using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
+using System.Windows.Media;
namespace VPet.ModMaker.Models;
@@ -32,11 +33,16 @@ public class WorkModel : I18nModel
public ObservableValue Time { get; } = new();
public ObservableValue FinishBonus { get; } = new();
- public ObservableValue BorderBrush { get; } = new("0290D5");
- public ObservableValue Background { get; } = new("81d4fa");
- public ObservableValue ButtonBackground { get; } = new("0286C6");
- public ObservableValue ButtonForeground { get; } = new("ffffff");
- public ObservableValue Foreground { get; } = new("0286C6");
+ public ObservableValue BorderBrush { get; } =
+ new(new((Color)ColorConverter.ConvertFromString("#FF0290D5")));
+ public ObservableValue Background { get; } =
+ new(new((Color)ColorConverter.ConvertFromString("#FF81d4fa")));
+ public ObservableValue Foreground { get; } =
+ new(new((Color)ColorConverter.ConvertFromString("#FF0286C6")));
+ public ObservableValue ButtonBackground { get; } =
+ new(new((Color)ColorConverter.ConvertFromString("#AA0286C6")));
+ public ObservableValue ButtonForeground { get; } =
+ new(new((Color)ColorConverter.ConvertFromString("#FFffffff")));
public ObservableValue Left { get; } = new(100);
public ObservableValue Top { get; } = new(160);
@@ -89,11 +95,15 @@ public class WorkModel : I18nModel
Time.Value = work.Time;
FinishBonus.Value = work.FinishBonus;
- BorderBrush.Value = work.BorderBrush;
- Background.Value = work.Background;
- ButtonBackground.Value = work.ButtonBackground;
- ButtonForeground.Value = work.ButtonForeground;
- Foreground.Value = work.Foreground;
+ BorderBrush.Value = new((Color)ColorConverter.ConvertFromString("#FF" + work.BorderBrush));
+ Background.Value = new((Color)ColorConverter.ConvertFromString("#FF" + work.Background));
+ Foreground.Value = new((Color)ColorConverter.ConvertFromString("#FF" + work.Foreground));
+ ButtonBackground.Value = new(
+ (Color)ColorConverter.ConvertFromString("#AA" + work.ButtonBackground)
+ );
+ ButtonForeground.Value = new(
+ (Color)ColorConverter.ConvertFromString("#FF" + work.ButtonForeground)
+ );
Left.Value = work.Left;
Top.Value = work.Top;
@@ -116,11 +126,11 @@ public class WorkModel : I18nModel
Time = Time.Value,
FinishBonus = FinishBonus.Value,
//
- BorderBrush = BorderBrush.Value,
- Background = Background.Value,
- ButtonBackground = ButtonBackground.Value,
- ButtonForeground = ButtonForeground.Value,
- Foreground = Foreground.Value,
+ BorderBrush = BorderBrush.Value.ToString().Substring(3),
+ Background = Background.Value.ToString().Substring(3),
+ ButtonBackground = ButtonBackground.Value.ToString().Substring(3),
+ ButtonForeground = ButtonForeground.Value.ToString().Substring(3),
+ Foreground = Foreground.Value.ToString().Substring(3),
//
Left = Left.Value,
Top = Top.Value,
diff --git a/VPet.ModMaker/Styles.xaml b/VPet.ModMaker/Styles.xaml
index 1c68f3c..f50a7f4 100644
--- a/VPet.ModMaker/Styles.xaml
+++ b/VPet.ModMaker/Styles.xaml
@@ -27,5 +27,4 @@
-
\ No newline at end of file
diff --git a/VPet.ModMaker/VPet.ModMaker.csproj b/VPet.ModMaker/VPet.ModMaker.csproj
index 120761a..3bb0b6b 100644
--- a/VPet.ModMaker/VPet.ModMaker.csproj
+++ b/VPet.ModMaker/VPet.ModMaker.csproj
@@ -90,7 +90,10 @@
App.xaml
+
+
+
diff --git a/VPet.ModMaker/ViewModels/ModEdit/ClickTextEdit/ClickTextPageVM.cs b/VPet.ModMaker/ViewModels/ModEdit/ClickTextEdit/ClickTextPageVM.cs
index e9088b7..d9678e5 100644
--- a/VPet.ModMaker/ViewModels/ModEdit/ClickTextEdit/ClickTextPageVM.cs
+++ b/VPet.ModMaker/ViewModels/ModEdit/ClickTextEdit/ClickTextPageVM.cs
@@ -44,7 +44,7 @@ public class ClickTextPageVM
{
ShowClickTexts.Value = new(
ClickTexts.Where(
- m => m.Name.Value.Contains(value, StringComparison.OrdinalIgnoreCase)
+ m => m.Id.Value.Contains(value, StringComparison.OrdinalIgnoreCase)
)
);
}
diff --git a/VPet.ModMaker/ViewModels/ModEdit/FoodEdit/FoodPageVM.cs b/VPet.ModMaker/ViewModels/ModEdit/FoodEdit/FoodPageVM.cs
index ccc6bca..d4e8333 100644
--- a/VPet.ModMaker/ViewModels/ModEdit/FoodEdit/FoodPageVM.cs
+++ b/VPet.ModMaker/ViewModels/ModEdit/FoodEdit/FoodPageVM.cs
@@ -45,7 +45,7 @@ public class FoodPageVM
else
{
ShowFoods.Value = new(
- Foods.Where(m => m.Name.Value.Contains(value, StringComparison.OrdinalIgnoreCase))
+ Foods.Where(m => m.Id.Value.Contains(value, StringComparison.OrdinalIgnoreCase))
);
}
}
diff --git a/VPet.ModMaker/ViewModels/ModEdit/LowTextEdit/LowTextPageVM.cs b/VPet.ModMaker/ViewModels/ModEdit/LowTextEdit/LowTextPageVM.cs
index 8a8e48f..d45a88e 100644
--- a/VPet.ModMaker/ViewModels/ModEdit/LowTextEdit/LowTextPageVM.cs
+++ b/VPet.ModMaker/ViewModels/ModEdit/LowTextEdit/LowTextPageVM.cs
@@ -46,9 +46,7 @@ public class LowTextPageVM
else
{
ShowLowTexts.Value = new(
- LowTexts.Where(
- m => m.Name.Value.Contains(value, StringComparison.OrdinalIgnoreCase)
- )
+ LowTexts.Where(m => m.Id.Value.Contains(value, StringComparison.OrdinalIgnoreCase))
);
}
}
diff --git a/VPet.ModMaker/ViewModels/ModEdit/PetEdit/PetEditWindowVM.cs b/VPet.ModMaker/ViewModels/ModEdit/PetEdit/PetEditWindowVM.cs
index 67854e4..a948a24 100644
--- a/VPet.ModMaker/ViewModels/ModEdit/PetEdit/PetEditWindowVM.cs
+++ b/VPet.ModMaker/ViewModels/ModEdit/PetEdit/PetEditWindowVM.cs
@@ -33,7 +33,7 @@ public class PetEditWindowVM
private void Image_ValueChanged(BitmapImage value)
{
- LengthRatio.Value = BorderLength.Value / value.PixelWidth;
+ //LengthRatio.Value = BorderLength.Value / value.PixelWidth;
}
public void Close()
diff --git a/VPet.ModMaker/ViewModels/ModEdit/PetEdit/PetPageVM.cs b/VPet.ModMaker/ViewModels/ModEdit/PetEdit/PetPageVM.cs
index 9837171..12c4008 100644
--- a/VPet.ModMaker/ViewModels/ModEdit/PetEdit/PetPageVM.cs
+++ b/VPet.ModMaker/ViewModels/ModEdit/PetEdit/PetPageVM.cs
@@ -43,7 +43,7 @@ public class PetPageVM
else
{
ShowPets.Value = new(
- Pets.Where(m => m.Name.Value.Contains(value, StringComparison.OrdinalIgnoreCase))
+ Pets.Where(m => m.Id.Value.Contains(value, StringComparison.OrdinalIgnoreCase))
);
}
}
diff --git a/VPet.ModMaker/ViewModels/ModEdit/SelectTextEdit/SelectTextPageVM.cs b/VPet.ModMaker/ViewModels/ModEdit/SelectTextEdit/SelectTextPageVM.cs
index a9cf0f2..88156c8 100644
--- a/VPet.ModMaker/ViewModels/ModEdit/SelectTextEdit/SelectTextPageVM.cs
+++ b/VPet.ModMaker/ViewModels/ModEdit/SelectTextEdit/SelectTextPageVM.cs
@@ -44,7 +44,7 @@ public class SelectTextPageVM
{
ShowSelectTexts.Value = new(
SelectTexts.Where(
- m => m.Name.Value.Contains(value, StringComparison.OrdinalIgnoreCase)
+ m => m.Id.Value.Contains(value, StringComparison.OrdinalIgnoreCase)
)
);
}
diff --git a/VPet.ModMaker/ViewModels/ModEdit/WorkEdit/WorkEditWindowVM.cs b/VPet.ModMaker/ViewModels/ModEdit/WorkEdit/WorkEditWindowVM.cs
index 15c3244..22a73e2 100644
--- a/VPet.ModMaker/ViewModels/ModEdit/WorkEdit/WorkEditWindowVM.cs
+++ b/VPet.ModMaker/ViewModels/ModEdit/WorkEdit/WorkEditWindowVM.cs
@@ -1,9 +1,12 @@
using HKW.HKWViewModels.SimpleObservable;
+using LinePutScript.Localization.WPF;
+using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
+using System.Windows.Media.Imaging;
using VPet.ModMaker.Models;
namespace VPet.ModMaker.ViewModels.ModEdit.WorkEdit;
@@ -15,4 +18,56 @@ public class WorkEditWindowVM
public WorkModel OldWork { get; set; }
public ObservableValue Work { get; } = new(new());
#endregion
+ public ObservableValue BorderLength { get; } = new(250);
+ public ObservableValue LengthRatio { get; } = new(250.0 / 500.0);
+ public ObservableValue Image { get; } = new();
+ #region Command
+ public ObservableCommand AddImageCommand { get; } = new();
+ public ObservableCommand ChangeImageCommand { get; } = new();
+ #endregion
+ public WorkEditWindowVM()
+ {
+ AddImageCommand.ExecuteEvent += AddImage;
+ ChangeImageCommand.ExecuteEvent += ChangeImage;
+ Image.ValueChanged += Image_ValueChanged;
+ }
+
+ private void Image_ValueChanged(BitmapImage value)
+ {
+ //LengthRatio.Value = BorderLength.Value / value.PixelWidth;
+ }
+
+ public void Close()
+ {
+ Image.Value?.StreamSource?.Close();
+ }
+
+ private void AddImage()
+ {
+ OpenFileDialog openFileDialog =
+ new()
+ {
+ Title = "选择图片".Translate(),
+ Filter = $"图片|*.jpg;*.jpeg;*.png;*.bmp".Translate()
+ };
+ if (openFileDialog.ShowDialog() is true)
+ {
+ Image.Value = Utils.LoadImageToStream(openFileDialog.FileName);
+ }
+ }
+
+ private void ChangeImage()
+ {
+ OpenFileDialog openFileDialog =
+ new()
+ {
+ Title = "选择图片".Translate(),
+ Filter = $"图片|*.jpg;*.jpeg;*.png;*.bmp".Translate()
+ };
+ if (openFileDialog.ShowDialog() is true)
+ {
+ Image.Value?.StreamSource?.Close();
+ Image.Value = Utils.LoadImageToStream(openFileDialog.FileName);
+ }
+ }
}
diff --git a/VPet.ModMaker/ViewModels/ModMakerWindowVM.cs b/VPet.ModMaker/ViewModels/ModMakerWindowVM.cs
index 1ef722e..b4de224 100644
--- a/VPet.ModMaker/ViewModels/ModMakerWindowVM.cs
+++ b/VPet.ModMaker/ViewModels/ModMakerWindowVM.cs
@@ -54,7 +54,11 @@ public class ModMakerWindowVM
return;
var lps = new LPS(File.ReadAllText(ModMakerInfo.HistoryFile));
foreach (var line in lps)
- Histories.Add(LPSConvert.DeserializeObject(line));
+ {
+ var history = LPSConvert.DeserializeObject(line);
+ if (Histories.All(h => h.InfoFile != history.InfoFile))
+ Histories.Add(history);
+ }
}
private void SaveHistories()
@@ -67,7 +71,7 @@ public class ModMakerWindowVM
lps.Add(
new Line(nameof(history))
{
- new Sub("Id", history.Name),
+ new Sub("Id", history.Id),
new Sub("SourcePath", history.SourcePath),
new Sub("LastTime", history.LastTimeString)
}
@@ -77,7 +81,7 @@ public class ModMakerWindowVM
private void AddHistories(ModInfoModel modInfo)
{
- if (Histories.FirstOrDefault(h => h.Name == modInfo.Name.Value) is ModMakerHistory history)
+ if (Histories.FirstOrDefault(h => h.Id == modInfo.Id.Value) is ModMakerHistory history)
{
history.SourcePath = modInfo.SourcePath.Value;
history.LastTime = DateTime.Now;
@@ -87,7 +91,7 @@ public class ModMakerWindowVM
Histories.Add(
new()
{
- Name = modInfo.Name.Value,
+ Id = modInfo.Id.Value,
SourcePath = modInfo.SourcePath.Value,
LastTime = DateTime.Now,
}
@@ -100,7 +104,7 @@ public class ModMakerWindowVM
if (string.IsNullOrEmpty(value))
ShowHistories.Value = Histories;
else
- ShowHistories.Value = new(Histories.Where(i => i.Name.Contains(value)));
+ ShowHistories.Value = new(Histories.Where(i => i.Id.Contains(value)));
}
public void CreateNewMod()
diff --git a/VPet.ModMaker/Views/ModEdit/ClickTextEdit/ClickTextEditWindow.xaml b/VPet.ModMaker/Views/ModEdit/ClickTextEdit/ClickTextEditWindow.xaml
index fa60ee2..50a6022 100644
--- a/VPet.ModMaker/Views/ModEdit/ClickTextEdit/ClickTextEditWindow.xaml
+++ b/VPet.ModMaker/Views/ModEdit/ClickTextEdit/ClickTextEditWindow.xaml
@@ -35,7 +35,7 @@
Grid.Column="1"
pu:TextBoxHelper.Watermark="Id"
Style="{StaticResource TextBox_Wrap}"
- Text="{Binding ClickText.Value.Name.Value, UpdateSourceTrigger=PropertyChanged}"
+ Text="{Binding ClickText.Value.Id.Value, UpdateSourceTrigger=PropertyChanged}"
TextWrapping="Wrap" />
i.Name.Value == ViewModel.ClickText.Value.Name.Value
+ i => i.Id.Value == ViewModel.ClickText.Value.Id.Value
)
)
{
diff --git a/VPet.ModMaker/Views/ModEdit/ClickTextEdit/ClickTextPage.xaml b/VPet.ModMaker/Views/ModEdit/ClickTextEdit/ClickTextPage.xaml
index 081e9e0..663dc3b 100644
--- a/VPet.ModMaker/Views/ModEdit/ClickTextEdit/ClickTextPage.xaml
+++ b/VPet.ModMaker/Views/ModEdit/ClickTextEdit/ClickTextPage.xaml
@@ -44,11 +44,11 @@
+ SortMemberPath="Id.Value">
diff --git a/VPet.ModMaker/Views/ModEdit/FoodEdit/FoodEditWindow.xaml b/VPet.ModMaker/Views/ModEdit/FoodEdit/FoodEditWindow.xaml
index 5389d36..e8d23cb 100644
--- a/VPet.ModMaker/Views/ModEdit/FoodEdit/FoodEditWindow.xaml
+++ b/VPet.ModMaker/Views/ModEdit/FoodEdit/FoodEditWindow.xaml
@@ -72,7 +72,7 @@
+ Text="{Binding Food.Value.Id.Value, UpdateSourceTrigger=PropertyChanged}" />
i.Name == ViewModel.Food.Value.Name)
+ ViewModel.OldFood?.Id.Value != ViewModel.Food.Value.Id.Value
+ && ModInfoModel.Current.Foods.Any(i => i.Id == ViewModel.Food.Value.Id)
)
{
MessageBox.Show("此Id已存在", "", MessageBoxButton.OK, MessageBoxImage.Warning);
diff --git a/VPet.ModMaker/Views/ModEdit/FoodEdit/FoodPage.xaml b/VPet.ModMaker/Views/ModEdit/FoodEdit/FoodPage.xaml
index 9d08560..501b869 100644
--- a/VPet.ModMaker/Views/ModEdit/FoodEdit/FoodPage.xaml
+++ b/VPet.ModMaker/Views/ModEdit/FoodEdit/FoodPage.xaml
@@ -43,10 +43,10 @@
+ SortMemberPath="Id.Value">
diff --git a/VPet.ModMaker/Views/ModEdit/LowTextEdit/LowTextEditWindow.xaml b/VPet.ModMaker/Views/ModEdit/LowTextEdit/LowTextEditWindow.xaml
index 71a7927..fe1ff9b 100644
--- a/VPet.ModMaker/Views/ModEdit/LowTextEdit/LowTextEditWindow.xaml
+++ b/VPet.ModMaker/Views/ModEdit/LowTextEdit/LowTextEditWindow.xaml
@@ -34,7 +34,7 @@
+ Text="{Binding LowText.Value.Id.Value, UpdateSourceTrigger=PropertyChanged}" />
i.Name.Value == ViewModel.LowText.Value.Name.Value
+ i => i.Id.Value == ViewModel.LowText.Value.Id.Value
)
)
{
diff --git a/VPet.ModMaker/Views/ModEdit/LowTextEdit/LowTextPage.xaml b/VPet.ModMaker/Views/ModEdit/LowTextEdit/LowTextPage.xaml
index 93e40db..ae8ed9f 100644
--- a/VPet.ModMaker/Views/ModEdit/LowTextEdit/LowTextPage.xaml
+++ b/VPet.ModMaker/Views/ModEdit/LowTextEdit/LowTextPage.xaml
@@ -45,11 +45,11 @@
+ SortMemberPath="Id.Value">
diff --git a/VPet.ModMaker/Views/ModEdit/ModEditWindow.xaml b/VPet.ModMaker/Views/ModEdit/ModEditWindow.xaml
index 7062b15..686f235 100644
--- a/VPet.ModMaker/Views/ModEdit/ModEditWindow.xaml
+++ b/VPet.ModMaker/Views/ModEdit/ModEditWindow.xaml
@@ -143,40 +143,58 @@
-
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/VPet.ModMaker/Views/ModEdit/WorkEdit/WorkEditWindow.xaml.cs b/VPet.ModMaker/Views/ModEdit/WorkEdit/WorkEditWindow.xaml.cs
index 3ae8080..a6218ff 100644
--- a/VPet.ModMaker/Views/ModEdit/WorkEdit/WorkEditWindow.xaml.cs
+++ b/VPet.ModMaker/Views/ModEdit/WorkEdit/WorkEditWindow.xaml.cs
@@ -29,6 +29,10 @@ public partial class WorkEditWindow : Window
{
InitializeComponent();
DataContext = new WorkEditWindowVM();
+ Closed += (s, e) =>
+ {
+ ViewModel.Close();
+ };
}
private void Button_Cancel_Click(object sender, RoutedEventArgs e)
diff --git a/VPet.ModMaker/Views/ModEdit/WorkEdit/WorkPage.xaml b/VPet.ModMaker/Views/ModEdit/WorkEdit/WorkPage.xaml
index c7937fe..85e2a1a 100644
--- a/VPet.ModMaker/Views/ModEdit/WorkEdit/WorkPage.xaml
+++ b/VPet.ModMaker/Views/ModEdit/WorkEdit/WorkPage.xaml
@@ -41,7 +41,7 @@
x:Name="ComboBox_Pet"
Grid.Column="1"
pu:ComboBoxHelper.Watermark="{ll:Str 选择宠物}"
- DisplayMemberPath="Name.Value"
+ DisplayMemberPath="Id.Value"
ItemsSource="{Binding Pets}"
SelectedItem="{Binding CurrentPet.Value}">
diff --git a/VPet.ModMaker/Views/ModMakerWindow.xaml b/VPet.ModMaker/Views/ModMakerWindow.xaml
index b9e813d..50c3767 100644
--- a/VPet.ModMaker/Views/ModMakerWindow.xaml
+++ b/VPet.ModMaker/Views/ModMakerWindow.xaml
@@ -68,7 +68,7 @@