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