OSDN Git Service

HPの数字のクリックでパーセント表示を切り替えられるようにする
[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.Spoiler = (_config.Spoilers & Spoiler.BattleResult) != 0;\r
121             battleResultPanel.Update(_sniffer);\r
122         }\r
123 \r
124         private void SetHeaderSortOrder()\r
125         {\r
126             switch (_config.ShipList.SortOrder)\r
127             {\r
128                 case SortOrder.None:\r
129                     labelHeaderCond.Text = "cond";\r
130                     labelHeaderExp.Text = "Exp";\r
131                     break;\r
132                 case SortOrder.CondAscend:\r
133                     labelHeaderCond.Text = "cond▴";\r
134                     labelHeaderExp.Text = "Exp";\r
135                     break;\r
136                 case SortOrder.CondDescend:\r
137                     labelHeaderCond.Text = "cond▾";\r
138                     labelHeaderExp.Text = "Exp";\r
139                     break;\r
140                 case SortOrder.ExpToNextAscend:\r
141                     labelHeaderCond.Text = "cond";\r
142                     labelHeaderExp.Text = "Exp▴";\r
143                     break;\r
144                 case SortOrder.ExpToNextDescend:\r
145                     labelHeaderCond.Text = "cond";\r
146                     labelHeaderExp.Text = "Exp▾";\r
147                     break;\r
148             }\r
149         }\r
150 \r
151         private bool InShipStatus => Array.Exists(new[] {"全員", "A", "B", "C", "D"}, x => comboBoxGroup.Text == x);\r
152 \r
153         private bool InGroupConfig => comboBoxGroup.Text == "分類";\r
154 \r
155         private bool InRepairList => comboBoxGroup.Text == "修復";\r
156 \r
157         private bool InItemList => comboBoxGroup.Text == "装備";\r
158 \r
159         private bool InFleetInfo => comboBoxGroup.Text == "艦隊";\r
160 \r
161         private bool InAntiAir => comboBoxGroup.Text == "対空";\r
162 \r
163         private bool InBattleResult => comboBoxGroup.Text == "戦況";\r
164 \r
165         private bool InMiscText => comboBoxGroup.Text == "情報";\r
166 \r
167         private void ShipListForm_Load(object sender, EventArgs e)\r
168         {\r
169             /* DPIではなくズームしたときにパネルは大きくなるがScrollBarはそのままなので隙間ができる。\r
170                そこでScrollBarの幅に合わせて全体の横幅を設定し直す。*/\r
171             Width = (int)Round((PanelWidth + 12 /* PanelとFrameの内側 */) * ShipLabel.ScaleFactor.Width) +\r
172                     SystemInformation.VerticalScrollBarWidth + 2 /* 縁の幅 */ + Width - ClientSize.Width;\r
173             MinimumSize = new Size(Width, 0);\r
174             MaximumSize = new Size(Width, int.MaxValue);\r
175             var config = _config.ShipList;\r
176             checkBoxShipType.Checked = config.ShipType;\r
177             if (config.ShowHpInPercent)\r
178             {\r
179                 shipListPanel.ToggleHpPercent();\r
180                 battleResultPanel.ToggleHpPercent();\r
181             }\r
182             LoadShipGroupFromConfig();\r
183             comboBoxGroup.SelectedItem = config.Mode ?? "全員";\r
184             if (config.Location.X == int.MinValue)\r
185                 return;\r
186             var bounds = new Rectangle(config.Location, config.Size);\r
187             if (MainForm.IsTitleBarOnAnyScreen(bounds.Location))\r
188                 Location = bounds.Location;\r
189             Height = bounds.Height;\r
190         }\r
191 \r
192         private void LoadShipGroupFromConfig()\r
193         {\r
194             var group = _config.ShipList.ShipGroup;\r
195             for (var i = 0; i < ShipListPanel.GroupCount; i++)\r
196                 shipListPanel.GroupSettings[i] = i < group.Count ? new HashSet<int>(group[i]) : new HashSet<int>();\r
197         }\r
198 \r
199         private void ShipListForm_FormClosing(object sender, FormClosingEventArgs e)\r
200         {\r
201             e.Cancel = true;\r
202             if (!Visible)\r
203                 return;\r
204             var config = _config.ShipList;\r
205             StoreShipGroupToConfig();\r
206             var bounds = WindowState == FormWindowState.Normal ? Bounds : RestoreBounds;\r
207             config.Location = bounds.Location;\r
208             config.Size = bounds.Size;\r
209             config.Mode = (string)comboBoxGroup.SelectedItem;\r
210             if (e.CloseReason != CloseReason.FormOwnerClosing)\r
211             {\r
212                 Hide();\r
213                 _config.Save();\r
214             }\r
215         }\r
216 \r
217         private void StoreShipGroupToConfig()\r
218         {\r
219             var all = _sniffer.ShipList.Select(s => s.Id).ToArray();\r
220             var group = _config.ShipList.ShipGroup;\r
221             group.Clear();\r
222             for (var i = 0; i < ShipListPanel.GroupCount; i++)\r
223             {\r
224                 if (all.Length > 0)\r
225                     shipListPanel.GroupSettings[i].IntersectWith(all);\r
226                 group.Add(shipListPanel.GroupSettings[i].ToList());\r
227             }\r
228         }\r
229 \r
230         public void ShowShip(int id)\r
231         {\r
232             if (InShipStatus)\r
233             {\r
234                 shipListPanel.ShowShip(id);\r
235             }\r
236             else if (InFleetInfo)\r
237             {\r
238                 fleetPanel.ShowShip(id);\r
239             }\r
240             else if (InAntiAir)\r
241             {\r
242                 antiAirPanel.ShowShip(id);\r
243             }\r
244         }\r
245 \r
246         private void checkBoxShipType_CheckedChanged(object sender, EventArgs e)\r
247         {\r
248             _config.ShipList.ShipType = checkBoxShipType.Checked;\r
249             UpdateList();\r
250             SetActiveControl();\r
251         }\r
252 \r
253         private void comboBoxGroup_DropDownClosed(object sender, EventArgs e)\r
254         {\r
255             SetActiveControl();\r
256         }\r
257 \r
258         private void comboBoxGroup_SelectedIndexChanged(object sender, EventArgs e)\r
259         {\r
260             UpdateList();\r
261             SetActiveControl();\r
262             copyToolStripMenuItem.Enabled = InShipStatus | InItemList;\r
263         }\r
264 \r
265         private void ShipListForm_KeyPress(object sender, KeyPressEventArgs e)\r
266         {\r
267             var g = Array.FindIndex(new[] {'Z', 'A', 'B', 'C', 'D', 'G', 'R', 'W', 'X', 'Y', 'S', 'I'},\r
268                 x => x == char.ToUpper(e.KeyChar));\r
269             if (g == -1)\r
270                 return;\r
271             comboBoxGroup.SelectedIndex = g;\r
272             e.Handled = true;\r
273         }\r
274 \r
275         // マウスホイールでスクロールするためにコントロールにフォーカスを合わせる。\r
276         private void SetActiveControl()\r
277         {\r
278             if (InItemList)\r
279             {\r
280                 ActiveControl = itemTreeView;\r
281             }\r
282             else if (InFleetInfo)\r
283             {\r
284                 ActiveControl = fleetPanel;\r
285             }\r
286             else if (InAntiAir)\r
287             {\r
288                 ActiveControl = antiAirPanel;\r
289             }\r
290             else\r
291             {\r
292                 ActiveControl = shipListPanel;\r
293             }\r
294         }\r
295 \r
296         private void copyToolStripMenuItem_Click(object sender, EventArgs e)\r
297         {\r
298             Clipboard.SetText(TextGenerator.GenerateItemList(_sniffer.ItemList));\r
299         }\r
300 \r
301         private void textToolStripMenuItem_Click(object sender, EventArgs e)\r
302         {\r
303             Clipboard.SetText(TextGenerator.GenerateFleetData(_sniffer));\r
304         }\r
305 \r
306         private void deckBuilderToolStripMenuItem_Click(object sender, EventArgs e)\r
307         {\r
308             Clipboard.SetText(TextGenerator.GenerateDeckBuilderData(_sniffer));\r
309         }\r
310 \r
311         private void labelHeaderCond_Click(object sender, EventArgs e)\r
312         {\r
313             var sl = _config.ShipList;\r
314             switch (sl.SortOrder)\r
315             {\r
316                 case SortOrder.CondAscend:\r
317                     sl.SortOrder = SortOrder.CondDescend;\r
318                     break;\r
319                 case SortOrder.CondDescend:\r
320                     sl.SortOrder = SortOrder.None;\r
321                     break;\r
322                 default:\r
323                     sl.SortOrder = SortOrder.CondAscend;\r
324                     break;\r
325             }\r
326             UpdateList();\r
327         }\r
328 \r
329         private void labelHeaderExp_Click(object sender, EventArgs e)\r
330         {\r
331             var sl = _config.ShipList;\r
332             switch (sl.SortOrder)\r
333             {\r
334                 case SortOrder.ExpToNextAscend:\r
335                     sl.SortOrder = SortOrder.ExpToNextDescend;\r
336                     break;\r
337                 case SortOrder.ExpToNextDescend:\r
338                     sl.SortOrder = SortOrder.None;\r
339                     break;\r
340                 default:\r
341                     sl.SortOrder = SortOrder.ExpToNextAscend;\r
342                     break;\r
343             }\r
344             UpdateList();\r
345         }\r
346 \r
347         private void csvToolStripMenuItem_Click(object sender, EventArgs e)\r
348         {\r
349             Clipboard.SetText(TextGenerator.GenerateShipList(shipListPanel.CurrentShipList));\r
350         }\r
351 \r
352         private void kantaiSarashiToolStripMenuItem_Click(object sender, EventArgs e)\r
353         {\r
354             Clipboard.SetText(TextGenerator.GenerateKantaiSarashiData(shipListPanel.CurrentShipList));\r
355         }\r
356 \r
357         private void labelFleet_Click(object sender, EventArgs e)\r
358         {\r
359             fleetPanel.ShowFleet(((Label)sender).Text);\r
360         }\r
361 \r
362         private void labelHeaderHp_Click(object sender, EventArgs e)\r
363         {\r
364             ToggleHpPercent();\r
365         }\r
366 \r
367         private void ToggleHpPercent()\r
368         {\r
369             _config.ShipList.ShowHpInPercent = !_config.ShipList.ShowHpInPercent;\r
370             shipListPanel.ToggleHpPercent();\r
371             battleResultPanel.ToggleHpPercent();\r
372         }\r
373     }\r
374 }