OSDN Git Service

曲ツリーの構築機能を ユーザ クラスから分離。
[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 System.Xml.Linq;
7
8 namespace SST.ユーザ
9 {
10         public class ユーザ管理
11         {
12                 public List<ユーザ> ユーザリスト { get; } = new List<ユーザ>();
13                 public ユーザ 現在選択されているユーザ { get; protected set; } = null;   // 外から設定するにはメソッドを使う。
14
15                 public ユーザ管理()
16                 {
17                         this.初期化する();
18                         this.ユーザリスト.Add( new ユーザ( Properties.Resources.AUTOPLAYER ) );  // 既定ユーザ
19                 }
20                 public void ユーザを選択する( ユーザ 選択対象ユーザ )
21                 {
22                         if( null != 選択対象ユーザ )   // null でもエラーじゃない
23                         {
24                                 if( null == this.ユーザリスト.Find( user => user == 選択対象ユーザ ) )
25                                 {
26                                         var msg = "存在しないユーザを選択しようとしました。";
27                                         FDK.Log.ERROR( msg );
28                                         throw new SSTException( msg );
29                                 }
30                         }
31
32                         // 選択ユーザを変更する。
33                         this.現在選択されているユーザ = 選択対象ユーザ;
34                 }
35                 public void ユーザを選択する( string ユーザ名 )
36                 {
37                         var 名前に該当するユーザ = this.ユーザリスト.Find( user => user.名前 == ユーザ名 );
38                         if( null == 名前に該当するユーザ )
39                         {
40                                 var msg = $"存在しない名前「{ユーザ名}」のユーザを選択しようとしました。";
41                                 FDK.Log.ERROR( msg );
42                                 throw new SSTException( msg );
43                         }
44
45                         // 選択ユーザを変更する。
46                         this.ユーザを選択する( 名前に該当するユーザ );
47                 }
48                 public void ユーザを選択する( int index )
49                 {
50                         this.ユーザを選択する( this.ユーザリスト[ index ] );
51                 }
52
53                 public void UsersXmlを保存する()
54                 {
55                         this.UsersXmlを保存する( FDK.フォルダ.絶対パスに含まれるフォルダ変数を展開して返す( this.ユーザXmlファイルパス ) );
56                 }
57                 public void UsersXmlを保存する( string ファイルパス )
58                 {
59                         try
60                         {
61                                 var XML文書 = new XDocument( new XDeclaration( version: "1.0", encoding: "utf-8", standalone: "yes" ) );
62
63                                 // <Root>
64                                 var Root要素 = new XElement( nameof( XML.Root ) );
65                                 {
66                                         // <Users>
67                                         var Users要素 = new XElement( nameof( XML.Users ) );
68                                         {
69                                                 // ユーザ要素*
70                                                 foreach( var user in this.ユーザリスト )
71                                                 {
72                                                         user.ユーザをXML要素で出力する( 親要素: Users要素 );
73                                                 }
74                                         }
75                                         Root要素.Add( Users要素 );
76                                 }
77                                 XML文書.Add( Root要素 );
78
79                                 // ファイルに保存する。
80                                 XML文書.Save( ファイルパス );
81                         }
82                         catch( Exception e )
83                         {
84                                 FDK.Log.ERROR( $"ユーザファイルの保存に失敗しました。{e.Message}[{FDK.フォルダ.絶対パスをフォルダ変数付き絶対パスに変換して返す( ファイルパス )}]" );
85                         }
86                 }
87                 public void UsersXmlを読み込む()
88                 {
89                         this.UsersXmlを読み込む( FDK.フォルダ.絶対パスに含まれるフォルダ変数を展開して返す( this.ユーザXmlファイルパス ) );
90                 }
91                 public void UsersXmlを読み込む( string ファイルパス )
92                 {
93                         this.初期化する();
94
95                         if( false == File.Exists( ファイルパス ) )
96                         {
97                                 FDK.Log.WARNING( $"ユーザファイルが存在しません。作成します。[{FDK.フォルダ.絶対パスをフォルダ変数付き絶対パスに変換して返す( ファイルパス )}]" );
98                                 this.AutoPlayerを追加する();
99                                 this.UsersXmlを保存する( ファイルパス );
100                                 return;
101                         }
102
103                         try
104                         {
105                                 var XML文書 = XDocument.Load( ファイルパス );
106
107                                 // <Root>
108                                 var Root要素 = XML文書.Element( nameof( XML.Root ) );
109                                 {
110                                         // <Users>*
111                                         foreach( var Users要素 in Root要素.Elements( nameof( XML.Users ) ) )
112                                         {
113                                                 // ユーザ要素*
114                                                 foreach( var ユーザ要素 in Users要素.Elements() )
115                                                 {
116                                                         var 新ユーザ = new ユーザ();
117                                                         新ユーザ.ユーザをXML要素から読み込む( 読込対象要素: ユーザ要素 );  // ユーザ要素の解析は向こうに任せる。
118
119                                                         if( false == string.IsNullOrEmpty( 新ユーザ.名前 ) )
120                                                         {
121                                                                 // すでに同じ名前が存在するなら削除する。
122                                                                 var 同名ユーザ = this.ユーザリスト.FindIndex( user => user.名前 == 新ユーザ.名前 );
123                                                                 if( 0 <= 同名ユーザ )
124                                                                         this.ユーザリスト.RemoveAt( 同名ユーザ );
125
126                                                                 // リストに追加する。
127                                                                 this.ユーザリスト.Add( 新ユーザ );
128                                                         }
129                                                 }
130                                         }
131                                 }
132                         }
133                         catch( Exception e )
134                         {
135                                 FDK.Log.ERROR( $"ユーザファイルの読み込みに失敗しました。{e.Message}[{FDK.フォルダ.絶対パスをフォルダ変数付き絶対パスに変換して返す( ファイルパス )}]" );
136                         }
137
138                         // AutoPlayer が存在しないなら、追加する。
139                         if( -1 == this.ユーザリスト.FindIndex( ( user ) => user.名前 == Properties.Resources.AUTOPLAYER ) )
140                         {
141                                 this.AutoPlayerを追加する();       // 追加して
142                                 this.UsersXmlを保存する();   // 保存。
143                         }
144                 }
145
146                 protected readonly string ユーザXmlファイルパス = @"$(AppData)\Users.xml";
147
148                 private void 初期化する()
149                 {
150                         this.ユーザリスト.Clear();
151                         this.現在選択されているユーザ = null;
152                 }
153                 private void AutoPlayerを追加する()
154                 {
155                         var autoPlayer = new ユーザ( Properties.Resources.AUTOPLAYER );
156                         autoPlayer.チップの自動演奏を一括設定する( true );
157                         this.ユーザリスト.Add( autoPlayer );
158                 }
159         }
160 }