OSDN Git Service

MainFormから艦隊表示全体をMainFleetPanelに分離する
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Sat, 2 May 2020 13:32:48 +0000 (22:32 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Sun, 30 Aug 2020 05:58:21 +0000 (14:58 +0900)
KancolleSniffer/KancolleSniffer.csproj
KancolleSniffer/MainForm.Designer.cs
KancolleSniffer/MainForm.cs
KancolleSniffer/View/MainFleetPanel.cs [new file with mode: 0644]

index 8b7b7b4..5d8bf01 100644 (file)
@@ -95,6 +95,9 @@
       <SubType>Component</SubType>\r
     </Compile>\r
     <Compile Include="View\IUpdateable.cs" />\r
+    <Compile Include="View\MainFleetPanel.cs">\r
+      <SubType>Component</SubType>\r
+    </Compile>\r
     <Compile Include="View\MaterialHistoryPanel.cs">\r
       <SubType>Component</SubType>\r
     </Compile>\r
index d4a47d6..d9bc4f4 100644 (file)
@@ -61,10 +61,6 @@ namespace KancolleSniffer
             this.CaptureToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
             this.ConfigToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
             this.ExitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();\r
-            this.labelFleet1 = new System.Windows.Forms.Label();\r
-            this.labelFleet4 = new System.Windows.Forms.Label();\r
-            this.labelFleet3 = new System.Windows.Forms.Label();\r
-            this.labelFleet2 = new System.Windows.Forms.Label();\r
             this.labelMaterialCaption = new System.Windows.Forms.Label();\r
             this.label31 = new System.Windows.Forms.Label();\r
             this.labelAkashiRepair = new System.Windows.Forms.Label();\r
@@ -78,16 +74,8 @@ namespace KancolleSniffer
             this.questPanel = new KancolleSniffer.View.QuestPanel();\r
             this.hqPanel = new KancolleSniffer.View.HqPanel();\r
             this.materialHistoryPanel = new KancolleSniffer.View.MaterialHistoryPanel();\r
-            this.shipInfoPanel = new KancolleSniffer.View.ShipInfoPanel();\r
-            this.chargeStatus1 = new KancolleSniffer.View.ChargeStatus();\r
-            this.chargeStatus2 = new KancolleSniffer.View.ChargeStatus();\r
-            this.chargeStatus3 = new KancolleSniffer.View.ChargeStatus();\r
-            this.chargeStatus4 = new KancolleSniffer.View.ChargeStatus();\r
-            this.triangleMark1 = new KancolleSniffer.View.TriangleMark();\r
-            this.triangleMark2 = new KancolleSniffer.View.TriangleMark();\r
-            this.triangleMark3 = new KancolleSniffer.View.TriangleMark();\r
-            this.triangleMark4 = new KancolleSniffer.View.TriangleMark();\r
             this.dropDownButtonMaterialHistory = new KancolleSniffer.View.DropDownButton();\r
+            this.mainFleetPanel = new KancolleSniffer.View.MainFleetPanel();\r
             this.contextMenuStripNotifyIcon.SuspendLayout();\r
             this.contextMenuStripMain.SuspendLayout();\r
             this.SuspendLayout();\r
@@ -214,40 +202,6 @@ namespace KancolleSniffer
             this.ExitToolStripMenuItem.Text = "終了(&X)";\r
             this.ExitToolStripMenuItem.Click += new System.EventHandler(this.ExitToolStripMenuItem_Click);\r
             // \r
-            // labelFleet1\r
-            // \r
-            this.labelFleet1.Location = new System.Drawing.Point(12, 43);\r
-            this.labelFleet1.Name = "labelFleet1";\r
-            this.labelFleet1.Size = new System.Drawing.Size(45, 12);\r
-            this.labelFleet1.TabIndex = 1;\r
-            this.labelFleet1.Text = "第一";\r
-            this.labelFleet1.MouseLeave += new System.EventHandler(this.labelFleet1_MouseLeave);\r
-            this.labelFleet1.MouseHover += new System.EventHandler(this.labelFleet1_MouseHover);\r
-            // \r
-            // labelFleet4\r
-            // \r
-            this.labelFleet4.Location = new System.Drawing.Point(177, 43);\r
-            this.labelFleet4.Name = "labelFleet4";\r
-            this.labelFleet4.Size = new System.Drawing.Size(45, 12);\r
-            this.labelFleet4.TabIndex = 17;\r
-            this.labelFleet4.Text = "第四";\r
-            // \r
-            // labelFleet3\r
-            // \r
-            this.labelFleet3.Location = new System.Drawing.Point(122, 43);\r
-            this.labelFleet3.Name = "labelFleet3";\r
-            this.labelFleet3.Size = new System.Drawing.Size(45, 12);\r
-            this.labelFleet3.TabIndex = 19;\r
-            this.labelFleet3.Text = "第三";\r
-            // \r
-            // labelFleet2\r
-            // \r
-            this.labelFleet2.Location = new System.Drawing.Point(67, 43);\r
-            this.labelFleet2.Name = "labelFleet2";\r
-            this.labelFleet2.Size = new System.Drawing.Size(45, 12);\r
-            this.labelFleet2.TabIndex = 21;\r
-            this.labelFleet2.Text = "第二";\r
-            // \r
             // labelMaterialCaption\r
             // \r
             this.labelMaterialCaption.AutoSize = true;\r
@@ -368,90 +322,6 @@ namespace KancolleSniffer
             this.materialHistoryPanel.TabIndex = 65;\r
             this.materialHistoryPanel.Visible = false;\r
             // \r
-            // shipInfoPanel\r
-            // \r
-            this.shipInfoPanel.AkashiRepairTimer = null;\r
-            this.shipInfoPanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\r
-            this.shipInfoPanel.CombinedFleet = false;\r
-            this.shipInfoPanel.Context = null;\r
-            this.shipInfoPanel.CurrentFleet = 0;\r
-            this.shipInfoPanel.Location = new System.Drawing.Point(6, 57);\r
-            this.shipInfoPanel.Name = "shipInfoPanel";\r
-            this.shipInfoPanel.ShowShipOnList = null;\r
-            this.shipInfoPanel.Size = new System.Drawing.Size(220, 134);\r
-            this.shipInfoPanel.TabIndex = 67;\r
-            // \r
-            // chargeStatus1\r
-            // \r
-            this.chargeStatus1.Context = null;\r
-            this.chargeStatus1.Location = new System.Drawing.Point(40, 42);\r
-            this.chargeStatus1.Name = "chargeStatus1";\r
-            this.chargeStatus1.Size = new System.Drawing.Size(17, 13);\r
-            this.chargeStatus1.TabIndex = 69;\r
-            this.chargeStatus1.Text = "chargeStatus1";\r
-            // \r
-            // chargeStatus2\r
-            // \r
-            this.chargeStatus2.Context = null;\r
-            this.chargeStatus2.Location = new System.Drawing.Point(95, 42);\r
-            this.chargeStatus2.Name = "chargeStatus2";\r
-            this.chargeStatus2.Size = new System.Drawing.Size(17, 13);\r
-            this.chargeStatus2.TabIndex = 71;\r
-            this.chargeStatus2.Text = "chargeStatus2";\r
-            // \r
-            // chargeStatus3\r
-            // \r
-            this.chargeStatus3.Context = null;\r
-            this.chargeStatus3.Location = new System.Drawing.Point(150, 42);\r
-            this.chargeStatus3.Name = "chargeStatus3";\r
-            this.chargeStatus3.Size = new System.Drawing.Size(17, 13);\r
-            this.chargeStatus3.TabIndex = 72;\r
-            this.chargeStatus3.Text = "chargeStatus3";\r
-            // \r
-            // chargeStatus4\r
-            // \r
-            this.chargeStatus4.Context = null;\r
-            this.chargeStatus4.Location = new System.Drawing.Point(205, 42);\r
-            this.chargeStatus4.Name = "chargeStatus4";\r
-            this.chargeStatus4.Size = new System.Drawing.Size(17, 13);\r
-            this.chargeStatus4.TabIndex = 73;\r
-            this.chargeStatus4.Text = "chargeStatus4";\r
-            // \r
-            // triangleMark1\r
-            // \r
-            this.triangleMark1.Location = new System.Drawing.Point(7, 42);\r
-            this.triangleMark1.Name = "triangleMark1";\r
-            this.triangleMark1.Size = new System.Drawing.Size(5, 13);\r
-            this.triangleMark1.TabIndex = 75;\r
-            this.triangleMark1.Text = "triangleMark1";\r
-            // \r
-            // triangleMark2\r
-            // \r
-            this.triangleMark2.Location = new System.Drawing.Point(62, 42);\r
-            this.triangleMark2.Name = "triangleMark2";\r
-            this.triangleMark2.Size = new System.Drawing.Size(5, 13);\r
-            this.triangleMark2.TabIndex = 76;\r
-            this.triangleMark2.Text = "triangleMark2";\r
-            this.triangleMark2.Visible = false;\r
-            // \r
-            // triangleMark3\r
-            // \r
-            this.triangleMark3.Location = new System.Drawing.Point(117, 42);\r
-            this.triangleMark3.Name = "triangleMark3";\r
-            this.triangleMark3.Size = new System.Drawing.Size(5, 13);\r
-            this.triangleMark3.TabIndex = 77;\r
-            this.triangleMark3.Text = "triangleMark3";\r
-            this.triangleMark3.Visible = false;\r
-            // \r
-            // triangleMark4\r
-            // \r
-            this.triangleMark4.Location = new System.Drawing.Point(172, 42);\r
-            this.triangleMark4.Name = "triangleMark4";\r
-            this.triangleMark4.Size = new System.Drawing.Size(5, 13);\r
-            this.triangleMark4.TabIndex = 78;\r
-            this.triangleMark4.Text = "triangleMark4";\r
-            this.triangleMark4.Visible = false;\r
-            // \r
             // dropDownButtonMaterialHistory\r
             // \r
             this.dropDownButtonMaterialHistory.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;\r
@@ -461,22 +331,22 @@ namespace KancolleSniffer
             this.dropDownButtonMaterialHistory.TabIndex = 80;\r
             this.dropDownButtonMaterialHistory.Text = "dropDownButton1";\r
             // \r
+            // mainFleetPanel\r
+            // \r
+            this.mainFleetPanel.Context = null;\r
+            this.mainFleetPanel.Location = new System.Drawing.Point(6, 42);\r
+            this.mainFleetPanel.Name = "mainFleetPanel";\r
+            this.mainFleetPanel.Size = new System.Drawing.Size(220, 149);\r
+            this.mainFleetPanel.TabIndex = 82;\r
+            // \r
             // MainForm\r
             // \r
             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\r
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\r
             this.ClientSize = new System.Drawing.Size(232, 456);\r
             this.ContextMenuStrip = this.contextMenuStripMain;\r
+            this.Controls.Add(this.mainFleetPanel);\r
             this.Controls.Add(this.dropDownButtonMaterialHistory);\r
-            this.Controls.Add(this.triangleMark4);\r
-            this.Controls.Add(this.triangleMark3);\r
-            this.Controls.Add(this.triangleMark2);\r
-            this.Controls.Add(this.triangleMark1);\r
-            this.Controls.Add(this.chargeStatus3);\r
-            this.Controls.Add(this.chargeStatus4);\r
-            this.Controls.Add(this.chargeStatus2);\r
-            this.Controls.Add(this.chargeStatus1);\r
-            this.Controls.Add(this.shipInfoPanel);\r
             this.Controls.Add(this.materialHistoryPanel);\r
             this.Controls.Add(this.hqPanel);\r
             this.Controls.Add(this.kdockPanel);\r
@@ -491,14 +361,10 @@ namespace KancolleSniffer
             this.Controls.Add(this.dropDownButtonRepairList);\r
             this.Controls.Add(this.label31);\r
             this.Controls.Add(this.labelMaterialCaption);\r
-            this.Controls.Add(this.labelFleet2);\r
-            this.Controls.Add(this.labelFleet3);\r
-            this.Controls.Add(this.labelFleet4);\r
             this.Controls.Add(this.labelMissionCaption);\r
             this.Controls.Add(this.labelQuest);\r
             this.Controls.Add(this.labelConstruct);\r
             this.Controls.Add(this.labelNDockCaption);\r
-            this.Controls.Add(this.labelFleet1);\r
             this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;\r
             this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));\r
             this.MaximizeBox = false;\r
