2023-07-17 10:20:00 +02:00
using TaikoSoundEditor.Data ;
2023-07-28 18:02:47 +02:00
using TaikoSoundEditor.Utils ;
2023-07-17 10:20:00 +02:00
namespace TaikoSoundEditor
{
public partial class MainForm : Form
{
public MainForm ( )
{
InitializeComponent ( ) ;
MusicAttributePathSelector . PathChanged + = MusicAttributePathSelector_PathChanged ;
MusicOrderPathSelector . PathChanged + = MusicOrderPathSelector_PathChanged ;
MusicInfoPathSelector . PathChanged + = MusicInfoPathSelector_PathChanged ;
WordListPathSelector . PathChanged + = WordListPathSelector_PathChanged ;
DirSelector . PathChanged + = DirSelector_PathChanged ;
2023-07-28 18:29:27 +02:00
2023-07-17 10:20:00 +02:00
AddedMusicBinding . DataSource = AddedMusic ;
NewSoundsBox . DataSource = AddedMusicBinding ;
2023-07-19 07:10:25 +02:00
TabControl . SelectedIndexChanged + = TabControl_SelectedIndexChanged ;
2023-07-28 18:29:27 +02:00
2023-07-28 21:28:05 +02:00
SimpleGenreBox . DataSource = Enum . GetValues ( typeof ( Genre ) ) ;
2023-07-19 07:10:25 +02:00
}
private void TabControl_SelectedIndexChanged ( object sender , EventArgs e )
{
2023-07-30 07:32:58 +02:00
Logger . Info ( $"Commuted to tab {TabControl.SelectedIndex}.{TabControl.Name}" ) ;
2023-07-28 18:02:47 +02:00
}
2023-07-17 10:20:00 +02:00
#region Editor
2023-07-28 18:02:47 +02:00
private void LoadMusicInfo ( MusicInfo item )
2023-07-19 12:07:56 +02:00
{
2023-07-19 07:10:25 +02:00
Logger . Info ( $"Showing properties for MusicInfo: {item}" ) ;
2023-07-19 12:07:56 +02:00
if ( item = = null )
{
MusicInfoGrid . SelectedObject = null ;
MusicAttributesGrid . SelectedObject = null ;
MusicOrderGrid . SelectedObject = null ;
WordsGrid . SelectedObject = null ;
WordSubGrid . SelectedObject = null ;
WordDetailGrid . SelectedObject = null ;
return ;
}
2023-07-17 10:20:00 +02:00
MusicInfoGrid . SelectedObject = item ;
MusicAttributesGrid . SelectedObject = MusicAttributes . GetByUniqueId ( item . UniqueId ) ;
MusicOrderGrid . SelectedObject = MusicOrders . GetByUniqueId ( item . UniqueId ) ;
WordsGrid . SelectedObject = WordList . GetBySong ( item . Id ) ;
WordSubGrid . SelectedObject = WordList . GetBySongSub ( item . Id ) ;
WordDetailGrid . SelectedObject = WordList . GetBySongDetail ( item . Id ) ;
2023-07-28 18:29:27 +02:00
simpleBoxLoading = true ;
SimpleIdBox . Text = item . Id ;
2023-07-30 07:18:54 +02:00
SimpleTitleBox . Text = WordList . GetBySong ( item . Id ) ? . JapaneseText ? ? throw new ArgumentNullException ( $"Title for '{item.Id}' not found in wordlist" ) ;
SimpleSubtitleBox . Text = WordList . GetBySongSub ( item . Id ) ? . JapaneseText ? ? throw new ArgumentNullException ( $"Subtitle for '{item.Id}' not found in wordlist" ) ;
SimpleDetailBox . Text = WordList . GetBySongDetail ( item . Id ) ? . JapaneseText ? ? throw new ArgumentNullException ( $"Detail for '{item.Id}' not found in wordlist" ) ;
SimpleGenreBox . SelectedItem = MusicOrders . GetByUniqueId ( item . UniqueId ) ? . Genre ? ? throw new ArgumentNullException ( $"Music order entry #{item.UniqueId} could not be found" ) ;
2023-07-28 18:29:27 +02:00
SimpleStarEasyBox . Value = item . StarEasy ;
SimpleStarNormalBox . Value = item . StarNormal ;
SimpleStarHardBox . Value = item . StarHard ;
SimpleStarManiaBox . Value = item . StarMania ;
SimpleStarUraBox . Value = item . StarUra ;
SimpleStarUraBox . Enabled = MusicAttributes . GetByUniqueId ( item . UniqueId ) . CanPlayUra ;
simpleBoxLoading = false ;
2023-07-17 10:20:00 +02:00
}
2023-07-19 12:07:56 +02:00
2023-07-28 18:02:47 +02:00
private void LoadNewSongData ( NewSongData item )
{
Logger . Info ( $"Selection Changed NewSongData: {item}" ) ;
Logger . Info ( $"Showing properties for NewSongData: {item}" ) ;
MusicInfoGrid . SelectedObject = item ? . MusicInfo ;
MusicAttributesGrid . SelectedObject = item ? . MusicAttribute ;
MusicOrderGrid . SelectedObject = item ? . MusicOrder ;
WordsGrid . SelectedObject = item ? . Word ;
WordSubGrid . SelectedObject = item ? . WordSub ;
WordDetailGrid . SelectedObject = item ? . WordDetail ;
indexChanging = false ;
2023-07-28 18:40:31 +02:00
if ( item = = null ) return ;
simpleBoxLoading = true ;
SimpleIdBox . Text = item . MusicInfo . Id ;
SimpleTitleBox . Text = item . Word . JapaneseText ;
SimpleSubtitleBox . Text = item . WordSub . JapaneseText ;
SimpleDetailBox . Text = item . WordDetail . JapaneseText ;
SimpleGenreBox . SelectedItem = item . MusicOrder . Genre ;
SimpleStarEasyBox . Value = item . MusicInfo . StarEasy ;
SimpleStarNormalBox . Value = item . MusicInfo . StarNormal ;
SimpleStarHardBox . Value = item . MusicInfo . StarHard ;
SimpleStarManiaBox . Value = item . MusicInfo . StarMania ;
SimpleStarUraBox . Value = item . MusicInfo . StarUra ;
SimpleStarUraBox . Enabled = item . MusicAttribute . CanPlayUra ;
simpleBoxLoading = false ;
2023-07-28 18:02:47 +02:00
}
2023-07-19 12:07:56 +02:00
private bool indexChanging = false ;
2023-07-17 10:20:00 +02:00
2023-07-30 07:32:58 +02:00
private void LoadedMusicBox_SelectedIndexChanged ( object sender , EventArgs e ) = > ExceptionGuard . Run ( ( ) = >
2023-07-17 10:20:00 +02:00
{
2023-07-19 12:07:56 +02:00
if ( indexChanging ) return ;
indexChanging = true ;
NewSoundsBox . SelectedItem = null ;
2023-07-17 10:20:00 +02:00
var item = LoadedMusicBox . SelectedItem as MusicInfo ;
2023-07-19 07:10:25 +02:00
Logger . Info ( $"Selection Changed MusicItem: {item}" ) ;
2023-07-28 18:02:47 +02:00
LoadMusicInfo ( item ) ;
2023-07-19 12:07:56 +02:00
indexChanging = false ;
2023-07-30 08:51:24 +02:00
SoundViewTab . SelectedTab = SoundViewerSimple ;
2023-07-30 07:32:58 +02:00
} ) ;
2023-07-17 10:20:00 +02:00
2023-07-30 07:32:58 +02:00
private void EditorTable_Resize ( object sender , EventArgs e ) = > ExceptionGuard . Run ( ( ) = >
2023-07-17 10:20:00 +02:00
{
WordsGB . Height = WordSubGB . Height = WordDetailGB . Height = EditorTable . Height / 3 ;
2023-07-30 07:32:58 +02:00
} ) ;
2023-07-17 10:20:00 +02:00
2023-07-30 07:32:58 +02:00
private void NewSoundsBox_SelectedIndexChanged ( object sender , EventArgs e ) = > ExceptionGuard . Run ( ( ) = >
2023-07-17 10:20:00 +02:00
{
2023-07-19 12:07:56 +02:00
if ( indexChanging ) return ;
indexChanging = true ;
2023-07-30 07:32:58 +02:00
LoadedMusicBox . SelectedItem = null ;
2023-07-19 07:10:25 +02:00
var item = NewSoundsBox . SelectedItem as NewSongData ;
2023-07-28 18:02:47 +02:00
LoadNewSongData ( item ) ;
2023-07-30 08:51:24 +02:00
SoundViewTab . SelectedTab = SoundViewerSimple ;
2023-07-30 07:32:58 +02:00
} ) ;
2023-07-17 10:20:00 +02:00
2023-07-28 18:02:47 +02:00
#endregion
2023-07-19 12:07:56 +02:00
2023-07-29 08:53:20 +02:00
private void RemoveNewSong ( NewSongData ns )
{
AddedMusic . Remove ( ns ) ;
Logger . Info ( "Refreshing list" ) ;
AddedMusicBinding . ResetBindings ( false ) ;
MusicOrderViewer . RemoveSong ( ns . MusicOrder ) ;
Logger . Info ( "Removing from wordlist & music_attributes" ) ;
WordList . Items . Remove ( ns . Word ) ;
WordList . Items . Remove ( ns . WordDetail ) ;
WordList . Items . Remove ( ns . WordSub ) ;
MusicAttributes . Items . Remove ( ns . MusicAttribute ) ;
}
private void RemoveExistingSong ( MusicInfo mi )
{
var ma = MusicAttributes . GetByUniqueId ( mi . UniqueId ) ;
var mo = MusicOrders . GetByUniqueId ( mi . UniqueId ) ;
var w = WordList . GetBySong ( mi . Id ) ;
var ws = WordList . GetBySongSub ( mi . Id ) ;
var wd = WordList . GetBySongDetail ( mi . Id ) ;
Logger . Info ( "Removing music info" ) ;
MusicInfos . Items . RemoveAll ( x = > x . UniqueId = = mi . UniqueId ) ;
Logger . Info ( "Removing music attribute" ) ;
MusicAttributes . Items . Remove ( ma ) ;
Logger . Info ( "Removing music order" ) ;
MusicOrders . Items . Remove ( mo ) ;
Logger . Info ( "Removing word" ) ;
WordList . Items . Remove ( w ) ;
Logger . Info ( "Removing word sub" ) ;
WordList . Items . Remove ( ws ) ;
Logger . Info ( "Removing word detail" ) ;
WordList . Items . Remove ( wd ) ;
Logger . Info ( "Refreshing list" ) ;
LoadedMusicBinding . DataSource = MusicInfos . Items . Where ( mi = > mi . UniqueId ! = 0 ) . ToList ( ) ;
LoadedMusicBinding . ResetBindings ( false ) ;
var sel = LoadedMusicBox . SelectedIndex ;
if ( sel > = MusicInfos . Items . Count )
sel = MusicInfos . Items . Count - 1 ;
LoadedMusicBox . SelectedItem = null ;
LoadedMusicBox . SelectedIndex = sel ;
Logger . Info ( "Removing from music orders" ) ;
MusicOrderViewer . RemoveSong ( mo ) ;
}
2023-07-28 18:02:47 +02:00
private void RemoveSongButton_Click ( object sender , EventArgs e ) = > ExceptionGuard . Run ( ( ) = >
2023-07-19 12:07:56 +02:00
{
Logger . Info ( "Clicked remove song" ) ;
if ( NewSoundsBox . SelectedItem ! = null )
{
Logger . Info ( "Removing newly added song" ) ;
2023-07-29 08:15:24 +02:00
var ns = NewSoundsBox . SelectedItem as NewSongData ;
2023-07-29 08:53:20 +02:00
RemoveNewSong ( ns ) ;
2023-07-19 12:07:56 +02:00
return ;
}
if ( LoadedMusicBox . SelectedItem ! = null )
{
Logger . Info ( "Removing existing song" ) ;
var mi = LoadedMusicBox . SelectedItem as MusicInfo ;
2023-07-29 08:53:20 +02:00
RemoveExistingSong ( mi ) ;
2023-07-19 12:07:56 +02:00
return ;
}
2023-07-28 18:29:27 +02:00
} ) ;
2023-07-30 07:32:58 +02:00
private void SoundViewTab_SelectedIndexChanged ( object sender , EventArgs e ) = > ExceptionGuard . Run ( ( ) = >
2023-07-28 18:29:27 +02:00
{
2023-07-30 07:32:58 +02:00
if ( SoundViewTab . SelectedTab = = MusicOrderTab )
2023-07-29 07:58:11 +02:00
{
MusicOrderViewer . Invalidate ( ) ;
2023-07-28 21:28:05 +02:00
return ;
}
2023-07-28 18:29:27 +02:00
if ( ! ( SoundViewTab . SelectedTab = = SoundViewerExpert | | SoundViewTab . SelectedTab = = SoundViewerSimple ) )
2023-07-30 07:32:58 +02:00
return ;
2023-07-28 18:29:27 +02:00
if ( LoadedMusicBox . SelectedItem ! = null )
{
var item = LoadedMusicBox . SelectedItem as MusicInfo ;
Logger . Info ( $"Tab switched, reloading MusicItem: {item}" ) ;
LoadMusicInfo ( item ) ;
return ;
}
2023-07-30 07:32:58 +02:00
if ( NewSoundsBox . SelectedItem ! = null )
2023-07-28 18:29:27 +02:00
{
var item = NewSoundsBox . SelectedItem as NewSongData ;
Logger . Info ( $"Tab switched, reloading NewSongData: {item}" ) ;
LoadNewSongData ( item ) ;
return ;
2023-07-30 07:32:58 +02:00
}
} ) ;
2023-07-28 18:29:27 +02:00
private bool simpleBoxLoading = false ;
private void SimpleBoxChanged ( object sender , EventArgs e ) = > ExceptionGuard . Run ( ( ) = >
{
if ( simpleBoxLoading ) return ;
if ( LoadedMusicBox . SelectedItem ! = null )
{
var item = LoadedMusicBox . SelectedItem as MusicInfo ;
Logger . Info ( $"Simple Box changed : {(sender as Control).Name} to value {(sender as Control).Text}" ) ;
WordList . GetBySong ( item . Id ) . JapaneseText = SimpleTitleBox . Text ;
WordList . GetBySongSub ( item . Id ) . JapaneseText = SimpleSubtitleBox . Text ;
WordList . GetBySongDetail ( item . Id ) . JapaneseText = SimpleDetailBox . Text ;
2023-07-29 09:32:03 +02:00
MusicOrders . GetByUniqueId ( item . UniqueId ) . Genre = item . Genre = ( Genre ) ( SimpleGenreBox . SelectedItem ? ? Genre . Pop ) ;
2023-07-28 18:29:27 +02:00
item . StarEasy = ( int ) SimpleStarEasyBox . Value ;
item . StarNormal = ( int ) SimpleStarNormalBox . Value ;
item . StarHard = ( int ) SimpleStarHardBox . Value ;
item . StarMania = ( int ) SimpleStarManiaBox . Value ;
item . StarUra = ( int ) SimpleStarUraBox . Value ;
return ;
}
2023-07-28 18:40:31 +02:00
else if ( NewSoundsBox . SelectedItem ! = null )
{
var item = NewSoundsBox . SelectedItem as NewSongData ;
Logger . Info ( $"Simple Box changed : {(sender as Control).Name} to value {(sender as Control).Text}" ) ;
item . Word . JapaneseText = SimpleTitleBox . Text ;
item . WordSub . JapaneseText = SimpleSubtitleBox . Text ;
item . WordDetail . JapaneseText = SimpleDetailBox . Text ;
2023-07-29 10:06:11 +02:00
item . MusicOrder . Genre = item . MusicInfo . Genre = ( Genre ) ( SimpleGenreBox . SelectedItem ? ? Genre . Pop ) ;
2023-07-28 18:40:31 +02:00
item . MusicInfo . StarEasy = ( int ) SimpleStarEasyBox . Value ;
item . MusicInfo . StarNormal = ( int ) SimpleStarNormalBox . Value ;
item . MusicInfo . StarHard = ( int ) SimpleStarHardBox . Value ;
item . MusicInfo . StarMania = ( int ) SimpleStarManiaBox . Value ;
item . MusicInfo . StarUra = ( int ) SimpleStarUraBox . Value ;
return ;
}
2023-07-28 18:29:27 +02:00
} ) ;
2023-07-29 08:53:20 +02:00
private void MusicOrderViewer_SongRemoved ( Controls . MusicOrderViewer sender , MusicOrder mo ) = > ExceptionGuard . Run ( ( ) = >
{
var uniqId = mo . UniqueId ;
var mi = MusicInfos . Items . Where ( x = > x . UniqueId = = uniqId ) . FirstOrDefault ( ) ;
if ( mi ! = null )
{
RemoveExistingSong ( mi ) ;
return ;
}
var ns = AddedMusic . Where ( x = > x . UniqueId = = uniqId ) . FirstOrDefault ( ) ;
if ( ns ! = null )
{
RemoveNewSong ( ns ) ;
return ;
}
throw new InvalidOperationException ( "Nothing to remove." ) ;
} ) ;
2023-07-29 09:21:31 +02:00
2023-07-30 07:32:58 +02:00
private void LocateInMusicOrderButton_Click ( object sender , EventArgs e ) = > ExceptionGuard . Run ( ( ) = >
2023-07-29 09:21:31 +02:00
{
if ( LoadedMusicBox . SelectedItem ! = null )
{
var item = LoadedMusicBox . SelectedItem as MusicInfo ;
var mo = MusicOrders . GetByUniqueId ( item . UniqueId ) ;
if ( MusicOrderViewer . Locate ( mo ) )
{
SoundViewTab . SelectedTab = MusicOrderTab ;
}
return ;
}
else if ( NewSoundsBox . SelectedItem ! = null )
{
var item = NewSoundsBox . SelectedItem as NewSongData ;
if ( MusicOrderViewer . Locate ( item . MusicOrder ) )
{
SoundViewTab . SelectedTab = MusicOrderTab ;
}
return ;
}
2023-07-30 07:32:58 +02:00
} ) ;
2023-07-31 18:45:26 +02:00
private void MusicOrderViewer_SongDoubleClick ( Controls . MusicOrderViewer sender , MusicOrder mo )
{
var uid = mo . UniqueId ;
var mi = LoadedMusicBox . Items . Cast < MusicInfo > ( ) . Where ( _ = > _ . UniqueId = = uid ) . FirstOrDefault ( ) ;
if ( mi ! = null )
{
LoadedMusicBox . SelectedItem = mi ;
return ;
}
var ns = AddedMusic . Where ( _ = > _ . UniqueId = = uid ) . FirstOrDefault ( ) ;
if ( ns ! = null )
{
NewSoundsBox . SelectedItem = ns ;
return ;
}
}
2023-07-17 10:20:00 +02:00
}
}