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
</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
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
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
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
public ListForm(MainForm main)\r
{\r
InitializeComponent();\r
+ IsMaster = false;\r
_main = main;\r
_sniffer = main.Sniffer;\r
_config = main.Config;\r
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
}\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
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
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
\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
\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
--- /dev/null
+// 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
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
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
if (Config.ShowHpInPercent)\r
_mainLabels.ToggleHpPercent();\r
if (Config.ShipList.Visible)\r
- _listForm.Show();\r
+ _listFormGroup.Show();\r
ApplyConfig();\r
ApplyDebugLogSetting();\r
ApplyLogSetting();\r
{\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
\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
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
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
{\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
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
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
\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
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
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
\r
private void UpdateCellInfo()\r
{\r
- _listForm.UpdateCellInfo();\r
+ _listFormGroup.UpdateCellInfo();\r
}\r
\r
private void ResetBattleInfo()\r
\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