@@ -520,10 +386,6 @@ namespace KancolleSniffer
         private System.Windows.Forms.ContextMenuStrip contextMenuStripMain;\r
         private System.Windows.Forms.ToolStripMenuItem ConfigToolStripMenuItem;\r
         private System.Windows.Forms.ToolStripMenuItem ExitToolStripMenuItem;\r
-        private System.Windows.Forms.Label labelFleet1;\r
-        private System.Windows.Forms.Label labelFleet4;\r
-        private System.Windows.Forms.Label labelFleet3;\r
-        private System.Windows.Forms.Label labelFleet2;\r
         private System.Windows.Forms.Label labelMaterialCaption;\r
         private DropDownButton dropDownButtonRepairList;\r
         private System.Windows.Forms.Label label31;\r
@@ -544,16 +406,8 @@ namespace KancolleSniffer
         private KDockPanel kdockPanel;\r
         private HqPanel hqPanel;\r
         private MaterialHistoryPanel materialHistoryPanel;\r
-        private ShipInfoPanel shipInfoPanel;\r
-        private ChargeStatus chargeStatus1;\r
-        private ChargeStatus chargeStatus2;\r
-        private ChargeStatus chargeStatus3;\r
-        private ChargeStatus chargeStatus4;\r
-        private TriangleMark triangleMark1;\r
-        private TriangleMark triangleMark2;\r
-        private TriangleMark triangleMark3;\r
-        private TriangleMark triangleMark4;\r
         private DropDownButton dropDownButtonMaterialHistory;\r
