using System.Windows.Forms;\r
using KancolleSniffer.Model;\r
using KancolleSniffer.View;\r
+using KancolleSniffer.View.ListWindow;\r
using KancolleSniffer.View.ShipListPanel;\r
using Clipboard = KancolleSniffer.Util.Clipboard;\r
\r
private readonly MainWindow.TimeOutChecker _suppressActivate;\r
private readonly CheckBox[] _shipTypeCheckBoxes;\r
private bool _isMaster;\r
- private Settings _settings;\r
- public const int PanelWidth = 217;\r
-\r
- public class Settings\r
- {\r
- public string Mode { get; set; }\r
- public ShipCategory ShipCategories { get; set; }\r
- public bool ShipType { get; set; }\r
- public bool ShowHpInPercent { get; set; }\r
- public SortOrder SortOrder { get; set; }\r
-\r
- public static Settings FromShipListConfig(ShipListConfig config)\r
- {\r
- return new Settings\r
- {\r
- Mode = config.Mode ?? "全艦",\r
- ShipCategories = config.ShipCategories,\r
- ShipType = config.ShipType,\r
- ShowHpInPercent = config.ShowHpInPercent,\r
- SortOrder = config.SortOrder\r
- };\r
- }\r
-\r
- public void SetToShipListConfig(ShipListConfig config)\r
- {\r
- config.Mode = Mode;\r
- config.ShipCategories = ShipCategories;\r
- config.ShipType = ShipType;\r
- config.ShowHpInPercent = ShowHpInPercent;\r
- config.SortOrder = SortOrder;\r
- }\r
- }\r
+ private ShipListConfig _listConfig;\r
+ private FormWindowState _windowState = FormWindowState.Normal;\r
+ public const int PanelWidth = 215;\r
\r
private object[] PanelNames => new object[] {"全艦", "A", "B", "C", "D", "分類", "修復", "装備", "艦隊", "対空", "戦況", "情報"}\r
.Where(n => IsMaster || (string)n != "分類").ToArray();\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
+ private bool IsMaster\r
{\r
get => _isMaster;\r
set\r
Repair\r
}\r
\r
- public ListForm(MainWindow main)\r
+ public ListForm(MainWindow main, bool isMaster = false)\r
{\r
InitializeComponent();\r
- IsMaster = false;\r
+ IsMaster = isMaster;\r
_form = main.Form;\r
_sniffer = main.Sniffer;\r
_config = main.Config;\r
swipe.AddShipListPanel(shipListPanel);\r
swipe.AddTreeView(itemTreeView);\r
swipe.AddPanel(fleetPanel);\r
+ SetupSettings();\r
+ }\r
+\r
+ private void SetupSettings()\r
+ {\r
+ _listConfig = GetConfig();\r
+ if (_listConfig.ShowHpInPercent)\r
+ {\r
+ shipListPanel.ToggleHpPercent();\r
+ battleResultPanel.ToggleHpPercent();\r
+ }\r
+ }\r
+\r
+ private ShipListConfig GetConfig()\r
+ {\r
+ if (_isMaster)\r
+ {\r
+ SetGroup();\r
+ return _config.ShipList;\r
+ }\r
+ if (_config.ListFormGroup.Count == 0)\r
+ return CreateSecondaryConfig();\r
+ var config = _config.ListFormGroup[0];\r
+ _config.ListFormGroup.RemoveAt(0);\r
+ config.ShipGroup = _config.ShipList.ShipGroup;\r
+ return config;\r
+ }\r
+\r
+ private ShipListConfig CreateSecondaryConfig()\r
+ {\r
+ var src = _config.ShipList;\r
+ var config = new ShipListConfig\r
+ {\r
+ Mode = src.Mode,\r
+ ShipCategories = src.ShipCategories,\r
+ ShipType = src.ShipType,\r
+ ShowHpInPercent = src.ShowHpInPercent,\r
+ SortOrder = src.SortOrder,\r
+ Location = src.Location,\r
+ Size = src.Size,\r
+ ShipGroup = src.ShipGroup\r
+ };\r
+ if (config.Mode == "分類" || string.IsNullOrEmpty(config.Mode))\r
+ config.Mode = "全艦";\r
+ return config;\r
+ }\r
+\r
+ private void SetGroup()\r
+ {\r
+ var groups = _config.ShipList.ShipGroup;\r
+ for (var i = groups.Count; i < GroupConfigLabels.GroupCount; i++)\r
+ groups.Add(new List<int>());\r
+ shipListPanel.GroupSettings = groups;\r
}\r
\r
public void UpdateList()\r
{\r
+ if (!Visible)\r
+ return;\r
SetHeaderVisibility();\r
SetPanelVisibility();\r
if (InItemList)\r
else if (InShipStatus || InGroupConfig || InRepairList)\r
{\r
SetHeaderSortOrder();\r
- shipListPanel.Update(_sniffer, comboBoxGroup.Text, _settings);\r
+ shipListPanel.Update(_sniffer, comboBoxGroup.Text, _listConfig);\r
}\r
if (shipListPanel.GroupUpdated)\r
{\r
- StoreShipGroupToConfig();\r
+ PurifyShipGroup();\r
_config.Save();\r
shipListPanel.GroupUpdated = false;\r
}\r
}\r
\r
+ private void PurifyShipGroup()\r
+ {\r
+ var all = _sniffer.ShipList.Select(s => s.Id).ToArray();\r
+ if (all.Length == 0)\r
+ return;\r
+ foreach (var g in _config.ShipList.ShipGroup)\r
+ {\r
+ var filtered = g.Intersect(all).ToArray();\r
+ g.Clear();\r
+ g.AddRange(filtered);\r
+ }\r
+ }\r
+\r
private void SetHeaderVisibility()\r
{\r
static void Set(Control header, bool visible)\r
header.BringToFront();\r
}\r
\r
- Set(panelItemHeader, InItemList || InAntiAir || InBattleResult || InMiscText);\r
+ Set(panelShipHeader, InShipStatus);\r
Set(panelGroupHeader, InGroupConfig);\r
Set(panelRepairHeader, InRepairList);\r
Set(panelFleetHeader, InFleetInfo);\r
+ SetSTypeDropDownVisible(InShipStatus || InGroupConfig || InRepairList);\r
}\r
\r
private void SetPanelVisibility()\r
\r
public void UpdateCellInfo()\r
{\r
+ MoveToBattleResult();\r
battleResultPanel.Spoilers = _config.Spoilers;\r
battleResultPanel.UpdateCellInfo(_sniffer.CellInfo);\r
}\r
\r
private void SetHeaderSortOrder()\r
{\r
- switch (_settings.SortOrder)\r
+ switch (_listConfig.SortOrder)\r
{\r
case SortOrder.None:\r
labelHeaderCond.Text = "cond";\r
}\r
}\r
\r
- private bool InShipStatus => Array.Exists(new[] {"全艦", "A", "B", "C", "D"}, x => _settings.Mode == x);\r
+ private bool InShipStatus => Array.Exists(new[] {"全艦", "A", "B", "C", "D"}, x => _listConfig.Mode == x);\r
\r
- private bool InGroupConfig => _settings.Mode == "分類";\r
+ private bool InGroupConfig => _listConfig.Mode == "分類";\r
\r
- private bool InRepairList => _settings.Mode == "修復";\r
+ private bool InRepairList => _listConfig.Mode == "修復";\r
\r
- private bool InItemList => _settings.Mode == "装備";\r
+ private bool InItemList => _listConfig.Mode == "装備";\r
\r
- private bool InFleetInfo => _settings.Mode == "艦隊";\r
+ private bool InFleetInfo => _listConfig.Mode == "艦隊";\r
\r
- private bool InAntiAir => _settings.Mode == "対空";\r
+ private bool InAntiAir => _listConfig.Mode == "対空";\r
\r
- private bool InBattleResult => _settings.Mode == "戦況";\r
+ private bool InBattleResult => _listConfig.Mode == "戦況";\r
\r
- private bool InMiscText => _settings.Mode == "情報";\r
+ private bool InMiscText => _listConfig.Mode == "情報";\r
\r
private void ListForm_Load(object sender, EventArgs e)\r
{\r
- /* DPIではなくズームしたときにパネルは大きくなるがScrollBarはそのままなので隙間ができる。\r
- そこでScrollBarの幅に合わせて全体の横幅を設定し直す。*/\r
- Width = Scaler.ScaleWidth(PanelWidth + 12 /* PanelとFrameの内側 */) +\r
- SystemInformation.VerticalScrollBarWidth + 2 /* 縁の幅 */ + Width - ClientSize.Width;\r
- MinimumSize = new Size(Width, 0);\r
- MaximumSize = new Size(Width, int.MaxValue);\r
- var config = GetConfig();\r
- _settings = Settings.FromShipListConfig(config);\r
- if (_settings.ShowHpInPercent)\r
- {\r
- shipListPanel.ToggleHpPercent();\r
- battleResultPanel.ToggleHpPercent();\r
- }\r
- LoadShipGroupFromConfig();\r
- comboBoxGroup.SelectedItem = _settings.Mode;\r
+ AdjustHeader();\r
+ SetMinimumSize();\r
+ comboBoxGroup.SelectedItem = _listConfig.Mode;\r
SetCheckBoxSTypeState();\r
- if (config.Location.X == int.MinValue)\r
+ if (_listConfig.Location.X == int.MinValue)\r
return;\r
- var bounds = new Rectangle(config.Location, config.Size);\r
+ var bounds = new Rectangle(_listConfig.Location, _listConfig.Size);\r
if (MainWindow.IsTitleBarOnAnyScreen(bounds.Location))\r
Location = bounds.Location;\r
- Height = bounds.Height;\r
+ Size = bounds.Size;\r
}\r
\r
- private ShipListConfig GetConfig()\r
+ private void AdjustHeader()\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
+ if (_config.Zoom == 100)\r
+ return;\r
+ foreach (var header in new[]\r
+ {\r
+ panelShipHeader, panelGroupHeader, panelRepairHeader\r
+ })\r
+ {\r
+ header.Left += SystemInformation.VerticalScrollBarWidth * (_config.Zoom - 100) / 100;\r
+ }\r
}\r
\r
- private void LoadShipGroupFromConfig()\r
+ private void SetMinimumSize()\r
{\r
- var group = _config.ShipList.ShipGroup;\r
- for (var i = 0; i < GroupConfigLabels.GroupCount; i++)\r
- shipListPanel.GroupSettings[i] = i < group.Count ? new HashSet<int>(group[i]) : new HashSet<int>();\r
+ MinimumSize = new Size(Width - Scaler.ScaleWidth(24) -\r
+ SystemInformation.VerticalScrollBarWidth * (_config.Zoom - 100) / 100, 0);\r
}\r
\r
private void SetCheckBoxSTypeState()\r
{\r
for (var type = 0; type < _shipTypeCheckBoxes.Length; type++)\r
- _shipTypeCheckBoxes[type].Checked = ((int)_settings.ShipCategories & (1 << type)) != 0;\r
- checkBoxSTypeAll.Checked = _settings.ShipCategories == ShipCategory.All;\r
- checkBoxSTypeDetails.Checked = _settings.ShipType;\r
+ _shipTypeCheckBoxes[type].Checked = ((int)_listConfig.ShipCategories & (1 << type)) != 0;\r
+ checkBoxSTypeAll.Checked = _listConfig.ShipCategories == ShipCategory.All;\r
+ checkBoxSTypeDetails.Checked = _listConfig.ShipType;\r
}\r
\r
private void ListForm_FormClosing(object sender, FormClosingEventArgs e)\r
\r
private void SaveMasterState()\r
{\r
- StoreShipGroupToConfig();\r
- var config = _config.ShipList;\r
- config.Visible = Visible && WindowState == FormWindowState.Normal;\r
- _settings.SetToShipListConfig(config);\r
- if (!Visible)\r
- return;\r
- SaveBounds(config); // 最小化時は以前のサイズを記録する\r
+ PurifyShipGroup();\r
+ _listConfig.Visible = Visible && WindowState == FormWindowState.Normal;\r
+ SaveBounds(_listConfig); // 最小化時は以前のサイズを記録する\r
}\r
\r
private void SaveSlaveState()\r
return;\r
if (WindowState != FormWindowState.Normal) // 最小化時は次回復旧しない\r
return;\r
- var config = new ShipListConfig {Visible = true};\r
- _settings.SetToShipListConfig(config);\r
- _config.ListFormGroup.Add(config);\r
- SaveBounds(config);\r
+ _listConfig.Visible = true;\r
+ _listConfig.ShipGroup = null;\r
+ _config.ListFormGroup.Add(_listConfig);\r
+ SaveBounds(_listConfig);\r
}\r
\r
private void SaveBounds(ShipListConfig config)\r
Owner = null;\r
}\r
\r
- private void StoreShipGroupToConfig()\r
- {\r
- var all = _sniffer.ShipList.Select(s => s.Id).ToArray();\r
- var group = _config.ShipList.ShipGroup;\r
- group.Clear();\r
- for (var i = 0; i < GroupConfigLabels.GroupCount; i++)\r
- {\r
- if (all.Length > 0)\r
- shipListPanel.GroupSettings[i].IntersectWith(all);\r
- group.Add(shipListPanel.GroupSettings[i].ToList());\r
- }\r
- }\r
-\r
public void ShowShip(int id)\r
{\r
+ if (!Visible)\r
+ return;\r
if (InShipStatus)\r
{\r
shipListPanel.ShowShip(id);\r
\r
private void comboBoxGroup_SelectedIndexChanged(object sender, EventArgs e)\r
{\r
- _settings.Mode = comboBoxGroup.Text;\r
+ _listConfig.Mode = comboBoxGroup.Text;\r
+ if (!Visible)\r
+ return;\r
UpdateList();\r
SetActiveControl();\r
if (!(InShipStatus || InGroupConfig || InRepairList))\r
\r
private void labelHeaderCond_Click(object sender, EventArgs e)\r
{\r
- switch (_settings.SortOrder)\r
+ switch (_listConfig.SortOrder)\r
{\r
case SortOrder.CondAscend:\r
- _settings.SortOrder = SortOrder.CondDescend;\r
+ _listConfig.SortOrder = SortOrder.CondDescend;\r
break;\r
case SortOrder.CondDescend:\r
- _settings.SortOrder = SortOrder.None;\r
+ _listConfig.SortOrder = SortOrder.None;\r
break;\r
default:\r
- _settings.SortOrder = SortOrder.CondAscend;\r
+ _listConfig.SortOrder = SortOrder.CondAscend;\r
break;\r
}\r
UpdateList();\r
\r
private void labelHeaderExp_Click(object sender, EventArgs e)\r
{\r
- switch (_settings.SortOrder)\r
+ switch (_listConfig.SortOrder)\r
{\r
case SortOrder.ExpToNextAscend:\r
- _settings.SortOrder = SortOrder.ExpToNextDescend;\r
+ _listConfig.SortOrder = SortOrder.ExpToNextDescend;\r
break;\r
case SortOrder.ExpToNextDescend:\r
- _settings.SortOrder = SortOrder.None;\r
+ _listConfig.SortOrder = SortOrder.None;\r
break;\r
default:\r
- _settings.SortOrder = SortOrder.ExpToNextAscend;\r
+ _listConfig.SortOrder = SortOrder.ExpToNextAscend;\r
break;\r
}\r
UpdateList();\r
\r
private void labelFleet_Click(object sender, EventArgs e)\r
{\r
- fleetPanel.ShowFleet(((Label)sender).Text);\r
+ fleetPanel.ShowFleet(((Control)sender).Text);\r
}\r
\r
private void labelHeaderHp_Click(object sender, EventArgs e)\r
\r
private void ToggleHpPercent()\r
{\r
- _settings.ShowHpInPercent = !_settings.ShowHpInPercent;\r
+ _listConfig.ShowHpInPercent = !_listConfig.ShowHpInPercent;\r
shipListPanel.ToggleHpPercent();\r
battleResultPanel.ToggleHpPercent();\r
}\r
\r
+ private void SetSTypeDropDownVisible(bool visible)\r
+ {\r
+ if (!visible)\r
+ SetPanelSTypeState(false);\r
+ dropDownButtonSType.Visible = visible;\r
+ labelSType.Visible = visible;\r
+ }\r
+\r
private void labelSTypeButton_Click(object sender, EventArgs e)\r
{\r
SetPanelSTypeState(!panelSType.Visible);\r
\r
private void checkBoxSType_Click(object sender, EventArgs e)\r
{\r
- _settings.ShipCategories = SelectedShipTypes;\r
+ _listConfig.ShipCategories = SelectedShipTypes;\r
UpdateList();\r
SetActiveControl();\r
}\r
\r
private void checkBoxSTypeDetails_Click(object sender, EventArgs e)\r
{\r
- _settings.ShipType = checkBoxSTypeDetails.Checked;\r
+ _listConfig.ShipType = checkBoxSTypeDetails.Checked;\r
UpdateList();\r
SetActiveControl();\r
}\r
+\r
+ private void ListForm_ResizeEnd(object sender, EventArgs e)\r
+ {\r
+ foreach (var panel in new IPanelResize[]\r
+ {shipListPanel, antiAirPanel, airBattleResultPanel, battleResultPanel, fleetPanel})\r
+ {\r
+ if (panel.Visible)\r
+ panel.ApplyResize();\r
+ }\r
+ }\r
+\r
+ private void ListForm_Resize(object sender, EventArgs e)\r
+ {\r
+ if (_windowState != WindowState && WindowState == FormWindowState.Normal)\r
+ UpdateList();\r
+ _windowState = WindowState;\r
+ }\r
+\r
+ private void ListForm_VisibleChanged(object sender, EventArgs e)\r
+ {\r
+ if (Visible)\r
+ UpdateList();\r
+ }\r
}\r
}
\ No newline at end of file