OSDN Git Service

ズームしたときに文字が欠けないようにゆとりを持たせる
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / AirBattleResultPanel.cs
1 // Copyright (C) 2016 Kazuhiro Fujieda <fujieda@users.osdn.me>\r
2 //\r
3 // Licensed under the Apache License, Version 2.0 (the "License");\r
4 // you may not use this file except in compliance with the License.\r
5 // You may obtain a copy of the License at\r
6 //\r
7 //    http://www.apache.org/licenses/LICENSE-2.0\r
8 //\r
9 // Unless required by applicable law or agreed to in writing, software\r
10 // distributed under the License is distributed on an "AS IS" BASIS,\r
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
12 // See the License for the specific language governing permissions and\r
13 // limitations under the License.\r
14 \r
15 using System;\r
16 using System.Collections.Generic;\r
17 using System.Drawing;\r
18 using System.Windows.Forms;\r
19 \r
20 // ReSharper disable CoVariantArrayConversion\r
21 \r
22 namespace KancolleSniffer\r
23 {\r
24     public class AirBattleResult\r
25     {\r
26         public class StageResult\r
27         {\r
28             public int FriendCount { get; set; }\r
29             public int FriendLost { get; set; }\r
30             public int EnemyCount { get; set; }\r
31             public int EnemyLost { get; set; }\r
32         }\r
33 \r
34         public string PhaseName { get; set; }\r
35         public int AirControlLevel { get; set; }\r
36         public StageResult Stage1 { get; set; } = new StageResult();\r
37         public StageResult Stage2 { get; set; } = new StageResult();\r
38     }\r
39 \r
40     public class AirBattleResultPanel : Panel\r
41     {\r
42         private readonly Label _phaseName;\r
43         private readonly Label _stage1;\r
44         private readonly Label[][][] _resultLabels = new Label[2][][];\r
45         private List<AirBattleResult> _resultList;\r
46         private int _resultIndex;\r
47 \r
48         public bool ShowResultAutomatic { get; set; }\r
49 \r
50         private bool ResultRemained\r
51         {\r
52             set => _phaseName.BorderStyle = value ? BorderStyle.FixedSingle : BorderStyle.None;\r
53         }\r
54 \r
55         public AirBattleResultPanel()\r
56         {\r
57             const int top = 20;\r
58             var labels = new[]\r
59             {\r
60                 _phaseName =\r
61                     new Label\r
62                     {\r
63                         Text = "航空戦",\r
64                         Location = new Point(4, 4),\r
65                         Size = new Size(49, 12),\r
66                         TextAlign = ContentAlignment.TopCenter\r
67                     },\r
68                 _stage1 = new Label {Text = "stage1", Location = new Point(8, top), AutoSize = true},\r
69                 new Label {Text = "stage2", Location = new Point(8, top + 14), AutoSize = true},\r
70                 new Label {Text = "自軍", Location = new Point(67, 6), AutoSize = true},\r
71                 new Label {Text = "敵軍", Location = new Point(124, 6), AutoSize = true}\r
72             };\r
73             Controls.AddRange(labels);\r
74             const int left = 53;\r
75             for (var stage = 0; stage < 2; stage++)\r
76             {\r
77                 _resultLabels[stage] = new Label[2][];\r
78                 for (var fe = 0; fe < 2; fe++)\r
79                 {\r
80                     _resultLabels[stage][fe] = new Label[2];\r
81                     Controls.Add(_resultLabels[stage][fe][1] = new Label\r
82                     {\r
83                         Location = new Point(left + 32 + 57 * fe, top + 14 * stage),\r
84                         Size = new Size(24, 12),\r
85                         TextAlign = ContentAlignment.TopLeft\r
86                     });\r
87                     Controls.Add(new Label\r
88                     {\r
89                         Location = new Point(left + 21 + 57 * fe, top + 14 * stage),\r
90                         Text = "→",\r
91                         AutoSize = true\r
92                     });\r
93                     Controls.Add(_resultLabels[stage][fe][0] = new Label\r
94                     {\r
95                         Location = new Point(left + 57 * fe, top + 14 * stage),\r
96                         Size = new Size(24, 12),\r
97                         TextAlign = ContentAlignment.TopRight\r
98                     });\r
99                 }\r
100             }\r
101             _phaseName.Click += PhaseNameOnClick;\r
102         }\r
103 \r
104         public void SetResult(List<AirBattleResult> resultList)\r
105         {\r
106             _resultList = resultList;\r
107             if (_resultList.Count == 0)\r
108             {\r
109                 ResultRemained = false;\r
110                 ClearResult();\r
111                 return;\r
112             }\r
113             _resultIndex = _resultList.Count - 1;\r
114             if (!ShowResultAutomatic)\r
115             {\r
116                 ResultRemained = true;\r
117                 ClearResult();\r
118                 return;\r
119             }\r
120             ShowResult();\r
121             ResultRemained = _resultList.Count > 1;\r
122             _resultIndex = 0;\r
123         }\r
124 \r
125         private void PhaseNameOnClick(object sender, EventArgs eventArgs)\r
126         {\r
127             if (_resultList == null || _resultList.Count == 0)\r
128                 return;\r
129             ShowResult();\r
130             if (_resultList.Count == 1)\r
131                 ResultRemained = false;\r
132             _resultIndex = (_resultIndex + 1) % _resultList.Count;\r
133         }\r
134 \r
135         private void ShowResult()\r
136         {\r
137             if (_resultIndex >= _resultList.Count)\r
138                 return;\r
139             var result = _resultList[_resultIndex];\r
140             _phaseName.Text = result.PhaseName;\r
141             var color = new[] {DefaultForeColor, CUDColor.Blue, CUDColor.Green, CUDColor.Orange, CUDColor.Red};\r
142             _stage1.ForeColor = color[result.AirControlLevel];\r
143             var stages = new[] {result.Stage1, result.Stage2};\r
144             for (var i = 0; i < 2; i++)\r
145             {\r
146                 var stage = stages[i];\r
147                 var labels = _resultLabels[i];\r
148                 labels[0][0].Text = $"{stage.FriendCount}";\r
149                 labels[0][1].Text = $"{stage.FriendCount - stage.FriendLost}";\r
150                 labels[1][0].Text = $"{stage.EnemyCount}";\r
151                 labels[1][1].Text = $"{stage.EnemyCount - stage.EnemyLost}";\r
152             }\r
153         }\r
154 \r
155         private void ClearResult()\r
156         {\r
157             _phaseName.Text = "航空戦";\r
158             _stage1.ForeColor = DefaultForeColor;\r
159             for (var st = 0; st < 2; st++)\r
160             {\r
161                 for (var fe = 0; fe < 2; fe++)\r
162                 {\r
163                     for (var ba = 0; ba < 2; ba++)\r
164                     {\r
165                         _resultLabels[st][fe][ba].Text = "";\r
166                     }\r
167                 }\r
168             }\r
169         }\r
170     }\r
171 }