OSDN Git Service

艦娘の状態を表示するラベルの生成と表示をShipInfoLabelsに分離する
authorKazuhiro Fujieda <fujieda@users.sourceforge.jp>
Mon, 27 Oct 2014 09:30:35 +0000 (18:30 +0900)
committerKazuhiro Fujieda <fujieda@users.sourceforge.jp>
Sun, 9 Nov 2014 15:15:09 +0000 (00:15 +0900)
KancolleSniffer/KancolleSniffer.csproj
KancolleSniffer/MainForm.Designer.cs
KancolleSniffer/MainForm.cs
KancolleSniffer/ShipInfoLabels.cs [new file with mode: 0644]

index 2e81d2d..c417c31 100644 (file)
@@ -75,6 +75,7 @@
       <DependentUpon>DebugDialog.cs</DependentUpon>\r
     </Compile>\r
     <Compile Include="DockInfo.cs" />\r
+    <Compile Include="ShipInfoLabels.cs" />\r
     <Compile Include="MainForm.cs">\r
       <SubType>Form</SubType>\r
     </Compile>\r
index 60041e0..c980d38 100644 (file)
@@ -58,7 +58,7 @@ namespace KancolleSniffer
             this.label2 = new System.Windows.Forms.Label();\r
             this.labelNumOfShips = new System.Windows.Forms.Label();\r
             this.label1 = new System.Windows.Forms.Label();\r
-            this.panelFleet1 = new System.Windows.Forms.Panel();\r
+            this.panelShipInfo = new System.Windows.Forms.Panel();\r
             this.panelBattleInfo = new System.Windows.Forms.Panel();\r
             this.labelEnemyAirSuperiority = new System.Windows.Forms.Label();\r
             this.label30 = new System.Windows.Forms.Label();\r
@@ -161,7 +161,7 @@ namespace KancolleSniffer
             this.labelDamgedShipListButton = new System.Windows.Forms.Label();\r
             this.label31 = new System.Windows.Forms.Label();\r
             this.panelHeadquarters.SuspendLayout();\r
-            this.panelFleet1.SuspendLayout();\r
+            this.panelShipInfo.SuspendLayout();\r
             this.panelBattleInfo.SuspendLayout();\r
             this.panelMaterialHistory.SuspendLayout();\r
             this.panelDock.SuspendLayout();\r
@@ -282,26 +282,26 @@ namespace KancolleSniffer
             this.label1.TabIndex = 0;\r
             this.label1.Text = "艦娘数";\r
             // \r
-            // panelFleet1\r
-            // \r
-            this.panelFleet1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\r
-            this.panelFleet1.Controls.Add(this.panelBattleInfo);\r
-            this.panelFleet1.Controls.Add(this.label19);\r
-            this.panelFleet1.Controls.Add(this.labelAirSuperiority);\r
-            this.panelFleet1.Controls.Add(this.label27);\r
-            this.panelFleet1.Controls.Add(this.label21);\r
-            this.panelFleet1.Controls.Add(this.labelCondTimer3);\r
-            this.panelFleet1.Controls.Add(this.label20);\r
-            this.panelFleet1.Controls.Add(this.labelCondTimer2);\r
-            this.panelFleet1.Controls.Add(this.labelCondTimer1);\r
-            this.panelFleet1.Controls.Add(this.label17);\r
-            this.panelFleet1.Controls.Add(this.label16);\r
-            this.panelFleet1.Controls.Add(this.label18);\r
-            this.panelFleet1.Controls.Add(this.label4);\r
-            this.panelFleet1.Location = new System.Drawing.Point(6, 57);\r
-            this.panelFleet1.Name = "panelFleet1";\r
-            this.panelFleet1.Size = new System.Drawing.Size(238, 134);\r
-            this.panelFleet1.TabIndex = 2;\r
+            // panelShipInfo\r
+            // \r
+            this.panelShipInfo.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\r
+            this.panelShipInfo.Controls.Add(this.panelBattleInfo);\r
+            this.panelShipInfo.Controls.Add(this.label19);\r
+            this.panelShipInfo.Controls.Add(this.labelAirSuperiority);\r
+            this.panelShipInfo.Controls.Add(this.label27);\r
+            this.panelShipInfo.Controls.Add(this.label21);\r
+            this.panelShipInfo.Controls.Add(this.labelCondTimer3);\r
+            this.panelShipInfo.Controls.Add(this.label20);\r
+            this.panelShipInfo.Controls.Add(this.labelCondTimer2);\r
+            this.panelShipInfo.Controls.Add(this.labelCondTimer1);\r
+            this.panelShipInfo.Controls.Add(this.label17);\r
+            this.panelShipInfo.Controls.Add(this.label16);\r
+            this.panelShipInfo.Controls.Add(this.label18);\r
+            this.panelShipInfo.Controls.Add(this.label4);\r
+            this.panelShipInfo.Location = new System.Drawing.Point(6, 57);\r
+            this.panelShipInfo.Name = "panelShipInfo";\r
+            this.panelShipInfo.Size = new System.Drawing.Size(238, 134);\r
+            this.panelShipInfo.TabIndex = 2;\r
             // \r
             // panelBattleInfo\r
             // \r
