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