OSDN Git Service

一覧ウィンドウを複数開けるようにする
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Mon, 24 Feb 2020 10:08:28 +0000 (19:08 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Sun, 30 Aug 2020 05:58:20 +0000 (14:58 +0900)
KancolleSniffer/Config.cs
KancolleSniffer/KancolleSniffer.csproj
KancolleSniffer/ListForm.Designer.cs
KancolleSniffer/ListForm.cs
KancolleSniffer/MainForm.ListFormGroup.cs [new file with mode: 0644]
KancolleSniffer/MainForm.cs

index 659c578..4ce2f00 100644 (file)
@@ -277,6 +277,7 @@ namespace KancolleSniffer
         public string DebugLogFile { get; set; } = "log.txt";\r
         public ProxyConfig Proxy { get; set; } = new ProxyConfig();\r
         public ShipListConfig ShipList { get; set; } = new ShipListConfig();\r
+        public List<ShipListConfig> ListFormGroup { get; set; } = new List<ShipListConfig>();\r
         public LogConfig Log { get; set; } = new LogConfig();\r
         public PushbulletConfig Pushbullet { get; set; } = new PushbulletConfig();\r
         public PushoverConfig Pushover { get; set; } = new PushoverConfig();\r
index 1364dae..eb0eb2e 100644 (file)
@@ -60,6 +60,9 @@
   </ItemGroup>\r
   <ItemGroup>\r
     <Compile Include="Log\BattleLogger.cs" />\r
+    <Compile Include="MainForm.ListFormGroup.cs">\r
+      <SubType>Form</SubType>\r
+    </Compile>\r
     <Compile Include="Model\AirBattleResult.cs" />\r
     <Compile Include="Model\AirCorpsFighterPower.cs" />\r
     <Compile Include="Model\QuestCounter.cs" />\r
index c4b7c5a..f9b4f65 100644 (file)
@@ -257,19 +257,6 @@ namespace KancolleSniffer
             this.comboBoxGroup.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\r
             this.comboBoxGroup.FlatStyle = System.Windows.Forms.FlatStyle.Flat;\r
             this.comboBoxGroup.FormattingEnabled = true;\r
-            this.comboBoxGroup.Items.AddRange(new object[] {\r
-            "全艦",\r
-            "A",\r
-            "B",\r
-            "C",\r
-            "D",\r
-            "分類",\r
-            "修復",\r
-            "装備",\r
-            "艦隊",\r
-            "対空",\r
-            "戦況",\r
-            "情報"});\r
             this.comboBoxGroup.Location = new System.Drawing.Point(6, 4);\r
             this.comboBoxGroup.Name = "comboBoxGroup";\r
             this.comboBoxGroup.Size = new System.Drawing.Size(48, 20);\r
@@ -351,7 +338,7 @@ namespace KancolleSniffer
             this.fleetTextToolStripMenuItem,\r
             this.deckBuilderToolStripMenuItem});\r
             this.contextMenuStripFleetData.Name = "contextMenuStripFleetData";\r
-            this.contextMenuStripFleetData.Size = new System.Drawing.Size(211, 70);\r
+            this.contextMenuStripFleetData.Size = new System.Drawing.Size(211, 48);\r
             // \r
             // fleetTextToolStripMenuItem\r
             // \r
index a1116fd..eee3439 100644 (file)
@@ -30,8 +30,27 @@ namespace KancolleSniffer
         private readonly MainForm _main;\r
         private readonly MainForm.TimeOutChecker _suppressActivate;\r
         private readonly CheckBox[] _shipTypeCheckBoxes;\r
+        private bool _isMaster;\r
         public const int PanelWidth = 217;\r
 \r
