2020-10-06 14:17:15 +08:00
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using System.IO ;
using osu.Framework.Allocation ;
using osu.Framework.Bindables ;
using osu.Framework.Graphics ;
2021-04-04 01:02:33 +08:00
using osu.Framework.Localisation ;
2020-10-06 14:17:15 +08:00
using osu.Game.Beatmaps ;
2024-08-28 18:17:39 +08:00
using osu.Game.Graphics.UserInterfaceV2 ;
2020-10-06 14:17:15 +08:00
using osu.Game.Overlays ;
2022-08-11 01:53:20 +08:00
using osu.Game.Localisation ;
2024-11-28 22:37:27 +08:00
using osu.Game.Utils ;
2020-10-06 14:17:15 +08:00
namespace osu.Game.Screens.Edit.Setup
{
2024-10-03 19:53:21 +08:00
public partial class ResourcesSection : SetupSection
2020-10-06 14:17:15 +08:00
{
2024-08-28 18:17:39 +08:00
private FormFileSelector audioTrackChooser = null ! ;
private FormFileSelector backgroundChooser = null ! ;
2020-10-06 14:17:15 +08:00
2022-08-15 23:14:16 +08:00
public override LocalisableString Title = > EditorSetupStrings . ResourcesHeader ;
2021-04-04 01:02:33 +08:00
2020-10-06 14:17:15 +08:00
[Resolved]
2023-01-07 08:08:02 +08:00
private MusicController music { get ; set ; } = null ! ;
2020-10-06 14:17:15 +08:00
[Resolved]
2023-01-07 08:08:02 +08:00
private BeatmapManager beatmaps { get ; set ; } = null ! ;
2020-10-06 14:17:15 +08:00
2021-01-04 15:47:08 +08:00
[Resolved]
2023-01-07 08:08:02 +08:00
private IBindable < WorkingBeatmap > working { get ; set ; } = null ! ;
2021-01-04 15:47:08 +08:00
2022-08-01 15:36:12 +08:00
[Resolved]
2023-01-07 08:08:02 +08:00
private EditorBeatmap editorBeatmap { get ; set ; } = null ! ;
2020-10-06 14:17:15 +08:00
2023-01-07 00:26:30 +08:00
[Resolved]
2023-01-07 08:03:52 +08:00
private Editor ? editor { get ; set ; }
2023-01-07 00:26:30 +08:00
2024-10-04 17:09:14 +08:00
private SetupScreenHeaderBackground headerBackground = null ! ;
2021-04-04 18:50:50 +08:00
2020-10-06 14:17:15 +08:00
[BackgroundDependencyLoader]
private void load ( )
{
2024-10-04 17:09:14 +08:00
headerBackground = new SetupScreenHeaderBackground
{
RelativeSizeAxes = Axes . X ,
Height = 110 ,
} ;
2020-10-06 18:26:57 +08:00
Children = new Drawable [ ]
2020-10-06 14:17:15 +08:00
{
2024-11-28 22:37:27 +08:00
backgroundChooser = new FormFileSelector ( SupportedExtensions . IMAGE_EXTENSIONS )
2021-04-04 18:50:50 +08:00
{
2024-08-28 18:17:39 +08:00
Caption = GameplaySettingsStrings . BackgroundHeader ,
PlaceholderText = EditorSetupStrings . ClickToSelectBackground ,
2021-04-04 18:50:50 +08:00
} ,
2024-11-29 15:46:08 +08:00
// `SupportedExtensions.AUDIO_EXTENSIONS` not used here specifically because it includes `.wav` for samples, which is strictly disallowed by ranking criteria
2024-11-28 22:37:27 +08:00
// (https://osu.ppy.sh/wiki/en/Ranking_criteria#audio)
audioTrackChooser = new FormFileSelector ( @".mp3" , @".ogg" )
2020-10-06 14:17:15 +08:00
{
2024-08-28 18:17:39 +08:00
Caption = EditorSetupStrings . AudioTrack ,
PlaceholderText = EditorSetupStrings . ClickToSelectTrack ,
2021-08-23 23:01:01 +08:00
} ,
2020-10-06 14:17:15 +08:00
} ;
2024-10-04 17:09:14 +08:00
backgroundChooser . PreviewContainer . Add ( headerBackground ) ;
2022-06-16 00:29:09 +08:00
if ( ! string . IsNullOrEmpty ( working . Value . Metadata . BackgroundFile ) )
backgroundChooser . Current . Value = new FileInfo ( working . Value . Metadata . BackgroundFile ) ;
if ( ! string . IsNullOrEmpty ( working . Value . Metadata . AudioFile ) )
audioTrackChooser . Current . Value = new FileInfo ( working . Value . Metadata . AudioFile ) ;
2022-06-16 23:48:32 +08:00
backgroundChooser . Current . BindValueChanged ( backgroundChanged ) ;
audioTrackChooser . Current . BindValueChanged ( audioTrackChanged ) ;
2020-10-06 14:17:15 +08:00
}
2022-06-16 00:29:09 +08:00
public bool ChangeBackgroundImage ( FileInfo source )
2020-10-06 14:17:15 +08:00
{
2022-06-15 14:02:48 +08:00
if ( ! source . Exists )
2020-10-06 14:17:15 +08:00
return false ;
2021-01-04 15:47:08 +08:00
var set = working . Value . BeatmapSetInfo ;
2020-10-06 14:17:15 +08:00
2022-06-15 14:02:48 +08:00
var destination = new FileInfo ( $@"bg{source.Extension}" ) ;
2021-04-04 19:10:12 +08:00
// remove the previous background for now.
2020-10-06 14:17:15 +08:00
// in the future we probably want to check if this is being used elsewhere (other difficulties?)
2022-08-10 14:48:38 +08:00
var oldFile = set . GetFile ( working . Value . Metadata . BackgroundFile ) ;
2020-10-06 14:17:15 +08:00
2022-06-15 14:02:48 +08:00
using ( var stream = source . OpenRead ( ) )
2020-10-06 14:17:15 +08:00
{
if ( oldFile ! = null )
2021-11-29 17:08:02 +08:00
beatmaps . DeleteFile ( set , oldFile ) ;
2022-06-15 14:02:48 +08:00
beatmaps . AddFile ( set , stream , destination . Name ) ;
2020-10-06 14:17:15 +08:00
}
2022-08-01 15:36:12 +08:00
editorBeatmap . SaveState ( ) ;
2022-06-15 14:02:48 +08:00
working . Value . Metadata . BackgroundFile = destination . Name ;
2024-08-28 18:17:39 +08:00
headerBackground . UpdateBackground ( ) ;
2020-10-06 14:17:15 +08:00
2023-01-07 08:03:52 +08:00
editor ? . ApplyToBackground ( bg = > bg . RefreshBackground ( ) ) ;
2023-01-07 00:26:30 +08:00
2020-10-06 14:17:15 +08:00
return true ;
}
2022-06-16 00:29:09 +08:00
public bool ChangeAudioTrack ( FileInfo source )
2021-04-04 18:50:50 +08:00
{
2022-06-15 14:02:48 +08:00
if ( ! source . Exists )
2021-04-04 18:50:50 +08:00
return false ;
var set = working . Value . BeatmapSetInfo ;
2022-06-15 14:02:48 +08:00
var destination = new FileInfo ( $@"audio{source.Extension}" ) ;
2021-04-04 19:10:12 +08:00
// remove the previous audio track for now.
2021-04-04 18:50:50 +08:00
// in the future we probably want to check if this is being used elsewhere (other difficulties?)
2022-08-10 14:48:38 +08:00
var oldFile = set . GetFile ( working . Value . Metadata . AudioFile ) ;
2021-04-04 18:50:50 +08:00
2022-06-15 14:02:48 +08:00
using ( var stream = source . OpenRead ( ) )
2021-04-04 18:50:50 +08:00
{
if ( oldFile ! = null )
2021-11-29 17:08:02 +08:00
beatmaps . DeleteFile ( set , oldFile ) ;
2022-06-15 14:02:48 +08:00
beatmaps . AddFile ( set , stream , destination . Name ) ;
2021-04-04 18:50:50 +08:00
}
2022-06-15 14:02:48 +08:00
working . Value . Metadata . AudioFile = destination . Name ;
2021-04-04 18:50:50 +08:00
2022-08-01 15:36:12 +08:00
editorBeatmap . SaveState ( ) ;
2021-04-04 19:10:12 +08:00
music . ReloadCurrentTrack ( ) ;
2022-08-01 15:36:12 +08:00
2021-04-04 18:50:50 +08:00
return true ;
}
2023-01-07 08:08:02 +08:00
private void backgroundChanged ( ValueChangedEvent < FileInfo ? > file )
2021-04-04 18:50:50 +08:00
{
2023-01-07 23:15:57 +08:00
if ( file . NewValue = = null | | ! ChangeBackgroundImage ( file . NewValue ) )
2022-06-16 23:48:32 +08:00
backgroundChooser . Current . Value = file . OldValue ;
2021-04-04 18:50:50 +08:00
}
2023-01-07 08:08:02 +08:00
private void audioTrackChanged ( ValueChangedEvent < FileInfo ? > file )
2020-10-06 14:17:15 +08:00
{
2023-01-07 23:15:57 +08:00
if ( file . NewValue = = null | | ! ChangeAudioTrack ( file . NewValue ) )
2022-06-16 23:48:32 +08:00
audioTrackChooser . Current . Value = file . OldValue ;
2020-10-06 14:17:15 +08:00
}
}
}