OSDN Git Service

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