+        private MainFleetPanel mainFleetPanel;\r
     }\r
 }\r
 \r
index 9efd82a..075b003 100644 (file)
@@ -17,10 +17,8 @@ using System.Collections.Generic;
 using System.Diagnostics;\r
 using System.Drawing;\r
 using System.Linq;\r
-using System.Threading;\r
 using System.Threading.Tasks;\r
 using System.Windows.Forms;\r
-using KancolleSniffer.Model;\r
 using KancolleSniffer.Notification;\r
 using KancolleSniffer.Util;\r
 using KancolleSniffer.View;\r
@@ -63,11 +61,10 @@ namespace KancolleSniffer
         private void SetupView()\r
         {\r
             SetScaleFactorOfDpiScaling();\r
-            SetupFleetClick();\r
             SetupQuestPanel();\r
             SetMainFormEventHandler();\r
-            shipInfoPanel.AkashiRepairTimer = labelAkashiRepairTimer;\r
-            shipInfoPanel.ShowShipOnList = ShowShipOnShipList;\r
+            mainFleetPanel.AkashiRepairTimer = labelAkashiRepairTimer;\r
+            mainFleetPanel.ShowShipOnList = ShowShipOnShipList;\r
             panelRepairList.CreateLabels(panelRepairList_Click);\r
             ndockPanel.SetClickHandler(labelNDockCaption);\r
             missionPanel.SetClickHandler(labelMissionCaption);\r
@@ -88,13 +85,12 @@ namespace KancolleSniffer
         {\r
             _updateable = new IUpdateContext[]\r
             {\r
-                hqPanel, missionPanel, kdockPanel, ndockPanel, materialHistoryPanel, shipInfoPanel, chargeStatus1,\r
-                chargeStatus2, chargeStatus3, chargeStatus4, Notifier\r
+                hqPanel, missionPanel, kdockPanel, ndockPanel, materialHistoryPanel, mainFleetPanel, Notifier\r
             };\r
             var context = new UpdateContext(Sniffer, Config, () => _main.Step);\r
             foreach (var updateable in _updateable)\r
                 updateable.Context = context;\r
-            _timers = new IUpdateTimers[] {missionPanel, kdockPanel, ndockPanel, shipInfoPanel};\r
+            _timers = new IUpdateTimers[] {missionPanel, kdockPanel, ndockPanel, mainFleetPanel};\r
         }\r
 \r
         private void SetScaleFactorOfDpiScaling()\r
@@ -116,7 +112,7 @@ namespace KancolleSniffer
             if (update == Sniffer.Update.Start)\r
             {\r
                 hqPanel.Login.Visible = false;\r
-                shipInfoPanel.Guide.Visible = false;\r
+                mainFleetPanel.Start();\r
                 _started = true;\r
                 Notifier.StopAllRepeat();\r
                 return;\r
@@ -150,10 +146,10 @@ namespace KancolleSniffer
             if (Config.HideOnMinimized && WindowState == FormWindowState.Minimized)\r
                 ShowInTaskbar = false;\r
             if (Config.ShowHpInPercent)\r
-                shipInfoPanel.ToggleHpPercent();\r
+                mainFleetPanel.ToggleHpPercent();\r
             if (Config.ShipList.Visible)\r
                 _listFormGroup.Show();\r
-            _main.CheckVersionUpMain(shipInfoPanel.Guide);\r
+            _main.CheckVersionUpMain(mainFleetPanel.Guide);\r
         }\r
 \r
         private void MainForm_FormClosing(object sender, FormClosingEventArgs e)\r
@@ -169,7 +165,7 @@ namespace KancolleSniffer
             }\r
             _listFormGroup.Close();\r
             Config.Location = (WindowState == FormWindowState.Normal ? Bounds : RestoreBounds).Location;\r
