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             if (config.ShowHpInPercent)\r
146                 shipListPanel.ToggleHpPercent();\r
147             for (var i = 0; i < ShipListPanel.GroupCount; i++)\r
148             {\r
149                 shipListPanel.GroupSettings[i] = i < config.ShipGroup.Count\r
150                     ? new HashSet<int>(config.ShipGroup[i])\r
151                     : new HashSet<int>();\r
152             }\r
153             comboBoxGroup.SelectedItem = config.Mode ?? "全員";\r
154             if (config.Location.X == int.MinValue)\r
155                 return;\r
156             var bounds = new Rectangle(config.Location, config.Size);\r
157             if (MainForm.IsTitleBarOnAnyScreen(bounds.Location))\r
158                 Location = bounds.Location;\r
159             Height = bounds.Height;\r
160         }\r
161 \r
162         private void ShipListForm_FormClosing(object sender, FormClosingEventArgs e)\r
163         {\r
164             e.Cancel = true;\r
165             if (!Visible)\r
166                 return;\r
167             var config = _config.ShipList;\r
168             config.ShowHpInPercent = shipListPanel.ShowHpInPercent;\r
169             var all = _sniffer.ShipList.Select(s => s.Id).ToArray();\r
170             config.ShipGroup.Clear();\r
171             for (var i = 0; i < ShipListPanel.GroupCount; i++)\r
172             {\r
173                 if (all.Length > 0)\r
174                     shipListPanel.GroupSettings[i].IntersectWith(all);\r
175                 config.ShipGroup.Add(shipListPanel.GroupSettings[i].ToList());\r
176             }\r
177             var bounds = WindowState == FormWindowState.Normal ? Bounds : RestoreBounds;\r
178             config.Location = bounds.Location;\r
179             config.Size = bounds.Size;\r
180             config.Mode = (string)comboBoxGroup.SelectedItem;\r
181             if (e.CloseReason != CloseReason.FormOwnerClosing)\r
182                 Hide();\r
183         }\r
184 \r
185         public void ShowShip(int id)\r
186         {\r
187             if (InShipStatus)\r
188             {\r
189                 shipListPanel.ShowShip(id);\r
190             }\r
191             else if (InFleetInfo)\r
192             {\r
193                 fleetPanel.ShowShip(id);\r
194             }\r
195             else if (InAntiAir)\r
196             {\r
197                 antiAirPanel.ShowShip(id);\r
198             }\r
199         }\r
200 \r
201         private void checkBoxShipType_CheckedChanged(object sender, EventArgs e)\r
202         {\r
203             _config.ShipList.ShipType = checkBoxShipType.Checked;\r
204             UpdateList();\r
205             SetActiveControl();\r
206         }\r
207 \r
208         private void comboBoxGroup_DropDownClosed(object sender, EventArgs e)\r
209         {\r
210             SetActiveControl();\r
211         }\r
212 \r
213         private void comboBoxGroup_SelectedIndexChanged(object sender, EventArgs e)\r
214         {\r
215             UpdateList();\r
216             SetActiveControl();\r
217             copyToolStripMenuItem.Enabled = InShipStatus | InItemList;\r
218         }\r
219 \r
220         private void ShipListForm_KeyPress(object sender, KeyPressEventArgs e)\r
221         {\r
222             var g = Array.FindIndex(new[] {'Z', 'A', 'B', 'C', 'D', 'G', 'R', 'W', 'X', 'Y', 'I'},\r
223                 x => x == char.ToUpper(e.KeyChar));\r
224             if (g == -1)\r
225                 return;\r
226             comboBoxGroup.SelectedIndex = g;\r
227             e.Handled = true;\r
228         }\r
229 \r
230         // マウスホイールでスクロールするためにコントロールにフォーカスを合わせる。\r
231         private void SetActiveControl()\r
232         {\r
233             if (InItemList)\r
234             {\r
235                 ActiveControl = itemTreeView;\r
236             }\r
237             else if (InFleetInfo)\r
238             {\r
239                 ActiveControl = fleetPanel;\r
240             }\r
241             else if (InAntiAir)\r
242             {\r
243                 ActiveControl = antiAirPanel;\r
244             }\r
245             else\r
246             {\r
247                 ActiveControl = shipListPanel;\r
248             }\r
249         }\r
250 \r
251         private void copyToolStripMenuItem_Click(object sender, EventArgs e)\r
252         {\r
253             Clipboard.SetText(TextGenerator.GenerateItemList(_sniffer.ItemList));\r
254         }\r
255 \r
256         private void textToolStripMenuItem_Click(object sender, EventArgs e)\r
257         {\r
258             Clipboard.SetText(TextGenerator.GenerateFleetData(_sniffer));\r
259         }\r
260 \r
261         private void deckBuilderToolStripMenuItem_Click(object sender, EventArgs e)\r
262         {\r
263             Clipboard.SetText(TextGenerator.GenerateDeckBuilderData(_sniffer));\r
264         }\r
265 \r
266         private void labelHeaderCond_Click(object sender, EventArgs e)\r
267         {\r
268             var sl = _config.ShipList;\r
269             switch (sl.SortOrder)\r
270             {\r
271                 case SortOrder.CondAscend:\r
272                     sl.SortOrder = SortOrder.CondDescend;\r
273                     break;\r
274                 case SortOrder.CondDescend:\r
275                     sl.SortOrder = SortOrder.None;\r
276                     break;\r
277                 default:\r
278                     sl.SortOrder = SortOrder.CondAscend;\r
279                     break;\r
280             }\r
281             UpdateList();\r
282         }\r
283 \r
284         private void labelHeaderExp_Click(object sender, EventArgs e)\r
285         {\r
286             var sl = _config.ShipList;\r
287             switch (sl.SortOrder)\r
288             {\r
289                 case SortOrder.ExpToNextAscend:\r
290                     sl.SortOrder = SortOrder.ExpToNextDescend;\r
291                     break;\r
292                 case SortOrder.ExpToNextDescend:\r
293                     sl.SortOrder = SortOrder.None;\r
294                     break;\r
295                 default:\r
296                     sl.SortOrder = SortOrder.ExpToNextAscend;\r
297                     break;\r
298             }\r
299             UpdateList();\r
300         }\r
301 \r
302         private void csvToolStripMenuItem_Click(object sender, EventArgs e)\r
303         {\r
304             Clipboard.SetText(TextGenerator.GenerateShipList(shipListPanel.CurrentShipList));\r
305         }\r
306 \r
307         private void kantaiSarashiToolStripMenuItem_Click(object sender, EventArgs e)\r
308         {\r
309             Clipboard.SetText(TextGenerator.GenerateKantaiSarashiData(shipListPanel.CurrentShipList));\r
310         }\r
311 \r
312         private void labelFleet_Click(object sender, EventArgs e)\r
313         {\r
314             fleetPanel.ShowFleet(((Label)sender).Text);\r
315         }\r
316 \r
317         private void labelHeaderHp_Click(object sender, EventArgs e)\r
318         {\r
319             shipListPanel.ToggleHpPercent();\r
320         }\r
321     }\r
322 }