OSDN Git Service

一行分のShipLabelの保持に配列ではなくオブジェクトを使う
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Sun, 14 May 2017 05:01:08 +0000 (14:01 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Sun, 14 May 2017 05:01:08 +0000 (14:01 +0900)
KancolleSniffer/RepairListForMain.cs

index a3b65d3..c4877a3 100644 (file)
@@ -13,6 +13,8 @@
 // limitations under the License.\r
 \r
 using System;\r
+using System.Collections;\r
+using System.Collections.Generic;\r
 using System.Drawing;\r
 using System.Linq;\r
 using System.Windows.Forms;\r
@@ -25,10 +27,30 @@ namespace KancolleSniffer
         private const int PanelPadding = 5;\r
         private const int LabelPadding = 2;\r
         private const int LineHeight = 16;\r
-        private readonly ShipLabel[][] _repairLabels = new ShipLabel[14][];\r
+        private readonly RepairListLabels[] _repairLabels = new RepairListLabels[14];\r
         private ShipStatus[] _repairList = new ShipStatus[0];\r
         private int _repairListPosition;\r
 \r
+        private class RepairListLabels : IEnumerable<ShipLabel>\r
+        {\r
+            public ShipLabel Fleet { get; set; }\r
+            public ShipLabel Name { get; set; }\r
+            public ShipLabel Time { get; set; }\r
+            public ShipLabel Damage { get; set; }\r
+            public ShipLabel BackGround { private get; set; }\r
+\r
+            public IEnumerator<ShipLabel> GetEnumerator()\r
+            {\r
+                foreach (var label in new[] {Fleet, Damage, Time, Name, BackGround})\r
+                    yield return label;\r
+            }\r
+\r
+            IEnumerator IEnumerable.GetEnumerator()\r
+            {\r
+                return GetEnumerator();\r
+            }\r
+        }\r
+\r
         public void CreateLabels(EventHandler onClick)\r
         {\r
             SuspendLayout();\r
@@ -36,14 +58,19 @@ namespace KancolleSniffer
             {\r
                 var y = PanelPadding + LabelPadding + i * LineHeight;\r
                 const int height = 12;\r
-                Controls.AddRange(_repairLabels[i] = new[]\r
+                _repairLabels[i] = new RepairListLabels\r
                 {\r
-                    new ShipLabel {Location = new Point(0, y), Size = new Size(11, height)},\r
-                    new ShipLabel {Location = new Point(119, y), Size = new Size(5, height - 1)},\r
-                    new ShipLabel {Location = new Point(75, y), AutoSize = true},\r
-                    new ShipLabel {Location = new Point(9, y), AutoSize = true},\r
-                    new ShipLabel {Location = new Point(0, y - LabelPadding), Size = new Size(Width, height + LabelPadding + 1)}\r
-                });\r
+                    Fleet = new ShipLabel {Location = new Point(0, y), Size = new Size(11, height)},\r
+                    Damage = new ShipLabel {Location = new Point(119, y), Size = new Size(5, height - 1)},\r
+                    Time = new ShipLabel {Location = new Point(75, y), AutoSize = true},\r
+                    Name = new ShipLabel {Location = new Point(9, y), AutoSize = true},\r
+                    BackGround = new ShipLabel\r
+                    {\r
+                        Location = new Point(0, y - LabelPadding),\r
+                        Size = new Size(Width, height + LabelPadding + 1)\r
+                    }\r
+                };\r
+                Controls.AddRange(_repairLabels[i].Cast<Control>().ToArray());\r
                 foreach (var label in _repairLabels[i])\r
                 {\r
                     label.Scale();\r
@@ -51,19 +78,24 @@ namespace KancolleSniffer
                     label.Click += onClick;\r
                 }\r
             }\r
-            foreach (var label in _repairLabels[0])\r
+            SetScrollEventHandler();\r
+            ResumeLayout();\r
+        }\r
+\r
+        private void SetScrollEventHandler()\r
+        {\r
+            foreach (var label in _repairLabels.First())\r
             {\r
                 label.MouseEnter += TopRepairLabelsOnMouseEnter;\r
                 label.MouseLeave += TopRepairLabelsOnMouseLeave;\r
             }\r
-            _topScrollRepeatTimer.Tick += TopRepairLabelsOnMouseEnter;\r
             foreach (var label in _repairLabels.Last())\r
             {\r
                 label.MouseEnter += BottomRepairLabelsOnMouseEnter;\r
                 label.MouseLeave += BottomRepairLabelsOnMouseLeave;\r
             }\r
+            _topScrollRepeatTimer.Tick += TopRepairLabelsOnMouseEnter;\r
             _bottomScrollRepeatTimer.Tick += BottomRepairLabelsOnMouseEnter;\r
-            ResumeLayout();\r
         }\r
 \r
         private readonly Timer _topScrollRepeatTimer = new Timer {Interval = 100};\r
