Skip to content

Commit c950de9

Browse files
committed
Add Albums & Sticker Packs to Chart Editor metadata dialogues
1 parent 2ad5933 commit c950de9

File tree

4 files changed

+177
-8
lines changed

4 files changed

+177
-8
lines changed

source/funkin/ui/debug/charting/ChartEditorState.hx

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1527,6 +1527,44 @@ class ChartEditorState extends UIState // UIState derives from MusicBeatState
15271527
return currentSongMetadata.playData.noteStyle = value;
15281528
}
15291529

1530+
var currentSongAlbum(get, set):Null<String>;
1531+
1532+
function get_currentSongAlbum():Null<String>
1533+
{
1534+
if (currentSongMetadata.playData.album == null
1535+
|| currentSongMetadata.playData.album == ''
1536+
|| currentSongMetadata.playData.album == 'item')
1537+
{
1538+
// Initialize to the default value if not set.
1539+
currentSongMetadata.playData.album = Constants.DEFAULT_ALBUM_ID;
1540+
}
1541+
return currentSongMetadata.playData.album;
1542+
}
1543+
1544+
function set_currentSongAlbum(value:String):Null<String>
1545+
{
1546+
return currentSongMetadata.playData.album = value;
1547+
}
1548+
1549+
var currentSongStickerPack(get, set):Null<String>;
1550+
1551+
function get_currentSongStickerPack():Null<String>
1552+
{
1553+
if (currentSongMetadata.playData.stickerPack == null
1554+
|| currentSongMetadata.playData.stickerPack == ''
1555+
|| currentSongMetadata.playData.stickerPack == 'item')
1556+
{
1557+
// Initialize to the default value if not set.
1558+
currentSongMetadata.playData.stickerPack = Constants.DEFAULT_STICKER_PACK;
1559+
}
1560+
return currentSongMetadata.playData.stickerPack;
1561+
}
1562+
1563+
function set_currentSongStickerPack(value:String):Null<String>
1564+
{
1565+
return currentSongMetadata.playData.stickerPack = value;
1566+
}
1567+
15301568
var currentSongFreeplayPreviewStart(get, set):Int;
15311569

15321570
function get_currentSongFreeplayPreviewStart():Int

source/funkin/ui/debug/charting/handlers/ChartEditorDialogHandler.hx

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import funkin.ui.debug.charting.dialogs.ChartEditorWelcomeDialog;
1919
import funkin.ui.debug.charting.dialogs.ChartEditorUploadVocalsDialog;
2020
import funkin.ui.debug.charting.util.ChartEditorDropdowns;
2121
import funkin.util.Constants;
22-
import funkin.util.DateUtil;
2322
import funkin.util.FileUtil;
2423
import funkin.util.VersionUtil;
2524
import haxe.io.Path;
@@ -655,6 +654,24 @@ class ChartEditorDialogHandler
655654
var startingValueNoteStyle = ChartEditorDropdowns.populateDropdownWithNoteStyles(inputNoteStyle, newSongMetadata.playData.noteStyle);
656655
inputNoteStyle.value = startingValueNoteStyle;
657656

