1 // Copyright (C) 2017 Kazuhiro Fujieda <fujieda@users.osdn.me>
\r
3 // Licensed under the Apache License, Version 2.0 (the "License");
\r
4 // you may not use this file except in compliance with the License.
\r
5 // You may obtain a copy of the License at
\r
7 // http://www.apache.org/licenses/LICENSE-2.0
\r
9 // Unless required by applicable law or agreed to in writing, software
\r
10 // distributed under the License is distributed on an "AS IS" BASIS,
\r
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
12 // See the License for the specific language governing permissions and
\r
13 // limitations under the License.
\r
16 using System.Collections;
\r
17 using System.Collections.Generic;
\r
18 using System.Drawing;
\r
20 using System.Windows.Forms;
\r
21 using static System.Math;
\r
23 namespace KancolleSniffer
\r
25 public class RepairListForMain : Panel
\r
27 private const int PanelPadding = 5;
\r
28 private const int LabelPadding = 2;
\r
29 private const int LineHeight = 16;
\r
30 private readonly RepairListLabels[] _repairLabels = new RepairListLabels[14];
\r
31 private ShipStatus[] _repairList = new ShipStatus[0];
\r
32 private int _repairListPosition;
\r
34 private class RepairListLabels : IEnumerable<ShipLabel>
\r
36 public ShipLabel Fleet { get; set; }
\r
37 public ShipLabel Name { get; set; }
\r
38 public ShipLabel Time { get; set; }
\r
39 public ShipLabel Damage { get; set; }
\r
40 public ShipLabel BackGround { private get; set; }
\r
42 public IEnumerator<ShipLabel> GetEnumerator()
\r
44 foreach (var label in new[] {Fleet, Damage, Time, Name, BackGround})
\r
48 IEnumerator IEnumerable.GetEnumerator()
\r
50 return GetEnumerator();
\r
54 public void CreateLabels(EventHandler onClick)
\r
57 for (var i = 0; i < _repairLabels.Length; i++)
\r
59 var y = PanelPadding + LabelPadding + i * LineHeight;
\r
60 const int height = 12;
\r
61 _repairLabels[i] = new RepairListLabels
\r
63 Fleet = new ShipLabel {Location = new Point(0, y), Size = new Size(11, height)},
\r
64 Damage = new ShipLabel {Location = new Point(119, y), Size = new Size(5, height - 1)},
\r
65 Time = new ShipLabel {Location = new Point(75, y), AutoSize = true},
\r
66 Name = new ShipLabel {Location = new Point(9, y), AutoSize = true},
\r
67 BackGround = new ShipLabel
\r
69 Location = new Point(0, y - LabelPadding),
\r
70 Size = new Size(Width, height + LabelPadding + 1)
\r
73 Controls.AddRange(_repairLabels[i].Cast<Control>().ToArray());
\r
74 foreach (var label in _repairLabels[i])
\r
77 label.PresetColor = label.BackColor = ShipLabels.ColumnColors[(i + 1) % 2];
\r
78 label.Click += onClick;
\r
81 SetScrollEventHandler();
\r
85 private void SetScrollEventHandler()
\r
87 foreach (var label in _repairLabels.First())
\r
89 label.MouseEnter += TopRepairLabelsOnMouseEnter;
\r
90 label.MouseLeave += TopRepairLabelsOnMouseLeave;
\r
92 foreach (var label in _repairLabels.Last())
\r
94 label.MouseEnter += BottomRepairLabelsOnMouseEnter;
\r
95 label.MouseLeave += BottomRepairLabelsOnMouseLeave;
\r
97 _topScrollRepeatTimer.Tick += TopRepairLabelsOnMouseEnter;
\r
98 _bottomScrollRepeatTimer.Tick += BottomRepairLabelsOnMouseEnter;
\r
101 private readonly Timer _topScrollRepeatTimer = new Timer {Interval = 100};
\r
102 private readonly Timer _bottomScrollRepeatTimer = new Timer {Interval = 100};
\r
104 private void TopRepairLabelsOnMouseEnter(object sender, EventArgs e)
\r
106 if (_repairListPosition == 0)
\r
108 _repairListPosition--;
\r
110 _topScrollRepeatTimer.Start();
\r
113 private void TopRepairLabelsOnMouseLeave(object sender, EventArgs e)
\r
115 _topScrollRepeatTimer.Stop();
\r
118 private void BottomRepairLabelsOnMouseEnter(object sender, EventArgs e)
\r
120 if (_repairListPosition + _repairLabels.Length >= _repairList.Length)
\r
122 _repairListPosition++;
\r
124 _bottomScrollRepeatTimer.Start();
\r
127 private void BottomRepairLabelsOnMouseLeave(object sender, EventArgs e)
\r
129 _bottomScrollRepeatTimer.Stop();
\r
132 public void SetRepairList(ShipStatus[] list)
\r
134 _repairList = list;
\r
136 if (list.Length == 0)
\r
141 _repairLabels[0].Name.SetName("なし");
\r
144 _repairListPosition = Min(_repairListPosition, Max(0, _repairList.Length - _repairLabels.Length));
\r
148 private void SetPanelHeight()
\r
150 var lines = Min(Max(1, _repairList.Length), _repairLabels.Length);
\r
151 Size = new Size(Width, (int)Round(ShipLabel.ScaleFactor.Height * lines * LineHeight + PanelPadding * 2));
\r
154 public void ShowRepairList()
\r
156 for (var i = 0; i < Min(_repairList.Length, _repairLabels.Length); i++)
\r
158 var s = _repairList[i + _repairListPosition];
\r
159 var labels = _repairLabels[i];
\r
160 labels.Fleet.SetFleet(s);
\r
161 labels.Name.SetName(s, ShipNameWidth.RepairList);
\r
162 labels.Time.SetRepairTime(s);
\r
163 labels.Damage.BackColor = ShipLabel.DamageColor(s, labels.Damage.PresetColor);
\r
165 if (_repairList.Length < _repairLabels.Length)
\r
166 ClearLabels(_repairList.Length);
\r
170 public void ClearLabels(int i)
\r
172 var labels = _repairLabels[i];
\r
173 labels.Fleet.Text = "";
\r
174 labels.Name.SetName("");
\r
175 labels.Time.Text = "";
\r
176 labels.Damage.BackColor = labels.Damage.PresetColor;
\r
179 private void DrawMark()
\r
181 using (var g = CreateGraphics())
\r
183 var topBrush = _repairListPosition > 0 ? Brushes.Black : new SolidBrush(BackColor);
\r
184 g.FillPolygon(topBrush,
\r
187 new PointF(Width * 0.45f, PanelPadding), new PointF(Width * 0.55f, PanelPadding),
\r
188 new PointF(Width * 0.5f, 0), new PointF(Width * 0.45f, PanelPadding)
\r
190 var bottomBrush = _repairLabels.Length + _repairListPosition < _repairList.Length
\r
192 : new SolidBrush(BackColor);
\r
193 g.FillPolygon(bottomBrush,
\r
196 new PointF(Width * 0.45f, Height - PanelPadding - 2), new PointF(Width * 0.55f, Height - PanelPadding - 2),
\r
197 new PointF(Width * 0.5f, Height - 2), new PointF(Width * 0.45f, Height - PanelPadding - 2)
\r
202 protected override void OnPaint(PaintEventArgs e)
\r