OSDN Git Service

対応表ではなく横幅を指定して艦娘の名前を縮める
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Mon, 8 Aug 2016 14:19:33 +0000 (23:19 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Wed, 10 Aug 2016 15:46:09 +0000 (00:46 +0900)
KancolleSniffer.Test/KancolleSniffer.Test.csproj
KancolleSniffer.Test/KancolleSniffer.Test.csproj.DotSettings [new file with mode: 0644]
KancolleSniffer.Test/ShipLabelTest.cs [new file with mode: 0644]
KancolleSniffer/ListForm.cs
KancolleSniffer/ShipLabels.cs

index 47bf3af..993a98f 100644 (file)
@@ -48,6 +48,7 @@
       <HintPath>..\packages\Moq.4.2.1506.2515\lib\net40\Moq.dll</HintPath>\r
     </Reference>\r
     <Reference Include="System" />\r
+    <Reference Include="System.Windows.Forms" />\r
   </ItemGroup>\r
   <Choose>\r
     <When Condition="('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'">\r
@@ -63,6 +64,7 @@
   </Choose>\r
   <ItemGroup>\r
     <Compile Include="JsonTest.cs" />\r
+    <Compile Include="ShipLabelTest.cs" />\r
     <Compile Include="SnifferTest.cs" />\r
     <Compile Include="Properties\AssemblyInfo.cs" />\r
     <Compile Include="LoggerTest.cs" />\r
diff --git a/KancolleSniffer.Test/KancolleSniffer.Test.csproj.DotSettings b/KancolleSniffer.Test/KancolleSniffer.Test.csproj.DotSettings
new file mode 100644 (file)
index 0000000..6e7fff8
--- /dev/null
@@ -0,0 +1,2 @@
+<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
+       <s:String x:Key="/Default/CodeEditing/Localization/Localizable/@EntryValue">No</s:String></wpf:ResourceDictionary>
\ No newline at end of file
diff --git a/KancolleSniffer.Test/ShipLabelTest.cs b/KancolleSniffer.Test/ShipLabelTest.cs
new file mode 100644 (file)
index 0000000..bee2ddf
--- /dev/null
@@ -0,0 +1,107 @@
+// Copyright (C) 2016 Kazuhiro Fujieda <fujieda@users.osdn.me>\r
+//\r
+// Licensed under the Apache License, Version 2.0 (the "License");\r
+// you may not use this file except in compliance with the License.\r
+// You may obtain a copy of the License at\r
+//\r
+//    http://www.apache.org/licenses/LICENSE-2.0\r
+//\r
+// Unless required by applicable law or agreed to in writing, software\r
+// distributed under the License is distributed on an "AS IS" BASIS,\r
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+// See the License for the specific language governing permissions and\r
+// limitations under the License.\r
+\r
+using System.Collections.Generic;\r
+using System.Windows.Forms;\r
+using ExpressionToCodeLib;\r
+using Microsoft.VisualStudio.TestTools.UnitTesting;\r
+\r
+namespace KancolleSniffer.Test\r
+{\r
+    [TestClass]\r
+    public class ShipLabelTest\r
+    {\r
+        /// <summary>\r
+        /// 明石タイマー表示中の艦娘の名前を縮める\r
+        /// </summary>\r
+        [TestMethod]\r
+        public void TrancateNameForAkashiTimer()\r
+        {\r
+            var dict = new Dictionary<string, string>\r
+            {\r
+                {"夕立改二", "夕立改二"},\r
+                {"千代田航改", "千代田航"},\r
+                {"千代田航改二", "千代田航"},\r
+                {"Bismarck改", "Bismarck"},\r
+                {"Bismarck twei", "Bismarck"},\r
+                {"Bismarck drei", "Bismarck"},\r
+                {"Prinz Eugen", "Prinz Eug"},\r
+                {"Prinz Eugen改", "Prinz Eug"},\r
+                {"Graf Zeppelin", "Graf Zep"},\r
+                {"Graf Zeppelin改", "Graf Zep"},\r
+                {"Libeccio改", "Libeccio"},\r
+            };\r
+            var label = new ShipLabel {Parent = new Panel()};\r
+            foreach (var entry in dict)\r
+            {\r
+                label.SetName("", entry.Key, "", ShipNameWidth.AkashiTimer);\r
+                PAssert.That(() => label.Text == entry.Value, entry.Key);\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// 入渠中の艦娘名の名前を縮める\r
+        /// </summary>\r
+        [TestMethod]\r
+        public void TrancateNameForNDock()\r
+        {\r
+            var dict = new Dictionary<string, string>\r
+            {\r
+                {"千歳航改二", "千歳航改二"},\r
+                {"Graf Zeppelin", "Graf Zeppeli"},\r
+                {"Graf Zeppelin改", "Graf Zeppeli"},\r
+                {"千代田航改二", "千代田航改"}\r
+            };\r
+            var label = new ShipLabel {Parent = new Panel()};\r
+            foreach (var entry in dict)\r
+            {\r
+                label.SetName("", entry.Key, "", ShipNameWidth.NDock);\r
+                PAssert.That(() => label.Text == entry.Value, entry.Key);\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// 一覧ウィンドウの要修復一覧の艦娘の名前を縮める\r
+        /// </summary>\r
+        [TestMethod]\r
+        public void TrancateNameForRepairList()\r
+        {\r
+            var dict = new Dictionary<string, string>\r
+            {\r
+                {"Graf Zeppelin", "Graf Zeppelin"},\r
+                {"Graf Zeppelin改", "Graf Zeppelin"},\r
+                {"千代田航改二", "千代田航改"}\r
+            };\r
+            var label = new ShipLabel {Parent = new Panel()};\r
+            foreach (var entry in dict)\r
+            {\r
+                label.SetName("", entry.Key, "", ShipNameWidth.RepairListFull);\r
+                PAssert.That(() => label.Text == entry.Value, entry.Key);\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// prefixとsuffixを加える\r
+        /// </summary>\r
+        [TestMethod]\r
+        public void SetName()\r
+        {\r
+            var label = new ShipLabel {Parent= new Panel()};\r
+            label.SetName("[避]", "綾波改二", "▫");\r
+            PAssert.That(() => label.Text == "[避]綾波改二▫");\r
+            label.SetName("[避]", "朝潮改二丁", "▫", ShipNameWidth.AkashiTimer);\r
+            PAssert.That(() => label.Text == "[避]朝潮改二▫");\r
+        }\r
+    }\r
+}
\ No newline at end of file
index 097fd53..4b9ac31 100644 (file)
@@ -436,7 +436,7 @@ namespace KancolleSniffer
             rpl[1].SetLevel(s);\r
             rpl[2].SetRepairTime(s);\r
             rpl[3].Text = TimeSpan.FromSeconds(s.RepairSecPerHp).ToString(@"mm\:ss");\r
-            rpl[4].SetName(s, new Dictionary<string, string> {{"Graf Zeppelin改", "Graf Zeppelin"}, {"千代田航改二", "千代田航改"}});\r
+            rpl[4].SetName(s, ShipNameWidth.RepairListFull);\r
             rpl[5].SetFleet(s);\r
             rpp.Visible = true;\r
         }\r
index aae46cd..54490bf 100644 (file)
@@ -13,7 +13,6 @@
 // limitations under the License.\r
 \r
 using System;\r
-using System.Collections.Generic;\r
 using System.Drawing;\r
 using System.Linq;\r
 using System.Text.RegularExpressions;\r
@@ -22,6 +21,15 @@ using static System.Math;
 \r
 namespace KancolleSniffer\r
 {\r
+    public enum ShipNameWidth\r
+    {\r
+        AkashiTimer = 53,\r
+        NDock = 69,\r
+        RepairList = NDock,\r
+        RepairListFull = 75,\r
+        Max = int.MaxValue\r
+    }\r
+\r
     public class ShipLabels\r
     {\r
         private readonly ShipLabel[][] _labels = new ShipLabel[ShipInfo.MemberCount][];\r
@@ -229,7 +237,7 @@ namespace KancolleSniffer
                 label.Visible = true;\r
                 label.Text = timer.Span.ToString(@"mm\:ss");\r
                 label.ForeColor = Control.DefaultForeColor;\r
-                labelName.SetName(stat, _shortNameDict);\r
+                labelName.SetName(stat, ShipNameWidth.AkashiTimer);\r
                 if (timer.Diff == 0)\r
                 {\r
                     labelHp.ForeColor = Control.DefaultForeColor;\r
@@ -242,27 +250,6 @@ namespace KancolleSniffer
             }\r
         }\r
 \r
-        private readonly Dictionary<string, string> _shortNameDict = new Dictionary<string, string>\r
-        {\r
-            {"千代田航改", "千代田航"},\r
-            {"千代田航改二", "千代田航"},\r
-            {"千歳航改二", "千歳航改"},\r
-            {"五十鈴改二", "五十鈴改"},\r
-            {"あきつ丸改", "あきつ丸"},\r
-            {"Bismarck改", "Bismarck"},\r
-            {"Bismarck twei", "Bismarck"},\r
-            {"Bismarck drei", "Bismarck"},\r
-            {"Prinz Eugen", "Prinz Eug"},\r
-            {"Prinz Eugen改", "Prinz Eug"},\r
-            {"Graf Zeppelin", "Graf Zep"},\r
-            {"Graf Zeppelin改", "Graf Zep"},\r
-            {"Libeccio改", "Libeccio"},\r
-            {"阿武隈改二", "阿武隈改"},\r
-            {"瑞鶴改二甲", "瑞鶴改二"},\r
-            {"翔鶴改二甲", "翔鶴改二"},\r
-            {"朝潮改二丁", "朝潮改二"}\r
-        };\r
-\r
         public void CreateRepairList(Control parent, EventHandler onClick)\r
         {\r
             parent.SuspendLayout();\r
@@ -310,12 +297,7 @@ namespace KancolleSniffer
                 var s = list[i];\r
                 var labels = _repairList[i];\r
                 labels[fleet].SetFleet(s);\r
-                labels[name].SetName(s, new Dictionary<string, string>\r
-                {\r
-                    {"Graf Zeppelin", "Graf Zeppeli"},\r
-                    {"Graf Zeppelin改", "Graf Zeppeli"},\r
-                    {"千代田航改二", "千代田航改"}\r
-                });\r
+                labels[name].SetName(s, ShipNameWidth.RepairList);\r
                 labels[time].SetRepairTime(s);\r
                 labels[damage].BackColor = ShipLabel.DamageColor(s, labels[damage].PresetColor);\r
             }\r
@@ -347,17 +329,8 @@ namespace KancolleSniffer
 \r
         public void SetNDockLabels(NameAndTimer[] ndock)\r
         {\r
-            var dict = new Dictionary<string, string>\r
-            {\r
-                {"Graf Zeppelin", "Graf Zeppeli"},\r
-                {"Graf Zeppelin改", "Graf Zeppeli"},\r
-                {"千代田航改二", "千代田航改"}\r
-            };\r
             for (var i = 0; i < _ndockLabels.Length; i++)\r
-            {\r
-                string name;\r
-                _ndockLabels[i][1].SetName(dict.TryGetValue(ndock[i].Name, out name) ? name : ndock[i].Name);\r
-            }\r
+                _ndockLabels[i][1].SetName("", ndock[i].Name, "", ShipNameWidth.NDock);\r
         }\r
 \r
         public void SetNDockTimer(int dock, RingTimer timer, bool finishTime)\r
@@ -383,20 +356,24 @@ namespace KancolleSniffer
             UseMnemonic = false;\r
         }\r
 \r
-        public void SetName(ShipStatus status, Dictionary<string, string> convDict = null)\r
+        public void SetName(ShipStatus status, ShipNameWidth width = ShipNameWidth.Max)\r
         {\r
-            string name;\r
-            if (convDict == null || !convDict.TryGetValue(status.Name, out name))\r
-                name = status.Name;\r
             var empty = status.Id != -1 && status.Slot.All(e => e.Id == -1) ? "▫" : "";\r
             var dc = status.PreparedDamageControl;\r
             var dcname = dc == 42 ? "[ダ]" : dc == 43 ? "[メ]" : "";\r
-            SetName((status.Escaped ? "[避]" : dcname) + name + empty);\r
+            SetName((status.Escaped ? "[避]" : dcname), status.Name, empty, width);\r
         }\r
 \r
         public void SetName(string name)\r
         {\r
-            var lu = name != null && new Regex(@"^(?:\[.\])?\p{Lu}").IsMatch(name);\r
+            SetName("", name, "");\r
+        }\r
+\r
+        public void SetName(string prefix, string name, string suffix, ShipNameWidth width = ShipNameWidth.Max)\r
+        {\r
+            if (name == null)\r
+                return;\r
+            var lu = new Regex(@"^\p{Lu}").IsMatch(name);\r
             var shift = (int)Round(ScaleFactor.Height);\r
             if (lu && Font.Equals(Parent.Font))\r
             {\r
@@ -408,7 +385,22 @@ namespace KancolleSniffer
                 Location += new Size(0, shift);\r
                 Font = Parent.Font;\r
             }\r
-            Text = name;\r
+            var result = prefix + name + suffix;\r
+            var measured = TextRenderer.MeasureText(result, Font).Width;\r
+            if (measured <= (int)width)\r
+            {\r
+                Text = result;\r
+                return;\r
+            }\r
+            var truncated = "";\r
+            foreach (var ch in name)\r
+            {\r
+                var tmp = truncated + ch;\r
+                if (TextRenderer.MeasureText(tmp, Font).Width > (int)width)\r
+                    break;\r
+                truncated = tmp;\r
+            }\r
+            Text = prefix + truncated.TrimEnd(' ') + suffix;\r
         }\r
 \r
         public void SetHp(ShipStatus status)\r