OSDN Git Service

Viewの下をMainWindowとListWindowに分ける
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / View / MainWindow / RepairListForMain.cs
1 // Copyright (C) 2017 Kazuhiro Fujieda <fujieda@users.osdn.me>\r
2 // \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
6 //\r
7 //    http://www.apache.org/licenses/LICENSE-2.0\r
8 //\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
14 \r
15 using System;\r
16 using System.Drawing;\r
17 using System.Linq;\r
18 using System.Windows.Forms;\r
19 using KancolleSniffer.Model;\r
20 using static System.Math;\r
21 \r
22 // ReSharper disable CoVariantArrayConversion\r
23 \r
24 namespace KancolleSniffer.View.MainWindow\r
25 {\r
26     public class RepairListForMain : Panel\r
27     {\r
28         private const int PanelPadding = 5;\r
29         private const int LineHeight = 15;\r
30         private RepairLabels[] _repairLabels;\r
31         private ShipStatus[] _repairList = new ShipStatus[0];\r
32         private ListScroller _listScroller;\r
33 \r
34         private class RepairLabels : ShipLabels\r
35         {\r
36             public ShipLabel.RepairTime Time { private get; set; }\r
37             public ShipLabel.Hp Damage { get; set; }\r
38 \r
39             public override Control[] AddedControls => new Control[] {Time, Damage};\r
40 \r
41             public override void Set(ShipStatus status)\r
42             {\r
43                 base.Set(status);\r
44                 Time.Set(status);\r
45             }\r
46 \r
47             public override void Reset()\r
48             {\r
49                 base.Reset();\r
50                 Time.Reset();\r
51                 Damage.Reset();\r
52             }\r
53         }\r
54 \r
55         public void CreateLabels(EventHandler onClick)\r
56         {\r
57             _repairLabels = new RepairLabels[Lines];\r
58             SuspendLayout();\r
59             for (var i = 0; i < _repairLabels.Length; i++)\r
60             {\r
61                 var y = PanelPadding + 1 + i * LineHeight;\r
62                 const int height = 12;\r
63                 _repairLabels[i] = new RepairLabels\r
64                 {\r
65                     Fleet = new ShipLabel.Fleet(new Point(0, y)),\r
66                     Name = new ShipLabel.Name(new Point(9, y), ShipNameWidth.RepairList),\r
67                     Damage = new ShipLabel.Hp {Location = new Point(119, y), Size = new Size(5, height - 1)},\r
68                     Time = new ShipLabel.RepairTime(new Point(75, y)),\r
69                     BackGround = new Label\r
70                     {\r
71                         Location = new Point(0, y - 1),\r
72                         Size = new Size(Width, height + 2)\r
73                     }\r
74                 };\r
75                 _repairLabels[i].Arrange(this, CustomColors.ColumnColors.BrightFirst(i));\r
76                 _repairLabels[i].SetClickHandler(onClick);\r
77             }\r
78             ResumeLayout();\r
79             SetupListScroller();\r
80         }\r
81 \r
82         private int Lines\r
83         {\r
84             get\r
85             {\r
86                 var baseHeight = Parent.ClientRectangle.Height - Location.Y;\r
87                 return (int)Round((baseHeight - Scaler.ScaleHeight((float)PanelPadding) * 2) /\r
88                                   Scaler.ScaleHeight((float)LineHeight));\r
89             }\r
90         }\r
91 \r
92         private void SetupListScroller()\r
93         {\r
94             _listScroller = new ListScroller(this, _repairLabels[0].Controls, _repairLabels.Last().Controls)\r
95             {\r
96                 Lines = _repairLabels.Length,\r
97                 Padding = PanelPadding\r
98             };\r
99             _listScroller.Update += ShowRepairList;\r
100         }\r
101 \r
102         public void SetRepairList(ShipStatus[] list)\r
103         {\r
104             _repairList = list;\r
105             _listScroller.DataCount = list.Length;\r
106             SetPanelHeight();\r
107             if (list.Length == 0)\r
108             {\r
109                 SetPanelHeight();\r
110                 ClearLabels(0);\r
111                 ClearLabels(1);\r
112                 _repairLabels[0].Name.SetName("なし");\r
113                 return;\r
114             }\r
115             _listScroller.Position = Min(_listScroller.Position, Max(0, _repairList.Length - _repairLabels.Length));\r
116             ShowRepairList();\r
117         }\r
118 \r
119         private void SetPanelHeight()\r
120         {\r
121             var lines = Min(Max(1, _repairList.Length), _repairLabels.Length);\r
122             Size = new Size(Width, Scaler.ScaleHeight(lines * LineHeight + PanelPadding * 2));\r
123         }\r
124 \r
125         private void ShowRepairList()\r
126         {\r
127             for (var i = 0; i < Min(_repairList.Length, _repairLabels.Length); i++)\r
128             {\r
129                 var s = _repairList[i + _listScroller.Position];\r
130                 var labels = _repairLabels[i];\r
131                 labels.Set(s);\r
132                 labels.Damage.SetColor(s);\r
133             }\r
134             if (_repairList.Length < _repairLabels.Length)\r
135                 ClearLabels(_repairList.Length);\r
136             _listScroller.DrawMark();\r
137         }\r
138 \r
139         private void ClearLabels(int i)\r
140         {\r
141             var labels = _repairLabels[i];\r
142             labels.Reset();\r
143         }\r
144     }\r
145 }