From 27db004c8efe8b52d4d270a5b7590dcd5a4e272f Mon Sep 17 00:00:00 2001 From: Kazuhiro Fujieda Date: Thu, 9 May 2019 22:33:49 +0900 Subject: [PATCH] =?utf8?q?=E4=B8=80=E8=A6=A7=E3=81=AE=E3=82=B0=E3=83=AB?= =?utf8?q?=E3=83=BC=E3=83=97=E5=88=86=E3=81=91=E3=81=AB=E9=96=A2=E3=81=99?= =?utf8?q?=E3=82=8B=E5=87=A6=E7=90=86=E3=82=92GroupConfigLabels=E3=81=AB?= =?utf8?q?=E5=88=86=E9=9B=A2=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- KancolleSniffer/KancolleSniffer.csproj | 1 + KancolleSniffer/ListForm.cs | 4 +- KancolleSniffer/View/GroupConfigLabels.cs | 139 ++++++++++++++++++++++++++++++ KancolleSniffer/View/ShipListPanel.cs | 128 +++++---------------------- 4 files changed, 163 insertions(+), 109 deletions(-) create mode 100644 KancolleSniffer/View/GroupConfigLabels.cs diff --git a/KancolleSniffer/KancolleSniffer.csproj b/KancolleSniffer/KancolleSniffer.csproj index 581890a..2ea5801 100644 --- a/KancolleSniffer/KancolleSniffer.csproj +++ b/KancolleSniffer/KancolleSniffer.csproj @@ -110,6 +110,7 @@ + diff --git a/KancolleSniffer/ListForm.cs b/KancolleSniffer/ListForm.cs index 8642e03..c74c281 100644 --- a/KancolleSniffer/ListForm.cs +++ b/KancolleSniffer/ListForm.cs @@ -238,7 +238,7 @@ namespace KancolleSniffer private void LoadShipGroupFromConfig() { var group = _config.ShipList.ShipGroup; - for (var i = 0; i < ShipListPanel.GroupCount; i++) + for (var i = 0; i < GroupConfigLabels.GroupCount; i++) shipListPanel.GroupSettings[i] = i < group.Count ? new HashSet(group[i]) : new HashSet(); } @@ -309,7 +309,7 @@ namespace KancolleSniffer var all = _sniffer.ShipList.Select(s => s.Id).ToArray(); var group = _config.ShipList.ShipGroup; group.Clear(); - for (var i = 0; i < ShipListPanel.GroupCount; i++) + for (var i = 0; i < GroupConfigLabels.GroupCount; i++) { if (all.Length > 0) shipListPanel.GroupSettings[i].IntersectWith(all); diff --git a/KancolleSniffer/View/GroupConfigLabels.cs b/KancolleSniffer/View/GroupConfigLabels.cs new file mode 100644 index 0000000..50c3f1b --- /dev/null +++ b/KancolleSniffer/View/GroupConfigLabels.cs @@ -0,0 +1,139 @@ +// Copyright (C) 2019 Kazuhiro Fujieda +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Windows.Forms; +using KancolleSniffer.Model; +// ReSharper disable CoVariantArrayConversion + +namespace KancolleSniffer.View +{ + public class GroupConfigLabels + { + private readonly ShipListPanel _shipListPanel; + private readonly List _checkBoxesList = new List(); + private readonly List _labelList = new List(); + private readonly List _panelList = new List(); + + public const int GroupCount = 4; + public HashSet[] GroupSettings { get; } = new HashSet[GroupCount]; + public bool GroupUpdated { get; set; } + + public GroupConfigLabels(ShipListPanel shipListPanel) + { + _shipListPanel = shipListPanel; + } + + public void CreateComponents(int i) + { + var y = ShipListPanel.LineHeight * i + 1; + var panel = new Panel + { + Location = new Point(0, y), + Size = new Size(ListForm.PanelWidth, ShipListPanel.LineHeight), + BackColor = ShipLabel.ColumnColors[(i + 1) % 2] + }; + Scaler.Scale(panel); + panel.Tag = panel.Location.Y; + var labels = new[] + { + new ShipLabel + { + Location = new Point(90, 2), + Size = new Size(24, ShipListPanel.LabelHeight), + TextAlign = ContentAlignment.MiddleRight + }, + new ShipLabel {Location = new Point(10, 2), AutoSize = true}, + new ShipLabel {Location = new Point(1, 2), AutoSize = true} + }; + + var cb = new CheckBox[GroupCount]; + for (var j = 0; j < cb.Length; j++) + { + cb[j] = new CheckBox + { + Location = new Point(125 + j * 24, 2), + FlatStyle = FlatStyle.Flat, + Size = new Size(12, 11), + Tag = i * 10 + j + }; + Scaler.Scale(cb[j]); + cb[j].CheckedChanged += checkboxGroup_CheckedChanged; + } + _labelList.Add(labels); + _checkBoxesList.Add(cb); + _panelList.Add(panel); + panel.Controls.AddRange(labels); + panel.Controls.AddRange(cb); + _shipListPanel.Controls.Add(panel); + var unused = panel.Handle; // create handle + foreach (var label in labels) + { + Scaler.Scale(label); + label.PresetColor = + label.BackColor = ShipLabel.ColumnColors[(i + 1) % 2]; + } + } + + private void checkboxGroup_CheckedChanged(object sender, EventArgs e) + { + var cb = (CheckBox)sender; + var group = (int)cb.Tag % 10; + var idx = (int)cb.Tag / 10; + if (cb.Checked) + { + GroupSettings[group].Add(_shipListPanel.GetShip(idx).Id); + } + else + { + GroupSettings[group].Remove(_shipListPanel.GetShip(idx).Id); + } + GroupUpdated = true; + } + + public void SetGrouping(int i) + { + var s = _shipListPanel.GetShip(i); + var labels = _labelList[i]; + if (s.Level == 1000) + { + _shipListPanel.SetShipType(i); + return; + } + labels[0].SetLevel(s); + labels[1].SetName(s, ShipNameWidth.GroupConfig); + labels[2].SetFleet(s); + var cb = _checkBoxesList[i]; + for (var j = 0; j < cb.Length; j++) + cb[j].Checked = GroupSettings[j].Contains(s.Id); + _panelList[i].Visible = true; + } + + public void HidePanel(int i) + { + _panelList[i].Visible = false; + } + + public IEnumerable FilterByGroup(IEnumerable ships, string group) + { + var g = Array.FindIndex(new[] {"A", "B", "C", "D"}, x => x == group); + if (g == -1) + return ships; + return from s in ships where GroupSettings[g].Contains(s.Id) select s; + } + } +} \ No newline at end of file diff --git a/KancolleSniffer/View/ShipListPanel.cs b/KancolleSniffer/View/ShipListPanel.cs index c99414d..3b6f7cb 100644 --- a/KancolleSniffer/View/ShipListPanel.cs +++ b/KancolleSniffer/View/ShipListPanel.cs @@ -25,31 +25,39 @@ namespace KancolleSniffer.View { public class ShipListPanel : Panel { - private const int LabelHeight = 12; + public const int LabelHeight = 12; public const int LineHeight = 16; private ShipStatus[] _shipList; private readonly List _labelList = new List(); private readonly List _labelPanelList = new List(); - private readonly List _checkBoxesList = new List(); - private readonly List _groupingLabelList = new List(); - private readonly List _groupingPanelList = new List(); private readonly List _repairLabelList = new List(); private readonly List _repairPanelList = new List(); private readonly List _hpLabels = new List(); + private readonly GroupConfigLabels _groupConfigLabels; private string _mode; private bool _hpPercent; - public const int GroupCount = 4; - public HashSet[] GroupSettings { get; } = new HashSet[GroupCount]; - public bool GroupUpdated { get; set; } + public HashSet[] GroupSettings => _groupConfigLabels.GroupSettings; + + public bool GroupUpdated + { + get => _groupConfigLabels.GroupUpdated; + set => _groupConfigLabels.GroupUpdated = value; + } public ScrollBar ScrollBar { get; } + public ShipStatus GetShip(int i) + { + return _shipList[i + ScrollBar.Value]; + } + public ShipListPanel() { ScrollBar = new VScrollBar {Dock = DockStyle.Right, Visible = false}; ScrollBar.ValueChanged += ScrollBarOnValueChanged; Controls.Add(ScrollBar); + _groupConfigLabels = new GroupConfigLabels(this); } private void ScrollBarOnValueChanged(object sender, EventArgs eventArgs) @@ -107,7 +115,7 @@ namespace KancolleSniffer.View private void CreateShipList(Sniffer sniffer, ShipListConfig config) { var ships = FilterByShipTypes( - _mode == "修復" ? sniffer.RepairList : FilterByGroup(sniffer.ShipList, _mode), + _mode == "修復" ? sniffer.RepairList : _groupConfigLabels.FilterByGroup(sniffer.ShipList, _mode), config.ShipCategories).ToArray(); var order = _mode == "修復" ? ListForm.SortOrder.Repair : config.SortOrder; if (!config.ShipType) @@ -123,14 +131,6 @@ namespace KancolleSniffer.View }).Concat(ships).OrderBy(ship => ship, new CompareShip(true, order)).ToArray(); } - private IEnumerable FilterByGroup(IEnumerable ships, string group) - { - var g = Array.FindIndex(new[] {"A", "B", "C", "D"}, x => x == group); - if (g == -1) - return ships; - return from s in ships where GroupSettings[g].Contains(s.Id) select s; - } - private static readonly int[][] ShipTypeIds = { new[] // 戦艦 @@ -272,7 +272,7 @@ namespace KancolleSniffer.View { for (var i = _labelList.Count; i * LineHeight < Height; i++) { - CreateGroupingComponents(i); + _groupConfigLabels.CreateComponents(i); CreateRepairLabels(i); CreateShipLabels(i); } @@ -298,75 +298,6 @@ namespace KancolleSniffer.View ScrollBar.Value = Min(ScrollBar.Value, max); } - private void CreateGroupingComponents(int i) - { - var y = LineHeight * i + 1; - var panel = new Panel - { - Location = new Point(0, y), - Size = new Size(ListForm.PanelWidth, LineHeight), - BackColor = ShipLabel.ColumnColors[(i + 1) % 2] - }; - Scaler.Scale(panel); - panel.Tag = panel.Location.Y; - var labels = new[] - { - new ShipLabel - { - Location = new Point(90, 2), - Size = new Size(24, LabelHeight), - TextAlign = ContentAlignment.MiddleRight - }, - new ShipLabel {Location = new Point(10, 2), AutoSize = true}, - new ShipLabel {Location = new Point(1, 2), AutoSize = true} - }; - - var cb = new CheckBox[GroupCount]; - for (var j = 0; j < cb.Length; j++) - { - cb[j] = new CheckBox - { - Location = new Point(125 + j * 24, 2), - FlatStyle = FlatStyle.Flat, - Size = new Size(12, 11), - Tag = i * 10 + j - }; - Scaler.Scale(cb[j]); - cb[j].CheckedChanged += checkboxGroup_CheckedChanged; - } - _groupingLabelList.Add(labels); - _checkBoxesList.Add(cb); - _groupingPanelList.Add(panel); - // ReSharper disable CoVariantArrayConversion - panel.Controls.AddRange(labels); - panel.Controls.AddRange(cb); - // ReSharper restore CoVariantArrayConversion - Controls.Add(panel); - var unused = panel.Handle; // create handle - foreach (var label in labels) - { - Scaler.Scale(label); - label.PresetColor = - label.BackColor = ShipLabel.ColumnColors[(i + 1) % 2]; - } - } - - private void checkboxGroup_CheckedChanged(object sender, EventArgs e) - { - var cb = (CheckBox)sender; - var group = (int)cb.Tag % 10; - var idx = (int)cb.Tag / 10; - if (cb.Checked) - { - GroupSettings[group].Add(_shipList[idx + ScrollBar.Value].Id); - } - else - { - GroupSettings[group].Remove(_shipList[idx + ScrollBar.Value].Id); - } - GroupUpdated = true; - } - private void CreateRepairLabels(int i) { var y = LineHeight * i + 1; @@ -490,7 +421,7 @@ namespace KancolleSniffer.View if (InShipStatus(_mode)) SetShipStatus(i); if (_mode == "分類") - SetGrouping(i); + _groupConfigLabels.SetGrouping(i); if (_mode == "修復") SetRepairList(i); } @@ -498,7 +429,8 @@ namespace KancolleSniffer.View private void HidePanels(int i) { - _labelPanelList[i].Visible = _groupingPanelList[i].Visible = _repairPanelList[i].Visible = false; + _labelPanelList[i].Visible = _repairPanelList[i].Visible = false; + _groupConfigLabels.HidePanel(i); } private bool InShipStatus(string mode) => Array.Exists(new[] {"全艦", "A", "B", "C", "D"}, x => mode == x); @@ -521,7 +453,7 @@ namespace KancolleSniffer.View _labelPanelList[i].Visible = true; } - private void SetShipType(int i) + public void SetShipType(int i) { var s = _shipList[i + ScrollBar.Value]; var labels = _labelList[i]; @@ -535,24 +467,6 @@ namespace KancolleSniffer.View _labelPanelList[i].Visible = true; } - private void SetGrouping(int i) - { - var s = _shipList[i + ScrollBar.Value]; - var labels = _groupingLabelList[i]; - if (s.Level == 1000) - { - SetShipType(i); - return; - } - labels[0].SetLevel(s); - labels[1].SetName(s, ShipNameWidth.GroupConfig); - labels[2].SetFleet(s); - var cb = _checkBoxesList[i]; - for (var j = 0; j < cb.Length; j++) - cb[j].Checked = GroupSettings[j].Contains(s.Id); - _groupingPanelList[i].Visible = true; - } - private void SetRepairList(int i) { var s = _shipList[i + ScrollBar.Value]; -- 2.11.0