2023-10-26 05:46:22 -04:00
package funkin . ui . debug . charting . handlers ;
2022-10-26 01:14:29 -04:00
2023-09-25 23:24:07 -04:00
import funkin . play . stage . StageData . StageDataParser ;
import funkin . play . stage . StageData ;
import funkin . play . character . CharacterData ;
import funkin . play . character . CharacterData . CharacterDataParser ;
2023-09-12 23:37:07 -04:00
import haxe . ui . components . HorizontalSlider ;
2023-08-14 23:13:12 -04:00
import haxe . ui . containers . TreeView ;
import haxe . ui . containers . TreeViewNode ;
2022-12-17 15:19:42 -05:00
import funkin . play . character . BaseCharacter . CharacterType ;
2023-01-22 19:55:30 -05:00
import funkin . play . event . SongEvent ;
2024-01-03 21:10:14 -05:00
import funkin . data . event . SongEventSchema ;
2023-09-08 17:46:44 -04:00
import funkin . data . song . SongData . SongTimeChange ;
2023-10-26 05:46:22 -04:00
import funkin . play . character . BaseCharacter . CharacterType ;
2023-09-25 23:24:07 -04:00
import funkin . play . character . CharacterData ;
import funkin . play . character . CharacterData . CharacterDataParser ;
2023-01-22 19:55:30 -05:00
import funkin . play . event . SongEvent ;
2022-12-17 15:19:42 -05:00
import funkin . play . song . SongSerializer ;
2023-10-26 05:46:22 -04:00
import funkin . play . stage . StageData ;
import funkin . play . stage . StageData . StageDataParser ;
2023-11-24 00:42:07 -05:00
import haxe . ui . RuntimeComponentBuilder ;
2023-10-26 05:46:22 -04:00
import funkin . ui . debug . charting . util . ChartEditorDropdowns ;
2023-01-22 19:55:30 -05:00
import funkin . ui . haxeui . components . CharacterPlayer ;
2023-09-25 23:24:07 -04:00
import funkin . util . FileUtil ;
2022-12-17 15:19:42 -05:00
import haxe . ui . components . Button ;
2024-01-03 19:53:17 -05:00
import haxe . ui . data . ArrayDataSource ;
2023-01-22 19:55:30 -05:00
import haxe . ui . components . CheckBox ;
2022-10-26 01:14:29 -04:00
import haxe . ui . components . DropDown ;
2023-10-26 05:46:22 -04:00
import haxe . ui . components . HorizontalSlider ;
2023-01-22 19:55:30 -05:00
import haxe . ui . components . Label ;
import haxe . ui . components . NumberStepper ;
import haxe . ui . components . Slider ;
import haxe . ui . components . TextField ;
import haxe . ui . containers . Box ;
2023-06-08 16:48:34 -04:00
import haxe . ui . containers . dialogs . CollapsibleDialog ;
import haxe . ui . containers . dialogs . Dialog . DialogButton ;
import haxe . ui . containers . dialogs . Dialog . DialogEvent ;
2023-12-12 05:24:43 -05:00
import funkin . ui . debug . charting . toolboxes . ChartEditorBaseToolbox ;
import funkin . ui . debug . charting . toolboxes . ChartEditorMetadataToolbox ;
2024-01-03 19:53:17 -05:00
import funkin . ui . debug . charting . toolboxes . ChartEditorEventDataToolbox ;
2023-10-26 05:46:22 -04:00
import haxe . ui . containers . Frame ;
import haxe . ui . containers . Grid ;
import haxe . ui . containers . TreeView ;
import haxe . ui . containers . TreeViewNode ;
2023-01-22 19:55:30 -05:00
import haxe . ui . core . Component ;
2022-10-26 01:14:29 -04:00
import haxe . ui . events . UIEvent ;
2023-06-08 16:48:34 -04:00
/ * *
* Static functions which handle building themed UI elements for a p r o v i d e d C h a r t E d i t o r S t a t e .
* /
2023-08-31 18:47:23 -04:00
@ : nullSafety
2023-10-26 05:46:22 -04:00
@ : access ( funkin . ui . debug . charting . ChartEditorState )
2022-10-26 01:14:29 -04:00
class ChartEditorToolboxHandler
{
2023-01-22 19:55:30 -05:00
public static function setToolboxState ( state : ChartEditorState , id : String , shown : Bool ) : Void
{
2023-06-08 16:48:34 -04:00
if ( shown )
{
showToolbox ( state , id ) ;
}
2023-01-22 19:55:30 -05:00
e lse
2023-06-08 16:48:34 -04:00
{
2023-01-22 19:55:30 -05:00
hideToolbox ( state , id ) ;
2023-06-08 16:48:34 -04:00
}
2023-01-22 19:55:30 -05:00
}
2023-06-08 16:48:34 -04:00
public static function showToolbox ( state : ChartEditorState , id : String ) : Void
2023-01-22 19:55:30 -05:00
{
2023-08-31 18:47:23 -04:00
var toolbox: Null < CollapsibleDialog > = state . activeToolboxes . get ( id ) ;
2023-01-22 19:55:30 -05:00
2023-01-22 22:25:45 -05:00
if ( toolbox == null ) toolbox = initToolbox ( state , id ) ;
2023-01-22 19:55:30 -05:00
if ( toolbox != null )
{
toolbox . showDialog ( false ) ;
2023-08-14 23:13:12 -04:00
2023-10-26 05:46:22 -04:00
state . playSound ( Paths . sound ( ' c h a r t i n g S o u n d s / o p e n W i n d o w ' ) ) ;
2023-10-11 19:39:52 -04:00
2023-08-14 23:13:12 -04:00
switch ( id )
{
c ase ChartEditorState . CHART_EDITOR_TOOLBOX_NOTEDATA_LAYOUT :
onShowToolboxNoteData ( state , toolbox ) ;
2024-01-03 19:53:17 -05:00
c ase ChartEditorState . CHART_EDITOR_TOOLBOX_EVENT_DATA_LAYOUT :
// TODO: Fix this.
cast ( toolbox , ChartEditorBaseToolbox ) . refresh ( ) ;
2023-12-10 03:37:12 -05:00
c ase ChartEditorState . CHART_EDITOR_TOOLBOX_PLAYTEST_PROPERTIES_LAYOUT :
onShowToolboxPlaytestProperties ( state , toolbox ) ;
2023-08-14 23:13:12 -04:00
c ase ChartEditorState . CHART_EDITOR_TOOLBOX_DIFFICULTY_LAYOUT :
onShowToolboxDifficulty ( state , toolbox ) ;
c ase ChartEditorState . CHART_EDITOR_TOOLBOX_METADATA_LAYOUT :
2023-12-12 05:24:43 -05:00
// TODO: Fix this.
cast ( toolbox , ChartEditorBaseToolbox ) . refresh ( ) ;
2023-08-14 23:13:12 -04:00
c ase ChartEditorState . CHART_EDITOR_TOOLBOX_PLAYER_PREVIEW_LAYOUT :
onShowToolboxPlayerPreview ( state , toolbox ) ;
c ase ChartEditorState . CHART_EDITOR_TOOLBOX_OPPONENT_PREVIEW_LAYOUT :
onShowToolboxOpponentPreview ( state , toolbox ) ;
d efault :
// This happens if you try to load an unknown layout.
trace ( ' C h a r t E d i t o r T o o l b o x H a n d l e r . s h o w T o o l b o x ( ) - U n k n o w n t o o l b o x I D : $ id ' ) ;
}
2023-01-22 19:55:30 -05:00
}
e lse
{
trace ( ' C h a r t E d i t o r T o o l b o x H a n d l e r . s h o w T o o l b o x ( ) - C o u l d n o t r e t r i e v e t o o l b o x : $ id ' ) ;
}
}
public static function hideToolbox ( state : ChartEditorState , id : String ) : Void
{
2023-08-31 18:47:23 -04:00
var toolbox: Null < CollapsibleDialog > = state . activeToolboxes . get ( id ) ;
2023-01-22 19:55:30 -05:00
2023-01-22 22:25:45 -05:00
if ( toolbox == null ) toolbox = initToolbox ( state , id ) ;
2023-01-22 19:55:30 -05:00
if ( toolbox != null )
{
toolbox . hideDialog ( DialogButton . CANCEL ) ;
2023-08-14 23:13:12 -04:00
2023-10-26 05:46:22 -04:00
state . playSound ( Paths . sound ( ' c h a r t i n g S o u n d s / e x i t W i n d o w ' ) ) ;
2023-10-11 19:39:52 -04:00
2023-08-14 23:13:12 -04:00
switch ( id )
{
c ase ChartEditorState . CHART_EDITOR_TOOLBOX_NOTEDATA_LAYOUT :
onHideToolboxNoteData ( state , toolbox ) ;
2024-01-03 19:53:17 -05:00
c ase ChartEditorState . CHART_EDITOR_TOOLBOX_EVENT_DATA_LAYOUT :
2023-08-14 23:13:12 -04:00
onHideToolboxEventData ( state , toolbox ) ;
2023-12-10 03:37:12 -05:00
c ase ChartEditorState . CHART_EDITOR_TOOLBOX_PLAYTEST_PROPERTIES_LAYOUT :
onHideToolboxPlaytestProperties ( state , toolbox ) ;
2023-08-14 23:13:12 -04:00
c ase ChartEditorState . CHART_EDITOR_TOOLBOX_DIFFICULTY_LAYOUT :
onHideToolboxDifficulty ( state , toolbox ) ;
c ase ChartEditorState . CHART_EDITOR_TOOLBOX_METADATA_LAYOUT :
onHideToolboxMetadata ( state , toolbox ) ;
c ase ChartEditorState . CHART_EDITOR_TOOLBOX_PLAYER_PREVIEW_LAYOUT :
onHideToolboxPlayerPreview ( state , toolbox ) ;
c ase ChartEditorState . CHART_EDITOR_TOOLBOX_OPPONENT_PREVIEW_LAYOUT :
onHideToolboxOpponentPreview ( state , toolbox ) ;
d efault :
// This happens if you try to load an unknown layout.
trace ( ' C h a r t E d i t o r T o o l b o x H a n d l e r . h i d e T o o l b o x ( ) - U n k n o w n t o o l b o x I D : $ id ' ) ;
}
2023-01-22 19:55:30 -05:00
}
e lse
{
trace ( ' C h a r t E d i t o r T o o l b o x H a n d l e r . h i d e T o o l b o x ( ) - C o u l d n o t r e t r i e v e t o o l b o x : $ id ' ) ;
}
}
2023-12-12 05:24:43 -05:00
public static function refreshToolbox ( state : ChartEditorState , id : String ) : Void
{
var toolbox: Null < ChartEditorBaseToolbox > = cast state . activeToolboxes . get ( id ) ;
if ( toolbox == null ) return ;
if ( toolbox != null )
{
toolbox . refresh ( ) ;
}
e lse
{
trace ( ' C h a r t E d i t o r T o o l b o x H a n d l e r . r e f r e s h T o o l b o x ( ) - C o u l d n o t r e t r i e v e t o o l b o x : $ id ' ) ;
}
}
2023-10-17 16:57:06 -04:00
public static function rememberOpenToolboxes ( state : ChartEditorState ) : Void { }
public static function openRememberedToolboxes ( state : ChartEditorState ) : Void { }
public static function hideAllToolboxes ( state : ChartEditorState ) : Void
{
for ( toolbox in state . activeToolboxes . values ( ) )
{
toolbox . hideDialog ( DialogButton . CANCEL ) ;
}
}
2023-06-08 16:48:34 -04:00
public static function minimizeToolbox ( state : ChartEditorState , id : String ) : Void
{
2023-08-31 18:47:23 -04:00
var toolbox: Null < CollapsibleDialog > = state . activeToolboxes . get ( id ) ;
2023-06-08 16:48:34 -04:00
if ( toolbox == null ) return ;
2023-01-22 19:55:30 -05:00
2023-06-08 16:48:34 -04:00
toolbox . minimized = true ;
}
2023-01-22 19:55:30 -05:00
2023-06-08 16:48:34 -04:00
public static function maximizeToolbox ( state : ChartEditorState , id : String ) : Void
2023-01-22 19:55:30 -05:00
{
2023-08-31 18:47:23 -04:00
var toolbox: Null < CollapsibleDialog > = state . activeToolboxes . get ( id ) ;
2023-06-08 16:48:34 -04:00
if ( toolbox == null ) return ;
toolbox . minimized = false ;
}
2023-08-31 18:47:23 -04:00
public static function initToolbox ( state : ChartEditorState , id : String ) : Null < CollapsibleDialog >
2023-06-08 16:48:34 -04:00
{
2023-08-31 18:47:23 -04:00
var toolbox: Null < CollapsibleDialog > = null ;
2023-01-22 19:55:30 -05:00
switch ( id )
{
c ase ChartEditorState . CHART_EDITOR_TOOLBOX_NOTEDATA_LAYOUT :
toolbox = buildToolboxNoteDataLayout ( state ) ;
2024-01-03 19:53:17 -05:00
c ase ChartEditorState . CHART_EDITOR_TOOLBOX_EVENT_DATA_LAYOUT :
2023-01-22 19:55:30 -05:00
toolbox = buildToolboxEventDataLayout ( state ) ;
2023-12-10 03:37:12 -05:00
c ase ChartEditorState . CHART_EDITOR_TOOLBOX_PLAYTEST_PROPERTIES_LAYOUT :
toolbox = buildToolboxPlaytestPropertiesLayout ( state ) ;
2023-01-22 19:55:30 -05:00
c ase ChartEditorState . CHART_EDITOR_TOOLBOX_DIFFICULTY_LAYOUT :
toolbox = buildToolboxDifficultyLayout ( state ) ;
c ase ChartEditorState . CHART_EDITOR_TOOLBOX_METADATA_LAYOUT :
toolbox = buildToolboxMetadataLayout ( state ) ;
c ase ChartEditorState . CHART_EDITOR_TOOLBOX_PLAYER_PREVIEW_LAYOUT :
2023-08-28 15:03:29 -04:00
toolbox = buildToolboxPlayerPreviewLayout ( state ) ;
2023-01-22 19:55:30 -05:00
c ase ChartEditorState . CHART_EDITOR_TOOLBOX_OPPONENT_PREVIEW_LAYOUT :
2023-08-28 15:03:29 -04:00
toolbox = buildToolboxOpponentPreviewLayout ( state ) ;
2023-01-22 19:55:30 -05:00
d efault :
// This happens if you try to load an unknown layout.
trace ( ' C h a r t E d i t o r T o o l b o x H a n d l e r . i n i t T o o l b o x ( ) - U n k n o w n t o o l b o x I D : $ id ' ) ;
toolbox = null ;
}
// This happens if the layout you try to load has a syntax error.
2023-01-22 22:25:45 -05:00
if ( toolbox == null ) return null ;
2023-01-22 19:55:30 -05:00
// Make sure we can reuse the toolbox later.
toolbox . destroyOnClose = false ;
state . activeToolboxes . set ( id , toolbox ) ;
return toolbox ;
}
2023-06-08 16:48:34 -04:00
/ * *
* Retrieve a toolbox by its layout ' s a s s e t I D .
* @ param state The ChartEditorState instance .
* @ param id The asset ID of the toolbox layout .
* @ return The toolbox .
* /
2023-12-12 05:24:43 -05:00
public static function getToolbox_OLD ( state : ChartEditorState , id : String ) : Null < CollapsibleDialog >
2023-01-22 19:55:30 -05:00
{
2023-08-31 18:47:23 -04:00
var toolbox: Null < CollapsibleDialog > = state . activeToolboxes . get ( id ) ;
2023-01-22 19:55:30 -05:00
// Initialize the toolbox without showing it.
2023-01-22 22:25:45 -05:00
if ( toolbox == null ) toolbox = initToolbox ( state , id ) ;
2023-01-22 19:55:30 -05:00
2023-12-12 05:24:43 -05:00
if ( toolbox == null ) throw ' C h a r t E d i t o r T o o l b o x H a n d l e r . g e t T o o l b o x _ O L D ( ) - C o u l d n o t r e t r i e v e o r b u i l d t o o l b o x : $ id ' ;
2023-08-28 15:03:29 -04:00
2023-01-22 19:55:30 -05:00
return toolbox ;
}
2023-12-12 05:24:43 -05:00
public static function getToolbox ( state : ChartEditorState , id : String ) : Null < ChartEditorBaseToolbox >
{
var toolbox: Null < CollapsibleDialog > = state . activeToolboxes . get ( id ) ;
// Initialize the toolbox without showing it.
if ( toolbox == null ) toolbox = initToolbox ( state , id ) ;
if ( toolbox == null ) throw ' C h a r t E d i t o r T o o l b o x H a n d l e r . g e t T o o l b o x ( ) - C o u l d n o t r e t r i e v e o r b u i l d t o o l b o x : $ id ' ;
return cast toolbox ;
}
2023-08-31 18:47:23 -04:00
static function buildToolboxNoteDataLayout ( state : ChartEditorState ) : Null < CollapsibleDialog >
2023-01-22 19:55:30 -05:00
{
2023-11-24 00:42:07 -05:00
var toolbox: CollapsibleDialog = cast RuntimeComponentBuilder . fromAsset ( ChartEditorState . CHART_EDITOR_TOOLBOX_NOTEDATA_LAYOUT ) ;
2023-01-22 19:55:30 -05:00
2023-01-22 22:25:45 -05:00
if ( toolbox == null ) return null ;
2023-01-22 19:55:30 -05:00
// Starting position.
toolbox . x = 75 ;
toolbox . y = 100 ;
2023-06-08 16:48:34 -04:00
toolbox . onDialogClosed = function ( event : DialogEvent ) {
2023-11-24 00:42:07 -05:00
state . menubarItemToggleToolboxNotes . selected = false ;
2023-01-22 19:55:30 -05:00
}
2023-08-31 18:47:23 -04:00
var toolboxNotesNoteKind: Null < DropDown > = toolbox . findComponent ( ' t o o l b o x N o t e s N o t e K i n d ' , DropDown ) ;
if ( toolboxNotesNoteKind == null ) throw ' C h a r t E d i t o r T o o l b o x H a n d l e r . b u i l d T o o l b o x N o t e D a t a L a y o u t ( ) - C o u l d n o t f i n d t o o l b o x N o t e s N o t e K i n d c o m p o n e n t . ' ;
var toolboxNotesCustomKindLabel: Null < Label > = toolbox . findComponent ( ' t o o l b o x N o t e s C u s t o m K i n d L a b e l ' , Label ) ;
if ( toolboxNotesCustomKindLabel == null )
throw ' C h a r t E d i t o r T o o l b o x H a n d l e r . b u i l d T o o l b o x N o t e D a t a L a y o u t ( ) - C o u l d n o t f i n d t o o l b o x N o t e s C u s t o m K i n d L a b e l c o m p o n e n t . ' ;
var toolboxNotesCustomKind: Null < TextField > = toolbox . findComponent ( ' t o o l b o x N o t e s C u s t o m K i n d ' , TextField ) ;
if ( toolboxNotesCustomKind == null ) throw ' C h a r t E d i t o r T o o l b o x H a n d l e r . b u i l d T o o l b o x N o t e D a t a L a y o u t ( ) - C o u l d n o t f i n d t o o l b o x N o t e s C u s t o m K i n d c o m p o n e n t . ' ;
2023-01-22 19:55:30 -05:00
2023-06-08 16:48:34 -04:00
toolboxNotesNoteKind . onChange = function ( event : UIEvent ) {
var isCustom: Bool = ( event . data . id == ' ~ C U S T O M ~ ' ) ;
2023-01-22 19:55:30 -05:00
if ( isCustom )
{
toolboxNotesCustomKindLabel . hidden = false ;
toolboxNotesCustomKind . hidden = false ;
2024-01-03 19:53:17 -05:00
state . noteKindToPlace = toolboxNotesCustomKind . text ;
2023-01-22 19:55:30 -05:00
}
e lse
{
toolboxNotesCustomKindLabel . hidden = true ;
toolboxNotesCustomKind . hidden = true ;
2024-01-03 19:53:17 -05:00
state . noteKindToPlace = event . data . id ;
2023-01-22 19:55:30 -05:00
}
}
2023-06-08 16:48:34 -04:00
toolboxNotesCustomKind . onChange = function ( event : UIEvent ) {
2024-01-03 19:53:17 -05:00
state . noteKindToPlace = toolboxNotesCustomKind . text ;
2023-01-22 19:55:30 -05:00
}
return toolbox ;
}
2023-08-14 23:13:12 -04:00
static function onShowToolboxNoteData ( state : ChartEditorState , toolbox : CollapsibleDialog ) : Void { }
static function onHideToolboxNoteData ( state : ChartEditorState , toolbox : CollapsibleDialog ) : Void { }
2024-01-03 19:53:17 -05:00
static function onHideToolboxMetadata ( state : ChartEditorState , toolbox : CollapsibleDialog ) : Void { }
2023-01-22 19:55:30 -05:00
2024-01-03 19:53:17 -05:00
static function onHideToolboxEventData ( state : ChartEditorState , toolbox : CollapsibleDialog ) : Void { }
2023-01-22 19:55:30 -05:00
2024-01-03 19:53:17 -05:00
static function onHideToolboxDifficulty ( state : ChartEditorState , toolbox : CollapsibleDialog ) : Void { }
2023-08-14 23:13:12 -04:00
2023-12-10 03:37:12 -05:00
static function onShowToolboxPlaytestProperties ( state : ChartEditorState , toolbox : CollapsibleDialog ) : Void { }
static function onHideToolboxPlaytestProperties ( state : ChartEditorState , toolbox : CollapsibleDialog ) : Void { }
static function buildToolboxPlaytestPropertiesLayout ( state : ChartEditorState ) : Null < CollapsibleDialog >
{
// fill with playtest properties
var toolbox: CollapsibleDialog = cast RuntimeComponentBuilder . fromAsset ( ChartEditorState . CHART_EDITOR_TOOLBOX_PLAYTEST_PROPERTIES_LAYOUT ) ;
if ( toolbox == null ) return null ;
2023-12-10 03:49:24 -05:00
toolbox . onDialogClosed = function ( _ ) {
state . menubarItemToggleToolboxPlaytestProperties . selected = false ;
}
2023-12-10 03:37:12 -05:00
var checkboxPracticeMode: Null < CheckBox > = toolbox . findComponent ( ' p r a c t i c e M o d e C h e c k b o x ' , CheckBox ) ;
if ( checkboxPracticeMode == null ) throw ' C h a r t E d i t o r T o o l b o x H a n d l e r . b u i l d T o o l b o x P l a y t e s t P r o p e r t i e s L a y o u t ( ) - C o u l d n o t f i n d p r a c t i c e M o d e C h e c k b o x c o m p o n e n t . ' ;
2023-12-12 17:07:28 -05:00
checkboxPracticeMode . selected = state . playtestPracticeMode ;
2023-12-10 03:37:12 -05:00
checkboxPracticeMode . onClick = _ - > {
state . playtestPracticeMode = checkboxPracticeMode . selected ;
} ;
2023-12-12 17:07:28 -05:00
var checkboxStartTime: Null < CheckBox > = toolbox . findComponent ( ' p l a y t e s t S t a r t T i m e C h e c k b o x ' , CheckBox ) ;
if ( checkboxStartTime == null )
throw ' C h a r t E d i t o r T o o l b o x H a n d l e r . b u i l d T o o l b o x P l a y t e s t P r o p e r t i e s L a y o u t ( ) - C o u l d n o t f i n d p l a y t e s t S t a r t T i m e C h e c k b o x c o m p o n e n t . ' ;
checkboxStartTime . selected = state . playtestStartTime ;
checkboxStartTime . onClick = _ - > {
state . playtestStartTime = checkboxStartTime . selected ;
} ;
2023-12-15 02:29:32 -05:00
var checkboxDebugger: Null < CheckBox > = toolbox . findComponent ( ' p l a y t e s t D e b u g g e r C h e c k b o x ' , CheckBox ) ;
if ( checkboxDebugger == null ) throw ' C h a r t E d i t o r T o o l b o x H a n d l e r . b u i l d T o o l b o x P l a y t e s t P r o p e r t i e s L a y o u t ( ) - C o u l d n o t f i n d p l a y t e s t D e b u g g e r C h e c k b o x c o m p o n e n t . ' ;
state . enabledDebuggerPopup = checkboxDebugger . selected ;
checkboxDebugger . onClick = _ - > {
state . enabledDebuggerPopup = checkboxDebugger . selected ;
} ;
2023-12-10 03:37:12 -05:00
return toolbox ;
}
2023-08-31 18:47:23 -04:00
static function buildToolboxDifficultyLayout ( state : ChartEditorState ) : Null < CollapsibleDialog >
2023-01-22 19:55:30 -05:00
{
2023-11-24 00:42:07 -05:00
var toolbox: CollapsibleDialog = cast RuntimeComponentBuilder . fromAsset ( ChartEditorState . CHART_EDITOR_TOOLBOX_DIFFICULTY_LAYOUT ) ;
2023-01-22 19:55:30 -05:00
2023-01-22 22:25:45 -05:00
if ( toolbox == null ) return null ;
2023-01-22 19:55:30 -05:00
// Starting position.
toolbox . x = 125 ;
toolbox . y = 200 ;
2023-06-08 16:48:34 -04:00
toolbox . onDialogClosed = function ( event : UIEvent ) {
2023-11-24 00:42:07 -05:00
state . menubarItemToggleToolboxDifficulty . selected = false ;
2023-01-22 19:55:30 -05:00
}
2023-09-25 23:24:07 -04:00
var difficultyToolboxAddVariation: Null < Button > = toolbox . findComponent ( ' d i f f i c u l t y T o o l b o x A d d V a r i a t i o n ' , Button ) ;
if ( difficultyToolboxAddVariation == null )
throw ' C h a r t E d i t o r T o o l b o x H a n d l e r . b u i l d T o o l b o x D i f f i c u l t y L a y o u t ( ) - C o u l d n o t f i n d d i f f i c u l t y T o o l b o x A d d V a r i a t i o n c o m p o n e n t . ' ;
var difficultyToolboxAddDifficulty: Null < Button > = toolbox . findComponent ( ' d i f f i c u l t y T o o l b o x A d d D i f f i c u l t y ' , Button ) ;
if ( difficultyToolboxAddDifficulty == null )
throw ' C h a r t E d i t o r T o o l b o x H a n d l e r . b u i l d T o o l b o x D i f f i c u l t y L a y o u t ( ) - C o u l d n o t f i n d d i f f i c u l t y T o o l b o x A d d D i f f i c u l t y c o m p o n e n t . ' ;
2023-08-31 18:47:23 -04:00
var difficultyToolboxSaveMetadata: Null < Button > = toolbox . findComponent ( ' d i f f i c u l t y T o o l b o x S a v e M e t a d a t a ' , Button ) ;
if ( difficultyToolboxSaveMetadata == null )
throw ' C h a r t E d i t o r T o o l b o x H a n d l e r . b u i l d T o o l b o x D i f f i c u l t y L a y o u t ( ) - C o u l d n o t f i n d d i f f i c u l t y T o o l b o x S a v e M e t a d a t a c o m p o n e n t . ' ;
var difficultyToolboxSaveChart: Null < Button > = toolbox . findComponent ( ' d i f f i c u l t y T o o l b o x S a v e C h a r t ' , Button ) ;
if ( difficultyToolboxSaveChart == null )
throw ' C h a r t E d i t o r T o o l b o x H a n d l e r . b u i l d T o o l b o x D i f f i c u l t y L a y o u t ( ) - C o u l d n o t f i n d d i f f i c u l t y T o o l b o x S a v e C h a r t c o m p o n e n t . ' ;
2023-09-25 23:24:07 -04:00
// var difficultyToolboxSaveAll:Null<Button> = toolbox.findComponent('difficultyToolboxSaveAll', Button);
// if (difficultyToolboxSaveAll == null) throw 'ChartEditorToolboxHandler.buildToolboxDifficultyLayout() - Could not find difficultyToolboxSaveAll component.';
2023-08-31 18:47:23 -04:00
var difficultyToolboxLoadMetadata: Null < Button > = toolbox . findComponent ( ' d i f f i c u l t y T o o l b o x L o a d M e t a d a t a ' , Button ) ;
if ( difficultyToolboxLoadMetadata == null )
throw ' C h a r t E d i t o r T o o l b o x H a n d l e r . b u i l d T o o l b o x D i f f i c u l t y L a y o u t ( ) - C o u l d n o t f i n d d i f f i c u l t y T o o l b o x L o a d M e t a d a t a c o m p o n e n t . ' ;
var difficultyToolboxLoadChart: Null < Button > = toolbox . findComponent ( ' d i f f i c u l t y T o o l b o x L o a d C h a r t ' , Button ) ;
if ( difficultyToolboxLoadChart == null )
throw ' C h a r t E d i t o r T o o l b o x H a n d l e r . b u i l d T o o l b o x D i f f i c u l t y L a y o u t ( ) - C o u l d n o t f i n d d i f f i c u l t y T o o l b o x L o a d C h a r t c o m p o n e n t . ' ;
2023-01-22 19:55:30 -05:00
2023-09-25 23:24:07 -04:00
difficultyToolboxAddVariation . onClick = function ( _ : UIEvent ) {
2023-10-26 05:46:22 -04:00
state . openAddVariationDialog ( true ) ;
2023-01-22 19:55:30 -05:00
} ;
2023-09-25 23:24:07 -04:00
difficultyToolboxAddDifficulty . onClick = function ( _ : UIEvent ) {
2023-10-26 05:46:22 -04:00
state . openAddDifficultyDialog ( true ) ;
2023-01-22 19:55:30 -05:00
} ;
2023-09-25 23:24:07 -04:00
difficultyToolboxSaveMetadata . onClick = function ( _ : UIEvent ) {
var vari: String = state . selectedVariation != Constants . DEFAULT_VARIATION ? ' - ${ state . selectedVariation } ' : ' ' ;
FileUtil . writeFileReference ( ' ${ state . currentSongId } $ vari - m e t a d a t a . j s o n ' , state . currentSongMetadata . serialize ( ) ) ;
2023-01-22 19:55:30 -05:00
} ;
2023-09-25 23:24:07 -04:00
difficultyToolboxSaveChart . onClick = function ( _ : UIEvent ) {
var vari: String = state . selectedVariation != Constants . DEFAULT_VARIATION ? ' - ${ state . selectedVariation } ' : ' ' ;
FileUtil . writeFileReference ( ' ${ state . currentSongId } $ vari - c h a r t . j s o n ' , state . currentSongChartData . serialize ( ) ) ;
} ;
difficultyToolboxLoadMetadata . onClick = function ( _ : UIEvent ) {
2023-01-22 19:55:30 -05:00
// Replace metadata for current variation.
2023-06-02 15:25:13 -04:00
SongSerializer . importSongMetadataAsync ( function ( songMetadata ) {
2023-01-22 19:55:30 -05:00
state . currentSongMetadata = songMetadata ;
} ) ;
} ;
2023-09-25 23:24:07 -04:00
difficultyToolboxLoadChart . onClick = function ( _ : UIEvent ) {
2023-01-22 19:55:30 -05:00
// Replace chart data for current variation.
2023-06-02 15:25:13 -04:00
SongSerializer . importSongChartDataAsync ( function ( songChartData ) {
2023-01-22 19:55:30 -05:00
state . currentSongChartData = songChartData ;
state . noteDisplayDirty = true ;
} ) ;
} ;
state . difficultySelectDirty = true ;
return toolbox ;
}
2023-08-14 23:13:12 -04:00
static function onShowToolboxDifficulty ( state : ChartEditorState , toolbox : CollapsibleDialog ) : Void
{
// Update the selected difficulty when reopening the toolbox.
2023-08-31 18:47:23 -04:00
var treeView: Null < TreeView > = toolbox . findComponent ( ' d i f f i c u l t y T o o l b o x T r e e ' ) ;
2023-08-14 23:13:12 -04:00
if ( treeView == null ) return ;
2023-08-31 18:47:23 -04:00
var current = state . getCurrentTreeDifficultyNode ( treeView ) ;
if ( current == null ) return ;
treeView . selectedNode = current ;
2023-08-14 23:13:12 -04:00
trace ( ' s e l e c t e d n o d e : ${ treeView . selectedNode } ' ) ;
}
2023-12-12 05:24:43 -05:00
static function buildToolboxMetadataLayout ( state : ChartEditorState ) : Null < ChartEditorBaseToolbox >
2023-01-22 19:55:30 -05:00
{
2023-12-12 05:24:43 -05:00
var toolbox: ChartEditorBaseToolbox = ChartEditorMetadataToolbox . build ( state ) ;
2023-01-22 19:55:30 -05:00
2023-01-22 22:25:45 -05:00
if ( toolbox == null ) return null ;
2023-01-22 19:55:30 -05:00
return toolbox ;
}
2024-01-03 19:53:17 -05:00
static function buildToolboxEventDataLayout ( state : ChartEditorState ) : Null < ChartEditorBaseToolbox >
{
var toolbox: ChartEditorBaseToolbox = ChartEditorEventDataToolbox . build ( state ) ;
if ( toolbox == null ) return null ;
return toolbox ;
}
2023-08-14 23:13:12 -04:00
2023-08-31 18:47:23 -04:00
static function buildToolboxPlayerPreviewLayout ( state : ChartEditorState ) : Null < CollapsibleDialog >
2023-01-22 19:55:30 -05:00
{
2023-11-24 00:42:07 -05:00
var toolbox: CollapsibleDialog = cast RuntimeComponentBuilder . fromAsset ( ChartEditorState . CHART_EDITOR_TOOLBOX_PLAYER_PREVIEW_LAYOUT ) ;
2023-01-22 19:55:30 -05:00
2023-01-22 22:25:45 -05:00
if ( toolbox == null ) return null ;
2023-01-22 19:55:30 -05:00
// Starting position.
toolbox . x = 200 ;
toolbox . y = 350 ;
2023-06-08 16:48:34 -04:00
toolbox . onDialogClosed = function ( event : DialogEvent ) {
2023-11-24 00:42:07 -05:00
state . menubarItemToggleToolboxPlayerPreview . selected = false ;
2023-01-22 19:55:30 -05:00
}
2023-08-31 18:47:23 -04:00
var charPlayer: Null < CharacterPlayer > = toolbox . findComponent ( ' c h a r P l a y e r ' ) ;
if ( charPlayer == null ) throw ' C h a r t E d i t o r T o o l b o x H a n d l e r . b u i l d T o o l b o x P l a y e r P r e v i e w L a y o u t ( ) - C o u l d n o t f i n d c h a r P l a y e r c o m p o n e n t . ' ;
2023-01-22 19:55:30 -05:00
// TODO: We need to implement character swapping in ChartEditorState.
charPlayer . loadCharacter ( ' b f ' ) ;
2023-06-08 16:48:34 -04:00
charPlayer . characterType = CharacterType . BF ;
2023-01-22 19:55:30 -05:00
charPlayer . flip = true ;
2023-06-08 16:48:34 -04:00
charPlayer . targetScale = 0.5 ;
2023-01-22 19:55:30 -05:00
return toolbox ;
}
2023-08-14 23:13:12 -04:00
static function onShowToolboxPlayerPreview ( state : ChartEditorState , toolbox : CollapsibleDialog ) : Void { }
static function onHideToolboxPlayerPreview ( state : ChartEditorState , toolbox : CollapsibleDialog ) : Void { }
2023-08-31 18:47:23 -04:00
static function buildToolboxOpponentPreviewLayout ( state : ChartEditorState ) : Null < CollapsibleDialog >
2023-01-22 19:55:30 -05:00
{
2023-11-24 00:42:07 -05:00
var toolbox: CollapsibleDialog = cast RuntimeComponentBuilder . fromAsset ( ChartEditorState . CHART_EDITOR_TOOLBOX_OPPONENT_PREVIEW_LAYOUT ) ;
2023-01-22 19:55:30 -05:00
2023-01-22 22:25:45 -05:00
if ( toolbox == null ) return null ;
2023-01-22 19:55:30 -05:00
// Starting position.
toolbox . x = 200 ;
toolbox . y = 350 ;
2023-06-08 16:30:45 -04:00
toolbox . onDialogClosed = ( event : DialogEvent ) - > {
2023-11-24 00:42:07 -05:00
state . menubarItemToggleToolboxOpponentPreview . selected = false ;
2023-01-22 19:55:30 -05:00
}
2023-08-31 18:47:23 -04:00
var charPlayer: Null < CharacterPlayer > = toolbox . findComponent ( ' c h a r P l a y e r ' ) ;
if ( charPlayer == null ) throw ' C h a r t E d i t o r T o o l b o x H a n d l e r . b u i l d T o o l b o x O p p o n e n t P r e v i e w L a y o u t ( ) - C o u l d n o t f i n d c h a r P l a y e r c o m p o n e n t . ' ;
2023-01-22 19:55:30 -05:00
// TODO: We need to implement character swapping in ChartEditorState.
charPlayer . loadCharacter ( ' d a d ' ) ;
2023-06-08 16:48:34 -04:00
charPlayer . characterType = CharacterType . DAD ;
2023-01-22 19:55:30 -05:00
charPlayer . flip = false ;
2023-06-08 16:48:34 -04:00
charPlayer . targetScale = 0.5 ;
2023-01-22 19:55:30 -05:00
return toolbox ;
}
2023-08-14 23:13:12 -04:00
static function onShowToolboxOpponentPreview ( state : ChartEditorState , toolbox : CollapsibleDialog ) : Void { }
static function onHideToolboxOpponentPreview ( state : ChartEditorState , toolbox : CollapsibleDialog ) : Void { }
2022-10-26 01:14:29 -04:00
}