OSDN Git Service

SSTFEditor と SSTFormat のリファクタ。
[strokestylet/CsWin10Desktop3.git] / StrokeStyleT / / 曲ツリー管理.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Diagnostics;
4 using System.IO;
5 using System.Linq;
6 using FDK.メディア;
7
8 namespace SST.曲
9 {
10         /// <summary>
11         /// 曲ツリーへの参照を受け取り、その曲ツリーに対する様々な操作を提供する。
12         /// </summary>
13         public class 曲ツリー管理 : FDK.Activity
14         {
15                 public RootNode 現在の管理対象ツリー
16                 {
17                         get
18                         {
19                                 return this.bs_現在の管理対象ツリー;
20                         }
21                         set
22                         {
23                                 this.bs_現在の管理対象ツリー = value;
24
25                                 // 選択ノードを子リストの先頭にリセット。
26                                 this.現在選択されているノード = ( 0 < value.子ノードリスト.Count ) ? value.子ノードリスト[ 0 ] : null;
27                         }
28                 }
29                 public Node 現在選択されているノード { get; protected set; } = null;
30
31                 public void 前のノードを選択する()
32                 {
33                         this.現在選択されているノード = this.現在選択されているノード?.前のノード;
34                 }
35                 public void 次のノードを選択する()
36                 {
37                         this.現在選択されているノード = this.現在選択されているノード?.次のノード;
38                 }
39
40                 public static void フォルダから曲を検索して子ノードリストに追加する( Node 追加対象ノード, string フォルダパス )
41                 {
42                         // フォルダが存在しないなら何もしない。
43                         if( false == Directory.Exists( フォルダパス ) )
44                         {
45                                 FDK.Log.WARNING( $"指定されたフォルダが存在しません。無視します。[{FDK.フォルダ.絶対パスをフォルダ変数付き絶対パスに変換して返す( フォルダパス )}]" );
46                                 return;
47                         }
48                         var dirInfo = new DirectoryInfo( フォルダパス );
49
50                         // (1) このフォルダにあるすべてのsstfファイルから、曲ノードを作成する。
51                         foreach( var fileInfo in dirInfo.GetFiles( "*.sstf", SearchOption.TopDirectoryOnly ) )
52                         {
53                                 var score = new SSTFormat.スコア();
54                                 score.t曲データファイルを読み込む_ヘッダだけ( fileInfo.FullName );
55                                 追加対象ノード.子ノードリスト.Add( new MusicNode( fileInfo.FullName ) {
56                                         タイトル = score.Header.曲名,
57                                         親ノード = 追加対象ノード,
58                                 } );
59                         }
60
61                         // (2) このフォルダのすべてのサブフォルダについて……
62                         foreach( var subDirInfo in dirInfo.GetDirectories() )
63                         {
64                                 // box.def を含むフォルダの場合 → BOX ノードを作成する。
65                                 var boxファイルパス = Path.Combine( subDirInfo.FullName, @"box.def" );
66                                 if( File.Exists( boxファイルパス ) )
67                                 {
68                                         var box = new BoxDef( boxファイルパス );
69                                         追加対象ノード.子ノードリスト.Add( new BoxNode() {
70                                                 タイトル = box.Title,
71                                                 親ノード = 追加対象ノード,
72                                         } );
73                                 }
74
75                                 // サブフォルダへ再帰。(通常フォルダでもBOXフォルダでも。)
76                                 曲ツリー管理.フォルダから曲を検索して子ノードリストに追加する( 追加対象ノード, subDirInfo.FullName );
77                         }
78                 }
79
80                 protected override void On活性化( デバイスリソース dr )
81                 {
82                         if( null != this.bs_現在の管理対象ツリー )
83                         {
84                                 // 子リストに含まれる全ノードを子Activityリストに追加する。
85                                 foreach( var node in this.bs_現在の管理対象ツリー.子ノードリスト )
86                                         this.子リスト.Add( node );
87                         }
88                 }
89                 protected override void On非活性化( デバイスリソース dr )
90                 {
91                         if( null != this.bs_現在の管理対象ツリー )
92                         {
93                                 // 子リストに含まれる全ノードを子Activityリストから削除する。
94                                 foreach( var node in this.bs_現在の管理対象ツリー.子ノードリスト )
95                                         this.子リスト.Remove( node );
96                         }
97                 }
98
99                 #region " バックストア。"
100                 //-------------------------
101                 private RootNode bs_現在の管理対象ツリー = null;
102                 //-------------------------
103                 #endregion
104         }
105 }