@@ -1269,7 +1269,7 @@ namespace KancolleSniffer
             this.Controls.Add(this.labelConstruct);\r
             this.Controls.Add(this.panelDock);\r
             this.Controls.Add(this.labelRepair);\r
-            this.Controls.Add(this.panelFleet1);\r
+            this.Controls.Add(this.panelShipInfo);\r
             this.Controls.Add(this.labelFleet1);\r
             this.Controls.Add(this.panelHeadquarters);\r
             this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;\r
@@ -1282,8 +1282,8 @@ namespace KancolleSniffer
             this.Resize += new System.EventHandler(this.MainForm_Resize);\r
             this.panelHeadquarters.ResumeLayout(false);\r
             this.panelHeadquarters.PerformLayout();\r
-            this.panelFleet1.ResumeLayout(false);\r
-            this.panelFleet1.PerformLayout();\r
+            this.panelShipInfo.ResumeLayout(false);\r
+            this.panelShipInfo.PerformLayout();\r
             this.panelBattleInfo.ResumeLayout(false);\r
             this.panelBattleInfo.PerformLayout();\r
             this.panelMaterialHistory.ResumeLayout(false);\r
@@ -1313,7 +1313,7 @@ namespace KancolleSniffer
         private System.Windows.Forms.Label label2;\r
         private System.Windows.Forms.Label labelNumOfShips;\r
         private System.Windows.Forms.Label label1;\r
-        private System.Windows.Forms.Panel panelFleet1;\r
+        private System.Windows.Forms.Panel panelShipInfo;\r
         private System.Windows.Forms.Label labelRepair;\r
         private System.Windows.Forms.Panel panelDock;\r
         private System.Windows.Forms.Label label8;\r
index b423330..b8e420f 100644 (file)
@@ -20,7 +20,6 @@ using System.Collections.Generic;
 using System.Drawing;\r
 using System.IO;\r
 using System.Linq;\r
-using System.Text.RegularExpressions;\r
 using System.Windows.Forms;\r
 using Codeplex.Data;\r
 using Fiddler;\r
@@ -33,13 +32,12 @@ namespace KancolleSniffer
         private readonly dynamic _wmp = Activator.CreateInstance(Type.GetTypeFromProgID("WMPlayer.OCX.7"));\r
         private readonly Config _config = new Config();\r
         private readonly ConfigDialog _configDialog;\r
-        private int _labelRightDistance;\r
         private int _currentFleet;\r
         private readonly Label[] _labelCheckFleets;\r
-        private readonly Label[][] _shipInfoLabels = new Label[ShipInfo.MemberCount][];\r
-        private readonly Label[][] _damagedShipList = new Label[14][];\r
+        private readonly ShipLabel[][] _damagedShipList = new ShipLabel[14][];\r
         private readonly Label[] _akashiTimers = new Label[ShipInfo.MemberCount];\r
