OSDN Git Service

DPX→PX変換に失敗していたミスを修正。
[strokestylet/CsWin10Desktop3.git] / StrokeStyleT / / Node.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Diagnostics;
4 using System.Linq;
5 using FDK.メディア;
6
7 namespace SST.曲
8 {
9         /// <summary>
10         /// 曲ツリーを構成するノードの抽象クラス。
11         /// </summary>
12         public abstract class Node : FDK.Activity
13         {
14                 public string タイトル { set; get; } = "(no title)";
15
16                 /// <summary>
17                 /// 自身の親のノード。
18                 /// </summary>
19                 /// <remarks>
20                 /// これが 非null の場合は、親ノードの子ノードリストに自身が含まれていることを意味する。
21                 /// これが null の場合は、ルートノードであるか、または曲ツリーにまだ登録されていないノードであることを意味する。
22                 /// ルートノード以外のノードは、基本的に null にはならない。
23                 /// </remarks>
24                 public Node 親ノード { get; set; } = null;
25                 
26                 /// <summary>
27                 /// 自身の子となるノードのリスト。
28                 /// 原則として、ルートノード/BOX ノード以外は 空リスト である。(一応、null にはしない。)
29                 /// </summary>
30                 public List<Node> 子ノードリスト { get; } = new List<Node>();
31
32                 public Node 前のノード
33                 {
34                         get
35                         {
36                                 var 兄弟リスト = this.親ノード.子ノードリスト;
37                                 Trace.Assert( 0 < 兄弟リスト.Count, "[バグあり] 兄弟リストの要素数がゼロです。兄弟リストには最低でも自分がいるはず。" );
38
39                                 var index = 兄弟リスト.IndexOf( this );
40                                 Trace.Assert( 0 <= index, "[バグあり] 自分が兄弟リストに存在していません。" );
41
42                                 index = index - 1;
43                                 if( 0 > index ) // 先頭なら
44                                         index = 兄弟リスト.Count - 1;    // 末尾へ。
45
46                                 return 兄弟リスト[ index ];
47                         }
48                 }
49                 public Node 次のノード
50                 {
51                         get
52                         {
53                                 var 兄弟リスト = this.親ノード.子ノードリスト;
54                                 if( 0 == 兄弟リスト.Count )
55                                         throw new SSTException( "兄弟リストの Count が 0 です。" );
56
57                                 var index = 兄弟リスト.IndexOf( this );
58                                 if( 0 > index )
59                                         throw new SSTException( "兄弟リストに this が存在していません。" );
60
61                                 index = index + 1;
62                                 if( 兄弟リスト.Count <= index )  // 末尾なら
63                                         index = 0;  // 先頭へ。
64
65                                 return 兄弟リスト[ index ];
66                         }
67                 }
68
69                 public SharpDX.Size2F ノードの全体サイズdpx => new SharpDX.Size2F( 314f, 220f );
70                 public virtual SharpDX.Size2F ノードの画像領域のサイズdpx => new SharpDX.Size2F( 314f, 220f-82f );
71                 public virtual SharpDX.Size2F ノードのタイトル領域のサイズdpx => new SharpDX.Size2F( 314f, 82f );
72                 public SharpDX.Size2F タイトル画像サイズdpx => this.タイトル文画像.サイズdpx;
73
74                 protected override void On活性化( デバイスリソース dr )
75                 {
76                         // タイトル部の文字画像を作成する。
77                         this.子リスト.Add( this.タイトル文画像 = new タイトルテクスチャ( this.タイトル ) );
78                 }
79                 protected override void On非活性化( デバイスリソース dr )
80                 {
81                         this.子リスト.Remove( this.タイトル文画像 );
82                 }
83                 protected override void Onデバイス依存リソースの作成( デバイスリソース dr )
84                 {
85                         // まだ既定の曲画像が生成されてなかったら生成する。
86                         if( null == Node.既定の曲画像 )
87                         {
88                                 Node.既定の曲画像 = new テクスチャ( @"$(Static)\images\選曲パネル.png" );
89                                 Node.既定の曲画像.活性化する( dr );    // 既定の曲画像には子Activityはないので、ここで活性化してよい。
90                         }
91                 }
92                 protected override void Onデバイス依存リソースの解放( デバイスリソース dr )
93                 {
94                         // まだ既定の曲画像が解放されてなかったら解放する。
95                         if( null != Node.既定の曲画像 )
96                         {
97                                 Node.既定の曲画像.非活性化する( dr );   // 既定の曲画像には子Activityはないので、ここで非活性化してよい。
98                                 Node.既定の曲画像 = null;
99                         }
100                 }
101
102                 public virtual void ノード画像を描画する( デバイスリソース dr, SharpDX.Matrix ワールド変換行列 )
103                 {
104                         if( Node.既定の曲画像.活性化している )
105                                 Node.既定の曲画像.描画する( dr, ワールド変換行列 );
106                 }
107                 public virtual void タイトル画像を描画する( デバイスリソース dr, SharpDX.Matrix ワールド変換行列 )
108                 {
109                         if( this.タイトル文画像.活性化している )
110                                 this.タイトル文画像.描画する( dr, ワールド変換行列 );
111                 }
112
113                 protected タイトルテクスチャ タイトル文画像 = null;
114
115                 protected static FDK.メディア.テクスチャ 既定の曲画像 = null;   // 全インスタンスで共有
116         }
117 }