+        private object[] PanelNames => new object[] {"全艦", "A", "B", "C", "D", "分類", "修復", "装備", "艦隊", "対空", "戦況", "情報"}\r
+            .Where(n => IsMaster || (string)n != "分類").ToArray();\r
+\r
+        private char[] PanelKeys => new[] {'Z', 'A', 'B', 'C', 'D', 'G', 'R', 'W', 'X', 'Y', 'S', 'I'}\r
+            .Where(key => IsMaster || key != 'G').ToArray();\r
+\r
+        public bool IsMaster\r
+        {\r
+            get => _isMaster;\r
+            set\r
+            {\r
+                _isMaster = value;\r
+                Text = _isMaster ? "一覧 プライマリ" : "一覧";\r
+                comboBoxGroup.Items.Clear();\r
+                comboBoxGroup.Items.AddRange(PanelNames);\r
+            }\r
+        }\r
+\r
         public enum SortOrder\r
         {\r
             None,\r
@@ -47,6 +66,7 @@ namespace KancolleSniffer
         public ListForm(MainForm main)\r
         {\r
             InitializeComponent();\r
+            IsMaster = false;\r
             _main = main;\r
             _sniffer = main.Sniffer;\r
             _config = main.Config;\r
@@ -226,7 +246,7 @@ namespace KancolleSniffer
                     SystemInformation.VerticalScrollBarWidth + 2 /* 縁の幅 */ + Width - ClientSize.Width;\r
             MinimumSize = new Size(Width, 0);\r
             MaximumSize = new Size(Width, int.MaxValue);\r
-            var config = _config.ShipList;\r
+            var config = GetConfig();\r
             if (config.ShowHpInPercent)\r
             {\r
                 shipListPanel.ToggleHpPercent();\r
@@ -234,7 +254,7 @@ namespace KancolleSniffer
             }\r
             LoadShipGroupFromConfig();\r
             comboBoxGroup.SelectedItem = config.Mode ?? "全艦";\r
-            SetCheckBoxSTypeSate();\r
+            SetCheckBoxSTypeState(config);\r
             if (config.Location.X == int.MinValue)\r
                 return;\r
             var bounds = new Rectangle(config.Location, config.Size);\r
@@ -243,6 +263,17 @@ namespace KancolleSniffer
             Height = bounds.Height;\r
         }\r
 \r
+        private ShipListConfig GetConfig()\r
+        {\r
+            if (_isMaster || _config.ListFormGroup.Count == 0)\r
+                return _config.ShipList;\r
+            var config = _config.ListFormGroup[0];\r
+            _config.ListFormGroup.RemoveAt(0);\r
+            if (config.Mode == "分類")\r
+                config.Mode = "全艦";\r
+            return config;\r
+        }\r
+\r
         private void LoadShipGroupFromConfig()\r
         {\r
             var group = _config.ShipList.ShipGroup;\r
@@ -250,26 +281,56 @@ namespace KancolleSniffer
                 shipListPanel.GroupSettings[i] = i < group.Count ? new HashSet<int>(group[i]) : new HashSet<int>();\r
         }\r
 \r
-        private void SetCheckBoxSTypeSate()\r
+        private void SetCheckBoxSTypeState(ShipListConfig config)\r
         {\r
             for (var type = 0; type < _shipTypeCheckBoxes.Length; type++)\r
-                _shipTypeCheckBoxes[type].Checked = ((int)_config.ShipList.ShipCategories & (1 << type)) != 0;\r
-            checkBoxSTypeAll.Checked = _config.ShipList.ShipCategories == ShipCategory.All;\r
-            checkBoxSTypeDetails.Checked = _config.ShipList.ShipType;\r
+                _shipTypeCheckBoxes[type].Checked = ((int)config.ShipCategories & (1 << type)) != 0;\r
+            checkBoxSTypeAll.Checked = config.ShipCategories == ShipCategory.All;\r
+            checkBoxSTypeDetails.Checked = config.ShipType;\r
         }\r
 \r
         private void ListForm_FormClosing(object sender, FormClosingEventArgs e)\r
         {\r
             e.Cancel = true;\r
-            if (!Visible) // 非表示のときは保存すべき情報がないのでスキップする\r
-                return;\r
-            var config = _config.ShipList;\r
+            if (_isMaster)\r
+            {\r
+                SaveMasterState();\r
+            }\r
+            else\r
+            {\r
+                SaveSlaveState();\r
+            }\r
+            Hide();\r
+        }\r
+\r
+        private void SaveMasterState()\r
+        {\r
             StoreShipGroupToConfig();\r
+            var config = _config.ShipList;\r
+            config.Visible = Visible && WindowState == FormWindowState.Normal;\r
+            config.Mode = (string)comboBoxGroup.SelectedItem;\r
+            if (!Visible)\r
+                return;\r
+            SaveBounds(config); // 最小化時は以前のサイズを記録する\r
+        }\r
+\r
+        private void SaveSlaveState()\r
+        {\r
+            if (!Visible)\r
+                return;\r
+            if (WindowState != FormWindowState.Normal) // 最小化時は次回復旧しない\r
+                return;\r
+            var config = new ShipListConfig {Visible = true};\r
+            _config.ListFormGroup.Add(config);\r
+            config.Mode = (string)comboBoxGroup.SelectedItem;\r
+            SaveBounds(config);\r
+        }\r
+\r
+        private void SaveBounds(ShipListConfig config)\r
+        {\r
             var bounds = WindowState == FormWindowState.Normal ? Bounds : RestoreBounds;\r
             config.Location = bounds.Location;\r
             config.Size = bounds.Size;\r
-            config.Mode = (string)comboBoxGroup.SelectedItem;\r
-            Hide();\r
         }\r
 \r
         public void ChangeWindowState(FormWindowState newState)\r
@@ -297,6 +358,8 @@ namespace KancolleSniffer
 \r
         private void ListForm_Activated(object sender, EventArgs e)\r
         {\r
+            if (!_isMaster)\r
+                return;\r
             if (_suppressActivate.Check())\r
                 return;\r
             if (WindowState == FormWindowState.Minimized)\r
@@ -356,8 +419,7 @@ namespace KancolleSniffer
 \r
         private void ListForm_KeyPress(object sender, KeyPressEventArgs e)\r
         {\r
-            var g = Array.FindIndex(new[] {'Z', 'A', 'B', 'C', 'D', 'G', 'R', 'W', 'X', 'Y', 'S', 'I'},\r
-                x => x == char.ToUpper(e.KeyChar));\r
+            var g = Array.FindIndex(PanelKeys, x => x == char.ToUpper(e.KeyChar));\r
             if (g == -1)\r
                 return;\r
             comboBoxGroup.SelectedIndex = g;\r
diff --git a/KancolleSniffer/MainForm.ListFormGroup.cs b/KancolleSniffer/MainForm.ListFormGroup.cs
new file mode 100644 (file)
index 0000000..581af95
--- /dev/null
@@ -0,0 +1,116 @@
+// Copyright (C) 2020 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;\r
+using System.Collections.Generic;\r
+using System.Drawing;\r
+using System.Linq;\r
+using System.Windows.Forms;\r
+\r
+namespace KancolleSniffer\r
+{\r
+    public partial class MainForm\r
+    {\r
+        private class ListFormGroup\r
+        {\r
+            private readonly MainForm _mainForm;\r
+            private readonly List<ListForm> _listForms = new List<ListForm>();\r
+\r
+            public ListForm Main => _listForms[0];\r
+\r
+            public ListFormGroup(MainForm mainForm)\r
+            {\r
+                _mainForm = mainForm;\r
+                _listForms.Add(new ListForm(mainForm) {IsMaster = true});\r
+                for (var i = 0; i < mainForm.Config.ListFormGroup.Count; i++)\r
+                    _listForms.Add(new ListForm(mainForm) {Owner = Main});\r
+            }\r
+\r
+            public void ShowOrCreate()\r
+            {\r
+                foreach (var listForm in _listForms)\r
+                {\r
+                    if (listForm.WindowState == FormWindowState.Minimized)\r
+                    {\r
+                        listForm.WindowState = FormWindowState.Normal;\r
+                        return;\r
+                    }\r
+                    if (!listForm.Visible)\r
+                    {\r
+                        listForm.Show();\r
+                        return;\r
+                    }\r
+                }\r
+                var newForm = new ListForm(_mainForm) {Owner = Main, TopMost = Main.TopMost, Font = Main.Font};\r
+                newForm.UpdateList();\r
+                newForm.Show();\r
+                _listForms.Add(newForm);\r
+            }\r
+\r
+            public void UpdateList()\r
+            {\r
+                InvokeAll(listForm => listForm.UpdateList());\r
+            }\r
+\r
+            public void UpdateAirBattleResult()\r
+            {\r
+                InvokeAll(listForm => listForm.UpdateAirBattleResult());\r
+            }\r
+\r
+            public void UpdateBattleResult()\r
+            {\r
+                InvokeAll(listForm => listForm.UpdateBattleResult());\r
+            }\r
+\r
+            public void UpdateCellInfo()\r
+            {\r
+                InvokeAll(listForm => listForm.UpdateCellInfo());\r
+            }\r
+\r
+            public bool Visible => _listForms.Any(listForm => listForm.Visible);\r
+\r
+            public bool TopMost\r
+            {\r
+                set { InvokeAll(listFrom => { listFrom.TopMost = value; }); }\r
+            }\r
+\r
+            public Font Font\r
+            {\r
+                get => _listForms[0].Font;\r
+                set { InvokeAll(listForm => { listForm.Font = value; }); }\r
+            }\r
+\r
+            public void ShowShip(int id)\r
+            {\r
+                InvokeAll(listForm => listForm.ShowShip(id));\r
+            }\r
+\r
+            public void Show()\r
+            {\r
+                InvokeAll(listForm => listForm.Show());\r
+            }\r
+\r
+            public void Close()\r
+            {\r
+                InvokeAll(listForm => listForm.Close());\r
+            }\r
+\r
+            private void InvokeAll(Action<ListForm> action)\r
+            {\r
+                foreach (var listForm in _listForms)\r
+                    action(listForm);\r
+            }\r
+        }\r
+    }\r
+}
\ No newline at end of file
index e20907a..de82eb6 100644 (file)
@@ -51,7 +51,8 @@ namespace KancolleSniffer
         private readonly MainShipLabels _mainLabels = new MainShipLabels();\r
         private readonly MainNDockLabels _ndockLabels = new MainNDockLabels();\r
         private NumberAndHistory _numberAndHistory;\r
-        private readonly ListForm _listForm;\r
+        private readonly ListFormGroup _listFormGroup;\r
+\r
         private readonly NotificationManager _notificationManager;\r
         private bool _started;\r
         private bool _timerEnabled;\r
@@ -71,7 +72,7 @@ namespace KancolleSniffer
             HttpProxy.AfterSessionComplete += HttpProxy_AfterSessionComplete;\r
             Config.Load();\r
             _configDialog = new ConfigDialog(this);\r
-            _listForm = new ListForm(this);\r
+            _listFormGroup = new ListFormGroup(this);\r
             _notificationManager = new NotificationManager(Alarm);\r
             SetupView(_notificationManager);\r
             _proxyManager = new ProxyManager(this);\r
@@ -356,7 +357,7 @@ namespace KancolleSniffer
             if (Config.ShowHpInPercent)\r
                 _mainLabels.ToggleHpPercent();\r
             if (Config.ShipList.Visible)\r
-                _listForm.Show();\r
+                _listFormGroup.Show();\r
             ApplyConfig();\r
             ApplyDebugLogSetting();\r
             ApplyLogSetting();\r
@@ -398,17 +399,14 @@ namespace KancolleSniffer
         {\r
             if (!Config.ExitSilently)\r
             {\r
-                using (var dialog = new ConfirmDialog())\r
+                using var dialog = new ConfirmDialog();\r
+                if (dialog.ShowDialog(this) != DialogResult.Yes)\r
                 {\r
-                    if (dialog.ShowDialog(this) != DialogResult.Yes)\r
-                    {\r
-                        e.Cancel = true;\r
-                        return;\r
-                    }\r
+                    e.Cancel = true;\r
+                    return;\r
                 }\r
             }\r
-            Config.ShipList.Visible = _listForm.Visible && _listForm.WindowState == FormWindowState.Normal;\r
-            _listForm.Close();\r
+            _listFormGroup.Close();\r
             Sniffer.FlashLog();\r
             Config.Location = (WindowState == FormWindowState.Normal ? Bounds : RestoreBounds).Location;\r
             Config.ShowHpInPercent = _mainLabels.ShowHpInPercent;\r
@@ -419,7 +417,7 @@ namespace KancolleSniffer
 \r
         private void MainForm_Resize(object sender, EventArgs e)\r
         {\r
-            if (_listForm == null) // DPIが100%でないときにInitializeComponentから呼ばれるので\r
+            if (_listFormGroup == null) // DPIが100%でないときにInitializeComponentから呼ばれるので\r
                 return;\r
             SuppressActivate.Start();\r
             if (WindowState == FormWindowState.Minimized)\r
@@ -427,7 +425,7 @@ namespace KancolleSniffer
                 if (Config.HideOnMinimized)\r
                     ShowInTaskbar = false;\r
             }\r
-            _listForm.ChangeWindowState(WindowState);\r
+            _listFormGroup.Main.ChangeWindowState(WindowState);\r
         }\r
 \r
         public TimeOutChecker SuppressActivate = new TimeOutChecker();\r
@@ -440,12 +438,12 @@ namespace KancolleSniffer
                 RaiseBothWindows();\r
         }\r
 \r
-        private bool NeedRaise => _listForm.Visible && WindowState != FormWindowState.Minimized;\r
+        private bool NeedRaise => _listFormGroup.Visible && WindowState != FormWindowState.Minimized;\r
 \r
         private void RaiseBothWindows()\r
         {\r
-            _listForm.Owner = null;\r
-            Owner = _listForm;\r
+            _listFormGroup.Main.Owner = null;\r
+            Owner = _listFormGroup.Main;\r
             BringToFront();\r
             Owner = null;\r
         }\r
@@ -478,7 +476,7 @@ namespace KancolleSniffer
         {\r
             ShowInTaskbar = true;\r
             WindowState = FormWindowState.Normal;\r
-            TopMost = _listForm.TopMost = Config.TopMost; // 最前面に表示されなくなることがあるのを回避する\r
+            TopMost = _listFormGroup.TopMost = Config.TopMost; // 最前面に表示されなくなることがあるのを回避する\r
         }\r
 \r
         private void ExitToolStripMenuItem_Click(object sender, EventArgs e)\r
@@ -513,13 +511,14 @@ namespace KancolleSniffer
             var prev = CurrentAutoScaleDimensions;\r
             foreach (var control in new Control[]\r
             {\r
-                this, _listForm, labelLogin, linkLabelGuide,\r
+                this, labelLogin, linkLabelGuide,\r
                 _configDialog, _configDialog.NotificationConfigDialog,\r
                 contextMenuStripMain, _errorDialog\r
             })\r
             {\r
                 control.Font = ZoomFont(control.Font);\r
             }\r
+            _listFormGroup.Font = ZoomFont(_listFormGroup.Font);\r
             foreach (var toolTip in new[] {_toolTip, _tooltipCopy})\r
             {\r
                 toolTip.Font = ZoomFont(toolTip.Font);\r
@@ -551,7 +550,7 @@ namespace KancolleSniffer
         private void ApplyConfig()\r
         {\r
             if (TopMost != Config.TopMost)\r
-                TopMost = _listForm.TopMost = Config.TopMost;\r
+                TopMost = _listFormGroup.TopMost = Config.TopMost;\r
             Sniffer.ShipCounter.Margin = Config.MarginShips;\r
             _numberAndHistory.UpdateNumOfShips();\r
             Sniffer.ItemCounter.Margin = Config.MarginEquips;\r
@@ -640,22 +639,22 @@ namespace KancolleSniffer
 \r
         private void ShowShipOnShipList(object sender, EventArgs ev)\r
         {\r
-            if (!_listForm.Visible)\r
+            if (!_listFormGroup.Visible)\r
                 return;\r
             var idx = (int)((Control)sender).Tag;\r
             var ship = (_combinedFleet\r
                 ? Sniffer.Fleets[0].Ships.Concat(Sniffer.Fleets[1].Ships).ToArray()\r
                 : Sniffer.Fleets[_currentFleet].Ships)[idx];\r
             if (!ship.Empty)\r
-                _listForm.ShowShip(ship.Id);\r
+                _listFormGroup.ShowShip(ship.Id);\r
         }\r
 \r
 \r
         private void UpdateItemInfo()\r
         {\r
             _numberAndHistory.Update();\r
-            if (_listForm.Visible)\r
-                _listForm.UpdateList();\r
+            if (_listFormGroup.Visible)\r
+                _listFormGroup.UpdateList();\r
         }\r
 \r
         private void UpdateShipInfo()\r
@@ -667,8 +666,8 @@ namespace KancolleSniffer
             UpdateChargeInfo();\r
             UpdateRepairList();\r
             UpdateMissionLabels();\r
-            if (_listForm.Visible)\r
-                _listForm.UpdateList();\r
+            if (_listFormGroup.Visible)\r
+                _listFormGroup.UpdateList();\r
         }\r
 \r
         private bool _inSortie;\r
@@ -802,8 +801,8 @@ namespace KancolleSniffer
         private void UpdateBattleInfo()\r
         {\r
             ResetBattleInfo();\r
-            _listForm.UpdateBattleResult();\r
-            _listForm.UpdateAirBattleResult();\r
+            _listFormGroup.UpdateBattleResult();\r
+            _listFormGroup.UpdateAirBattleResult();\r
             if (Sniffer.Battle.BattleState == BattleState.None)\r
                 return;\r
             panelBattleInfo.BringToFront();\r
@@ -816,7 +815,7 @@ namespace KancolleSniffer
 \r
         private void UpdateCellInfo()\r
         {\r
-            _listForm.UpdateCellInfo();\r
+            _listFormGroup.UpdateCellInfo();\r
         }\r
 \r
         private void ResetBattleInfo()\r
@@ -1411,11 +1410,14 @@ namespace KancolleSniffer
 \r
         private void ShipListToolStripMenuItem_Click(object sender, EventArgs e)\r
         {\r
+            _listFormGroup.ShowOrCreate();\r
+            /*\r
             _listForm.UpdateList();\r
             _listForm.Show();\r
             if (_listForm.WindowState == FormWindowState.Minimized)\r
                 _listForm.WindowState = FormWindowState.Normal;\r
             _listForm.Activate();\r
+            */\r
         }\r
 \r
         private void LogToolStripMenuItem_Click(object sender, EventArgs e)\r