-        private readonly Label[][] _ndockLabels = new Label[DockInfo.DockCount][];\r
+        private readonly ShipLabel[][] _ndockLabels = new ShipLabel[DockInfo.DockCount][];\r
+        private readonly ShipInfoLabels _shipInfoLabels;\r
         private readonly Queue<string[]> _akashiTimerNoticeQueue = new Queue<string[]>();\r
         private bool _started;\r
 \r
@@ -55,7 +53,7 @@ namespace KancolleSniffer
             var i = 0;\r
             foreach (var label in new[] {labelFleet1, labelFleet2, labelFleet3, labelFleet4})\r
                 label.Tag = i++;\r
-            CreateShipInfoLabels();\r
+            _shipInfoLabels = new ShipInfoLabels(panelShipInfo);\r
             CreateDamagedShipList();\r
             CreateAkashiTimers();\r
             CreateNDockLabels();\r
@@ -155,12 +153,6 @@ namespace KancolleSniffer
                 ShowInTaskbar = false;\r
         }\r
 \r
-        private void labelHP_SizeChanged(object sender, EventArgs e)\r
-        {\r
-            var label = (Label)sender;\r
-            label.Location = new Point(label.Parent.Width - _labelRightDistance - label.Width, label.Top);\r
-        }\r
-\r
         private void notifyIconMain_MouseDoubleClick(object sender, MouseEventArgs e)\r
         {\r
             NotifyIconOpenToolStripMenuItem_Click(sender, e);\r
@@ -277,64 +269,10 @@ namespace KancolleSniffer
             }\r
         }\r
 \r
-        private void CreateShipInfoLabels()\r
-        {\r
-            var parent = panelFleet1;\r
-            parent.SuspendLayout();\r
-            for (var i = 0; i < _shipInfoLabels.Length; i++)\r
-            {\r
-                var y = 20 + 16 * i;\r
-                const int height = 12;\r
-                parent.Controls.AddRange(_shipInfoLabels[i] = new[]\r
-                {\r
-                    new Label {Location = new Point(130, y), AutoSize = true},\r
-                    new Label\r
-                    {\r
-                        Location = new Point(136, y),\r
-                        Size = new Size(23, height),\r
-                        TextAlign = ContentAlignment.MiddleRight\r
-                    },\r
-                    new Label\r
-                    {\r
-                        Location = new Point(170, y),\r
-                        Size = new Size(23, height),\r
-                        TextAlign = ContentAlignment.MiddleRight\r
-                    },\r
-                    new Label\r
-                    {\r
-                        Location = new Point(195, y),\r
-                        Size = new Size(41, height),\r
-                        TextAlign = ContentAlignment.MiddleRight\r
-                    },\r
-                    new Label {Location = new Point(2, y), AutoSize = true} // 名前のZ-orderを下に\r
-                });\r
-                _shipInfoLabels[i][0].SizeChanged += labelHP_SizeChanged;\r
-            }\r
-            _labelRightDistance = parent.Width - _shipInfoLabels[0][0].Right;\r
-            parent.ResumeLayout();\r
-        }\r
-\r
         private void UpdateShipInfo()\r
         {\r
             var statuses = _sniffer.GetShipStatuses(_currentFleet);\r
-            var empty = new ShipStatus();\r
-            for (var i = 0; i < _shipInfoLabels.Length; i++)\r
-            {\r
-                var labels = _shipInfoLabels[i];\r
-                var stat = i < statuses.Length ? statuses[i] : empty;\r
-                SetShipName(labels[4], stat.Name);\r
-                SetHpLabel(labels[0], stat);\r
-                if (stat == empty)\r
-                {\r
-                    // SetCondLabelでは背景色が赤になってしまう\r
-                    labels[1].Text = "0";\r
-                    labels[1].BackColor = DefaultBackColor;\r
-                }\r
-                else\r
-                    SetCondLabel(labels[1], stat.Cond);\r
-                labels[2].Text = stat.Level.ToString("D");\r
-                labels[3].Text = stat.ExpToNext.ToString("D");\r
-            }\r
+            _shipInfoLabels.SetShipInfo(statuses);\r
             if (_sniffer.Battle.HasDamagedShip)\r
                 Ring("大破した艦娘がいます", string.Join(" ", _sniffer.Battle.DamagedShipNames), _config.DamagedShipSoundFile);\r
             labelAirSuperiority.Text = _sniffer.GetAirSuperiority(_currentFleet).ToString("D");\r
@@ -374,44 +312,6 @@ namespace KancolleSniffer
             }\r
         }\r
 \r
