1
0
Fork 0
mirror of https://github.com/ppy/osu-tools.git synced 2025-06-11 02:13:33 +09:00

Use Bindable for the container's info dictionary

This commit is contained in:
srb2thepast 2023-02-14 17:43:00 -05:00
parent ec480adde8
commit a00657bc67
4 changed files with 64 additions and 37 deletions

View file

@ -34,7 +34,7 @@ namespace PerformanceCalculatorGUI.Screens.ObjectInspection
: base(ruleset, beatmap, mods)
{
difficultyHitObjects = difficultyCalculator.GetDifficultyHitObjects(beatmap, clockRate)
.Select(x => (CatchDifficultyHitObject)x).ToArray();
.Cast<CatchDifficultyHitObject>().ToArray();
focusedDiffHitBind = diffHitBind;
focusedDiffHitBind.ValueChanged += (ValueChangedEvent<DifficultyHitObject> newHit) => UpdateDebugList(debugValueList, newHit.NewValue);
}
@ -62,11 +62,15 @@ namespace PerformanceCalculatorGUI.Screens.ObjectInspection
if (curDiffHit == null) return;
CatchDifficultyHitObject catchDiffHit = (CatchDifficultyHitObject)curDiffHit;
string groupName = catchDiffHit.BaseObject.GetType().Name;
valueList.AddGroup(groupName, new string[] { "Fruit", "Droplet" });
valueList.SetValue(groupName, "Strain Time", catchDiffHit.StrainTime);
valueList.SetValue(groupName, "Normalized Position", catchDiffHit.NormalizedPosition);
valueList.UpdateValues();
Dictionary<string, Dictionary<string, object>> infoDict = valueList.InfoDictionary.Value;
infoDict[groupName] = new Dictionary<string, object> {
{ "Strain Time", catchDiffHit.StrainTime },
{ "Normalized Position", catchDiffHit.NormalizedPosition },
};
}
private partial class CatchObjectInspectorPlayfield : CatchEditorPlayfield

View file