-            Config.ShowHpInPercent = shipInfoPanel.ShowHpInPercent;\r
+            Config.ShowHpInPercent = mainFleetPanel.ShowHpInPercent;\r
         }\r
 \r
         private void MainForm_Resize(object sender, EventArgs e)\r
@@ -257,7 +253,7 @@ namespace KancolleSniffer
             var prev = CurrentAutoScaleDimensions;\r
             foreach (var control in new Control[]\r
             {\r
-                this, shipInfoPanel.Guide, hqPanel.Login,\r
+                this, mainFleetPanel.Guide, hqPanel.Login,\r
                 contextMenuStripMain\r
             }.Concat(_main.Controls))\r
             {\r
@@ -326,8 +322,7 @@ namespace KancolleSniffer
 \r
         private void UpdateShipInfo()\r
         {\r
-            shipInfoPanel.SetCurrentFleet();\r
-            shipInfoPanel.Update();\r
+            mainFleetPanel.Update();\r
             Notifier.NotifyDamagedShip();\r
             UpdateChargeInfo();\r
             UpdateRepairList();\r
@@ -336,43 +331,11 @@ namespace KancolleSniffer
                 _listFormGroup.UpdateList();\r
         }\r
 \r
-        private void UpdatePanelShipInfo()\r
-        {\r
-            shipInfoPanel.Update();\r
-            ShowCurrentFleetNumber();\r
-            labelFleet1.Text = shipInfoPanel.CombinedFleet ? CombinedName : "第一";\r
-        }\r
-\r
-        private void ShowCurrentFleetNumber()\r
-        {\r
-            var labels = new[] {triangleMark1, triangleMark2, triangleMark3, triangleMark4};\r
-            for (var i = 0; i < labels.Length; i++)\r
-                labels[i].Visible = shipInfoPanel.CurrentFleet == i;\r
-        }\r
-\r
-        private string CombinedName\r
-        {\r
-            get\r
-            {\r
-                switch (Sniffer.Fleets[0].CombinedType)\r
-                {\r
-                    case CombinedType.Carrier:\r
-                        return "機動";\r
-                    case CombinedType.Surface:\r
-                        return "水上";\r
-                    case CombinedType.Transport:\r
-                        return "輸送";\r
-                    default:\r
-                        return "連合";\r
-                }\r
-            }\r
-        }\r
-\r
         private void UpdateBattleInfo()\r
         {\r
             _listFormGroup.UpdateBattleResult();\r
             _listFormGroup.UpdateAirBattleResult();\r
-            shipInfoPanel.UpdateBattleInfo();\r
+            mainFleetPanel.UpdateBattleInfo();\r
         }\r
 \r
         private void UpdateCellInfo()\r
@@ -382,11 +345,7 @@ namespace KancolleSniffer
 \r
         private void UpdateChargeInfo()\r
         {\r
-            foreach (var status in new[] {chargeStatus1, chargeStatus2, chargeStatus3, chargeStatus4})\r
-            {\r
-                status.Update();\r
-                _toolTip.SetToolTip(status, status.Text);\r
-            }\r
+            mainFleetPanel.UpdateChargeInfo();\r
         }\r
 \r
         private void UpdateNDocLabels()\r
@@ -439,113 +398,6 @@ namespace KancolleSniffer
             base.WndProc(ref m);\r
         }\r
 \r