-        private void SetShipName(Label label, string name)\r
-        {\r
-            var lu = name != null && new Regex(@"^\p{Lu}").IsMatch(name);\r
-            if (lu && label.Font.Equals(DefaultFont))\r
-            {\r
-                label.Location += new Size(0, -1);\r
-                label.Font = new Font("Tahoma", 8);\r
-            }\r
-            else if (!lu && !label.Font.Equals(DefaultFont))\r
-            {\r
-                label.Location += new Size(0, 1);\r
-                label.Font = DefaultFont;\r
-            }\r
-            label.Text = name;\r
-        }\r
-\r
-        private void SetHpLabel(Label label, ShipStatus status)\r
-        {\r
-            SetHpLabel(label, status.NowHp, status.MaxHp);\r
-        }\r
-\r
-        private void SetHpLabel(Label label, int now, int max)\r
-        {\r
-            var colors = new[] {DefaultBackColor, Color.FromArgb(255, 240, 240, 100), Color.Orange, Color.Red};\r
-            label.Text = string.Format("{0:D}/{1:D}", now, max);\r
-            label.BackColor = colors[(int)ShipStatus.CalcDamage(now, max)];\r
-        }\r
-\r
-        private void SetCondLabel(Label label, int cond)\r
-        {\r
-            label.Text = cond.ToString("D");\r
-            label.BackColor = cond >= 50\r
-                ? Color.Yellow\r
-                : cond >= 30\r
-                    ? DefaultBackColor\r
-                    : cond >= 20 ? Color.Orange : Color.Red;\r
-        }\r
-\r
         private void CreateNDockLabels()\r
         {\r
             var parent = panelDock;\r
@@ -421,8 +321,8 @@ namespace KancolleSniffer
                 parent.Controls.AddRange(\r
                     _ndockLabels[i] = new[]\r
                     {\r
-                        new Label {Location = new Point(106, y), AutoSize = true, Text = "00:00:00"},\r
-                        new Label {Location = new Point(30, y), AutoSize = true} // 名前のZ-orderを下に\r
+                        new ShipLabel {Location = new Point(106, y), AutoSize = true, Text = "00:00:00"},\r
+                        new ShipLabel {Location = new Point(30, y), AutoSize = true} // 名前のZ-orderを下に\r
                     });\r
             }\r
         }\r
@@ -430,7 +330,7 @@ namespace KancolleSniffer
         private void UpdateNDocLabels()\r
         {\r
             for (var i = 0; i < _ndockLabels.Length; i++)\r
-                SetShipName(_ndockLabels[i][1], _sniffer.NDock[i].Name);\r
+                _ndockLabels[i][1].SetName(_sniffer.NDock[i].Name);\r
         }\r
 \r
         private void UpdateMissionLabels()\r
