Skip to content

Commit c4ea81d

Browse files
committed
support save/load drawingTargets' render order and visible
1 parent eb0958c commit c4ea81d

File tree

7 files changed

+250
-143
lines changed

7 files changed

+250
-143
lines changed

OngekiFumenEditor/App.config

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,9 @@
221221
<setting name="LimitFPS" serializeAs="String">
222222
<value>-1</value>
223223
</setting>
224+
<setting name="RenderTargetOrderVisibleMap" serializeAs="String">
225+
<value />
226+
</setting>
224227
</OngekiFumenEditor.Properties.EditorGlobalSetting>
225228
<OngekiFumenEditor.Properties.AudioPlayerToolViewerSetting>
226229
<setting name="ResampleSize" serializeAs="String">

OngekiFumenEditor/Kernel/KeyBinding/DefaultKeyBindingManager.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@ private class Config
2929

3030
private Dictionary<string, KeyBindingDefinition> definitionMap = new();
3131

32+
private JsonSerializerOptions serializerOptions = new JsonSerializerOptions()
33+
{
34+
WriteIndented = true,
35+
Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
36+
};
37+
3238
[ImportingConstructor]
3339
public DefaultKeyBindingManager([ImportMany] KeyBindingDefinition[] definations)
3440
{
@@ -42,7 +48,7 @@ public DefaultKeyBindingManager([ImportMany] KeyBindingDefinition[] definations)
4248

4349
public void SaveConfig()
4450
{
45-
var json = JsonSerializer.Serialize(new Config() { KeyBindings = definitionMap.ToDictionary(x => x.Key, x => KeyBindingDefinition.FormatToExpression(x.Value.Key, x.Value.Modifiers)) });
51+
var json = JsonSerializer.Serialize(new Config() { KeyBindings = definitionMap.ToDictionary(x => x.Key, x => KeyBindingDefinition.FormatToExpression(x.Value.Key, x.Value.Modifiers)) }, serializerOptions);
4652
File.WriteAllText(jsonConfigFilePath, json);
4753

4854
Log.LogInfo($"Saved.");
@@ -121,7 +127,7 @@ private static ModifierKeys GetActualModifiers(Key key, ModifierKeys modifiers)
121127

122128
public void ChangeKeyBinding(KeyBindingDefinition definition, Key newKey, ModifierKeys newModifier)
123129
{
124-
Log.LogInfo($"[{definition.Key}] {KeyBindingDefinition.FormatToExpression(definition.Key, definition.Modifiers)} --> {KeyBindingDefinition.FormatToExpression(newKey, newModifier)}");
130+
Log.LogInfo($"[{definition.Name}] {KeyBindingDefinition.FormatToExpression(definition.Key, definition.Modifiers)} --> {KeyBindingDefinition.FormatToExpression(newKey, newModifier)}");
125131

126132
definition.Key = newKey;
127133
definition.Modifiers = newModifier;

OngekiFumenEditor/Modules/FumenEditorRenderControlViewer/ViewModels/FumenEditorRenderControlViewerViewModel.cs

Lines changed: 148 additions & 141 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
using Gemini.Framework.Services;
44
using OngekiFumenEditor.Kernel.Graphics;
55
using OngekiFumenEditor.Modules.FumenVisualEditor.Graphics.Drawing;
6+
using OngekiFumenEditor.Modules.FumenVisualEditor.Kernel;
7+
using OngekiFumenEditor.Modules.FumenVisualEditor.ViewModels;
68
using OngekiFumenEditor.Properties;
79
using OngekiFumenEditor.Utils;
810
using System;
@@ -15,145 +17,150 @@
1517

1618
namespace OngekiFumenEditor.Modules.FumenEditorRenderControlViewer.ViewModels
1719
{
18-
[Export(typeof(IFumenEditorRenderControlViewer))]
19-
public class FumenEditorRenderControlViewerViewModel : Tool, IFumenEditorRenderControlViewer
20-
{
21-
private ListViewDragDropManager<ControlItem> listDragManager;
22-
23-
public class ControlItem : PropertyChangedBase
24-
{
25-
public ControlItem(IFumenEditorDrawingTarget target)
26-
{
27-
this.target = target;
28-
Name = target.GetType().Name.TrimEnd("DrawingTarget").TrimEnd("DrawTarget");
29-
}
30-
31-
public string Name { get; init; }
32-
private readonly IFumenEditorDrawingTarget target;
33-
34-
public IFumenEditorDrawingTarget Target => target;
35-
36-
public bool IsDesignEnable
37-
{
38-
get { return target.Visible.HasFlag(DrawingVisible.Design); }
39-
set
40-
{
41-
if (value)
42-
target.Visible |= DrawingVisible.Design;
43-
else
44-
target.Visible &= ~DrawingVisible.Design;
45-
NotifyOfPropertyChange(() => IsDesignEnable);
46-
}
47-
}
48-
49-
public bool IsPreviewEnable
50-
{
51-
get { return target.Visible.HasFlag(DrawingVisible.Preview); }
52-
set
53-
{
54-
if (value)
55-
target.Visible |= DrawingVisible.Preview;
56-
else
57-
target.Visible &= ~DrawingVisible.Preview;
58-
NotifyOfPropertyChange(() => IsPreviewEnable);
59-
}
60-
}
61-
62-
public int RenderOrder
63-
{
64-
get { return target.CurrentRenderOrder; }
65-
set
66-
{
67-
target.CurrentRenderOrder = value;
68-
NotifyOfPropertyChange(() => RenderOrder);
69-
}
70-
}
71-
72-
public override string ToString() => $"[{target.Visible}] : {Name}";
73-
}
74-
75-
public override PaneLocation PreferredLocation => PaneLocation.Right;
76-
77-
public ObservableCollection<ControlItem> ControlItems { get; } = new ObservableCollection<ControlItem>();
78-
79-
public FumenEditorRenderControlViewerViewModel()
80-
{
81-
DisplayName = Resources.FumenEditorRenderControlViewer;
82-
RebuildItems(false);
83-
}
84-
85-
private async void RebuildItems(bool sortByDefault)
86-
{
87-
ControlItems.Clear();
88-
89-
await IoC.Get<IDrawingManager>().WaitForGraphicsInitializationDone();
90-
var targets = IoC.GetAll<IFumenEditorDrawingTarget>().OrderBy(x => sortByDefault ? x.DefaultRenderOrder : x.CurrentRenderOrder).ToArray();
91-
ControlItems.AddRange(targets.Select(x => new ControlItem(x)));
92-
93-
UpdateRenderOrder();
94-
}
95-
96-
private void UpdateRenderOrder()
97-
{
98-
for (int i = 0; i < ControlItems.Count; i++)
99-
ControlItems[i].RenderOrder = i;
100-
}
101-
102-
public void ResetDefault()
103-
{
104-
RebuildItems(true);
105-
for (int i = 0; i < ControlItems.Count; i++)
106-
{
107-
ControlItems[i].Target.Visible = ControlItems[i].Target.DefaultVisible;
108-
ControlItems[i].Refresh();
109-
}
110-
}
111-
112-
public void OnListLoaded(FrameworkElement list)
113-
{
114-
listDragManager = new ListViewDragDropManager<ControlItem>(list as ListView);
115-
listDragManager.ShowDragAdorner = true;
116-
listDragManager.DragAdornerOpacity = 0.75f;
117-
118-
listDragManager.ProcessDrop += ListDragManager_ProcessDrop;
119-
120-
Log.LogDebug($"ListViewDragDropManager created.");
121-
}
122-
123-
private void ListDragManager_ProcessDrop(object sender, ProcessDropEventArgs<ControlItem> e)
124-
{
125-
// This shows how to customize the behavior of a drop.
126-
// Here we perform a swap, instead of just moving the dropped item.
127-
128-
int higherIdx = Math.Max(e.OldIndex, e.NewIndex);
129-
int lowerIdx = Math.Min(e.OldIndex, e.NewIndex);
130-
131-
if (lowerIdx < 0)
132-
{
133-
// The item came from the lower ListView
134-
// so just insert it.
135-
e.ItemsSource.Insert(higherIdx, e.DataItem);
136-
}
137-
else
138-
{
139-
// null values will cause an error when calling Move.
140-
// It looks like a bug in ObservableCollection to me.
141-
if (e.ItemsSource[lowerIdx] == null ||
142-
e.ItemsSource[higherIdx] == null)
143-
return;
144-
145-
// The item came from the ListView into which
146-
// it was dropped, so swap it with the item
147-
// at the target index.
148-
e.ItemsSource.Move(lowerIdx, higherIdx);
149-
e.ItemsSource.Move(higherIdx - 1, lowerIdx);
150-
}
151-
152-
UpdateRenderOrder();
153-
154-
// Set this to 'Move' so that the OnListViewDrop knows to
155-
// remove the item from the other ListView.
156-
e.Effects = DragDropEffects.Move;
157-
}
158-
}
20+
[Export(typeof(IFumenEditorRenderControlViewer))]
21+
public class FumenEditorRenderControlViewerViewModel : Tool, IFumenEditorRenderControlViewer
22+
{
23+
private ListViewDragDropManager<ControlItem> listDragManager;
24+
25+
public class ControlItem : PropertyChangedBase
26+
{
27+
public ControlItem(IFumenEditorDrawingTarget target)
28+
{
29+
this.target = target;
30+
Name = target.GetType().Name.TrimEnd("DrawingTarget").TrimEnd("DrawTarget");
31+
}
32+
33+
public string Name { get; init; }
34+
private readonly IFumenEditorDrawingTarget target;
35+
36+
public IFumenEditorDrawingTarget Target => target;
37+
38+
public bool IsDesignEnable
39+
{
40+
get { return target.Visible.HasFlag(DrawingVisible.Design); }
41+
set
42+
{
43+
if (value)
44+
target.Visible |= DrawingVisible.Design;
45+
else
46+
target.Visible &= ~DrawingVisible.Design;
47+
NotifyOfPropertyChange(() => IsDesignEnable);
48+
}
49+
}
50+
51+
public bool IsPreviewEnable
52+
{
53+
get { return target.Visible.HasFlag(DrawingVisible.Preview); }
54+
set
55+
{
56+
if (value)
57+
target.Visible |= DrawingVisible.Preview;
58+
else
59+
target.Visible &= ~DrawingVisible.Preview;
60+
NotifyOfPropertyChange(() => IsPreviewEnable);
61+
}
62+
}
63+
64+
public int RenderOrder
65+
{
66+
get { return target.CurrentRenderOrder; }
67+
set
68+
{
69+
target.CurrentRenderOrder = value;
70+
NotifyOfPropertyChange(() => RenderOrder);
71+
}
72+
}
73+
74+
public override string ToString() => $"[{target.Visible}] : {Name}";
75+
}
76+
77+
public override PaneLocation PreferredLocation => PaneLocation.Right;
78+
79+
public ObservableCollection<ControlItem> ControlItems { get; } = new ObservableCollection<ControlItem>();
80+
81+
public FumenEditorRenderControlViewerViewModel()
82+
{
83+
DisplayName = Resources.FumenEditorRenderControlViewer;
84+
RebuildItems(false);
85+
}
86+
87+
private async void RebuildItems(bool sortByDefault)
88+
{
89+
ControlItems.Clear();
90+
91+
await IoC.Get<IDrawingManager>().WaitForGraphicsInitializationDone();
92+
var targets = IoC.GetAll<IFumenEditorDrawingTarget>().OrderBy(x => sortByDefault ? x.DefaultRenderOrder : x.CurrentRenderOrder).ToArray();
93+
ControlItems.AddRange(targets.Select(x => new ControlItem(x)));
94+
95+
UpdateRenderOrder();
96+
}
97+
98+
private void UpdateRenderOrder()
99+
{
100+
for (int i = 0; i < ControlItems.Count; i++)
101+
ControlItems[i].RenderOrder = i;
102+
}
103+
104+
public void ResetDefault()
105+
{
106+
RebuildItems(true);
107+
for (int i = 0; i < ControlItems.Count; i++)
108+
{
109+
ControlItems[i].Target.Visible = ControlItems[i].Target.DefaultVisible;
110+
ControlItems[i].Refresh();
111+
}
112+
}
113+
114+
public void Save()
115+
{
116+
IoC.Get<IEditorDocumentManager>().CurrentActivatedEditor?.SaveRenderOrderVisible();
117+
}
118+
119+
public void OnListLoaded(FrameworkElement list)
120+
{
121+
listDragManager = new ListViewDragDropManager<ControlItem>(list as ListView);
122+
listDragManager.ShowDragAdorner = true;
123+
listDragManager.DragAdornerOpacity = 0.75f;
124+
125+
listDragManager.ProcessDrop += ListDragManager_ProcessDrop;
126+
127+
Log.LogDebug($"ListViewDragDropManager created.");
128+
}
129+
130+
private void ListDragManager_ProcessDrop(object sender, ProcessDropEventArgs<ControlItem> e)
131+
{
132+
// This shows how to customize the behavior of a drop.
133+
// Here we perform a swap, instead of just moving the dropped item.
134+
135+
int higherIdx = Math.Max(e.OldIndex, e.NewIndex);
136+
int lowerIdx = Math.Min(e.OldIndex, e.NewIndex);
137+
138+
if (lowerIdx < 0)
139+
{
140+
// The item came from the lower ListView
141+
// so just insert it.
142+
e.ItemsSource.Insert(higherIdx, e.DataItem);
143+
}
144+
else
145+
{
146+
// null values will cause an error when calling Move.
147+
// It looks like a bug in ObservableCollection to me.
148+
if (e.ItemsSource[lowerIdx] == null ||
149+
e.ItemsSource[higherIdx] == null)
150+
return;
151+
152+
// The item came from the ListView into which
153+
// it was dropped, so swap it with the item
154+
// at the target index.
155+
e.ItemsSource.Move(lowerIdx, higherIdx);
156+
e.ItemsSource.Move(higherIdx - 1, lowerIdx);
157+
}
158+
159+
UpdateRenderOrder();
160+
161+
// Set this to 'Move' so that the OnListViewDrop knows to
162+
// remove the item from the other ListView.
163+
e.Effects = DragDropEffects.Move;
164+
}
165+
}
159166
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using OngekiFumenEditor.Modules.FumenVisualEditor.Graphics.Drawing;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Text;
6+
using System.Threading.Tasks;
7+
8+
namespace OngekiFumenEditor.Modules.FumenVisualEditor.Base
9+
{
10+
public class RenderTargetOrderVisible
11+
{
12+
public int Order { get; set; }
13+
public DrawingVisible Visible { get; set; }
14+
}
15+
}

0 commit comments

Comments
 (0)