@@ -99,40 +131,48 @@ namespace KancolleSniffer
 \r
         public void SetRepairList(ShipStatus[] list)\r
         {\r
-            const int fleet = 0, name = 3, time = 2, damage = 1;\r
             _repairList = list;\r
+            SetPanelHeight();\r
             if (list.Length == 0)\r
             {\r
-                Size = new Size(Width, (int)Round(ShipLabel.ScaleFactor.Height * (LineHeight + PanelPadding * 2)));\r
-                var labels = _repairLabels[0];\r
-                labels[fleet].Text = "";\r
-                labels[name].SetName("なし");\r
-                labels[time].Text = "";\r
-                labels[damage].BackColor = labels[damage].PresetColor;\r
+                SetPanelHeight();\r
+                ClearLabels(0);\r
+                _repairLabels[0].Name.SetName("なし");\r
                 return;\r
             }\r
-            Size = new Size(Width,\r
-                (int)Round(ShipLabel.ScaleFactor.Height *\r
-                           (Min(_repairList.Length, _repairLabels.Length) * LineHeight + PanelPadding * 2)));\r
             _repairListPosition = Min(_repairListPosition, Max(0, _repairList.Length - _repairLabels.Length));\r
             ShowRepairList();\r
         }\r
 \r
+        private void SetPanelHeight()\r
+        {\r
+            var lines = Min(Max(1, _repairList.Length), _repairLabels.Length);\r
+            Size = new Size(Width, (int)Round(ShipLabel.ScaleFactor.Height * lines * LineHeight + PanelPadding * 2));\r
+        }\r
+\r
         public void ShowRepairList()\r
         {\r
-            const int fleet = 0, name = 3, time = 2, damage = 1;\r
             for (var i = 0; i < Min(_repairList.Length, _repairLabels.Length); i++)\r
             {\r
                 var s = _repairList[i + _repairListPosition];\r
                 var labels = _repairLabels[i];\r
-                labels[fleet].SetFleet(s);\r
-                labels[name].SetName(s, ShipNameWidth.RepairList);\r
-                labels[time].SetRepairTime(s);\r
-                labels[damage].BackColor = ShipLabel.DamageColor(s, labels[damage].PresetColor);\r
+                labels.Fleet.SetFleet(s);\r
+                labels.Name.SetName(s, ShipNameWidth.RepairList);\r
+                labels.Time.SetRepairTime(s);\r
+                labels.Damage.BackColor = ShipLabel.DamageColor(s, labels.Damage.PresetColor);\r
             }\r
             DrawMark();\r
         }\r
 \r
+        public void ClearLabels(int i)\r
+        {\r
+            var labels = _repairLabels[i];\r
+            labels.Fleet.Text = "";\r
+            labels.Name.SetName("");\r
+            labels.Time.Text = "";\r
+            labels.Damage.BackColor = labels.Damage.PresetColor;\r
+        }\r
+\r
         private void DrawMark()\r
         {\r
             using (var g = CreateGraphics())\r
@@ -153,7 +193,6 @@ namespace KancolleSniffer
                         new PointF(Width * 0.45f, Height - PanelPadding - 2), new PointF(Width * 0.55f, Height - PanelPadding - 2),\r
                         new PointF(Width * 0.5f, Height - 2), new PointF(Width * 0.45f, Height - PanelPadding - 2)\r
                     });\r
-\r
             }\r
         }\r
 \r