-        private void SetupFleetClick()\r
-        {\r
-            var labels = new[]\r
-            {\r
-                new Control[] {labelFleet1, labelFleet2, labelFleet3, labelFleet4},\r
-                new Control[] {chargeStatus1, chargeStatus2, chargeStatus3, chargeStatus4}\r
-            };\r
-            foreach (var a in labels)\r
-            {\r
-                a[0].Tag = 0;\r
-                a[0].Click += labelFleet1_Click;\r
-                a[0].DoubleClick += labelFleet1_DoubleClick;\r
-                for (var fleet = 1; fleet < labels[0].Length; fleet++)\r
-                {\r
-                    a[fleet].Tag = fleet;\r
-                    a[fleet].Click += labelFleet_Click;\r
-                    a[fleet].DoubleClick += labelFleet_DoubleClick;\r
-                }\r
-            }\r
-        }\r
-\r
-        private void labelFleet_Click(object sender, EventArgs e)\r
-        {\r
-            if (!_started)\r
-                return;\r
-            var fleet = (int)((Control)sender).Tag;\r
-            if (shipInfoPanel.CurrentFleet == fleet)\r
-                return;\r
-            shipInfoPanel.CombinedFleet = false;\r
-            shipInfoPanel.CurrentFleet = fleet;\r
-            UpdatePanelShipInfo();\r
-        }\r
-\r
-        private readonly SemaphoreSlim _clickSemaphore = new SemaphoreSlim(1);\r
-        private readonly SemaphoreSlim _doubleClickSemaphore = new SemaphoreSlim(0);\r
-\r
-        private async void labelFleet1_Click(object sender, EventArgs e)\r
-        {\r
-            if (!_started)\r
-                return;\r
-            if (shipInfoPanel.CurrentFleet != 0)\r
-            {\r
-                labelFleet_Click(sender, e);\r
-                return;\r
-            }\r
-            if (!_clickSemaphore.Wait(0))\r
-                return;\r
-            try\r
-            {\r
-                if (await _doubleClickSemaphore.WaitAsync(SystemInformation.DoubleClickTime))\r
-                    return;\r
-            }\r
-            finally\r
-            {\r
-                _clickSemaphore.Release();\r
-            }\r
-            shipInfoPanel.CombinedFleet = Sniffer.IsCombinedFleet && !shipInfoPanel.CombinedFleet;\r
-            UpdatePanelShipInfo();\r
-        }\r
-\r
-        private void labelFleet1_MouseHover(object sender, EventArgs e)\r
-        {\r
-            labelFleet1.Text =\r
-                shipInfoPanel.CurrentFleet == 0 && Sniffer.IsCombinedFleet && !shipInfoPanel.CombinedFleet\r
-                    ? "連合"\r
-                    : "第一";\r
-        }\r
-\r
-        private void labelFleet1_MouseLeave(object sender, EventArgs e)\r
-        {\r
-            labelFleet1.Text = shipInfoPanel.CombinedFleet ? CombinedName : "第一";\r
-        }\r
-\r
-        private void labelFleet_DoubleClick(object sender, EventArgs e)\r
-        {\r
-            if (!_started)\r
-                return;\r
-            var fleet = (int)((Control)sender).Tag;\r
-            var text = TextGenerator.GenerateFleetData(Sniffer, fleet);\r
-            CopyFleetText(text, (Control)sender);\r
-        }\r
-\r
-        private void labelFleet1_DoubleClick(object sender, EventArgs e)\r
-        {\r
-            if (!_started)\r
-                return;\r
-            _doubleClickSemaphore.Release();\r
-            var text = TextGenerator.GenerateFleetData(Sniffer, 0);\r
-            if (shipInfoPanel.CombinedFleet)\r
-                text += TextGenerator.GenerateFleetData(Sniffer, 1);\r
-            CopyFleetText(text, (Control)sender);\r
-        }\r
-\r
-        private void CopyFleetText(string text, Control fleetButton)\r
-        {\r
-            if (string.IsNullOrEmpty(text))\r
-                return;\r
-            Clipboard.SetText(text);\r
-            _tooltipCopy.Active = true;\r
-            _tooltipCopy.Show("コピーしました。", fleetButton);\r
-            Task.Run(async () =>\r
-            {\r
-                await Task.Delay(1000);\r
-                _tooltipCopy.Active = false;\r
-            });\r
-        }\r
-\r
         private void labelRepairListButton_Click(object sender, EventArgs e)\r
         {\r
             if (panelRepairList.Visible)\r
diff --git a/KancolleSniffer/View/MainFleetPanel.cs b/KancolleSniffer/View/MainFleetPanel.cs
new file mode 100644 (file)
index 0000000..9bd5ace
--- /dev/null
@@ -0,0 +1,304 @@
+using System;\r
+using System.Drawing;\r
+using System.Linq;\r
+using System.Threading;\r
+using System.Windows.Forms;\r
+using KancolleSniffer.Model;\r
+using Clipboard = KancolleSniffer.Util.Clipboard;\r
+\r
+namespace KancolleSniffer.View\r
+{\r
+    public class MainFleetPanel : PanelWithToolTip, IUpdateTimers\r
+    {\r
+        private readonly ShipInfoPanel _shipInfoPanel = new ShipInfoPanel\r
+        {\r
+            Location = new Point(0, 15),\r
+            Size = new Size(220, 134)\r
+        };\r
+\r
+        private readonly ChargeStatus[] _chargeStatus =\r
+        {\r
+            new ChargeStatus\r
+            {\r
+                Location = new Point(34, 0),\r
+                Size = new Size(17, 13)\r
+            },\r
+            new ChargeStatus\r
+            {\r
+                Location = new Point(89, 0),\r
+                Size = new Size(17, 13)\r
+            },\r
+            new ChargeStatus\r
+            {\r
+                Location = new Point(144, 0),\r
+                Size = new Size(17, 13)\r
+            },\r
+            new ChargeStatus\r
+            {\r
+                Location = new Point(199, 0),\r
+                Size = new Size(17, 13)\r
+            }\r
+        };\r
+\r
+        private readonly TriangleMark[] _triangleMarks =\r
+        {\r
+            new TriangleMark\r
+            {\r
+                Location = new Point(1, 0),\r
+                Name = "triangleMark1",\r
+                Size = new Size(5, 13)\r
+            },\r
+            new TriangleMark\r
+            {\r
+                Location = new Point(56, 0),\r
+                Name = "triangleMark2",\r
+                Size = new Size(5, 13)\r
+            },\r
+            new TriangleMark\r
+            {\r
+                Location = new Point(111, 0),\r
+                Name = "triangleMark3",\r
+                Size = new Size(5, 13)\r
+            },\r
+            new TriangleMark\r
+            {\r
+                Location = new Point(166, 0),\r
+                Name = "triangleMark4",\r
+                Size = new Size(5, 13)\r
+            }\r
+        };\r
+\r
+        private readonly Control[] _fleets =\r
+        {\r
+            new Label\r
+            {\r
+                Location = new Point(6, 1),\r
+                Size = new Size(45, 12),\r
+                Text = "第一"\r
+            },\r
+            new Label\r
+            {\r
+                Location = new Point(61, 1),\r
+                Size = new Size(45, 12),\r
+                Text = "第二"\r
+            },\r
+            new Label\r
+            {\r
+                Location = new Point(116, 1),\r
+                Size = new Size(45, 12),\r
+                Text = "第三"\r
+            },\r
+            new Label\r
+            {\r
+                Location = new Point(171, 1),\r
+                Size = new Size(45, 12),\r
+                Text = "第四"\r
+            }\r
+        };\r
+\r
+        private UpdateContext _context;\r
+\r
+        public UpdateContext Context\r
+        {\r
+            get => _context;\r
+            set\r
+            {\r
+                _context = value;\r
+                _shipInfoPanel.Context = value;\r
+                foreach (var c in _chargeStatus)\r
+                    c.Context = value;\r
+            }\r
+        }\r
+\r
+        public MainFleetPanel()\r
+        {\r
+            SetupFleetClick();\r
+            _fleets[0].MouseHover += labelFleet1_MouseHover;\r
+            _fleets[0].MouseLeave += labelFleet1_MouseLeave;\r
+            for (var i = 1; i < _triangleMarks.Length; i++)\r
+                _triangleMarks[i].Visible = false;\r
+            Controls.AddRange(_chargeStatus.Concat(_fleets).Concat(_triangleMarks).Concat(new[] {_shipInfoPanel})\r
+                .ToArray());\r
+        }\r
+\r
+        private bool _started;\r
+\r
+        public void Start()\r
+        {\r
+            _started = true;\r
+            _shipInfoPanel.Guide.Visible = false;\r
+        }\r
+\r
+        public LinkLabel Guide => _shipInfoPanel.Guide;\r
+\r
+        public Label AkashiRepairTimer\r
+        {\r
+            set => _shipInfoPanel.AkashiRepairTimer = value;\r
+        }\r
+\r
+        public Action<int> ShowShipOnList\r
+        {\r
+            set => _shipInfoPanel.ShowShipOnList = value;\r
+        }\r
+\r
+        public bool ShowHpInPercent => _shipInfoPanel.ShowHpInPercent;\r
+\r
+        public void ToggleHpPercent() => _shipInfoPanel.ToggleHpPercent();\r
+\r
+        public new void Update()\r
+        {\r
+            _shipInfoPanel.SetCurrentFleet();\r
+            _shipInfoPanel.Update();\r
+        }\r
+\r
+        public void UpdateBattleInfo()\r
+        {\r
+            _shipInfoPanel.UpdateBattleInfo();\r
+        }\r
+\r
+        private void UpdatePanelShipInfo()\r
+        {\r
+            _shipInfoPanel.Update();\r
+            ShowCurrentFleetNumber();\r
+            _fleets[0].Text = _shipInfoPanel.CombinedFleet ? CombinedName : "第一";\r
+        }\r
+\r
+        public void UpdateChargeInfo()\r
+        {\r
+            foreach (var status in _chargeStatus)\r
+            {\r
+                status.Update();\r
+                ToolTip.SetToolTip(status, status.Text);\r
+            }\r
+        }\r
+\r
+        private void ShowCurrentFleetNumber()\r
+        {\r
+            for (var i = 0; i < _triangleMarks.Length; i++)\r
+                _triangleMarks[i].Visible = _shipInfoPanel.CurrentFleet == i;\r
+        }\r
+\r
+        private void SetupFleetClick()\r
+        {\r
+            SetupFleetClick(_fleets);\r
+            // ReSharper disable once CoVariantArrayConversion\r
+            SetupFleetClick(_chargeStatus);\r
+        }\r
+\r
+        private void SetupFleetClick(Control[] a)\r
+        {\r
+            a[0].Tag = 0;\r
+            a[0].Click += labelFleet1_Click;\r
+            a[0].DoubleClick += labelFleet1_DoubleClick;\r
+            for (var fleet = 1; fleet < a.Length; fleet++)\r
+            {\r
+                a[fleet].Tag = fleet;\r
+                a[fleet].Click += labelFleet_Click;\r
+                a[fleet].DoubleClick += labelFleet_DoubleClick;\r
+            }\r
+        }\r
+\r
+        private void labelFleet_Click(object sender, EventArgs e)\r
+        {\r
+            if (!_started)\r
+                return;\r
+            var fleet = (int)((Control)sender).Tag;\r
+            if (_shipInfoPanel.CurrentFleet == fleet)\r
+                return;\r
+            _shipInfoPanel.CombinedFleet = false;\r
+            _shipInfoPanel.CurrentFleet = fleet;\r
+            UpdatePanelShipInfo();\r
+        }\r
+\r
+        private readonly SemaphoreSlim _clickSemaphore = new SemaphoreSlim(1);\r
+        private readonly SemaphoreSlim _doubleClickSemaphore = new SemaphoreSlim(0);\r
+\r
+        private async void labelFleet1_Click(object sender, EventArgs e)\r
+        {\r
+            if (!_started)\r
+                return;\r
+            if (_shipInfoPanel.CurrentFleet != 0)\r
+            {\r
+                labelFleet_Click(sender, e);\r
+                return;\r
+            }\r
+            if (!_clickSemaphore.Wait(0))\r
+                return;\r
+            try\r
+            {\r
+                if (await _doubleClickSemaphore.WaitAsync(SystemInformation.DoubleClickTime))\r
+                    return;\r
+            }\r
+            finally\r
+            {\r
+                _clickSemaphore.Release();\r
+            }\r
+            _shipInfoPanel.CombinedFleet = Context.Sniffer.IsCombinedFleet && !_shipInfoPanel.CombinedFleet;\r
+            UpdatePanelShipInfo();\r
+        }\r
+\r
+        private void labelFleet1_MouseHover(object sender, EventArgs e)\r
+        {\r
+            _fleets[0].Text =\r
+                _shipInfoPanel.CurrentFleet == 0 && Context.Sniffer.IsCombinedFleet && !_shipInfoPanel.CombinedFleet\r
+                    ? "連合"\r
+                    : "第一";\r
+        }\r
+\r
+        private void labelFleet1_MouseLeave(object sender, EventArgs e)\r
+        {\r
+            _fleets[0].Text = _shipInfoPanel.CombinedFleet ? CombinedName : "第一";\r
+        }\r
+\r
+        private string CombinedName\r
+        {\r
+            get\r
+            {\r
+                switch (Context.Sniffer.Fleets[0].CombinedType)\r
+                {\r
+                    case CombinedType.Carrier:\r
+                        return "機動";\r
+                    case CombinedType.Surface:\r
+                        return "水上";\r
+                    case CombinedType.Transport:\r
+                        return "輸送";\r
+                    default:\r
+                        return "連合";\r
+                }\r
+            }\r
+        }\r
+\r
+        private void labelFleet_DoubleClick(object sender, EventArgs e)\r
+        {\r
+            if (!_started)\r
+                return;\r
+            var fleet = (int)((Control)sender).Tag;\r
+            var text = TextGenerator.GenerateFleetData(Context.Sniffer, fleet);\r
+            CopyFleetText(text, (Control)sender);\r
+        }\r
+\r
+        private void labelFleet1_DoubleClick(object sender, EventArgs e)\r
+        {\r
+            if (!_started)\r
+                return;\r
+            _doubleClickSemaphore.Release();\r
+            var text = TextGenerator.GenerateFleetData(Context.Sniffer, 0);\r
+            if (_shipInfoPanel.CombinedFleet)\r
+                text += TextGenerator.GenerateFleetData(Context.Sniffer, 1);\r
+            CopyFleetText(text, (Control)sender);\r
+        }\r
+\r
+        private void CopyFleetText(string text, Control fleetButton)\r
+        {\r
+            if (string.IsNullOrEmpty(text))\r
+                return;\r
+            Clipboard.SetText(text);\r
+            ToolTip.Show("コピーしました。", fleetButton, 1000);\r
+        }\r
+\r
+        public void UpdateTimers()\r
+        {\r
+            _shipInfoPanel.UpdateTimers();\r
+        }\r
+    }\r
+}
\ No newline at end of file