657+
var inputAlbum:Null<DropDown> = dialog.findComponent('inputAlbum', DropDown);
658+
if (inputAlbum == null) throw 'Could not locate inputAlbum DropDown in Song Metadata dialog';
659+
inputAlbum.onChange = (event:UIEvent) -> {
660+
if (event.data?.id == null) return;
661+
newSongMetadata.playData.album = event.data.id;
662+
};
663+
var startingValueAlbum = ChartEditorDropdowns.populateDropdownWithAlbums(inputAlbum, newSongMetadata.playData.album);
664+
inputAlbum.value = startingValueAlbum;
665+
666+
var inputStickerPack:Null<DropDown> = dialog.findComponent('inputStickerPack', DropDown);
667+
if (inputStickerPack == null) throw 'Could not locate inputStickerPack DropDown in Song Metadata dialog';
668+
inputStickerPack.onChange = (event:UIEvent) -> {
669+
if (event.data?.id == null) return;
670+
newSongMetadata.playData.stickerPack = event.data.id;
671+
};
672+
var startingValueStickerPack = ChartEditorDropdowns.populateDropdownWithStickerPacks(inputStickerPack, newSongMetadata.playData.stickerPack);
673+
inputStickerPack.value = startingValueStickerPack;
674+
658675
var inputCharacterPlayer:Null<DropDown> = dialog.findComponent('inputCharacterPlayer', DropDown);
659676
if (inputCharacterPlayer == null) throw 'ChartEditorToolboxHandler.buildToolboxMetadataLayout() - Could not find inputCharacterPlayer component.';
660677
inputCharacterPlayer.onChange = function(event:UIEvent) {
@@ -1208,6 +1225,16 @@ class ChartEditorDialogHandler
12081225
var startingValueNoteStyle = ChartEditorDropdowns.populateDropdownWithNoteStyles(dialogNoteStyle, state.currentSongMetadata.playData.noteStyle);
12091226
dialogNoteStyle.value = startingValueNoteStyle;
12101227

1228+
var dialogAlbum:Null<DropDown> = dialog.findComponent('dialogAlbum', DropDown);
1229+
if (dialogAlbum == null) throw 'Could not locate dialogAlbum DropDown in Add Variation dialog';
1230+
var startingValueAlbum = ChartEditorDropdowns.populateDropdownWithAlbums(dialogAlbum, state.currentSongMetadata.playData.album);
1231+
dialogAlbum.value = startingValueAlbum;
1232+
1233+
var dialogStickerPack:Null<DropDown> = dialog.findComponent('dialogStickerPack', DropDown);
1234+
if (dialogStickerPack == null) throw 'Could not locate dialogStickerPack DropDown in Add Variation dialog';
1235+
var startingValueStickerPack = ChartEditorDropdowns.populateDropdownWithStickerPacks(dialogStickerPack, state.currentSongMetadata.playData.stickerPack);
1236+
dialogAlbum.value = startingValueStickerPack;
1237+
12111238
var dialogCharacterPlayer:Null<DropDown> = dialog.findComponent('dialogCharacterPlayer', DropDown);
12121239
if (dialogCharacterPlayer == null) throw 'Could not locate dialogCharacterPlayer DropDown in Add Variation dialog';
12131240
dialogCharacterPlayer.value = ChartEditorDropdowns.populateDropdownWithCharacters(dialogCharacterPlayer, CharacterType.BF,
@@ -1243,6 +1270,8 @@ class ChartEditorDialogHandler
12431270

12441271
pendingVariation.playData.stage = dialogStage.value.id;
12451272
pendingVariation.playData.noteStyle = dialogNoteStyle.value.id;
1273+
pendingVariation.playData.album = dialogAlbum.value.id;
1274+
pendingVariation.playData.stickerPack = dialogStickerPack.value.id;
12461275
pendingVariation.timeChanges[0].bpm = dialogBPM.value;
12471276

12481277
state.songMetadata.set(pendingVariation.variation, pendingVariation);

source/funkin/ui/debug/charting/toolboxes/ChartEditorMetadataToolbox.hx

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package funkin.ui.debug.charting.toolboxes;
33
#if FEATURE_CHART_EDITOR
44
import funkin.play.character.BaseCharacter.CharacterType;
55
import funkin.data.character.CharacterData;
6+
import funkin.data.freeplay.album.AlbumRegistry;
67
import funkin.data.song.importer.ChartManifestData;
78
import funkin.data.stage.StageRegistry;
89
import funkin.data.notestyle.NoteStyleRegistry;
@@ -11,6 +12,7 @@ import funkin.ui.debug.charting.commands.AddNewTimeChangeCommand;
1112
import funkin.ui.debug.charting.commands.ModifyTimeChangeCommand;
1213
import funkin.ui.debug.charting.commands.RemoveTimeChangeCommand;
1314
import funkin.ui.debug.charting.util.ChartEditorDropdowns;
15+
import funkin.ui.freeplay.Album;
1416
import haxe.ui.components.Button;
1517
import haxe.ui.components.DropDown;
1618
import haxe.ui.components.Label;
@@ -35,6 +37,8 @@ class ChartEditorMetadataToolbox extends ChartEditorBaseToolbox
3537
var inputSongCharter:TextField;
3638
var inputStage:DropDown;
3739
var inputNoteStyle:DropDown;
40+
var inputAlbum:DropDown;
41+
var inputStickerPack:DropDown;
3842
var buttonCharacterPlayer:Button;
3943
var buttonCharacterGirlfriend:Button;
4044
var buttonCharacterOpponent:Button;
@@ -148,6 +152,28 @@ class ChartEditorMetadataToolbox extends ChartEditorBaseToolbox
148152
var startingValueNoteStyle = ChartEditorDropdowns.populateDropdownWithNoteStyles(inputNoteStyle, chartEditorState.currentSongMetadata.playData.noteStyle);
149153
inputNoteStyle.value = startingValueNoteStyle;
150154

155+
inputAlbum.onChange = (event:UIEvent) -> {
156+
var valid:Bool = event.data != null && event.data.id != null;
157+
158+
if (valid)
159+
{
160+
chartEditorState.currentSongAlbum = event.data.id;
161+
}
162+
}
163+
var startingValueAlbum = ChartEditorDropdowns.populateDropdownWithAlbums(inputAlbum, chartEditorState.currentSongMetadata.playData?.album);
164+
inputAlbum.value = startingValueAlbum;
165+
166+
inputStickerPack.onChange = (event:UIEvent) -> {
167+
var valid:Bool = event.data != null && event.data.id != null;
168+
169+
if (valid)
170+
{
171+
chartEditorState.currentSongStickerPack = event.data.id;
172+
}
173+
}
174+
var startingValueStickerPack = ChartEditorDropdowns.populateDropdownWithStickerPacks(inputStickerPack, chartEditorState.currentSongMetadata.playData?.stickerPack);
175+
inputStickerPack.value = startingValueStickerPack;
176+
151177
inputTimeChange.onChange = function(event:UIEvent) {
152178
var currentTimeChange = refreshTimeChangeInputs();
153179
var previousTimeChange = chartEditorState.currentSongMetadata.timeChanges[inputTimeChange.selectedIndex - 1];
@@ -319,6 +345,7 @@ class ChartEditorMetadataToolbox extends ChartEditorBaseToolbox
319345
inputSongCharter.value = chartEditorState.currentSongMetadata.charter;
320346
inputStage.value = chartEditorState.currentSongMetadata.playData.stage;
321347
inputNoteStyle.value = chartEditorState.currentSongMetadata.playData.noteStyle;
348+
inputAlbum.value = chartEditorState.currentSongMetadata.playData.album;
322349
inputDifficultyRating.value = chartEditorState.currentSongChartDifficultyRating;
323350
inputScrollSpeed.value = chartEditorState.currentSongChartScrollSpeed;
324351
labelScrollSpeed.text = 'Scroll Speed: ${chartEditorState.currentSongChartScrollSpeed}x';
@@ -345,6 +372,15 @@ class ChartEditorMetadataToolbox extends ChartEditorBaseToolbox
345372
{id: "Funkin", text: "Funkin'"};
346373
}
347374

375+
var albumId:String = chartEditorState.currentSongAlbum;
376+
var album:Null<Album> = AlbumRegistry.instance.fetchEntry(albumId);
377+
if (inputAlbum != null)
378+
{
379+
inputAlbum.value = (album != null) ?
380+
{id: album.id, text: album.getAlbumName()} :
381+
{id: "volume1", text: "Volume 1"};
382+
}
383+
348384
var LIMIT = 6;
349385

350386
var charDataOpponent:Null<CharacterData> = CharacterDataParser.fetchCharacterData(chartEditorState.currentSongMetadata.playData.characters.opponent);

source/funkin/ui/debug/charting/util/ChartEditorDropdowns.hx

Lines changed: 73 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
11
package funkin.ui.debug.charting.util;
22

33
#if FEATURE_CHART_EDITOR
4+
import funkin.data.character.CharacterData;
5+
import funkin.data.character.CharacterData.CharacterDataParser;
6+
import funkin.data.event.SongEventRegistry;
7+
import funkin.data.freeplay.album.AlbumRegistry;
48
import funkin.data.notestyle.NoteStyleRegistry;
5-
import funkin.play.notes.notestyle.NoteStyle;
69
import funkin.data.song.SongData.SongTimeChange;
7-
import funkin.play.event.SongEvent;
810
import funkin.data.stage.StageRegistry;
9-
import funkin.data.character.CharacterData;
10-
import haxe.ui.components.DropDown;
11-
import funkin.play.stage.Stage;
11+
import funkin.data.stickers.StickerRegistry;
1212
import funkin.play.character.BaseCharacter.CharacterType;
13-
import funkin.data.event.SongEventRegistry;
14-
import funkin.data.character.CharacterData.CharacterDataParser;
13+
import funkin.play.event.SongEvent;
14+
import funkin.play.notes.notestyle.NoteStyle;
15+
import funkin.play.stage.Stage;
16+
import funkin.ui.freeplay.Album;
17+
import funkin.ui.transition.stickers.StickerPack;
18+
import haxe.ui.components.DropDown;
1519

1620
/**
1721
* Functions for populating dropdowns based on game data.
@@ -188,6 +192,68 @@ class ChartEditorDropdowns
188192
return returnValue;
189193
}
190194

195+
/**
196+
* Populate a dropdown with a list of albums.
197+
*/
198+
public static function populateDropdownWithAlbums(dropDown:DropDown, startingAlbumId:Null<String>):DropDownEntry
199+
{
200+
startingAlbumId = startingAlbumId ?? Constants.DEFAULT_ALBUM_ID;
201+
dropDown.dataSource.clear();
202+
203+
var albumIds:Array<String> = AlbumRegistry.instance.listEntryIds();
204+
205+
var returnValue:DropDownEntry = {id: "volume1", text: "Volume 1"};
206+
207+
for (albumId in albumIds)
208+
{
209+
var album:Null<Album> = AlbumRegistry.instance.fetchEntry(albumId);
210+
if (album == null) continue;
211+
212+
// Check if the album has all necessary assets (art and title)
213+
if (album._data?.albumArtAsset == null || album._data?.albumTitleAsset == null) continue;
214+
215+
var value = {id: albumId, text: album.getAlbumName()};
216+
if (startingAlbumId == albumId) returnValue = value;
217+
218+
dropDown.dataSource.add(value);
219+
}
220+
221+
dropDown.dataSource.sort('text', ASCENDING);
222+
223+
return returnValue;
224+
}
225+
226+
/**
227+
* Populate a dropdown with a list of sticker packs.
228+
*/
229+
public static function populateDropdownWithStickerPacks(dropDown:DropDown, startingStickerPackId:Null<String>):DropDownEntry
230+
{
231+
startingStickerPackId = startingStickerPackId ?? Constants.DEFAULT_STICKER_PACK;
232+
dropDown.dataSource.clear();
233+
234+
var stickerPackIds:Array<String> = StickerRegistry.instance.listEntryIds();
235+
236+
var returnValue:DropDownEntry = {id: "default", text: "Default"};
237+
238+
for (stickerPackId in stickerPackIds)
239+
{
240+
var stickerPack:Null<StickerPack> = StickerRegistry.instance.fetchEntry(stickerPackId);
241+
if (stickerPack == null) continue;
242+
243+
// Check if the sticker has all necessary assets (stickers)
244+
if (stickerPack._data?.stickers == null) continue;
245+
246+
var value = {id: stickerPackId, text: stickerPack.getStickerPackName()};
247+
if (startingStickerPackId == stickerPackId) returnValue = value;
248+
249+
dropDown.dataSource.add(value);
250+
}
251+
252+
dropDown.dataSource.sort('text', ASCENDING);
253+
254+
return returnValue;
255+
}
256+
191257
public static final NOTE_KINDS:Map<String, String> = [
192258
// Base
193259
"" => "Default",

0 commit comments

Comments
 (0)