OSDN Git Service

補強増設スロットが空かどうかわかるようにする
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / ShipLabels.cs
index c085eed..34fed82 100644 (file)
@@ -334,7 +334,7 @@ namespace KancolleSniffer
         public void SetNDockLabels(NameAndTimer[] ndock)\r
         {\r
             for (var i = 0; i < _ndockLabels.Length; i++)\r
-                _ndockLabels[i][1].SetName("", ndock[i].Name, "", ShipNameWidth.NDock);\r
+                _ndockLabels[i][1].SetName(ndock[i].Name, ShipNameWidth.NDock);\r
         }\r
 \r
         public void SetNDockTimer(int dock, RingTimer timer, bool finishTime)\r
@@ -354,6 +354,15 @@ namespace KancolleSniffer
         public bool AnchorRight { get; set; }\r
         private int _right = int.MinValue;\r
         private int _left;\r
+        private SlotStatus _slotStatus;\r
+\r
+        [Flags]\r
+        private enum SlotStatus\r
+        {\r
+            Equipped = 0,\r
+            NormalEmpty = 1,\r
+            ExtraEmpty = 2\r
+        }\r
 \r
         public ShipLabel()\r
         {\r
@@ -362,7 +371,14 @@ namespace KancolleSniffer
 \r
         public void SetName(ShipStatus status, ShipNameWidth width = ShipNameWidth.Max)\r
         {\r
-            var empty = status.Id != -1 && status.Slot.All(e => e.Id == -1) ? "▫" : "";\r
+            SlotStatus empty = SlotStatus.Equipped;\r
+            if (status.Id != -1)\r
+            {\r
+                if (status.Slot.All(item => item.Id == -1))\r
+                    empty |= SlotStatus.NormalEmpty;\r
+                if (status.SlotEx.Id == -1)\r
+                    empty |= SlotStatus.ExtraEmpty;\r
+            }\r
             var dc = status.PreparedDamageControl;\r
             var dcname = dc == 42 ? "[ダ]" : dc == 43 ? "[メ]" : "";\r
             SetName((status.Escaped ? "[避]" : dcname), status.Name, empty, width);\r
@@ -370,13 +386,19 @@ namespace KancolleSniffer
 \r
         public void SetName(string name)\r
         {\r
-            SetName("", name, "");\r
+            SetName("", name, SlotStatus.Equipped);\r
+        }\r
+\r
+        public void SetName(string name, ShipNameWidth width)\r
+        {\r
+            SetName("", name, SlotStatus.Equipped, width);\r
         }\r
 \r
-        public void SetName(string prefix, string name, string suffix, ShipNameWidth width = ShipNameWidth.Max)\r
+        private void SetName(string prefix, string name, SlotStatus slotStatus, ShipNameWidth width = ShipNameWidth.Max)\r
         {\r
             if (name == null)\r
                 return;\r
+            _slotStatus = slotStatus;\r
             var lu = new Regex(@"^\p{Lu}").IsMatch(name);\r
             var shift = (int)Round(ScaleFactor.Height);\r
             if (lu && Font.Equals(Parent.Font))\r
@@ -389,11 +411,12 @@ namespace KancolleSniffer
                 Location += new Size(0, shift);\r
                 Font = Parent.Font;\r
             }\r
-            var result = prefix + name + suffix;\r
+            var result = prefix + name;\r
             var measured = TextRenderer.MeasureText(result, Font).Width;\r
             if (measured <= (int)width)\r
             {\r
                 Text = result;\r
+                Invalidate(); // 必ずOnPaintを実行させるため\r
                 return;\r
             }\r
             var truncated = "";\r
@@ -404,7 +427,8 @@ namespace KancolleSniffer
                     break;\r
                 truncated = tmp;\r
             }\r
-            Text = prefix + truncated.TrimEnd(' ') + suffix;\r
+            Text = prefix + truncated.TrimEnd(' ');\r
+            Invalidate();\r
         }\r
 \r
         public void SetHp(ShipStatus status)\r
@@ -486,6 +510,25 @@ namespace KancolleSniffer
             Location = new Point(_left, Top);\r
         }\r
 \r
+        protected override void OnPaint(PaintEventArgs e)\r
+        {\r
+            base.OnPaint(e);\r
+            if ((_slotStatus & SlotStatus.NormalEmpty) != 0)\r
+            {\r
+                e.Graphics.DrawRectangle(\r
+                    Pens.Black,\r
+                    ClientSize.Width - 3 * ScaleFactor.Width, 1 * ScaleFactor.Height,\r
+                    2 * ScaleFactor.Width, 4 * ScaleFactor.Height);\r
+            }\r
+            if ((_slotStatus & SlotStatus.ExtraEmpty) != 0)\r
+            {\r
+                e.Graphics.DrawRectangle(\r
+                    Pens.Black,\r
+                    ClientSize.Width - 3 * ScaleFactor.Width, 7 * ScaleFactor.Height,\r
+                    2 * ScaleFactor.Width, 3 * ScaleFactor.Height);\r
+            }\r
+        }\r
+\r
         public void Scale()\r
         {\r
             Scale(ScaleFactor);\r