@@ -495,7 +395,7 @@ namespace KancolleSniffer
 \r
         private void CreateAkashiTimers()\r
         {\r
-            var parent = panelFleet1;\r
+            var parent = panelShipInfo;\r
             parent.SuspendLayout();\r
             for (var i = 0; i < _akashiTimers.Length; i++)\r
             {\r
@@ -517,7 +417,7 @@ namespace KancolleSniffer
             for (var i = 0; i < _akashiTimers.Length; i++)\r
             {\r
                 var label = _akashiTimers[i];\r
-                var labelHp = _shipInfoLabels[i][0];\r
+                var labelHp = _shipInfoLabels.GetHpLabel(i);\r
                 if (timers == null || i >= timers.Length || timers[i].Span == TimeSpan.MinValue)\r
                 {\r
                     label.Visible = false;\r
@@ -534,7 +434,7 @@ namespace KancolleSniffer
                     continue;\r
                 }\r
                 labelHp.ForeColor = Color.DimGray;\r
-                SetHpLabel(labelHp, stat.NowHp + timer.Diff, stat.MaxHp);\r
+                labelHp.SetHp(stat.NowHp + timer.Diff, stat.MaxHp);\r
             }\r
             var msgs = _sniffer.GetAkashiTimerNotice();\r
             var fn = new[] {"第一艦隊", "第二艦隊", "第三艦隊", "第四艦隊"};\r
@@ -565,10 +465,10 @@ namespace KancolleSniffer
                 const int height = 12;\r
                 parent.Controls.AddRange(_damagedShipList[i] = new[]\r
                 {\r
-                    new Label {Location = new Point(1, y), Size = new Size(11, height)},\r
-                    new Label {Location = new Point(79, y), Size = new Size(45, height)},\r
-                    new Label {Location = new Point(123, y), Size = new Size(5, height - 1)},\r
-                    new Label {Location = new Point(10, y), AutoSize = true}\r
+                    new ShipLabel {Location = new Point(1, y), Size = new Size(11, height)},\r
+                    new ShipLabel {Location = new Point(79, y), Size = new Size(45, height)},\r
+                    new ShipLabel {Location = new Point(123, y), Size = new Size(5, height - 1)},\r
+                    new ShipLabel {Location = new Point(10, y), AutoSize = true}\r
                 });\r
             }\r
             parent.ResumeLayout();\r
@@ -586,7 +486,7 @@ namespace KancolleSniffer
                 parent.Size = new Size(width, 19);\r
                 var labels = _damagedShipList[0];\r
                 labels[fleet].Text = "";\r
-                SetShipName(labels[name], "なし");\r
+                labels[name].SetName("なし");\r
                 labels[time].Text = "";\r
                 labels[damage].BackColor = DefaultBackColor;\r
                 return;\r
@@ -599,7 +499,7 @@ namespace KancolleSniffer
                 var e = list[i];\r
                 var labels = _damagedShipList[i];\r
                 labels[fleet].Text = fn[e.Fleet + 1];\r
-                SetShipName(labels[name], e.Name);\r
+                labels[name].SetName(e.Name);\r
                 var t = e.RepairTime;\r
                 labels[time].Text = string.Format(@"{0:d2}:{1:mm\:ss}", (int)t.TotalHours, t);\r
                 labels[damage].BackColor = colors[(int)e.DamageLevel];\r
diff --git a/KancolleSniffer/ShipInfoLabels.cs b/KancolleSniffer/ShipInfoLabels.cs
new file mode 100644 (file)
index 0000000..cffa31f
--- /dev/null
@@ -0,0 +1,160 @@
+// Copyright (C) 2014 Kazuhiro Fujieda <fujieda@users.sourceforge.jp>\r
+// \r
+// This program is part of KancolleSniffer.\r
+//\r
+// KancolleSniffer is free software: you can redistribute it and/or modify\r
+// it under the terms of the GNU General Public License as published by\r
+// the Free Software Foundation, either version 3 of the License, or\r
+// (at your option) any later version.\r
+//\r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+//\r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, see <http://www.gnu.org/licenses/>.\r
+\r
+using System;\r
+using System.Drawing;\r
+using System.Text.RegularExpressions;\r
+using System.Windows.Forms;\r
+\r
+namespace KancolleSniffer\r
+{\r
+    public class ShipInfoLabels\r
+    {\r
+        private readonly ShipLabel[][] _labels = new ShipLabel[ShipInfo.MemberCount][];\r
+        private const int LabelHpRight = 130;\r
+\r
+        public ShipInfoLabels(Control parent)\r
+        {\r
+            CreateLabels(parent);\r
+        }\r
+\r
+        private void CreateLabels(Control parent)\r
+        {\r
+            parent.SuspendLayout();\r
+            for (var i = 0; i < _labels.Length; i++)\r
+            {\r
+                var y = 20 + 16 * i;\r
+                const int height = 12;\r
+                parent.Controls.AddRange(_labels[i] = new[]\r
+                {\r
+                    new ShipLabel {Location = new Point(LabelHpRight, y), AutoSize = true},\r
+                    new ShipLabel\r
+                    {\r
+                        Location = new Point(136, y),\r
+                        Size = new Size(23, height),\r
+                        TextAlign = ContentAlignment.MiddleRight\r
+                    },\r
+                    new ShipLabel\r
+                    {\r
+                        Location = new Point(170, y),\r
+                        Size = new Size(23, height),\r
+                        TextAlign = ContentAlignment.MiddleRight\r
+                    },\r
+                    new ShipLabel\r
+                    {\r
+                        Location = new Point(195, y),\r
+                        Size = new Size(41, height),\r
+                        TextAlign = ContentAlignment.MiddleRight\r
+                    },\r
+                    new ShipLabel {Location = new Point(2, y), AutoSize = true} // 名前のZ-orderを下に\r
+                });\r
+                _labels[i][0].SizeChanged += labelHP_SizeChanged;\r
+            }\r
+            parent.ResumeLayout();\r
+        }\r
+\r
+        public ShipLabel GetHpLabel(int idx)\r
+        {\r
+            return _labels[idx][0];\r
+        }\r
+\r
+        private void labelHP_SizeChanged(object sender, EventArgs e)\r
+        {\r
+            var label = (Label)sender;\r
+            label.Location = new Point(LabelHpRight - label.Width, label.Top);\r
+        }\r
+\r
+        public void SetShipInfo(ShipStatus[] statuses)\r
+        {\r
+            var empty = new ShipStatus();\r
+            for (var i = 0; i < _labels.Length; i++)\r
+            {\r
+                var labels = _labels[i];\r
+                var s = i < statuses.Length ? statuses[i] : empty;\r
+                labels[4].SetName(s);\r
+                labels[0].SetHp(s);\r
+                labels[1].SetCond(s);\r
+                labels[2].SetLevel(s);\r
+                labels[3].SetExpToNext(s);\r
+            }\r
+        }\r
+    }\r
+\r
+    [System.ComponentModel.DesignerCategory("Code")]\r
+    public class ShipLabel : Label\r
+    {\r
+        public void SetName(ShipStatus status)\r
+        {\r
+            SetName(status.Name);\r
+        }\r
+\r
+        public void SetName(string name)\r
+        {\r
+            var lu = name != null && new Regex(@"^\p{Lu}").IsMatch(name);\r
+            if (lu && Font.Equals(DefaultFont))\r
+            {\r
+                Location += new Size(0, -1);\r
+                Font = new Font("Tahoma", 8);\r
+            }\r
+            else if (!lu && !Font.Equals(DefaultFont))\r
+            {\r
+                Location += new Size(0, 1);\r
+                Font = DefaultFont;\r
+            }\r
+            Text = name;\r
+        }\r
+\r
+        public void SetHp(ShipStatus status)\r
+        {\r
+            SetHp(status.NowHp, status.MaxHp);\r
+        }\r
+\r
+        public void SetHp(int now, int max)\r
+        {\r
+            var colors = new[] {DefaultBackColor, Color.FromArgb(255, 240, 240, 100), Color.Orange, Color.Red};\r
+            Text = string.Format("{0:D}/{1:D}", now, max);\r
+            BackColor = colors[(int)ShipStatus.CalcDamage(now, max)];\r
+        }\r
+\r
+        public void SetCond(ShipStatus status)\r
+        {\r
+            if (status.Level == 0)\r
+            {\r
+                Text = "0";\r
+                BackColor = DefaultBackColor;\r
+                return;\r
+            }\r
+            var cond = status.Cond;\r
+            Text = cond.ToString("D");\r
+            BackColor = cond >= 50\r
+                ? Color.Yellow\r
+                : cond >= 30\r
+                    ? DefaultBackColor\r
+                    : cond >= 20 ? Color.Orange : Color.Red;\r
+        }\r
+\r
+        public void SetLevel(ShipStatus status)\r
+        {\r
+            Text = status.Level.ToString("D");\r
+        }\r
+\r
+        public void SetExpToNext(ShipStatus status)\r
+        {\r
+            Text = status.ExpToNext.ToString("D");\r
+        }\r
+    }\r
+}
\ No newline at end of file