diff --git a/TJAPlayer3/Songs/C曲リストノード.cs b/TJAPlayer3/Songs/C曲リストノード.cs index 08035285..f91813e2 100644 --- a/TJAPlayer3/Songs/C曲リストノード.cs +++ b/TJAPlayer3/Songs/C曲リストノード.cs @@ -63,6 +63,7 @@ namespace TJAPlayer3 public C曲リストノード r親ノード; public int Openindex; + public bool bIsOpenFolder; public Stack stackランダム演奏番号 = new Stack(); public string strジャンル = ""; public string str本当のジャンル = ""; diff --git a/TJAPlayer3/Stages/05.SongSelect/CActSelect曲リスト.cs b/TJAPlayer3/Stages/05.SongSelect/CActSelect曲リスト.cs index d637a756..3ae15d55 100644 --- a/TJAPlayer3/Stages/05.SongSelect/CActSelect曲リスト.cs +++ b/TJAPlayer3/Stages/05.SongSelect/CActSelect曲リスト.cs @@ -62,6 +62,11 @@ namespace TJAPlayer3 return null; } } + public int nSelectSongIndex + { + get; + private set; + } public C曲リストノード r現在選択中の曲 { get; @@ -70,7 +75,8 @@ namespace TJAPlayer3 public void ResetSongIndex() { - this.r現在選択中の曲 = TJAPlayer3.Songs管理.list曲ルート[0]; + nSelectSongIndex = 0; + this.r現在選択中の曲 = TJAPlayer3.Songs管理.list曲ルート[nSelectSongIndex]; } public int nスクロールバー相対y座標 @@ -131,11 +137,13 @@ namespace TJAPlayer3 stレベル数字Ar[7] = st数字7; stレベル数字Ar[8] = st数字8; stレベル数字Ar[9] = st数字9; - this.st小文字位置 = stレベル数字Ar; + this.st小文字位置 = stレベル数字Ar; #endregion - + + this.nSelectSongIndex = 0; this.r現在選択中の曲 = null; - this.n現在のアンカ難易度レベル = Math.Min((int)Difficulty.Edit, TJAPlayer3.ConfigIni.nDefaultCourse); + + this.n現在のアンカ難易度レベル = Math.Min((int)Difficulty.Edit, TJAPlayer3.ConfigIni.nDefaultCourse); base.b活性化してない = true; this.bIsEnumeratingSongs = false; } @@ -274,25 +282,21 @@ namespace TJAPlayer3 if (TJAPlayer3.ConfigIni.TJAP3FolderMode) { this.r現在選択中の曲 = this.r現在選択中の曲.list子リスト[0]; + nSelectSongIndex = 0; + tChangeSong(this.r現在選択中の曲.r親ノード.Openindex); } else { - List list = TJAPlayer3.Songs管理.list曲ルート; + //実際には親フォルダを消さないように変更 - // Fill list songs - list.InsertRange(list.IndexOf(this.r現在選択中の曲) + 1, this.r現在選択中の曲.list子リスト); + this.r現在選択中の曲.bIsOpenFolder = true; // Previous index int n回数 = this.r現在選択中の曲.Openindex; if (this.r現在選択中の曲.Openindex >= this.r現在選択中の曲.list子リスト.Count()) n回数 = 0; - - for (int index = 0; index <= n回数; index++) - this.r現在選択中の曲 = this.r次の曲(this.r現在選択中の曲); - - // Remove main box - list.RemoveAt(list.IndexOf(this.r現在選択中の曲.r親ノード)); + tChangeSong(n回数); } this.t現在選択中の曲を元に曲バーを再構成する(); @@ -333,34 +337,16 @@ namespace TJAPlayer3 if (this.r現在選択中の曲.r親ノード != null) { this.r現在選択中の曲 = this.r現在選択中の曲.r親ノード; + this.r現在選択中の曲.Openindex = nSelectSongIndex; + tChangeSong(TJAPlayer3.Songs管理.list曲ルート.IndexOf(this.r現在選択中の曲) - nSelectSongIndex); } } else { - // Complete list of songs - List list = TJAPlayer3.Songs管理.list曲ルート; - - // Reinsert parent node - list.Insert(list.IndexOf(this.r現在選択中の曲) + 1, this.r現在選択中の曲.r親ノード); - + this.r現在選択中の曲.r親ノード.bIsOpenFolder = false; // Reindex the parent node this.r現在選択中の曲.r親ノード.Openindex = r現在選択中の曲.r親ノード.list子リスト.IndexOf(this.r現在選択中の曲); - - // Move song pointer back to the folder - this.r現在選択中の曲 = this.r次の曲(r現在選択中の曲); - - // Flatten folder - var flattened = flattenList(this.r現在選択中の曲.list子リスト); - - // Remove recursively the included songs that are contained in the folder - for (int index = 0; index < list.Count; index++) - { - if (flattened.Contains(list[index])) - { - list.RemoveAt(index); - index--; - } - } + tChangeSong(-this.r現在選択中の曲.r親ノード.Openindex); } this.t現在選択中の曲を元に曲バーを再構成する(); @@ -371,18 +357,21 @@ namespace TJAPlayer3 } - public List flattenList(List list) + public List flattenList(List list, bool useOpenFlag = false) { List ret = new List(); - ret.AddRange(list); - - foreach (var e in list) + //foreach (var e in list) + for(int i = 0; i < list.Count; i++) { - if (e.eノード種別 == C曲リストノード.Eノード種別.BOX) - { - ret.AddRange(flattenList(e.list子リスト)); - } + var e = list[i]; + if (!useOpenFlag || !e.bIsOpenFolder) ret.Add(e); + + if (e.eノード種別 == C曲リストノード.Eノード種別.BOX && + (!useOpenFlag || e.bIsOpenFolder)) + { + ret.AddRange(flattenList(e.list子リスト, useOpenFlag)); + } } return (ret); @@ -436,18 +425,14 @@ namespace TJAPlayer3 // 曲毎に表示しているスキル値を、新しい難易度レベルに合わせて取得し直す。(表示されている13曲全部。) - C曲リストノード song = this.r現在選択中の曲; - for( int i = 0; i < 4; i++ ) - song = this.r前の曲( song ); - for( int i = this.n現在の選択行 - 4; i < ( ( this.n現在の選択行 - 4 ) + 9 ); i++ ) { + var song = this.rGetSideSong(i); int index = ( i + 9 ) % 9; for( int m = 0; m < 3; m++ ) { this.stバー情報[ index ].nスキル値[ m ] = (int) song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.最大スキル[ m ]; } - song = this.r次の曲( song ); } @@ -499,18 +484,14 @@ namespace TJAPlayer3 // 曲毎に表示しているスキル値を、新しい難易度レベルに合わせて取得し直す。(表示されている13曲全部。) - C曲リストノード song = this.r現在選択中の曲; - for( int i = 0; i < 4; i++ ) - song = this.r前の曲( song ); - for( int i = this.n現在の選択行 - 4; i < ( ( this.n現在の選択行 - 4 ) + 9 ); i++ ) { + C曲リストノード song = this.rGetSideSong(i); int index = ( i + 9 ) % 9; for( int m = 0; m < 3; m++ ) { this.stバー情報[ index ].nスキル値[ m ] = (int) song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.最大スキル[ m ]; } - song = this.r次の曲( song ); } @@ -546,6 +527,7 @@ namespace TJAPlayer3 { this.On非活性化(); this.r現在選択中の曲 = null; + this.nSelectSongIndex = 0; this.On活性化(); } } @@ -840,8 +822,11 @@ namespace TJAPlayer3 // まだ選択中の曲が決まってなければ、曲ツリールートの最初の曲にセットする。 - if ((this.r現在選択中の曲 == null) && (TJAPlayer3.Songs管理.list曲ルート.Count > 0)) - this.r現在選択中の曲 = TJAPlayer3.Songs管理.list曲ルート[0]; + if ((this.r現在選択中の曲 == null) && (TJAPlayer3.Songs管理.list曲ルート.Count > 0)) + { + nSelectSongIndex = 0; + this.r現在選択中の曲 = TJAPlayer3.Songs管理.list曲ルート[nSelectSongIndex]; + } // 描画。 if (this.r現在選択中の曲 == null) @@ -945,20 +930,18 @@ namespace TJAPlayer3 #endregion if (this.n現在のスクロールカウンタ >= 100) // 1行=100カウント。 - { + { #region [ パネルを1行上にシフトする。] - //----------------- - - // 選択曲と選択行を1つ下の行に移動。 - - this.r現在選択中の曲 = this.r次の曲(this.r現在選択中の曲); - this.n現在の選択行 = (this.n現在の選択行 + 1) % 9; - - // 選択曲から7つ下のパネル(=新しく最下部に表示されるパネル。消えてしまう一番上のパネルを再利用する)に、新しい曲の情報を記載する。 - - C曲リストノード song = this.r現在選択中の曲; - for (int i = 0; i < 4; i++) - song = this.r次の曲(song); + //----------------- + + // 選択曲と選択行を1つ下の行に移動。 + + tChangeSong(1); + this.n現在の選択行 = (this.n現在の選択行 + 1) % 9; + + // 選択曲から7つ下のパネル(=新しく最下部に表示されるパネル。消えてしまう一番上のパネルを再利用する)に、新しい曲の情報を記載する。 + + var song = this.rGetSideSong(4); int index = (this.n現在の選択行 + 4) % 9; // 新しく最下部に表示されるパネルのインデックス(0~12)。 this.stバー情報[index].strタイトル文字列 = song.strタイトル; @@ -1010,16 +993,13 @@ namespace TJAPlayer3 #endregion // stバー情報[] の内容を1行ずつずらす。 - - C曲リストノード song2 = this.r現在選択中の曲; - for (int i = 0; i < 4; i++) - song2 = this.r前の曲(song2); + for (int i = 0; i < 9; i++) - { + { + C曲リストノード song2 = this.rGetSideSong(i - 4); int n = (((this.n現在の選択行 - 4) + i) + 9) % 9; this.stバー情報[n].eバー種別 = this.e曲のバー種別を返す(song2); - song2 = this.r次の曲(song2); this.stバー情報[n].ttkタイトル = this.ttk曲名テクスチャを生成する(this.stバー情報[n].strタイトル文字列, this.stバー情報[n].ForeColor, this.stバー情報[n].BackColor, stバー情報[n].eバー種別 == Eバー種別.Box ? this.pfBoxName : this.pfMusicName); } @@ -1065,15 +1045,13 @@ namespace TJAPlayer3 // 選択曲と選択行を1つ上の行に移動。 - this.r現在選択中の曲 = this.r前の曲(this.r現在選択中の曲); - this.n現在の選択行 = ((this.n現在の選択行 - 1) + 9) % 9; - - - // 選択曲から5つ上のパネル(=新しく最上部に表示されるパネル。消えてしまう一番下のパネルを再利用する)に、新しい曲の情報を記載する。 - - C曲リストノード song = this.r現在選択中の曲; - for (int i = 0; i < 4; i++) - song = this.r前の曲(song); + tChangeSong(-1); + this.n現在の選択行 = ((this.n現在の選択行 - 1) + 9) % 9; + + + // 選択曲から5つ上のパネル(=新しく最上部に表示されるパネル。消えてしまう一番下のパネルを再利用する)に、新しい曲の情報を記載する。 + + var song = this.rGetSideSong(-4); int index = ((this.n現在の選択行 - 4) + 9) % 9; // 新しく最上部に表示されるパネルのインデックス(0~12)。 this.stバー情報[index].strタイトル文字列 = song.strタイトル; @@ -1142,15 +1120,11 @@ namespace TJAPlayer3 // stバー情報[] の内容を1行ずつずらす。 - C曲リストノード song2 = this.r現在選択中の曲; - for (int i = 0; i < 4; i++) - song2 = this.r前の曲(song2); - for (int i = 0; i < 9; i++) { int n = (((this.n現在の選択行 - 4) + i) + 9) % 9; + var song2 = this.rGetSideSong(i - 4); this.stバー情報[n].eバー種別 = this.e曲のバー種別を返す(song2); - song2 = this.r次の曲(song2); this.stバー情報[n].ttkタイトル = this.ttk曲名テクスチャを生成する(this.stバー情報[n].strタイトル文字列, this.stバー情報[n].ForeColor, this.stバー情報[n].BackColor, stバー情報[n].eバー種別 == Eバー種別.Box ? this.pfBoxName : this.pfMusicName); } @@ -2447,55 +2421,48 @@ namespace TJAPlayer3 } return Eバー種別.Other; } - public C曲リストノード r次の曲( C曲リストノード song ) + private void tChangeSong(int change) { - if( song == null ) - return null; + List list = (TJAPlayer3.ConfigIni.TJAP3FolderMode && r現在選択中の曲.r親ノード != null) ? r現在選択中の曲.r親ノード.list子リスト : flattenList(TJAPlayer3.Songs管理.list曲ルート, true); + + int index = nSelectSongIndex + change; - List list = (TJAPlayer3.ConfigIni.TJAP3FolderMode && song.r親ノード != null) ? song.r親ノード.list子リスト : TJAPlayer3.Songs管理.list曲ルート; - - int index = list.IndexOf( song ); - - if( index < 0 ) - return null; - - if( index == ( list.Count - 1 ) ) - return list[ 0 ]; - - return list[ index + 1 ]; + while (index >= list.Count) + { + index -= list.Count; + } + while (index < 0) + { + index += list.Count; + } + nSelectSongIndex = index; + r現在選択中の曲 = list[index]; } - public C曲リストノード r前の曲( C曲リストノード song ) + public C曲リストノード rGetSideSong(int change) { - if( song == null ) - return null; + List list = (TJAPlayer3.ConfigIni.TJAP3FolderMode && r現在選択中の曲.r親ノード != null) ? r現在選択中の曲.r親ノード.list子リスト : flattenList(TJAPlayer3.Songs管理.list曲ルート, true); - List list = (TJAPlayer3.ConfigIni.TJAP3FolderMode && song.r親ノード != null) ? song.r親ノード.list子リスト : TJAPlayer3.Songs管理.list曲ルート; + if (list.Count <= 0) return null; - int index = list.IndexOf( song ); - - if( index < 0 ) - return null; + int index = nSelectSongIndex + change; - if( index == 0 ) - return list[ list.Count - 1 ]; + while (index >= list.Count) + { + index -= list.Count; + } + while (index < 0) + { + index += list.Count; + } - return list[ index - 1 ]; + return list[index]; } private void tバーの初期化() { - C曲リストノード song = this.r現在選択中の曲; - - if( song == null ) - return; - - for( int i = 0; i < 4; i++ ) - song = this.r前の曲( song ); - - // - for ( int i = 0; i < 9; i++ ) { + C曲リストノード song = this.rGetSideSong(i - 4); this.stバー情報[ i ].strタイトル文字列 = song.strタイトル; this.stバー情報[ i ].strジャンル = song.strジャンル; this.stバー情報[ i ].col文字色 = song.col文字色; @@ -2556,8 +2523,6 @@ namespace TJAPlayer3 this.stバー情報[ i ].nスキル値[ j ] = (int) song.arスコア[ this.n現在のアンカ難易度レベルに最も近い難易度レベルを返す( song ) ].譜面情報.最大スキル[ j ]; this.stバー情報[ i ].ttkタイトル = this.ttk曲名テクスチャを生成する( this.stバー情報[ i ].strタイトル文字列, this.stバー情報[i].ForeColor, this.stバー情報[i].BackColor, stバー情報[i].eバー種別 == Eバー種別.Box ? this.pfBoxName : this.pfMusicName); - - song = this.r次の曲( song ); } this.n現在の選択行 = 4; diff --git a/TJAPlayer3/Stages/05.SongSelect/CStage選曲.cs b/TJAPlayer3/Stages/05.SongSelect/CStage選曲.cs index cbdd7719..8ff7a30e 100644 --- a/TJAPlayer3/Stages/05.SongSelect/CStage選曲.cs +++ b/TJAPlayer3/Stages/05.SongSelect/CStage選曲.cs @@ -1402,7 +1402,7 @@ namespace TJAPlayer3 private void tカーソルを下へ移動する() { - if ((this.act曲リスト.r次の曲(r現在選択中の曲).eノード種別 == C曲リストノード.Eノード種別.SCORE) || this.act曲リスト.r次の曲(r現在選択中の曲).eノード種別 == C曲リストノード.Eノード種別.BACKBOX) + if ((this.act曲リスト.rGetSideSong(1).eノード種別 == C曲リストノード.Eノード種別.SCORE) || this.act曲リスト.rGetSideSong(1).eノード種別 == C曲リストノード.Eノード種別.BACKBOX) { TJAPlayer3.stage選曲.bBGMIn再生した = false; TJAPlayer3.Skin.bgm選曲画面イン.n位置_現在のサウンド = 0; @@ -1429,7 +1429,7 @@ namespace TJAPlayer3 } private void tカーソルを上へ移動する() { - if ((this.act曲リスト.r前の曲(r現在選択中の曲).eノード種別 == C曲リストノード.Eノード種別.SCORE) || this.act曲リスト.r前の曲(r現在選択中の曲).eノード種別 == C曲リストノード.Eノード種別.BACKBOX) + if ((this.act曲リスト.rGetSideSong(-1).eノード種別 == C曲リストノード.Eノード種別.SCORE) || this.act曲リスト.rGetSideSong(-1).eノード種別 == C曲リストノード.Eノード種別.BACKBOX) { TJAPlayer3.stage選曲.bBGMIn再生した = false;