OSDN Git Service

装備の改修効果が索敵値に正しく反映されていないのを直す
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / ListForm.cs
1 // Copyright (C) 2014, 2015 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.Linq;\r
19 using System.Windows.Forms;\r
20 using static System.Math;\r
21 \r
22 namespace KancolleSniffer\r
23 {\r
24     public partial class ListForm : Form\r
25     {\r
26         private readonly Sniffer _sniffer;\r
27         private readonly Config _config;\r
28         public const int PanelWidth = 217;\r
29 \r
30         public enum SortOrder\r
31         {\r
32             None,\r
33             Cond,\r
34             CondAscend = Cond,\r
35             CondDescend,\r
36             ExpToNext,\r
37             ExpToNextAscend = ExpToNext,\r
38             ExpToNextDescend,\r
39             Repair\r
40         }\r
41 \r
42         public ListForm(Sniffer sniffer, Config config)\r
43         {\r
44             InitializeComponent();\r
45             _sniffer = sniffer;\r
46             _config = config;\r
47             battleResultPanel.HpLabelClick += ToggleHpPercent;\r
48             shipListPanel.HpLabelClick += ToggleHpPercent;\r
49             var swipe = new SwipeScrollify();\r
50             swipe.AddShipListPanel(shipListPanel);\r
51             swipe.AddTreeView(itemTreeView);\r
52             swipe.AddPanel(fleetPanel);\r
53         }\r
54 \r
55         /// <summary>\r
56         /// パネルのz-orderがくるうのを避ける\r
57         /// https://stackoverflow.com/a/5777090/1429506\r
58         /// </summary>\r
59         private void ListForm_Shown(object sender, EventArgs e)\r
60         {\r
61             // ReSharper disable once NotAccessedVariable\r
62             IntPtr handle;\r
63             foreach (Control panel in Controls)\r
64                 // ReSharper disable once RedundantAssignment\r
65                 handle = panel.Handle;\r
66         }\r
67 \r
68         public void UpdateList()\r
69         {\r
70             panelItemHeader.Visible = InItemList || InAntiAir || InBattleResult || InMiscText;\r
71             panelGroupHeader.Visible = InGroupConfig;\r
72             panelRepairHeader.Visible = InRepairList;\r
73             panelFleetHeader.Visible = InFleetInfo;\r
74             // SwipeScrollifyが誤作動するのでEnabledも切り替える\r
75             shipListPanel.Visible = shipListPanel.Enabled = InShipStatus || InGroupConfig || InRepairList;\r
76             itemTreeView.Visible = itemTreeView.Enabled = InItemList;\r
77             fleetPanel.Visible = fleetPanel.Enabled = InFleetInfo;\r
78             antiAirPanel.Visible = antiAirPanel.Enabled = InAntiAir;\r
79             airBattleResultPanel.Visible = airBattleResultPanel.Enabled =\r
80                 battleResultPanel.Visible = battleResultPanel.Enabled = InBattleResult;\r
81             richTextBoxMiscText.Visible = InMiscText;\r
82             if (InItemList)\r
83             {\r
84                 itemTreeView.SetNodes(_sniffer.ItemList);\r
85             }\r
86             else if (InFleetInfo)\r
87             {\r
88                 fleetPanel.Update(_sniffer);\r
89             }\r
90             else if (InAntiAir)\r
91             {\r
92                 antiAirPanel.Update(_sniffer);\r
93             }\r
94             else if (InMiscText)\r
95             {\r
96                 richTextBoxMiscText.Text = _sniffer.MiscText;\r
97             }\r
98             else\r
99             {\r
100                 SetHeaderSortOrder();\r
101                 shipListPanel.Update(_sniffer, comboBoxGroup.Text, _config.ShipList.SortOrder,\r
102                     _config.ShipList.ShipType);\r
103             }\r
104             if (shipListPanel.GroupUpdated)\r
105             {\r
106                 StoreShipGroupToConfig();\r
107                 _config.Save();\r
108                 shipListPanel.GroupUpdated = false;\r
109             }\r
110         }\r
111 \r
112         public void UpdateAirBattleResult()\r
113         {\r
114             airBattleResultPanel.ShowResultAutomatic = (_config.Spoilers & Spoiler.AirBattleResult) != 0;\r
115             airBattleResultPanel.SetResult(_sniffer.Battle.AirBattleResults);\r
116         }\r
117 \r
118         public void UpdateBattleResult()\r
119         {\r
120             battleResultPanel.Spoilers = _config.Spoilers;\r
121             battleResultPanel.Update(_sniffer);\r
122         }\r
123 \r
124         public void UpdateCellInfo()\r
125         {\r
126             battleResultPanel.Spoilers = _config.Spoilers;\r
127             battleResultPanel.UpdateCellInfo(_sniffer);\r
128         }\r
129 \r
130         private void SetHeaderSortOrder()\r
131         {\r
132             switch (_config.ShipList.SortOrder)\r
133             {\r
134                 case SortOrder.None:\r
135                     labelHeaderCond.Text = "cond";\r
136                     labelHeaderExp.Text = "Exp";\r
137                     break;\r
138                 case SortOrder.CondAscend:\r
139                     labelHeaderCond.Text = "cond▴";\r
140                     labelHeaderExp.Text = "Exp";\r
141                     break;\r
142                 case SortOrder.CondDescend:\r
143                     labelHeaderCond.Text = "cond▾";\r
144                     labelHeaderExp.Text = "Exp";\r
145                     break;\r
146                 case SortOrder.ExpToNextAscend:\r
147                     labelHeaderCond.Text = "cond";\r
148                     labelHeaderExp.Text = "Exp▴";\r
149                     break;\r
150                 case SortOrder.ExpToNextDescend:\r
151                     labelHeaderCond.Text = "cond";\r
152                     labelHeaderExp.Text = "Exp▾";\r
153                     break;\r
154             }\r
155         }\r
156 \r
157         private bool InShipStatus => Array.Exists(new[] {"全艦", "A", "B", "C", "D"}, x => comboBoxGroup.Text == x);\r
158 \r
159         private bool InGroupConfig => comboBoxGroup.Text == "分類";\r
160 \r
161         private bool InRepairList => comboBoxGroup.Text == "修復";\r
162 \r
163         private bool InItemList => comboBoxGroup.Text == "装備";\r
164 \r
165         private bool InFleetInfo => comboBoxGroup.Text == "艦隊";\r
166 \r
167         private bool InAntiAir => comboBoxGroup.Text == "対空";\r
168 \r
169         private bool InBattleResult => comboBoxGroup.Text == "戦況";\r
170 \r
171         private bool InMiscText => comboBoxGroup.Text == "情報";\r
172 \r
173         private void ShipListForm_Load(object sender, EventArgs e)\r
174         {\r
175             /* DPIではなくズームしたときにパネルは大きくなるがScrollBarはそのままなので隙間ができる。\r
176                そこでScrollBarの幅に合わせて全体の横幅を設定し直す。*/\r
177             Width = (int)Round((PanelWidth + 12 /* PanelとFrameの内側 */) * ShipLabel.ScaleFactor.Width) +\r
178                     SystemInformation.VerticalScrollBarWidth + 2 /* 縁の幅 */ + Width - ClientSize.Width;\r
179             MinimumSize = new Size(Width, 0);\r
180             MaximumSize = new Size(Width, int.MaxValue);\r
181             var config = _config.ShipList;\r
182             checkBoxShipType.Checked = config.ShipType;\r
183             if (config.ShowHpInPercent)\r
184             {\r
185                 shipListPanel.ToggleHpPercent();\r
186                 battleResultPanel.ToggleHpPercent();\r
187             }\r
188             LoadShipGroupFromConfig();\r
189             comboBoxGroup.SelectedItem = config.Mode ?? "全艦";\r
190             if (config.Location.X == int.MinValue)\r
191                 return;\r
192             var bounds = new Rectangle(config.Location, config.Size);\r
193             if (MainForm.IsTitleBarOnAnyScreen(bounds.Location))\r
194                 Location = bounds.Location;\r
195             Height = bounds.Height;\r
196         }\r
197 \r
198         private void LoadShipGroupFromConfig()\r
199         {\r
200             var group = _config.ShipList.ShipGroup;\r
201             for (var i = 0; i < ShipListPanel.GroupCount; i++)\r
202                 shipListPanel.GroupSettings[i] = i < group.Count ? new HashSet<int>(group[i]) : new HashSet<int>();\r
203         }\r
204 \r
205         private void ShipListForm_FormClosing(object sender, FormClosingEventArgs e)\r
206         {\r
207             e.Cancel = true;\r
208             if (!Visible)\r
209                 return;\r
210             var config = _config.ShipList;\r
211             StoreShipGroupToConfig();\r
212             var bounds = WindowState == FormWindowState.Normal ? Bounds : RestoreBounds;\r
213             config.Location = bounds.Location;\r
214             config.Size = bounds.Size;\r
215             config.Mode = (string)comboBoxGroup.SelectedItem;\r
216             if (e.CloseReason != CloseReason.FormOwnerClosing)\r
217             {\r
218                 Hide();\r
219                 _config.Save();\r
220             }\r
221         }\r
222 \r
223         private void StoreShipGroupToConfig()\r
224         {\r
225             var all = _sniffer.ShipList.Select(s => s.Id).ToArray();\r
226             var group = _config.ShipList.ShipGroup;\r
227             group.Clear();\r
228             for (var i = 0; i < ShipListPanel.GroupCount; i++)\r
229             {\r
230                 if (all.Length > 0)\r
231                     shipListPanel.GroupSettings[i].IntersectWith(all);\r
232                 group.Add(shipListPanel.GroupSettings[i].ToList());\r
233             }\r
234         }\r
235 \r
236         public void ShowShip(int id)\r
237         {\r
238             if (InShipStatus)\r
239             {\r
240                 shipListPanel.ShowShip(id);\r
241             }\r
242             else if (InFleetInfo)\r
243             {\r
244                 fleetPanel.ShowShip(id);\r
245             }\r
246             else if (InAntiAir)\r
247             {\r
248                 antiAirPanel.ShowShip(id);\r
249             }\r
250         }\r
251 \r
252         private void checkBoxShipType_CheckedChanged(object sender, EventArgs e)\r
253         {\r
254             _config.ShipList.ShipType = checkBoxShipType.Checked;\r
255             UpdateList();\r
256             SetActiveControl();\r
257         }\r
258 \r
259         private void comboBoxGroup_DropDownClosed(object sender, EventArgs e)\r
260         {\r
261             SetActiveControl();\r
262         }\r
263 \r
264         private void comboBoxGroup_SelectedIndexChanged(object sender, EventArgs e)\r
265         {\r
266             UpdateList();\r
267             SetActiveControl();\r
268             copyToolStripMenuItem.Enabled = InShipStatus | InItemList;\r
269         }\r
270 \r
271         private void ShipListForm_KeyPress(object sender, KeyPressEventArgs e)\r
272         {\r
273             var g = Array.FindIndex(new[] {'Z', 'A', 'B', 'C', 'D', 'G', 'R', 'W', 'X', 'Y', 'S', 'I'},\r
274                 x => x == char.ToUpper(e.KeyChar));\r
275             if (g == -1)\r
276                 return;\r
277             comboBoxGroup.SelectedIndex = g;\r
278             e.Handled = true;\r
279         }\r
280 \r
281         // マウスホイールでスクロールするためにコントロールにフォーカスを合わせる。\r
282         private void SetActiveControl()\r
283         {\r
284             if (InItemList)\r
285             {\r
286                 ActiveControl = itemTreeView;\r
287             }\r
288             else if (InFleetInfo)\r
289             {\r
290                 ActiveControl = fleetPanel;\r
291             }\r
292             else if (InAntiAir)\r
293             {\r
294                 ActiveControl = antiAirPanel;\r
295             }\r
296             else\r
297             {\r
298                 ActiveControl = shipListPanel;\r
299             }\r
300         }\r
301 \r
302         private void copyToolStripMenuItem_Click(object sender, EventArgs e)\r
303         {\r
304             Clipboard.SetText(TextGenerator.GenerateItemList(_sniffer.ItemList));\r
305         }\r
306 \r
307         private void textToolStripMenuItem_Click(object sender, EventArgs e)\r
308         {\r
309             Clipboard.SetText(TextGenerator.GenerateFleetData(_sniffer));\r
310         }\r
311 \r
312         private void deckBuilderToolStripMenuItem_Click(object sender, EventArgs e)\r
313         {\r
314             Clipboard.SetText(TextGenerator.GenerateDeckBuilderData(_sniffer));\r
315         }\r
316 \r
317         private void labelHeaderCond_Click(object sender, EventArgs e)\r
318         {\r
319             var sl = _config.ShipList;\r
320             switch (sl.SortOrder)\r
321             {\r
322                 case SortOrder.CondAscend:\r
323                     sl.SortOrder = SortOrder.CondDescend;\r
324                     break;\r
325                 case SortOrder.CondDescend:\r
326                     sl.SortOrder = SortOrder.None;\r
327                     break;\r
328                 default:\r
329                     sl.SortOrder = SortOrder.CondAscend;\r
330                     break;\r
331             }\r
332             UpdateList();\r
333         }\r
334 \r
335         private void labelHeaderExp_Click(object sender, EventArgs e)\r
336         {\r
337             var sl = _config.ShipList;\r
338             switch (sl.SortOrder)\r
339             {\r
340                 case SortOrder.ExpToNextAscend:\r
341                     sl.SortOrder = SortOrder.ExpToNextDescend;\r
342                     break;\r
343                 case SortOrder.ExpToNextDescend:\r
344                     sl.SortOrder = SortOrder.None;\r
345                     break;\r
346                 default:\r
347                     sl.SortOrder = SortOrder.ExpToNextAscend;\r
348                     break;\r
349             }\r
350             UpdateList();\r
351         }\r
352 \r
353         private void csvToolStripMenuItem_Click(object sender, EventArgs e)\r
354         {\r
355             Clipboard.SetText(TextGenerator.GenerateShipList(shipListPanel.CurrentShipList));\r
356         }\r
357 \r
358         private void kantaiSarashiToolStripMenuItem_Click(object sender, EventArgs e)\r
359         {\r
360             Clipboard.SetText(TextGenerator.GenerateKantaiSarashiData(shipListPanel.CurrentShipList));\r
361         }\r
362 \r
363         private void labelFleet_Click(object sender, EventArgs e)\r
364         {\r
365             fleetPanel.ShowFleet(((Label)sender).Text);\r
366         }\r
367 \r
368         private void labelHeaderHp_Click(object sender, EventArgs e)\r
369         {\r
370             ToggleHpPercent();\r
371         }\r
372 \r
373         private void ToggleHpPercent()\r
374         {\r
375             _config.ShipList.ShowHpInPercent = !_config.ShipList.ShowHpInPercent;\r
376             shipListPanel.ToggleHpPercent();\r
377             battleResultPanel.ToggleHpPercent();\r
378         }\r
379     }\r
380 }