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.ComponentModel;\r
18 using System.Drawing;\r
19 using System.Windows.Forms;\r
20 \r
21 // ReSharper disable CoVariantArrayConversion\r
22 \r
23 namespace KancolleSniffer\r
24 {\r
25     public class AirBattleResult\r
26     {\r
27         public class StageResult\r
28         {\r
29             public int FriendCount { get; set; }\r
30             public int FriendLost { get; set; }\r
31             public int EnemyCount { get; set; }\r
32             public int EnemyLost { get; set; }\r
33         }\r
34 \r
35         public string PhaseName { get; set; }\r
36         public int AirControlLevel { get; set; }\r
37         public StageResult Stage1 { get; set; } = new StageResult();\r
38         public StageResult Stage2 { get; set; } = new StageResult();\r
39     }\r
40 \r
41     [DesignerCategory("Code")]\r
42     public class AirBattleResultPanel : Panel\r
43     {\r
44         private readonly Label _phaseName;\r
45         private readonly Label _stage1;\r
46         private readonly Label[][][] _resultLabels = new Label[2][][];\r
47         private AirBattleResult[] _resultList;\r
48         private int _resultIndex;\r
49 \r
50         public bool ShowResultAutomatic { get; set; }\r
51 \r
52         private bool ResultRemained\r
53         {\r
54             set => _phaseName.BorderStyle = value ? BorderStyle.FixedSingle : BorderStyle.None;\r
55         }\r
56 \r
57         public AirBattleResultPanel()\r
58         {\r
59             const int top = 20;\r
60             var labels = new[]\r
61             {\r
62                 _phaseName =\r
63                     new Label\r
64                     {\r
65                         Text = "航空戦",\r
66                         Location = new Point(4, 4),\r
67                         Size = new Size(49, 12),\r
68                         TextAlign = ContentAlignment.TopCenter\r
69                     },\r
70                 _stage1 = new Label {Text = "stage1", Location = new Point(8, top), AutoSize = true},\r
71                 new Label {Text = "stage2", Location = new Point(8, top + 14), AutoSize = true},\r
72                 new Label {Text = "自軍", Location = new Point(67, 6), AutoSize = true},\r
73                 new Label {Text = "敵軍", Location = new Point(122, 6), AutoSize = true}\r
74             };\r
75             Controls.AddRange(labels);\r
76             const int left = 53;\r
77             const int space = 55;\r
78             for (var stage = 0; stage < 2; stage++)\r
79             {\r
80                 _resultLabels[stage] = new Label[2][];\r
81                 for (var fe = 0; fe < 2; fe++)\r
82                 {\r
83                     _resultLabels[stage][fe] = new Label[2];\r
84                     Controls.Add(_resultLabels[stage][fe][1] = new Label\r
85                     {\r
86                         Location = new Point(left + 34 + space * fe, top + 14 * stage),\r
87                         Size = new Size(24, 12),\r
88                         TextAlign = ContentAlignment.TopLeft\r
89                     });\r
90                     Controls.Add(new Label\r
91                     {\r
92                         Location = new Point(left + 21 + space * fe, top + 14 * stage),\r
93                         Text = "→",\r
94                         AutoSize = true\r
95                     });\r
96                     Controls.Add(_resultLabels[stage][fe][0] = new Label\r
97                     {\r
98                         Location = new Point(left + space * fe, top + 14 * stage),\r
99                         Size = new Size(24, 12),\r
100                         TextAlign = ContentAlignment.TopRight\r
101                     });\r
102                 }\r
103             }\r
104             _phaseName.Click += PhaseNameOnClick;\r
105         }\r
106 \r
107         public void SetResult(List<AirBattleResult> resultList)\r
108         {\r
109             _resultList = resultList.ToArray();\r
110             if (_resultList.Length == 0)\r
111             {\r
112                 ResultRemained = false;\r
113                 ClearResult();\r
114                 return;\r
115             }\r
116             _resultIndex = _resultList.Length - 1;\r
117             if (!ShowResultAutomatic)\r
118             {\r
119                 ResultRemained = true;\r
120                 ClearResult();\r
121                 return;\r
122             }\r
123             ShowResult();\r
124             ResultRemained = _resultList.Length > 1;\r
125             _resultIndex = 0;\r
126         }\r
127 \r
128         private void PhaseNameOnClick(object sender, EventArgs eventArgs)\r
129         {\r
130             if (_resultList == null || _resultList.Length == 0)\r
131                 return;\r
132             ShowResult();\r
133             if (_resultList.Length == 1)\r
134                 ResultRemained = false;\r
135             _resultIndex = (_resultIndex + 1) % _resultList.Length;\r
136         }\r
137 \r
138         private void ShowResult()\r
139         {\r
140             if (_resultIndex >= _resultList.Length)\r
141                 return;\r
142             var result = _resultList[_resultIndex];\r
143             _phaseName.Text = result.PhaseName;\r
144             var color = new[] {DefaultForeColor, CUDColor.Blue, CUDColor.Green, CUDColor.Orange, CUDColor.Red};\r
145             _stage1.ForeColor = color[result.AirControlLevel];\r
146             var stages = new[] {result.Stage1, result.Stage2};\r
147             for (var i = 0; i < 2; i++)\r
148             {\r
149                 var stage = stages[i];\r
150                 var labels = _resultLabels[i];\r
151                 labels[0][0].Text = $"{stage.FriendCount}";\r
152                 labels[0][1].Text = $"{stage.FriendCount - stage.FriendLost}";\r
153                 labels[1][0].Text = $"{stage.EnemyCount}";\r
154                 labels[1][1].Text = $"{stage.EnemyCount - stage.EnemyLost}";\r
155             }\r
156         }\r
157 \r
158         private void ClearResult()\r
159         {\r
160             _phaseName.Text = "航空戦";\r
161             _stage1.ForeColor = DefaultForeColor;\r
162             for (var st = 0; st < 2; st++)\r
163             {\r
164                 for (var fe = 0; fe < 2; fe++)\r
165                 {\r
166                     for (var ba = 0; ba < 2; ba++)\r
167                     {\r
168                         _resultLabels[st][fe][ba].Text = "";\r
169                     }\r
170                 }\r
171             }\r
172         }\r
173     }\r
174 }