@ -18,18 +18,21 @@ namespace PerformanceCalculatorGUI.Screens.ObjectInspection
{
public partial class ObjectDifficultyValuesContainer : Container
{
public Dictionary<string, Dictionary<string, object>> InfoDictionary;
public Bindable<Dictionary<string, Dictionary<string, object>>> InfoDictionary;
private Box bgBox;
private TextFlowContainer flowContainer;
private Bindable<DifficultyHitObject> focusedDiffHit = new Bindable<DifficultyHitObject>();
private Bindable<DifficultyHitObject> focusedDiffHit = new();
public ObjectDifficultyValuesContainer(Bindable<DifficultyHitObject> diffHitBind)
{
focusedDiffHit.BindTo(diffHitBind);
focusedDiffHit.ValueChanged += (ValueChangedEvent<DifficultyHitObject> hit) => UpdateValues();
focusedDiffHit.ValueChanged += (ValueChangedEvent<DifficultyHitObject> _) => UpdateValues();
InfoDictionary = new Dictionary<string, Dictionary<string, object>>();
InfoDictionary = new Bindable<Dictionary<string, Dictionary<string, object>>>
{
Value = new Dictionary<string, Dictionary<string, object>>()
};
RelativeSizeAxes = Axes.Y;
Width = 215;
}
@ -61,14 +64,14 @@ namespace PerformanceCalculatorGUI.Screens.ObjectInspection
public void UpdateValues()
{
flowContainer.Text = "";
foreach (KeyValuePair<string, Dictionary<string, object>> GroupPair in InfoDictionary)
foreach (KeyValuePair<string, Dictionary<string, object>> GroupPair in InfoDictionary.Value)
{
// Big text
string groupName = GroupPair.Key;
Dictionary<string, object> groupDict = GroupPair.Value;
flowContainer.AddText($"- {GroupPair.Key}\n", t =>
{
t.Font = OsuFont.Torus.With(weight: "Bold", size: 28);
t.Font = OsuFont.Torus.With(size: 28, weight: "Bold");
t.Colour = Colour4.Pink;
t.Shadow = true;
});
@ -77,14 +80,29 @@ namespace PerformanceCalculatorGUI.Screens.ObjectInspection
{
flowContainer.AddText($" {ValuePair.Key}:\n", t =>
{
t.Font = OsuFont.TorusAlternate.With(weight: "SemiBold", size: 21);
t.Font = OsuFont.TorusAlternate.With(size: 21, weight: "SemiBold");
t.Colour = Colour4.White;
t.Shadow = true;
t.Truncate = true;
});
flowContainer.AddText($" -> {ValuePair.Value}\n\n", t =>
// value formatting
object value = ValuePair.Value;
if (value is double val)
{
t.Font = OsuFont.TorusAlternate.With(weight: "SemiBold", size: 21);
value = Math.Truncate(val * 1000) / 1000;
}
if (value is float val2)
{
value = Math.Truncate(val2 * 1000) / 1000;
}
if (value is Vector2 val3)
{
value = new Vector2((float)(Math.Truncate(val3.X * 100) / 100), (float)Math.Truncate(val3.Y * 100) / 100);
}
flowContainer.AddText($" -> {value}\n\n", t =>
{
t.Font = OsuFont.TorusAlternate.With(size: 21, weight: "SemiBold");
t.Colour = Colour4.White;
t.Shadow = true;
});
@ -97,19 +115,19 @@ namespace PerformanceCalculatorGUI.Screens.ObjectInspection
overrides ??= Array.Empty<string>();
foreach (string other in overrides)
{
InfoDictionary.Remove(other);
InfoDictionary.Value.Remove(other);
}
InfoDictionary[name] = new Dictionary<string, object>();
InfoDictionary.Value[name] = new Dictionary<string, object>();
}
public bool GroupExists(string name)
{
return InfoDictionary.ContainsKey(name);
return InfoDictionary.Value.ContainsKey(name);
}
public void SetValue(string group, string name, object value)
{
InfoDictionary.TryGetValue(group, out var exists);
InfoDictionary.Value.TryGetValue(group, out var exists);
if (exists == null)
{
AddGroup(group);
@ -127,12 +145,12 @@ namespace PerformanceCalculatorGUI.Screens.ObjectInspection
value = new Vector2((float)(Math.Truncate(val3.X * 100) / 100), (float)Math.Truncate(val3.Y * 100) / 100);
}
InfoDictionary[group][name] = value;
InfoDictionary.Value[group][name] = value;
}
public object GetValue(string group, string name)
{
return InfoDictionary[group][name];
return InfoDictionary.Value[group][name];
}
}
}

View file

@ -67,27 +67,29 @@ namespace PerformanceCalculatorGUI.Screens.ObjectInspection
OsuHitObject baseHit = (OsuHitObject)osuDiffHit.BaseObject;
string groupName = osuDiffHit.BaseObject.GetType().Name;
Dictionary<string, Dictionary<string, object>> infoDict = valueList.InfoDictionary.Value;
valueList.AddGroup(groupName, new string[] { "Slider", "HitCircle", "Spinner" });
valueList.SetValue(groupName, "Position", baseHit.StackedPosition);
valueList.SetValue(groupName, "Strain Time", osuDiffHit.StrainTime);
valueList.SetValue(groupName, "Aim Difficulty", AimEvaluator.EvaluateDifficultyOf(osuDiffHit, true));
valueList.SetValue(groupName, "Speed Difficulty", SpeedEvaluator.EvaluateDifficultyOf(osuDiffHit));
valueList.SetValue(groupName, "Rhythm Diff", RhythmEvaluator.EvaluateDifficultyOf(osuDiffHit));
valueList.SetValue(groupName, "Flashlight Diff", FlashlightEvaluator.EvaluateDifficultyOf(osuDiffHit, false));
infoDict[groupName] = new Dictionary<string, object> {
{ "Position", baseHit.StackedPosition },
{ "Strain Time", osuDiffHit.StrainTime },
{ "Aim Difficulty", AimEvaluator.EvaluateDifficultyOf(osuDiffHit, true) },
{ "Speed Difficulty", SpeedEvaluator.EvaluateDifficultyOf(osuDiffHit) },
{ "Rhythm Diff",SpeedEvaluator.EvaluateDifficultyOf(osuDiffHit) },
{ "Flashlight Diff", SpeedEvaluator.EvaluateDifficultyOf(osuDiffHit)},
};
if (osuDiffHit.Angle is not null)
valueList.SetValue(groupName, "Angle", MathUtils.RadiansToDegrees(osuDiffHit.Angle.Value));
infoDict[groupName].Add("Angle", MathUtils.RadiansToDegrees(osuDiffHit.Angle.Value));
if (osuDiffHit.BaseObject is Slider)
{
valueList.SetValue(groupName, "FL Travel Time", FlashlightEvaluator.EvaluateDifficultyOf(osuDiffHit, false));
valueList.SetValue(groupName, "Travel Time", osuDiffHit.TravelTime);
valueList.SetValue(groupName, "Travel Distance", osuDiffHit.TravelDistance);
valueList.SetValue(groupName, "Min Jump Dist", osuDiffHit.MinimumJumpDistance);
valueList.SetValue(groupName, "Min Jump Time", osuDiffHit.MinimumJumpTime);
infoDict[groupName].Add("FL Travel Time", FlashlightEvaluator.EvaluateDifficultyOf(osuDiffHit, false));
infoDict[groupName].Add("Travel Time", osuDiffHit.TravelTime);
infoDict[groupName].Add("Travel Distance", osuDiffHit.TravelDistance);
infoDict[groupName].Add("Min Jump Dist", osuDiffHit.MinimumJumpDistance);
infoDict[groupName].Add("Min Jump Time", osuDiffHit.MinimumJumpTime);
}
valueList.UpdateValues();
}
private partial class OsuObjectInspectorPlayfield : OsuPlayfield

View file

@ -66,10 +66,13 @@ namespace PerformanceCalculatorGUI.Screens.ObjectInspection
string groupName = taikoDiffHit.BaseObject.GetType().Name;
valueList.AddGroup(groupName, new string[] { "Hit", "Swell", "DrumRoll" });
valueList.SetValue(groupName, "Delta Time", taikoDiffHit.DeltaTime);
valueList.SetValue(groupName, "Rhythm Difficulty", taikoDiffHit.Rhythm.Difficulty);
valueList.SetValue(groupName, "Rhythm Ratio", taikoDiffHit.Rhythm.Ratio);
valueList.UpdateValues();
Dictionary<string, Dictionary<string, object>> infoDict = valueList.InfoDictionary.Value;
infoDict[groupName] = new Dictionary<string, object> {
{ "Delta Time", taikoDiffHit.DeltaTime },
{ "Rhythm Difficulty", taikoDiffHit.Rhythm.Difficulty },
{ "Rhythm Ratio", taikoDiffHit.Rhythm.Ratio }
};
}
private partial class TaikoObjectInspectorPlayfield : TaikoPlayfield