OSDN Git Service

PresetColorを廃止する
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / View / 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.ComponentModel;\r
17 using System.Drawing;\r
18 using System.Windows.Forms;\r
19 using KancolleSniffer.Model;\r
20 \r
21 // ReSharper disable CoVariantArrayConversion\r
22 \r
23 namespace KancolleSniffer.View\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 class AirFireResult\r
36         {\r
37             public string ShipName { get; set; }\r
38             public int Kind { get; set; }\r
39             public string[] Items { get; set; }\r
40         }\r
41 \r
42         public string PhaseName { get; set; }\r
43         public int AirControlLevel { get; set; }\r
44         public StageResult Stage1 { get; set;  }\r
45         public StageResult Stage2 { get; set;  }\r
46         public AirFireResult AirFire { get; set; }\r
47     }\r
48 \r
49     [DesignerCategory("Code")]\r
50     public class AirBattleResultPanel : PanelWithToolTip\r
51     {\r
52         private readonly Label _phaseName;\r
53         private readonly Label _stage1;\r
54         private readonly Label[][][] _resultLabels = new Label[2][][];\r
55         private AirBattleResult[] _resultList;\r
56         private int _resultIndex;\r
57         private readonly ShipLabel _ciShipName;\r
58         private readonly Label _ciKind;\r
59 \r
60         public bool ShowResultAutomatic { get; set; }\r
61 \r
62         private bool ResultRemained\r
63         {\r
64             set => _phaseName.BorderStyle = value ? BorderStyle.FixedSingle : BorderStyle.None;\r
65         }\r
66 \r
67         public AirBattleResultPanel()\r
68         {\r
69             const int top = 20;\r
70             const int ci = 168;\r
71             var labels = new[]\r
72             {\r
73                 _phaseName =\r
74                     new Label\r
75                     {\r
76                         Text = "航空戦",\r
77                         Location = new Point(4, 4),\r
78                         Size = new Size(49, 12),\r
79                         TextAlign = ContentAlignment.TopCenter\r
80                     },\r
81                 _stage1 = new Label {Text = "stage1", Location = new Point(8, top), AutoSize = true},\r
82                 new Label {Text = "stage2", Location = new Point(8, top + 14), AutoSize = true},\r
83                 new Label {Text = "自軍", Location = new Point(67, 6), AutoSize = true},\r
84                 new Label {Text = "敵軍", Location = new Point(122, 6), AutoSize = true},\r
85                 new Label {Text = "CI", Location = new Point(ci, 4), AutoSize = true}\r
86             };\r
87             Controls.AddRange(labels);\r
88             const int left = 53;\r
89             const int space = 55;\r
90             for (var stage = 0; stage < 2; stage++)\r
91             {\r
92                 _resultLabels[stage] = new Label[2][];\r
93                 for (var fe = 0; fe < 2; fe++)\r
94                 {\r
95                     _resultLabels[stage][fe] = new Label[2];\r
96                     Controls.Add(_resultLabels[stage][fe][1] = new Label\r
97                     {\r
98                         Location = new Point(left + 34 + space * fe, top + 14 * stage),\r
99                         Size = new Size(24, 12),\r
100                         TextAlign = ContentAlignment.TopLeft\r
101                     });\r
102                     Controls.Add(new Label\r
103                     {\r
104                         Location = new Point(left + 21 + space * fe, top + 14 * stage),\r
105                         Text = "→",\r
106                         AutoSize = true\r
107                     });\r
108                     Controls.Add(_resultLabels[stage][fe][0] = new Label\r
109                     {\r
110                         Location = new Point(left + space * fe, top + 14 * stage),\r
111                         Size = new Size(24, 12),\r
112                         TextAlign = ContentAlignment.TopRight\r
113                     });\r
114                 }\r
115             }\r
116             Controls.Add(_ciShipName = new ShipLabel\r
117             {\r
118                 Location = new Point(ci, top),\r
119                 Size = new Size((int)ShipNameWidth.CiShipName, 12)\r
120             });\r
121             Controls.Add(_ciKind = new Label\r
122             {\r
123                 Location = new Point(ci, top + 14),\r
124                 Size = new Size(24, 12)\r
125             });\r
126             _phaseName.Click += PhaseNameOnClick;\r
127         }\r
128 \r
129         public void SetResult(Sniffer sniffer)\r
130         {\r
131             var state = sniffer.Battle.BattleState;\r
132             if (state != BattleState.Day && state != BattleState.SpNight)\r
133                 return;\r
134             _resultList = sniffer.Battle.AirBattleResults.ToArray();\r
135             if (_resultList.Length == 0)\r
136             {\r
137                 ResultRemained = false;\r
138                 ClearResult();\r
139                 return;\r
140             }\r
141             _resultIndex = _resultList.Length - 1;\r
142             if (!ShowResultAutomatic)\r
143             {\r
144                 ResultRemained = true;\r
145                 ClearResult();\r
146                 return;\r
147             }\r
148             ShowResult();\r
149             ResultRemained = _resultList.Length > 1;\r
150             _resultIndex = 0;\r
151         }\r
152 \r
153         private void PhaseNameOnClick(object sender, EventArgs eventArgs)\r
154         {\r
155             if (_resultList == null || _resultList.Length == 0)\r
156                 return;\r
157             ShowResult();\r
158             if (_resultList.Length == 1)\r
159                 ResultRemained = false;\r
160             _resultIndex = (_resultIndex + 1) % _resultList.Length;\r
161         }\r
162 \r
163         private void ShowResult()\r
164         {\r
165             if (_resultIndex >= _resultList.Length)\r
166                 return;\r
167             var result = _resultList[_resultIndex];\r
168             _phaseName.Text = result.PhaseName;\r
169             var color = new[] {DefaultForeColor, CUDColors.Blue, CUDColors.Green, CUDColors.Orange, CUDColors.Red};\r
170             _stage1.ForeColor = color[result.AirControlLevel];\r
171             var stages = new[] {result.Stage1, result.Stage2};\r
172             for (var i = 0; i < 2; i++)\r
173             {\r
174                 var stage = stages[i];\r
175                 var labels = _resultLabels[i];\r
176                 labels[0][0].Text = $"{stage.FriendCount}";\r
177                 labels[0][1].Text = $"{stage.FriendCount - stage.FriendLost}";\r
178                 labels[1][0].Text = $"{stage.EnemyCount}";\r
179                 labels[1][1].Text = $"{stage.EnemyCount - stage.EnemyLost}";\r
180             }\r
181             ShowAirFireResult();\r
182         }\r
183 \r
184         private void ShowAirFireResult()\r
185         {\r
186             var result = _resultList[_resultIndex];\r
187             if (result.AirFire == null)\r
188             {\r
189                 _ciShipName.SetName(null);\r
190                 _ciKind.Text = "";\r
191                 ToolTip.SetToolTip(_ciKind, "");\r
192             }\r
193             else\r
194             {\r
195                 _ciShipName.SetName(result.AirFire.ShipName, ShipNameWidth.CiShipName);\r
196                 _ciKind.Text = result.AirFire.Kind.ToString();\r
197                 ToolTip.SetToolTip(_ciKind, string.Join("\r\n", result.AirFire.Items));\r
198             }\r
199         }\r
200 \r
201         private void ClearResult()\r
202         {\r
203             _phaseName.Text = "航空戦";\r
204             _stage1.ForeColor = DefaultForeColor;\r
205             for (var st = 0; st < 2; st++)\r
206             {\r
207                 for (var fe = 0; fe < 2; fe++)\r
208                 {\r
209                     for (var ba = 0; ba < 2; ba++)\r
210                     {\r
211                         _resultLabels[st][fe][ba].Text = "";\r
212                     }\r
213                 }\r
214             }\r
215             _ciShipName.SetName(null);\r
216             _ciKind.Text = "";\r
217             ToolTip.SetToolTip(_ciKind, "");\r
218         }\r
219     }\r
220 }