OSDN Git Service

艦娘一覧で艦種を表示するとレベル順に並ばないことがあるのを直す
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / View / ShipListPanel.cs
index 541cc20..10d29f8 100644 (file)
@@ -108,9 +108,19 @@ namespace KancolleSniffer.View
         {\r
             var ships = FilterByShipTypes(\r
                 _mode == "修復" ? sniffer.RepairList : FilterByGroup(sniffer.ShipList, _mode),\r
-                config.ShipCategories);\r
+                config.ShipCategories).ToArray();\r
             var order = _mode == "修復" ? ListForm.SortOrder.Repair : config.SortOrder;\r
-            _shipList = ships.OrderBy(s => s, new CompareShip(false, order)).ToArray();\r
+            if (!config.ShipType)\r
+            {\r
+                _shipList = ships.OrderBy(s => s, new CompareShip(false, order)).ToArray();\r
+                return;\r
+            }\r
+            _shipList = ships.Select(ship => new {Id = ship.Spec.ShipType, Name = ship.Spec.ShipTypeName})\r
+                .Distinct().Select(type => new ShipStatus\r
+                {\r
+                    Spec = new ShipSpec { Name = type.Name, ShipType = type.Id},\r
+                    Level = 1000,\r
+                }).Concat(ships).OrderBy(ship => ship, new CompareShip(true, order)).ToArray();\r
         }\r
 \r
         private IEnumerable<ShipStatus> FilterByGroup(IEnumerable<ShipStatus> ships, string group)\r
@@ -121,13 +131,13 @@ namespace KancolleSniffer.View
             return from s in ships where GroupSettings[g].Contains(s.Id) select s;\r
         }\r
 \r
-        private readonly int[][] _shipTypeIds =\r
+        private static readonly int[][] ShipTypeIds =\r
         {\r
             new[] // 戦艦\r
             {\r
-                10, // 航空戦艦\r
+                8, // 巡洋戦艦\r
                 9, // 戦艦\r
-                8 // 巡洋戦艦\r
+                10 // 航空戦艦\r
             },\r
             new[] // 空母\r
             {\r
@@ -137,14 +147,14 @@ namespace KancolleSniffer.View
             },\r
             new[] // 重巡\r
             {\r
-                6, // 航空巡洋艦\r
-                5 // 重巡洋艦\r
+                5, // 重巡洋艦\r
+                6 // 航空巡洋艦\r
             },\r
             new[] // 軽巡\r
             {\r
-                21, // 練習巡洋艦\r
+                3, // 軽巡洋艦\r
                 4, // 重雷装巡洋艦\r
-                3 // 軽巡洋艦\r
+                21 // 練習巡洋艦\r
             },\r
             new[] // 駆逐\r
             {\r
@@ -156,24 +166,35 @@ namespace KancolleSniffer.View
             },\r
             new[] // 潜水\r
             {\r
-                14, // 潜水空母\r
-                13 // 潜水艦\r
+                13, // 潜水艦\r
+                14 // 潜水空母\r
             },\r
             new[] // 補助\r
             {\r
-                22, // 補給艦\r
-                20, // 潜水母艦\r
-                19, // 工作艦\r
+                16, // 水上機母艦\r
                 17, // 揚陸艦\r
-                16 // 水上機母艦\r
+                19, // 工作艦\r
+                20, // 潜水母艦\r
+                22 // 補給艦\r
             }\r
         };\r
 \r
+        private static readonly int[] ShipTypeSortIds = CreateShipTypeSortIds();\r
+\r
+        private static int[] CreateShipTypeSortIds()\r
+        {\r
+            var ids = ShipTypeIds.SelectMany(x => x).ToArray();\r
+            var res = new int[ids.Max() + 1];\r
+            for (var i = 0; i < ids.Length; i++)\r
+                res[ids[i]] = i;\r
+            return res;\r
+        }\r
+\r
         private IEnumerable<ShipStatus> FilterByShipTypes(IEnumerable<ShipStatus> ships, ShipCategory shipTypes)\r
         {\r
-            var ids = Enumerable.Range(0, _shipTypeIds.Length)\r
+            var ids = Enumerable.Range(0, ShipTypeIds.Length)\r
                 .Where(type => ((int)shipTypes & (1 << type)) != 0)\r
-                .SelectMany(type => _shipTypeIds[type]).ToArray();\r
+                .SelectMany(type => ShipTypeIds[type]).ToArray();\r
             return ships.Where(ship => ids.Contains(ship.Spec.ShipType));\r
         }\r
 \r
@@ -197,7 +218,7 @@ namespace KancolleSniffer.View
                 if (_shipType)\r
                 {\r
                     if (a.Spec.ShipType != b.Spec.ShipType)\r
-                        return a.Spec.ShipType - b.Spec.ShipType;\r
+                        return ShipTypeSortIds[a.Spec.ShipType] - ShipTypeSortIds[b.Spec.ShipType];\r
                     if (a.Level != b.Level)\r
                     {\r
                         if (a.Level == 1000)\r
@@ -221,8 +242,7 @@ namespace KancolleSniffer.View
                         return b.Level - a.Level;\r
                     if (_order == ListForm.SortOrder.ExpToNextDescend)\r
                         return a.Level - b.Level;\r
-                    if (!_shipType) // Condが同じかSortOrder.Noneで艦種なし\r
-                        return b.Level - a.Level;\r
+                    return b.Level - a.Level;\r
                 }\r
                 if (a.ExpToNext != b.ExpToNext)\r
                 {\r
@@ -245,12 +265,6 @@ namespace KancolleSniffer.View
                 CreateRepairLabels(i);\r
                 CreateShipLabels(i);\r
             }\r
-            for (var i = 0; i * LineHeight < Height; i++)\r
-            {\r
-                _labelPanelList[i].Visible = InShipStatus(_mode);\r
-                _groupingPanelList[i].Visible = _mode == "分類";\r
-                _repairPanelList[i].Visible = _mode == "修復";\r
-            }\r
             SetupScrollBar();\r
         }\r
 \r
