Skip to content

Commit a39c137

Browse files
Added ability to move sub tracks/channels up/down
1 parent d71210b commit a39c137

File tree

4 files changed

+75
-8
lines changed

4 files changed

+75
-8
lines changed

MSUScripter/Services/ControlServices/MsuSongMsuPcmInfoPanelService.cs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.IO;
3+
using System.Linq;
34
using AvaloniaControls.ControlServices;
45
using MSUScripter.Configs;
56
using MSUScripter.ViewModels;
@@ -171,6 +172,49 @@ public void UpdateLoopSettings(PyMusicLooperResultViewModel loopResult)
171172
_model.TrimEnd = loopResult.LoopEnd;
172173
}
173174

175+
public void UpdateContextMenuOptions()
176+
{
177+
if (_model.IsTopLevel)
178+
{
179+
_model.CanMoveUp = false;
180+
_model.CanMoveDown = false;
181+
return;
182+
}
183+
184+
var parentObjectList = _model.IsSubChannel
185+
? _model.ParentMsuPcmInfo!.SubChannels.ToList()
186+
: _model.ParentMsuPcmInfo!.SubTracks.ToList();
187+
188+
_model.CanMoveUp = parentObjectList.IndexOf(_model) > 0;
189+
_model.CanMoveDown = parentObjectList.IndexOf(_model) < parentObjectList.Count - 1;
190+
}
191+
192+
public void MoveUp()
193+
{
194+
if (!_model.CanMoveUp) return;
195+
196+
var parentObjectList = _model.IsSubChannel
197+
? _model.ParentMsuPcmInfo!.SubChannels
198+
: _model.ParentMsuPcmInfo!.SubTracks;
199+
200+
var currentIndex = parentObjectList.IndexOf(_model);
201+
parentObjectList.Remove(_model);
202+
parentObjectList.Insert(currentIndex - 1, _model);
203+
}
204+
205+
public void MoveDown()
206+
{
207+
if (!_model.CanMoveDown) return;
208+
209+
var parentObjectList = _model.IsSubChannel
210+
? _model.ParentMsuPcmInfo!.SubChannels
211+
: _model.ParentMsuPcmInfo!.SubTracks;
212+
213+
var currentIndex = parentObjectList.IndexOf(_model);
214+
parentObjectList.Remove(_model);
215+
parentObjectList.Insert(currentIndex + 1, _model);
216+
}
217+
174218
public bool HasLoopDetails()
175219
{
176220
return _model.Loop > 0 || _model.TrimEnd > 0;

MSUScripter/ViewModels/MsuSongMsuPcmInfoViewModel.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,9 @@ public MsuSongMsuPcmInfoViewModel TopLevel
108108
return topModel ?? this;
109109
}
110110
}
111+
112+
[SkipConvert, Reactive] public bool CanMoveUp { get; set; }
113+
[SkipConvert, Reactive] public bool CanMoveDown { get; set; }
111114

112115
public bool CanDelete => !IsTopLevel;
113116

MSUScripter/Views/MsuSongMsuPcmInfoPanel.axaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,12 @@
6767
<MenuItem Header="Paste MsuPcm++ Details from Clipboard" Name="PasteMenuItem"
6868
Click="PasteMenuItem_OnClick"
6969
></MenuItem>
70+
<MenuItem Header="Move Up" Name="MoveUpMenuItem" IsEnabled="{Binding CanMoveUp}" IsVisible="{Binding !IsTopLevel}"
71+
Click="MoveUpMenuItem_OnClick"
72+
></MenuItem>
73+
<MenuItem Header="Move Down" Name="MoveDownMenuItem" IsEnabled="{Binding CanMoveDown}" IsVisible="{Binding !IsTopLevel}"
74+
Click="MoveDownMenuItem_OnClick"
75+
></MenuItem>
7076
<MenuItem Header="{Binding RemoveText}" Name="RemoveButton" IsVisible="{Binding CanDelete}"
7177
Click="RemoveButton_OnClick"
7278
></MenuItem>

MSUScripter/Views/MsuSongMsuPcmInfoPanel.axaml.cs

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -152,10 +152,7 @@ private async void MenuButton_OnClick(object? sender, RoutedEventArgs e)
152152
return;
153153
}
154154

155-
if (contextMenu.Items.FirstOrDefault(x => x is MenuItem { Name: "PasteMenuItem" }) is MenuItem pasteMenuItem)
156-
{
157-
pasteMenuItem.IsEnabled = !string.IsNullOrEmpty((await this.GetClipboardAsync())?.Trim());
158-
}
155+
await UpdateContextMenu(contextMenu);
159156

160157
contextMenu.PlacementTarget = button;
161158
contextMenu.Open();
@@ -198,10 +195,7 @@ private async void ContextMenu_OnOpening(object? sender, CancelEventArgs e)
198195
return;
199196
}
200197

201-
if (contextMenu.Items.FirstOrDefault(x => x is MenuItem { Name: "PasteMenuItem" }) is MenuItem pasteMenuItem)
202-
{
203-
pasteMenuItem.IsEnabled = !string.IsNullOrEmpty((await this.GetClipboardAsync())?.Trim());
204-
}
198+
await UpdateContextMenu(contextMenu);
205199
}
206200

207201
private void Insert_OnClick(object? sender, RoutedEventArgs e)
@@ -228,4 +222,24 @@ private void FileControl_OnOnUpdated(object? sender, FileControlUpdatedEventArgs
228222
{
229223
_service?.ImportAudioMetadata();
230224
}
225+
226+
private async Task UpdateContextMenu(ContextMenu contextMenu)
227+
{
228+
if (contextMenu.Items.FirstOrDefault(x => x is MenuItem { Name: "PasteMenuItem" }) is MenuItem pasteMenuItem)
229+
{
230+
pasteMenuItem.IsEnabled = !string.IsNullOrEmpty((await this.GetClipboardAsync())?.Trim());
231+
}
232+
233+
_service?.UpdateContextMenuOptions();
234+
}
235+
236+
private void MoveUpMenuItem_OnClick(object? sender, RoutedEventArgs e)
237+
{
238+
_service?.MoveUp();
239+
}
240+
241+
private void MoveDownMenuItem_OnClick(object? sender, RoutedEventArgs e)
242+
{
243+
_service?.MoveDown();
244+
}
231245
}

0 commit comments

Comments
 (0)