X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=KancolleSniffer%2FView%2FShipListPanel.cs;h=10d29f8e448298b3cd1e9790008ce752080247d2;hb=fab0d21c2da682134ca5f8e6922ea5d020a4334d;hp=1acc87a6482a39238361320bb38bfd2c486bfcf2;hpb=a1217f69d553cf6b3deff0d8d0d6b47add1b5eae;p=kancollesniffer%2FKancolleSniffer.git diff --git a/KancolleSniffer/View/ShipListPanel.cs b/KancolleSniffer/View/ShipListPanel.cs index 1acc87a..10d29f8 100644 --- a/KancolleSniffer/View/ShipListPanel.cs +++ b/KancolleSniffer/View/ShipListPanel.cs @@ -78,10 +78,10 @@ namespace KancolleSniffer.View ScrollBar.Value - e.Delta * SystemInformation.MouseWheelScrollLines / 120)); } - public void Update(Sniffer sniffer, string mode, ListForm.SortOrder sortOrder, bool byShipType) + public void Update(Sniffer sniffer, string mode, ShipListConfig config) { _mode = mode; - CreateShipList(sniffer, sortOrder, byShipType); + CreateShipList(sniffer, config); SuspendDrawing(); SetupLabels(); SetShipLabels(); @@ -104,26 +104,23 @@ namespace KancolleSniffer.View Refresh(); } - private void CreateShipList(Sniffer sniffer, ListForm.SortOrder sortOrder, bool byShipType) + private void CreateShipList(Sniffer sniffer, ShipListConfig config) { - var ships = _mode == "修復" ? sniffer.RepairList : FilterByGroup(sniffer.ShipList, _mode).ToArray(); - var order = _mode == "修復" ? ListForm.SortOrder.Repair : sortOrder; - if (!byShipType) + var ships = FilterByShipTypes( + _mode == "修復" ? sniffer.RepairList : FilterByGroup(sniffer.ShipList, _mode), + config.ShipCategories).ToArray(); + var order = _mode == "修復" ? ListForm.SortOrder.Repair : config.SortOrder; + if (!config.ShipType) { _shipList = ships.OrderBy(s => s, new CompareShip(false, order)).ToArray(); return; } - var types = ships.Select(s => new {Id = s.Spec.ShipType, Name = s.Spec.ShipTypeName}) - .Distinct() - .Select(stype => - new ShipStatus - { - Spec = new ShipSpec {Name = stype.Name, ShipType = stype.Id}, - Level = 1000, - NowHp = -1000, - Cond = -1000 - }); - _shipList = ships.Concat(types).OrderBy(s => s, new CompareShip(true, order)).ToArray(); + _shipList = ships.Select(ship => new {Id = ship.Spec.ShipType, Name = ship.Spec.ShipTypeName}) + .Distinct().Select(type => new ShipStatus + { + Spec = new ShipSpec { Name = type.Name, ShipType = type.Id}, + Level = 1000, + }).Concat(ships).OrderBy(ship => ship, new CompareShip(true, order)).ToArray(); } private IEnumerable FilterByGroup(IEnumerable ships, string group) @@ -134,6 +131,73 @@ namespace KancolleSniffer.View return from s in ships where GroupSettings[g].Contains(s.Id) select s; } + private static readonly int[][] ShipTypeIds = + { + new[] // 戦艦 + { + 8, // 巡洋戦艦 + 9, // 戦艦 + 10 // 航空戦艦 + }, + new[] // 空母 + { + 18, // 装甲空母 + 11, // 正規空母 + 7 // 軽空母 + }, + new[] // 重巡 + { + 5, // 重巡洋艦 + 6 // 航空巡洋艦 + }, + new[] // 軽巡 + { + 3, // 軽巡洋艦 + 4, // 重雷装巡洋艦 + 21 // 練習巡洋艦 + }, + new[] // 駆逐 + { + 2 // 駆逐艦 + }, + new[] // 海防 + { + 1 // 海防艦 + }, + new[] // 潜水 + { + 13, // 潜水艦 + 14 // 潜水空母 + }, + new[] // 補助 + { + 16, // 水上機母艦 + 17, // 揚陸艦 + 19, // 工作艦 + 20, // 潜水母艦 + 22 // 補給艦 + } + }; + + private static readonly int[] ShipTypeSortIds = CreateShipTypeSortIds(); + + private static int[] CreateShipTypeSortIds() + { + var ids = ShipTypeIds.SelectMany(x => x).ToArray(); + var res = new int[ids.Max() + 1]; + for (var i = 0; i < ids.Length; i++) + res[ids[i]] = i; + return res; + } + + private IEnumerable FilterByShipTypes(IEnumerable ships, ShipCategory shipTypes) + { + var ids = Enumerable.Range(0, ShipTypeIds.Length) + .Where(type => ((int)shipTypes & (1 << type)) != 0) + .SelectMany(type => ShipTypeIds[type]).ToArray(); + return ships.Where(ship => ids.Contains(ship.Spec.ShipType)); + } + public IEnumerable CurrentShipList => _shipList.Where(ship => ship.Level != 1000); private class CompareShip : IComparer @@ -154,7 +218,7 @@ namespace KancolleSniffer.View if (_shipType) { if (a.Spec.ShipType != b.Spec.ShipType) - return a.Spec.ShipType - b.Spec.ShipType; + return ShipTypeSortIds[a.Spec.ShipType] - ShipTypeSortIds[b.Spec.ShipType]; if (a.Level != b.Level) { if (a.Level == 1000) @@ -178,8 +242,7 @@ namespace KancolleSniffer.View return b.Level - a.Level; if (_order == ListForm.SortOrder.ExpToNextDescend) return a.Level - b.Level; - if (!_shipType) // Condが同じかSortOrder.Noneで艦種なし - return b.Level - a.Level; + return b.Level - a.Level; } if (a.ExpToNext != b.ExpToNext) { @@ -188,8 +251,8 @@ namespace KancolleSniffer.View if (_order == ListForm.SortOrder.ExpToNextDescend) return b.ExpToNext - a.ExpToNext; } - if (a.Spec.SortNo != b.Spec.SortNo) - return a.Spec.SortNo - b.Spec.SortNo; + if (a.Spec.SortId != b.Spec.SortId) + return a.Spec.SortId - b.Spec.SortId; return a.Id - b.Id; } } @@ -202,12 +265,6 @@ namespace KancolleSniffer.View CreateRepairLabels(i); CreateShipLabels(i); } - for (var i = 0; i * LineHeight < Height; i++) - { - _labelPanelList[i].Visible = InShipStatus(_mode); - _groupingPanelList[i].Visible = _mode == "分類"; - _repairPanelList[i].Visible = _mode == "修復"; - } SetupScrollBar(); } @@ -233,15 +290,15 @@ namespace KancolleSniffer.View private void CreateGroupingComponents(int i) { var y = LineHeight * i + 1; - var cfgp = new Panel + var panel = new Panel { Location = new Point(0, y), Size = new Size(ListForm.PanelWidth, LineHeight), BackColor = ShipLabel.ColumnColors[(i + 1) % 2] }; - cfgp.Scale(ShipLabel.ScaleFactor); - cfgp.Tag = cfgp.Location.Y; - var cfgl = new[] + panel.Scale(ShipLabel.ScaleFactor); + panel.Tag = panel.Location.Y; + var labels = new[] { new ShipLabel { @@ -266,15 +323,16 @@ namespace KancolleSniffer.View cb[j].Scale(ShipLabel.ScaleFactor); cb[j].CheckedChanged += checkboxGroup_CheckedChanged; } - _groupingLabelList.Add(cfgl); + _groupingLabelList.Add(labels); _checkBoxesList.Add(cb); - _groupingPanelList.Add(cfgp); + _groupingPanelList.Add(panel); // ReSharper disable CoVariantArrayConversion - cfgp.Controls.AddRange(cfgl); - cfgp.Controls.AddRange(cb); + panel.Controls.AddRange(labels); + panel.Controls.AddRange(cb); // ReSharper restore CoVariantArrayConversion - Controls.Add(cfgp); - foreach (var label in cfgl) + Controls.Add(panel); + var unused = panel.Handle; // create handle + foreach (var label in labels) { label.Scale(); label.PresetColor = @@ -302,15 +360,15 @@ namespace KancolleSniffer.View { var y = LineHeight * i + 1; const int height = LabelHeight; - var rpp = new Panel + var panel = new Panel { Location = new Point(0, y), Size = new Size(ListForm.PanelWidth, LineHeight), BackColor = ShipLabel.ColumnColors[(i + 1) % 2] }; - rpp.Scale(ShipLabel.ScaleFactor); - rpp.Tag = rpp.Location.Y; - var rpl = new[] + panel.Scale(ShipLabel.ScaleFactor); + panel.Tag = panel.Location.Y; + var labels = new[] { new ShipLabel { @@ -332,34 +390,35 @@ namespace KancolleSniffer.View new ShipLabel {Location = new Point(10, 2), AutoSize = true}, new ShipLabel {Location = new Point(1, 2), AutoSize = true} }; - _repairLabelList.Add(rpl); - _repairPanelList.Add(rpp); + _repairLabelList.Add(labels); + _repairPanelList.Add(panel); // ReSharper disable once CoVariantArrayConversion - rpp.Controls.AddRange(rpl); - Controls.Add(rpp); - foreach (var label in rpl) + panel.Controls.AddRange(labels); + Controls.Add(panel); + var unused = panel.Handle; // create handle + foreach (var label in labels) { label.Scale(); label.PresetColor = label.BackColor = ShipLabel.ColumnColors[(i + 1) % 2]; } if (_hpPercent) - rpl[0].ToggleHpPercent(); - _hpLabels.Add(rpl[0]); - rpl[0].DoubleClick += HpLabelClickHandler; + labels[0].ToggleHpPercent(); + _hpLabels.Add(labels[0]); + labels[0].DoubleClick += HpLabelClickHandler; } private void CreateShipLabels(int i) { var y = LineHeight * i + 1; const int height = LabelHeight; - var lbp = new Panel + var panel = new Panel { Location = new Point(0, y), Size = new Size(ListForm.PanelWidth, LineHeight), BackColor = ShipLabel.ColumnColors[(i + 1) % 2] }; - lbp.Scale(ShipLabel.ScaleFactor); + panel.Scale(ShipLabel.ScaleFactor); var labels = new[] { new ShipLabel @@ -393,10 +452,11 @@ namespace KancolleSniffer.View new ShipLabel {Location = new Point(1, 2), AutoSize = true} }; _labelList.Add(labels); - _labelPanelList.Add(lbp); + _labelPanelList.Add(panel); // ReSharper disable once CoVariantArrayConversion - lbp.Controls.AddRange(labels); - Controls.Add(lbp); + panel.Controls.AddRange(labels); + Controls.Add(panel); + var unused = panel.Handle; // create handle foreach (var label in labels) { label.Scale(); @@ -413,6 +473,9 @@ namespace KancolleSniffer.View { for (var i = 0; i < (Height + LineHeight - 1) / LineHeight; i++) { + HidePanels(i); + if (i + ScrollBar.Value >= _shipList.Length) + continue; if (InShipStatus(_mode)) SetShipStatus(i); if (_mode == "分類") @@ -422,16 +485,15 @@ namespace KancolleSniffer.View } } + private void HidePanels(int i) + { + _labelPanelList[i].Visible = _groupingPanelList[i].Visible = _repairPanelList[i].Visible = false; + } + private bool InShipStatus(string mode) => Array.Exists(new[] {"全艦", "A", "B", "C", "D"}, x => mode == x); private void SetShipStatus(int i) { - var panel = _labelPanelList[i]; - if (i + ScrollBar.Value >= _shipList.Length) - { - panel.Visible = false; - return; - } var s = _shipList[i + ScrollBar.Value]; var labels = _labelList[i]; if (s.Level == 1000) // 艦種の表示 @@ -445,7 +507,7 @@ namespace KancolleSniffer.View labels[3].SetExpToNext(s); labels[4].SetName(s, ShipNameWidth.ShipList); labels[5].SetFleet(s); - panel.Visible = true; + _labelPanelList[i].Visible = true; } private void SetShipType(int i) @@ -464,18 +526,10 @@ namespace KancolleSniffer.View private void SetGrouping(int i) { - var panel = _groupingPanelList[i]; - if (i + ScrollBar.Value >= _shipList.Length) - { - panel.Visible = false; - _labelPanelList[i].Visible = false; - return; - } var s = _shipList[i + ScrollBar.Value]; var labels = _groupingLabelList[i]; if (s.Level == 1000) { - panel.Visible = false; SetShipType(i); return; } @@ -485,33 +539,25 @@ namespace KancolleSniffer.View var cb = _checkBoxesList[i]; for (var j = 0; j < cb.Length; j++) cb[j].Checked = GroupSettings[j].Contains(s.Id); - panel.Visible = true; + _groupingPanelList[i].Visible = true; } private void SetRepairList(int i) { - var panel = _repairPanelList[i]; - if (i + ScrollBar.Value >= _shipList.Length) - { - panel.Visible = false; - _labelPanelList[i].Visible = false; - return; - } var s = _shipList[i + ScrollBar.Value]; if (s.Level == 1000) { - panel.Visible = false; SetShipType(i); return; } - var rpl = _repairLabelList[i]; - rpl[0].SetHp(s); - rpl[1].SetLevel(s); - rpl[2].SetRepairTime(s); - rpl[3].Text = s.RepairTimePerHp.ToString(@"mm\:ss"); - rpl[4].SetName(s, ShipNameWidth.RepairListFull); - rpl[5].SetFleet(s); - panel.Visible = true; + var labels = _repairLabelList[i]; + labels[0].SetHp(s); + labels[1].SetLevel(s); + labels[2].SetRepairTime(s); + labels[3].Text = s.RepairTimePerHp.ToString(@"mm\:ss"); + labels[4].SetName(s, ShipNameWidth.RepairListFull); + labels[5].SetFleet(s); + _repairPanelList[i].Visible = true; } public event Action HpLabelClick; @@ -530,6 +576,8 @@ namespace KancolleSniffer.View public void ShowShip(int id) { + if (!ScrollBar.Visible) + return; var i = Array.FindIndex(_shipList, s => s.Id == id); if (i == -1) return;