@@ -317,6 +331,7 @@ namespace KancolleSniffer.View
             panel.Controls.AddRange(cb);\r
             // ReSharper restore CoVariantArrayConversion\r
             Controls.Add(panel);\r
+            var unused = panel.Handle; // create handle\r
             foreach (var label in labels)\r
             {\r
                 label.Scale();\r
@@ -380,6 +395,7 @@ namespace KancolleSniffer.View
             // ReSharper disable once CoVariantArrayConversion\r
             panel.Controls.AddRange(labels);\r
             Controls.Add(panel);\r
+            var unused = panel.Handle; // create handle\r
             foreach (var label in labels)\r
             {\r
                 label.Scale();\r
@@ -440,6 +456,7 @@ namespace KancolleSniffer.View
             // ReSharper disable once CoVariantArrayConversion\r
             panel.Controls.AddRange(labels);\r
             Controls.Add(panel);\r
+            var unused = panel.Handle; // create handle\r
             foreach (var label in labels)\r
             {\r
                 label.Scale();\r
@@ -456,6 +473,9 @@ namespace KancolleSniffer.View
         {\r
             for (var i = 0; i < (Height + LineHeight - 1) / LineHeight; i++)\r
             {\r
+                HidePanels(i);\r
+                if (i + ScrollBar.Value >= _shipList.Length)\r
+                    continue;\r
                 if (InShipStatus(_mode))\r
                     SetShipStatus(i);\r
                 if (_mode == "分類")\r
@@ -465,16 +485,15 @@ namespace KancolleSniffer.View
             }\r
         }\r
 \r
+        private void HidePanels(int i)\r
+        {\r
+            _labelPanelList[i].Visible = _groupingPanelList[i].Visible = _repairPanelList[i].Visible = false;\r
+        }\r
+\r
         private bool InShipStatus(string mode) => Array.Exists(new[] {"全艦", "A", "B", "C", "D"}, x => mode == x);\r
 \r
         private void SetShipStatus(int i)\r
         {\r
-            var panel = _labelPanelList[i];\r
-            if (i + ScrollBar.Value >= _shipList.Length)\r
-            {\r
-                panel.Visible = false;\r
-                return;\r
-            }\r
             var s = _shipList[i + ScrollBar.Value];\r
             var labels = _labelList[i];\r
             if (s.Level == 1000) // 艦種の表示\r
@@ -488,7 +507,7 @@ namespace KancolleSniffer.View
             labels[3].SetExpToNext(s);\r
             labels[4].SetName(s, ShipNameWidth.ShipList);\r
             labels[5].SetFleet(s);\r
-            panel.Visible = true;\r
+            _labelPanelList[i].Visible = true;\r
         }\r
 \r
         private void SetShipType(int i)\r
@@ -507,18 +526,10 @@ namespace KancolleSniffer.View
 \r
         private void SetGrouping(int i)\r
         {\r
-            var panel = _groupingPanelList[i];\r
-            if (i + ScrollBar.Value >= _shipList.Length)\r
-            {\r
-                panel.Visible = false;\r
-                _labelPanelList[i].Visible = false;\r
-                return;\r
-            }\r
             var s = _shipList[i + ScrollBar.Value];\r
             var labels = _groupingLabelList[i];\r
             if (s.Level == 1000)\r
             {\r
-                panel.Visible = false;\r
                 SetShipType(i);\r
                 return;\r
             }\r
@@ -528,22 +539,14 @@ namespace KancolleSniffer.View
             var cb = _checkBoxesList[i];\r
             for (var j = 0; j < cb.Length; j++)\r
                 cb[j].Checked = GroupSettings[j].Contains(s.Id);\r
-            panel.Visible = true;\r
+            _groupingPanelList[i].Visible = true;\r
         }\r
 \r
         private void SetRepairList(int i)\r
         {\r
-            var panel = _repairPanelList[i];\r
-            if (i + ScrollBar.Value >= _shipList.Length)\r
-            {\r
-                panel.Visible = false;\r
-                _labelPanelList[i].Visible = false;\r
-                return;\r
-            }\r
             var s = _shipList[i + ScrollBar.Value];\r
             if (s.Level == 1000)\r
             {\r
-                panel.Visible = false;\r
                 SetShipType(i);\r
                 return;\r
             }\r
@@ -554,7 +557,7 @@ namespace KancolleSniffer.View
             labels[3].Text = s.RepairTimePerHp.ToString(@"mm\:ss");\r
             labels[4].SetName(s, ShipNameWidth.RepairListFull);\r
             labels[5].SetFleet(s);\r
-            panel.Visible = true;\r
+            _repairPanelList[i].Visible = true;\r
         }\r
 \r
         public event Action HpLabelClick;\r
@@ -573,6 +576,8 @@ namespace KancolleSniffer.View
 \r
         public void ShowShip(int id)\r
         {\r
+            if (!ScrollBar.Visible)\r
+                return;\r
             var i = Array.FindIndex(_shipList, s => s.Id == id);\r
             if (i == -1)\r
                 return;\r