From b37d9d2cd7068dc175afa3814578ed7b6154c477 Mon Sep 17 00:00:00 2001 From: 0thElement Date: Fri, 26 Jan 2024 20:32:26 +0900 Subject: [PATCH] Compose: Add QOL keybinds --- Assets/Scenes/Compose.unity | 502 ++++++++++++++++-- .../Components/Fields/TimingGroupField.cs | 15 +- .../Compose/EventsEditor/Group/GroupTable.cs | 28 + Assets/Scripts/Compose/Grid/GridService.cs | 15 + .../Scripts/Compose/Popups/IPopupsService.cs | 3 +- .../Popups/Picker/TimingGroupPicker.cs | 28 +- .../Scripts/Compose/Popups/PopupsService.cs | 4 +- .../Scripts/Compose/Project/ProjectService.cs | 16 + .../Compose/Selection/InspectorMenu.cs | 10 + .../Compose/Selection/SelectionService.cs | 3 + .../Compose/Timeline/TimelineService.cs | 26 +- Assets/StreamingAssets/Locales/en-us.yml | 7 + 12 files changed, 611 insertions(+), 46 deletions(-) diff --git a/Assets/Scenes/Compose.unity b/Assets/Scenes/Compose.unity index 8e5ca15b..a39c9925 100644 --- a/Assets/Scenes/Compose.unity +++ b/Assets/Scenes/Compose.unity @@ -6561,32 +6561,32 @@ PrefabInstance: - target: {fileID: 3014758101193431086, guid: e67fadbf328492f099eb1ebbf30f8022, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3014758101193431086, guid: e67fadbf328492f099eb1ebbf30f8022, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3014758101193431086, guid: e67fadbf328492f099eb1ebbf30f8022, type: 3} propertyPath: m_SizeDelta.x - value: 87.5 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3014758101193431086, guid: e67fadbf328492f099eb1ebbf30f8022, type: 3} propertyPath: m_SizeDelta.y - value: 16 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3014758101193431086, guid: e67fadbf328492f099eb1ebbf30f8022, type: 3} propertyPath: m_AnchoredPosition.x - value: 175 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3014758101193431086, guid: e67fadbf328492f099eb1ebbf30f8022, type: 3} propertyPath: m_AnchoredPosition.y - value: -13 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3014758101762927650, guid: e67fadbf328492f099eb1ebbf30f8022, type: 3} @@ -6596,7 +6596,7 @@ PrefabInstance: - target: {fileID: 3014758101762927650, guid: e67fadbf328492f099eb1ebbf30f8022, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3014758101762927650, guid: e67fadbf328492f099eb1ebbf30f8022, type: 3} @@ -6606,27 +6606,27 @@ PrefabInstance: - target: {fileID: 3014758101762927650, guid: e67fadbf328492f099eb1ebbf30f8022, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3014758101762927650, guid: e67fadbf328492f099eb1ebbf30f8022, type: 3} propertyPath: m_SizeDelta.x - value: 87.5 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3014758101762927650, guid: e67fadbf328492f099eb1ebbf30f8022, type: 3} propertyPath: m_SizeDelta.y - value: 16 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3014758101762927650, guid: e67fadbf328492f099eb1ebbf30f8022, type: 3} propertyPath: m_AnchoredPosition.x - value: 87.5 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3014758101762927650, guid: e67fadbf328492f099eb1ebbf30f8022, type: 3} propertyPath: m_AnchoredPosition.y - value: -13 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3014758102323890174, guid: e67fadbf328492f099eb1ebbf30f8022, type: 3} @@ -7198,6 +7198,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: waveformDisplay: {fileID: 559529294} + gameplayData: {fileID: 11400000, guid: ae19a07671eb9dc748d6346649a697b7, type: 2} timingMarker: {fileID: 1230096822} returnTimingMarker: {fileID: 1759389850} pauseButton: {fileID: 6258816206211466886} @@ -7522,6 +7523,7 @@ RectTransform: - {fileID: 953208644} - {fileID: 1120448178} - {fileID: 1045470005} + - {fileID: 191154194} m_Father: {fileID: 1527298068} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -9700,6 +9702,143 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 +--- !u!1001 &191154193 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 169807681} + m_Modifications: + - target: {fileID: 6258816205848568548, guid: b478ebaa3ae36f1fe9dc18ef70e70acc, + type: 3} + propertyPath: m_Name + value: SelectNotes + objectReference: {fileID: 0} + - target: {fileID: 6258816205848568549, guid: b478ebaa3ae36f1fe9dc18ef70e70acc, + type: 3} + propertyPath: m_Pivot.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6258816205848568549, guid: b478ebaa3ae36f1fe9dc18ef70e70acc, + type: 3} + propertyPath: m_Pivot.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6258816205848568549, guid: b478ebaa3ae36f1fe9dc18ef70e70acc, + type: 3} + propertyPath: m_RootOrder + value: 3 + objectReference: {fileID: 0} + - target: {fileID: 6258816205848568549, guid: b478ebaa3ae36f1fe9dc18ef70e70acc, + type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6258816205848568549, guid: b478ebaa3ae36f1fe9dc18ef70e70acc, + type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6258816205848568549, guid: b478ebaa3ae36f1fe9dc18ef70e70acc, + type: 3} + propertyPath: m_AnchorMin.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6258816205848568549, guid: b478ebaa3ae36f1fe9dc18ef70e70acc, + type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6258816205848568549, guid: b478ebaa3ae36f1fe9dc18ef70e70acc, + type: 3} + propertyPath: m_SizeDelta.x + value: 30 + objectReference: {fileID: 0} + - target: {fileID: 6258816205848568549, guid: b478ebaa3ae36f1fe9dc18ef70e70acc, + type: 3} + propertyPath: m_SizeDelta.y + value: 30 + objectReference: {fileID: 0} + - target: {fileID: 6258816205848568549, guid: b478ebaa3ae36f1fe9dc18ef70e70acc, + type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6258816205848568549, guid: b478ebaa3ae36f1fe9dc18ef70e70acc, + type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6258816205848568549, guid: b478ebaa3ae36f1fe9dc18ef70e70acc, + type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6258816205848568549, guid: b478ebaa3ae36f1fe9dc18ef70e70acc, + type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6258816205848568549, guid: b478ebaa3ae36f1fe9dc18ef70e70acc, + type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6258816205848568549, guid: b478ebaa3ae36f1fe9dc18ef70e70acc, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6258816205848568549, guid: b478ebaa3ae36f1fe9dc18ef70e70acc, + type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6258816205848568549, guid: b478ebaa3ae36f1fe9dc18ef70e70acc, + type: 3} + propertyPath: m_AnchoredPosition.x + value: -5 + objectReference: {fileID: 0} + - target: {fileID: 6258816205848568549, guid: b478ebaa3ae36f1fe9dc18ef70e70acc, + type: 3} + propertyPath: m_AnchoredPosition.y + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 6258816205848568549, guid: b478ebaa3ae36f1fe9dc18ef70e70acc, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6258816205848568549, guid: b478ebaa3ae36f1fe9dc18ef70e70acc, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6258816205848568549, guid: b478ebaa3ae36f1fe9dc18ef70e70acc, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: b478ebaa3ae36f1fe9dc18ef70e70acc, type: 3} +--- !u!224 &191154194 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 6258816205848568549, guid: b478ebaa3ae36f1fe9dc18ef70e70acc, + type: 3} + m_PrefabInstance: {fileID: 191154193} + m_PrefabAsset: {fileID: 0} +--- !u!114 &191154195 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 6258816205848568570, guid: b478ebaa3ae36f1fe9dc18ef70e70acc, + type: 3} + m_PrefabInstance: {fileID: 191154193} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1001 &191210415 PrefabInstance: m_ObjectHideFlags: 0 @@ -14931,6 +15070,140 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 736760963e16abb4b8380762d9ff92e9, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!1 &250100797 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 250100798} + - component: {fileID: 250100800} + - component: {fileID: 250100799} + m_Layer: 11 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &250100798 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 250100797} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 798655814} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -10, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &250100799 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 250100797} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Title + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: fc246767bf759519bb5f459275194444, type: 2} + m_sharedMaterial: {fileID: 3714936077332224653, guid: fc246767bf759519bb5f459275194444, + type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 12 + m_fontSizeBase: 12 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &250100800 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 250100797} + m_CullTransparentMesh: 0 --- !u!1 &250581191 stripped GameObject: m_CorrespondingSourceObject: {fileID: 6622026399764894585, guid: cf5bf9d09dff6245d97b77acfd0e0b52, @@ -42674,6 +42947,81 @@ Transform: m_Father: {fileID: 1022165531} m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &798655813 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 798655814} + - component: {fileID: 798655816} + - component: {fileID: 798655815} + m_Layer: 11 + m_Name: TitleFrame + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &798655814 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 798655813} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 250100798} + m_Father: {fileID: 1377351379} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 4, y: 20} + m_Pivot: {x: 0.5, y: 0} +--- !u!114 &798655815 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 798655813} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.10980393, g: 0.10980393, b: 0.10980393, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &798655816 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 798655813} + m_CullTransparentMesh: 0 --- !u!1001 &799790055 PrefabInstance: m_ObjectHideFlags: 0 @@ -47937,8 +48285,8 @@ GameObject: m_Component: - component: {fileID: 940952970} - component: {fileID: 940952972} - - component: {fileID: 940952971} - component: {fileID: 940952973} + - component: {fileID: 940952971} m_Layer: 11 m_Name: Hints m_TagString: Untagged @@ -47953,17 +48301,17 @@ RectTransform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 940952969} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] - m_Father: {fileID: 2092054170} + m_Father: {fileID: 1217571762} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} + m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 20} + m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0} --- !u!114 &940952971 MonoBehaviour: @@ -47978,7 +48326,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} - m_Color: {r: 0.18431373, g: 0.18431373, b: 0.18431373, a: 1} + m_Color: {r: 0, g: 0, b: 0, a: 0.011764706} m_RaycastTarget: 1 m_Maskable: 1 m_OnCullStateChanged: @@ -54860,7 +55208,7 @@ MonoBehaviour: m_EditorClassIdentifier: m_Padding: m_Left: 10 - m_Right: 0 + m_Right: 40 m_Top: 5 m_Bottom: 5 m_ChildAlignment: 0 @@ -58270,6 +58618,7 @@ MonoBehaviour: gameplayData: {fileID: 11400000, guid: ae19a07671eb9dc748d6346649a697b7, type: 2} addButton: {fileID: 931944249} removeButton: {fileID: 434247403} + selectButton: {fileID: 191154195} editingTimingGroupField: {fileID: 8358422144209520221} --- !u!114 &1120448182 MonoBehaviour: @@ -61506,6 +61855,81 @@ MonoBehaviour: m_EditorClassIdentifier: id: Compose.UI.Project.Label.SyncBaseBPM readIdFromContent: 0 +--- !u!1 &1217571761 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1217571762} + - component: {fileID: 1217571765} + - component: {fileID: 1217571764} + m_Layer: 11 + m_Name: HintFrame + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1217571762 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1217571761} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 940952970} + m_Father: {fileID: 2092054170} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 20} + m_Pivot: {x: 0.5, y: 0} +--- !u!114 &1217571764 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1217571761} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.18431373, g: 0.18431373, b: 0.18431373, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1217571765 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1217571761} + m_CullTransparentMesh: 0 --- !u!1 &1220010405 GameObject: m_ObjectHideFlags: 0 @@ -67809,6 +68233,7 @@ RectTransform: - {fileID: 1336924022} - {fileID: 332246035} - {fileID: 769915974} + - {fileID: 798655814} m_Father: {fileID: 2016334273} m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -67853,6 +68278,8 @@ MonoBehaviour: canvasRect: {fileID: 2016334273} minDistanceFromBorder: 10 numberField: {fileID: 4596395660596855910} + title: {fileID: 250100799} + titleFrame: {fileID: 798655813} --- !u!225 &1377351382 CanvasGroup: m_ObjectHideFlags: 0 @@ -72572,8 +72999,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 181.85712, y: 0} - m_SizeDelta: {x: 363.71423, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 1} --- !u!114 &1505927680 MonoBehaviour: @@ -74523,8 +74950,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 215.26575, y: 0} - m_SizeDelta: {x: 276.89697, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 1} --- !u!114 &1554505476 MonoBehaviour: @@ -88102,6 +88529,7 @@ MonoBehaviour: m_Bits: 2048 inspectorWindow: {fileID: 405529745} inspectorMenu: {fileID: 405529754} + timingGroupPicker: {fileID: 1377351381} rangeSelectPreview: {fileID: 957675523} --- !u!4 &1809673899 Transform: @@ -92301,32 +92729,32 @@ PrefabInstance: - target: {fileID: 3014758101193431086, guid: e67fadbf328492f099eb1ebbf30f8022, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3014758101193431086, guid: e67fadbf328492f099eb1ebbf30f8022, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3014758101193431086, guid: e67fadbf328492f099eb1ebbf30f8022, type: 3} propertyPath: m_SizeDelta.x - value: 87.5 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3014758101193431086, guid: e67fadbf328492f099eb1ebbf30f8022, type: 3} propertyPath: m_SizeDelta.y - value: 16 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3014758101193431086, guid: e67fadbf328492f099eb1ebbf30f8022, type: 3} propertyPath: m_AnchoredPosition.x - value: 175 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3014758101193431086, guid: e67fadbf328492f099eb1ebbf30f8022, type: 3} propertyPath: m_AnchoredPosition.y - value: -13 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3014758101762927650, guid: e67fadbf328492f099eb1ebbf30f8022, type: 3} @@ -92336,7 +92764,7 @@ PrefabInstance: - target: {fileID: 3014758101762927650, guid: e67fadbf328492f099eb1ebbf30f8022, type: 3} propertyPath: m_AnchorMax.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3014758101762927650, guid: e67fadbf328492f099eb1ebbf30f8022, type: 3} @@ -92346,27 +92774,27 @@ PrefabInstance: - target: {fileID: 3014758101762927650, guid: e67fadbf328492f099eb1ebbf30f8022, type: 3} propertyPath: m_AnchorMin.y - value: 1 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3014758101762927650, guid: e67fadbf328492f099eb1ebbf30f8022, type: 3} propertyPath: m_SizeDelta.x - value: 87.5 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3014758101762927650, guid: e67fadbf328492f099eb1ebbf30f8022, type: 3} propertyPath: m_SizeDelta.y - value: 16 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3014758101762927650, guid: e67fadbf328492f099eb1ebbf30f8022, type: 3} propertyPath: m_AnchoredPosition.x - value: 87.5 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3014758101762927650, guid: e67fadbf328492f099eb1ebbf30f8022, type: 3} propertyPath: m_AnchoredPosition.y - value: -13 + value: 0 objectReference: {fileID: 0} - target: {fileID: 3014758102323890174, guid: e67fadbf328492f099eb1ebbf30f8022, type: 3} @@ -98418,7 +98846,7 @@ RectTransform: m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - - {fileID: 940952970} + - {fileID: 1217571762} - {fileID: 497225745} m_Father: {fileID: 86582844} m_RootOrder: 3 @@ -104307,7 +104735,7 @@ MonoBehaviour: m_RichText: 1 m_GlobalFontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_OnFocusSelectAll: 1 - m_ResetOnDeActivation: 1 + m_ResetOnDeActivation: 0 m_RestoreOriginalTextOnEscape: 1 m_isRichTextEditingAllowed: 0 m_LineLimit: 0 diff --git a/Assets/Scripts/Compose/Components/Fields/TimingGroupField.cs b/Assets/Scripts/Compose/Components/Fields/TimingGroupField.cs index 9cdc3744..549cdb9a 100644 --- a/Assets/Scripts/Compose/Components/Fields/TimingGroupField.cs +++ b/Assets/Scripts/Compose/Components/Fields/TimingGroupField.cs @@ -1,9 +1,11 @@ using System; +using System.Security.Cryptography.X509Certificates; using ArcCreate.Compose.Popups; using ArcCreate.Gameplay.Chart; using TMPro; using UnityEngine; using UnityEngine.EventSystems; +using UnityEngine.UIElements; namespace ArcCreate.Compose.Components { @@ -17,6 +19,12 @@ public class TimingGroupField : MonoBehaviour, IPointerDownHandler public TimingGroup Value => value; + public void Open(string title) + { + Vector2 position = Input.mousePosition; + OpenWindow(position, title); + } + /// /// Set the value without invoking event. /// @@ -39,10 +47,15 @@ public void SetValue(TimingGroup tg) } public void OnPointerDown(PointerEventData eventData) + { + OpenWindow(eventData.position, string.Empty); + } + + private void OpenWindow(Vector2 position, string title) { if (Services.Gameplay?.IsLoaded ?? false) { - window = Services.Popups.OpenTimingGroupPicker(eventData.position, value.GroupNumber, this); + window = Services.Popups.OpenTimingGroupPicker(position, value.GroupNumber, title, this); window.OnEndEdit = OnWindow; } } diff --git a/Assets/Scripts/Compose/EventsEditor/Group/GroupTable.cs b/Assets/Scripts/Compose/EventsEditor/Group/GroupTable.cs index 1b26474e..614886c0 100644 --- a/Assets/Scripts/Compose/EventsEditor/Group/GroupTable.cs +++ b/Assets/Scripts/Compose/EventsEditor/Group/GroupTable.cs @@ -1,18 +1,22 @@ using System.Collections.Generic; using System.Linq; using ArcCreate.Compose.Components; +using ArcCreate.Compose.Navigation; using ArcCreate.Gameplay; using ArcCreate.Gameplay.Chart; +using ArcCreate.Gameplay.Data; using UnityEngine; using UnityEngine.UI; namespace ArcCreate.Compose.EventsEditor { + [EditorScope("Groups")] public class GroupTable : Table { [SerializeField] private GameplayData gameplayData; [SerializeField] private Button addButton; [SerializeField] private Button removeButton; + [SerializeField] private Button selectButton; [SerializeField] private TimingGroupField editingTimingGroupField; public override TimingGroup Selected @@ -23,9 +27,17 @@ public override TimingGroup Selected base.Selected = value; removeButton.interactable = Selected?.GroupProperties.Editable ?? false && Selected?.GroupNumber > 0; + selectButton.interactable = Selected?.GroupProperties.Editable ?? false; } } + [EditorAction("ChangeGroup", false, "")] + [KeybindHint(Exclude = true)] + public void OpenPicker() + { + editingTimingGroupField.Open(I18n.S("Compose.Dialog.GroupPicker.SelectEditingGroup")); + } + public void UpdateEditingGroupField() { editingTimingGroupField.SetValueWithoutNotify(Selected); @@ -43,6 +55,7 @@ protected override void Awake() Values.EditingTimingGroup.OnValueChange += OnEdittingTimingGroup; addButton.onClick.AddListener(OnAddButton); removeButton.onClick.AddListener(OnRemoveButton); + selectButton.onClick.AddListener(OnSelectButton); editingTimingGroupField.OnValueChanged += OnEditingTimingGroupField; } @@ -53,6 +66,7 @@ protected override void OnDestroy() Values.EditingTimingGroup.OnValueChange -= OnEdittingTimingGroup; addButton.onClick.RemoveListener(OnAddButton); removeButton.onClick.RemoveListener(OnRemoveButton); + selectButton.onClick.RemoveListener(OnSelectButton); editingTimingGroupField.OnValueChanged -= OnEditingTimingGroupField; } @@ -131,6 +145,20 @@ private void OnRemoveConfirm() Values.OnEditAction?.Invoke(); } + private void OnSelectButton() + { + if (Selected == null) + { + return; + } + + Services.Selection.SetSelection( + Selected.GetEventType().Cast() + .Concat(Selected.GetEventType().Cast()) + .Concat(Selected.GetEventType().Cast()) + .Concat(Selected.GetEventType().Cast())); + } + private void OnChart() { UpdateTable(Services.Gameplay.Chart.TimingGroups); diff --git a/Assets/Scripts/Compose/Grid/GridService.cs b/Assets/Scripts/Compose/Grid/GridService.cs index 4c677757..0d77ce10 100644 --- a/Assets/Scripts/Compose/Grid/GridService.cs +++ b/Assets/Scripts/Compose/Grid/GridService.cs @@ -1,3 +1,4 @@ +using System; using ArcCreate.Compose.Navigation; using ArcCreate.Utility.Parser; using Cysharp.Threading.Tasks; @@ -119,6 +120,20 @@ public async UniTask SetSlot(EditorAction action) IsGridEnabled = slotSwitched || !IsGridEnabled; } + [EditorAction("DecreaseDensity", false, "-")] + [KeybindHint(Priority = KeybindPriorities.Grid - 1)] + public void DecreaseGridDensity() + { + Values.BeatlineDensity.Value = Mathf.Max(Values.BeatlineDensity.Value - 1, 1); + } + + [EditorAction("IncreaseDensity", false, "=")] + [KeybindHint(Priority = KeybindPriorities.Grid - 2)] + public void IncreaseGridDensity() + { + Values.BeatlineDensity.Value = Values.BeatlineDensity.Value + 1; + } + public (float fromX, float fromY, float toX, float toY) GetVerticalGridBound() { return verticalGrid.GetBounds(); diff --git a/Assets/Scripts/Compose/Popups/IPopupsService.cs b/Assets/Scripts/Compose/Popups/IPopupsService.cs index ddf24d48..22685403 100644 --- a/Assets/Scripts/Compose/Popups/IPopupsService.cs +++ b/Assets/Scripts/Compose/Popups/IPopupsService.cs @@ -36,9 +36,10 @@ public interface IPopupsService /// /// The screen position to open the picker at. /// The timing group to initialize the picker with. + /// The title of the display. /// The object that opened this window. /// An arc type picker instance. - TimingGroupPicker OpenTimingGroupPicker(Vector2 screenPosition, int? defaultTimingGroup, object caller); + TimingGroupPicker OpenTimingGroupPicker(Vector2 screenPosition, int? defaultTimingGroup, string title, object caller); /// /// Open a text dialog. diff --git a/Assets/Scripts/Compose/Popups/Picker/TimingGroupPicker.cs b/Assets/Scripts/Compose/Popups/Picker/TimingGroupPicker.cs index 66dddc6c..e931f007 100644 --- a/Assets/Scripts/Compose/Popups/Picker/TimingGroupPicker.cs +++ b/Assets/Scripts/Compose/Popups/Picker/TimingGroupPicker.cs @@ -17,6 +17,8 @@ public class TimingGroupPicker : Table [SerializeField] private RectTransform canvasRect; [SerializeField] private float minDistanceFromBorder; [SerializeField] private TMP_InputField numberField; + [SerializeField] private TMP_Text title; + [SerializeField] private GameObject titleFrame; private RectTransform rect; public Action OnValueChanged { get; set; } @@ -27,7 +29,9 @@ public class TimingGroupPicker : Table public object Owner { get; private set; } - public void OpenAt(Vector2 screenPosition, int? defaultTg, object caller) + public bool IsCursorHovering => RectTransformUtility.RectangleContainsScreenPoint(rect, Input.mousePosition, null); + + public void OpenAt(Vector2 screenPosition, int? defaultTg, string title, object caller) { window.SetActive(true); Owner = caller; @@ -36,6 +40,9 @@ public void OpenAt(Vector2 screenPosition, int? defaultTg, object caller) RectTransformUtility.ScreenPointToLocalPointInRectangle(canvasRect, screenPosition, null, out Vector2 position); + titleFrame.SetActive(!string.IsNullOrEmpty(title)); + this.title.text = title; + float canvasWidth = canvasRect.rect.width; float canvasHeight = canvasRect.rect.height; float rectWidth = rect.rect.width; @@ -92,6 +99,8 @@ protected override void Awake() base.Awake(); numberField.onValueChanged.AddListener(OnNumberFieldChange); numberField.onSubmit.AddListener(OnNumberFieldSubmit); + numberField.onDeselect.AddListener(OnNumberFieldDeselect); + numberField.onEndEdit.AddListener(OnNumberFieldEndEdit); rect = window.GetComponent(); rect.anchorMin = new Vector2(0.5f, 0.5f); rect.anchorMax = new Vector2(0.5f, 0.5f); @@ -103,9 +112,26 @@ protected override void OnDestroy() base.OnDestroy(); numberField.onValueChanged.RemoveListener(OnNumberFieldChange); numberField.onSubmit.RemoveListener(OnNumberFieldSubmit); + numberField.onDeselect.RemoveListener(OnNumberFieldDeselect); + numberField.onEndEdit.RemoveListener(OnNumberFieldEndEdit); closeButton.onClick.RemoveListener(CloseWindow); } + private void OnNumberFieldDeselect(string val) + { + if (IsCursorHovering) + { + return; + } + + OnNumberFieldSubmit(val); + } + + private void OnNumberFieldEndEdit(string arg0) + { + CloseWindow(); + } + private void OnNumberFieldChange(string val) { BuildTable(val); diff --git a/Assets/Scripts/Compose/Popups/PopupsService.cs b/Assets/Scripts/Compose/Popups/PopupsService.cs index 04cd7701..d4a4e000 100644 --- a/Assets/Scripts/Compose/Popups/PopupsService.cs +++ b/Assets/Scripts/Compose/Popups/PopupsService.cs @@ -45,9 +45,9 @@ public ColorPickerWindow OpenColorPicker(Vector2 screenPosition, Color defaultCo return colorPickerWindow; } - public TimingGroupPicker OpenTimingGroupPicker(Vector2 screenPosition, int? defaultTg, object caller) + public TimingGroupPicker OpenTimingGroupPicker(Vector2 screenPosition, int? defaultTg, string title, object caller) { - timingGroupPickerWindow.OpenAt(screenPosition, defaultTg, caller); + timingGroupPickerWindow.OpenAt(screenPosition, defaultTg, title, caller); return timingGroupPickerWindow; } diff --git a/Assets/Scripts/Compose/Project/ProjectService.cs b/Assets/Scripts/Compose/Project/ProjectService.cs index f3fa3ac9..0464a98c 100644 --- a/Assets/Scripts/Compose/Project/ProjectService.cs +++ b/Assets/Scripts/Compose/Project/ProjectService.cs @@ -200,6 +200,22 @@ public void SaveProject() SerializeProject(CurrentProject); } + [EditorAction("Reload", false, "")] + [KeybindHint(Exclude = true)] + [RequireGameplayLoaded] + public void ReloadChart() + { + if (CurrentProject == null) + { + return; + } + + int currentTiming = Services.Gameplay.Audio.AudioTiming; + SaveProject(); + LoadChart(CurrentChart); + Services.Gameplay.Audio.AudioTiming = currentTiming; + } + public void OpenProject(string path) { ProjectSettings project = DeserializeProject(path); diff --git a/Assets/Scripts/Compose/Selection/InspectorMenu.cs b/Assets/Scripts/Compose/Selection/InspectorMenu.cs index f2bf12c7..a57af7f3 100644 --- a/Assets/Scripts/Compose/Selection/InspectorMenu.cs +++ b/Assets/Scripts/Compose/Selection/InspectorMenu.cs @@ -3,6 +3,7 @@ using System.Linq; using ArcCreate.Compose.Components; using ArcCreate.Compose.History; +using ArcCreate.Compose.Navigation; using ArcCreate.Gameplay; using ArcCreate.Gameplay.Chart; using ArcCreate.Gameplay.Data; @@ -13,6 +14,7 @@ namespace ArcCreate.Compose.Selection { + [EditorScope("Inspector")] public class InspectorMenu : MonoBehaviour { private const string Mixed = "-"; @@ -55,6 +57,14 @@ public void ApplySelection(HashSet selected) Rebuild(); } + [EditorAction("AssignToGroup", false, "")] + [KeybindHint(Exclude = true)] + [SelectionService.RequireSelection] + public void AssignSelectedToGroup() + { + groupField.Open(I18n.S("Compose.Dialog.GroupPicker.AssignNotesToGroup")); + } + private void Rebuild() { bool includeTap = false; diff --git a/Assets/Scripts/Compose/Selection/SelectionService.cs b/Assets/Scripts/Compose/Selection/SelectionService.cs index b109cc96..1d80f706 100644 --- a/Assets/Scripts/Compose/Selection/SelectionService.cs +++ b/Assets/Scripts/Compose/Selection/SelectionService.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using ArcCreate.Compose.Navigation; +using ArcCreate.Compose.Popups; using ArcCreate.Compose.Timeline; using ArcCreate.Gameplay.Data; using Cysharp.Threading.Tasks; @@ -23,6 +24,7 @@ public class SelectionService : MonoBehaviour, ISelectionService [SerializeField] private LayerMask gameplayLayer; [SerializeField] private GameObject inspectorWindow; [SerializeField] private InspectorMenu inspectorMenu; + [SerializeField] private TimingGroupPicker timingGroupPicker; [SerializeField] private MarkerRange rangeSelectPreview; private readonly HashSet selectedNotes = new HashSet(); @@ -53,6 +55,7 @@ public void SelectSingle() if (EventSystem.current.currentSelectedGameObject != null || !Services.Cursor.IsCursorAboveViewport || inspectorMenu.IsCursorHovering + || timingGroupPicker.IsCursorHovering || RangeSelected) { return; diff --git a/Assets/Scripts/Compose/Timeline/TimelineService.cs b/Assets/Scripts/Compose/Timeline/TimelineService.cs index 37cd3ad8..5d827d63 100644 --- a/Assets/Scripts/Compose/Timeline/TimelineService.cs +++ b/Assets/Scripts/Compose/Timeline/TimelineService.cs @@ -1,4 +1,5 @@ using ArcCreate.Compose.Navigation; +using ArcCreate.Gameplay; using ArcCreate.Utility; using Cysharp.Threading.Tasks; using UnityEngine; @@ -10,6 +11,7 @@ namespace ArcCreate.Compose.Timeline public class TimelineService : MonoBehaviour, ITimelineService { [SerializeField] private WaveformDisplay waveformDisplay; + [SerializeField] private GameplayData gameplayData; [Header("Markers")] [SerializeField] private Marker timingMarker; @@ -37,7 +39,7 @@ public class TimelineService : MonoBehaviour, ITimelineService private bool IsPlaying => Services.Gameplay?.Audio.IsPlaying ?? false; [EditorAction("TogglePlay", false, "q")] - [KeybindHint(Priority = KeybindPriorities.Playback + 1)] + [KeybindHint(Priority = KeybindPriorities.Playback + 3)] [RequireGameplayLoaded] public void TogglePlay() { @@ -54,9 +56,9 @@ public void TogglePlay() [EditorAction("PlayReturn", false, "")] [SubAction("Return", false, "")] [SubAction("Pause", false, "q")] - [KeybindHint(Priority = KeybindPriorities.Playback)] - [KeybindHint("Return", Priority = KeybindPriorities.Playback + 2)] - [KeybindHint("Pause", Priority = KeybindPriorities.Playback + 1)] + [KeybindHint(Priority = KeybindPriorities.Playback + 2)] + [KeybindHint("Return", Priority = KeybindPriorities.Playback + 4)] + [KeybindHint("Pause", Priority = KeybindPriorities.Playback + 3)] [RequireGameplayLoaded] public async UniTask StartPlayReturn(EditorAction action) { @@ -168,6 +170,22 @@ public async UniTask ScrollForwardOneBeat(EditorAction action) } } + [EditorAction("DecreaseSpeed", false, "[")] + [KeybindHint(Exclude = false, Priority = KeybindPriorities.Playback + 1)] + public void DecreasePlaybackSpeed() + { + gameplayData.PlaybackSpeed.Value + = Mathf.Max(gameplayData.PlaybackSpeed.Value - 0.25f, 0.1f); + } + + [EditorAction("IncreaseSpeed", false, "]")] + [KeybindHint(Exclude = false, Priority = KeybindPriorities.Playback)] + public void IncreasePlaybackSpeed() + { + gameplayData.PlaybackSpeed.Value + = Mathf.Min(gameplayData.PlaybackSpeed.Value + 0.25f, 5f); + } + private void Awake() { timingMarker.OnValueChanged += OnTimingMarker; diff --git a/Assets/StreamingAssets/Locales/en-us.yml b/Assets/StreamingAssets/Locales/en-us.yml index aae1c65b..1b97fd3a 100644 --- a/Assets/StreamingAssets/Locales/en-us.yml +++ b/Assets/StreamingAssets/Locales/en-us.yml @@ -257,6 +257,9 @@ Compose: Confirm: Confirm Macros: Title: Macros + GroupPicker: + SelectEditingGroup: "Change current group to:" + AssignNotesToGroup: "Assign selected notes to:" Navigation: KeybindOverride: Overriding keybind for action {0} # Texts that appear on the context menu (right-click menu) @@ -296,6 +299,8 @@ Compose: Slot8: Slot 8 Slot9: Slot 9 Slot0: Slot 0 + IncreaseDensity: Increase density + DecreaseDensity: Decrease density Macro: Name: Macro SelectEvents: @@ -400,6 +405,8 @@ Compose: Name: Play Return: Pause and return Pause: Pause + IncreaseSpeed: Speed up + DecreaseSpeed: Slow down Grid: # Please modify the comment lines only (lines beginning with '--')