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