OSDN Git Service

IUpdatableをIUpdateContextとIUpdateTimerに分離する
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / View / HqPanel.cs
1 using System;\r
2 using System.Drawing;\r
3 using System.Windows.Forms;\r
4 using KancolleSniffer.Model;\r
5 using KancolleSniffer.Properties;\r
6 \r
7 namespace KancolleSniffer.View\r
8 {\r
9     public class HqPanel : PanelWithToolTip, IUpdateContext\r
10     {\r
11         public Label Login { get; } = new Label\r
12         {\r
13             Location = new Point(6, 2),\r
14             Size = new Size(210, 28),\r
15             Font = new Font("MS UI Gothic", 9.75f),\r
16             TextAlign = ContentAlignment.MiddleLeft,\r
17             Text = "艦これにログインしてください。\r\nログイン中ならログインし直してください。"\r
18         };\r
19 \r
20         public Label PlayLog { get; } = new Label\r
21         {\r
22             Location = new Point(207, 3),\r
23             AutoSize = true,\r
24             Text = "*",\r
25             Visible = false\r
26         };\r
27 \r
28         private readonly Label _bucketHistoryButton = new Label\r
29         {\r
30             Location = new Point(146, 15),\r
31             Size = new Size(14, 14),\r
32             BorderStyle = BorderStyle.FixedSingle,\r
33             Image = Resources.arrow_virtical\r
34         };\r
35 \r
36         private readonly Label _achievement = new Label\r
37         {\r
38             Location = new Point(166, 18),\r
39             Size = new Size(33, 12),\r
40             TextAlign = ContentAlignment.MiddleRight\r
41         };\r
42 \r
43         private readonly Label _numOfBuckets = new Label\r
44         {\r
45             Location = new Point(116, 18),\r
46             Size = new Size(30, 12),\r
47             Text = "0",\r
48             TextAlign = ContentAlignment.MiddleRight\r
49         };\r
50 \r
51         private readonly Label _numOfEquips = new Label\r
52         {\r
53             Location = new Point(46, 18),\r
54             Size = new Size(60, 12),\r
55             Text = "0/0",\r
56             TextAlign = ContentAlignment.MiddleRight\r
57         };\r
58 \r
59         private readonly Label _numOfShips = new Label\r
60         {\r
61             Location = new Point(0, 18),\r
62             Size = new Size(48, 12),\r
63             Text = "0/0",\r
64             TextAlign = ContentAlignment.MiddleRight\r
65         };\r
66 \r
67         private readonly Label _bucketHistory = new Label\r
68         {\r
69             BorderStyle = BorderStyle.FixedSingle,\r
70             Name = "labelBucketHistory",\r
71             Size = new Size(61, 28),\r
72             Text = "今日\r\n今週",\r
73             TextAlign = ContentAlignment.MiddleRight,\r
74             Visible = false\r
75         };\r
76 \r
77         private readonly Control[] _captions =\r
78         {\r
79             new Label\r
80             {\r
81                 Location = new Point(170, 3),\r
82                 AutoSize = true,\r
83                 Text = "戦果"\r
84             },\r
85             new Label\r
86             {\r
87                 Location = new Point(113, 3),\r
88                 AutoSize = true,\r
89                 Text = "バケツ"\r
90             },\r
91             new Label\r
92             {\r
93                 Location = new Point(65, 3),\r
94                 AutoSize = true,\r
95                 Text = "装備数"\r
96             },\r
97             new Label\r
98             {\r
99                 Location = new Point(7, 3),\r
100                 AutoSize = true,\r
101                 Text = "艦娘数"\r
102             }\r
103         };\r
104 \r
105         public UpdateContext Context { private get; set; }\r
106 \r
107         public HqPanel()\r
108         {\r
109             BorderStyle = BorderStyle.FixedSingle;\r
110             Controls.AddRange(new Control[]\r
111                 {Login, PlayLog, _bucketHistoryButton, _achievement, _numOfBuckets, _numOfEquips, _numOfShips});\r
112             Controls.AddRange(_captions);\r
113             _bucketHistoryButton.Click += BucketHistoryButtonClick;\r
114             _numOfBuckets.Click += BucketHistoryButtonClick;\r
115             _bucketHistory.Click += BucketHistoryButtonClick;\r
116         }\r
117 \r
118         protected override void OnParentChanged(EventArgs e)\r
119         {\r
120             base.OnParentChanged(e);\r
121             _bucketHistory.Location =\r
122                 new Point(Location.X + Parent.Location.X + 100, Location.Y + Parent.Location.Y + 30);\r
123             Parent.Controls.Add(_bucketHistory);\r
124         }\r
125 \r
126         public new void Update()\r
127         {\r
128             UpdateNumOfShips();\r
129             UpdateNumOfEquips();\r
130             Context.Submitter.Flash();\r
131             UpdateNumOfBuckets();\r
132             UpdateBucketHistory();\r
133             UpdateAchievement();\r
134         }\r
135 \r
136         private void UpdateNumOfBuckets()\r
137         {\r
138             _numOfBuckets.Text = Context.Sniffer.Material.MaterialHistory[(int)Material.Bucket].Now.ToString("D");\r
139         }\r
140 \r
141         private void UpdateAchievement()\r
142         {\r
143             var ac = Context.Sniffer.Achievement.Value;\r
144             if (ac >= 10000)\r
145                 ac = 9999;\r
146             _achievement.Text = ac >= 1000 ? ((int)ac).ToString("D") : ac.ToString("F1");\r
147             ToolTip.SetToolTip(_achievement,\r
148                 "今月 " + Context.Sniffer.Achievement.ValueOfMonth.ToString("F1") + "\n" +\r
149                 "EO " + Context.Sniffer.ExMap.Achievement);\r
150         }\r
151 \r
152         private void UpdateNumOfShips()\r
153         {\r
154             var ship = Context.Sniffer.ShipCounter;\r
155             _numOfShips.Text = $"{ship.Now:D}/{ship.Max:D}";\r
156             _numOfShips.ForeColor = ship.TooMany ? CUDColors.Red : Color.Black;\r
157             if (ship.Alarm)\r
158             {\r
159                 var message = $"残り{ship.Rest:D}隻";\r
160                 Context.Submitter.Enqueue("艦娘数超過", message);\r
161                 ship.Alarm = false;\r
162             }\r
163         }\r
164 \r
165         private void UpdateNumOfEquips()\r
166         {\r
167             var item = Context.Sniffer.ItemCounter;\r
168             _numOfEquips.Text = $"{item.Now:D}/{item.Max:D}";\r
169             _numOfEquips.ForeColor = item.TooMany ? CUDColors.Red : Color.Black;\r
170             if (item.Alarm)\r
171             {\r
172                 var message = $"残り{item.Rest:D}個";\r
173                 Context.Submitter.Enqueue("装備数超過", message);\r
174                 item.Alarm = false;\r
175             }\r
176         }\r
177 \r
178         private void UpdateBucketHistory()\r
179         {\r
180             var count = Context.Sniffer.Material.MaterialHistory[(int)Material.Bucket];\r
181             var day = CutOverflow(count.Now - count.BegOfDay, 999);\r
182             var week = CutOverflow(count.Now - count.BegOfWeek, 999);\r
183             _bucketHistory.Text = $"{day:+#;-#;±0} 今日\n{week:+#;-#;±0} 今週";\r
184         }\r
185 \r
186         private void BucketHistoryButtonClick(object sender, EventArgs e)\r
187         {\r
188             if (_bucketHistory.Visible)\r
189             {\r
190                 _bucketHistory.Visible = false;\r
191                 _bucketHistoryButton.BackColor = DefaultBackColor;\r
192             }\r
193             else\r
194             {\r
195                 _bucketHistory.Visible = true;\r
196                 _bucketHistory.BringToFront();\r
197                 _bucketHistoryButton.BackColor = CustomColors.ActiveButtonColor;\r
198             }\r
199         }\r
200 \r
201         private static int CutOverflow(int value, int limit)\r
202         {\r
203             if (value > limit)\r
204                 return limit;\r
205             if (value < -limit)\r
206                 return -limit;\r
207             return value;\r
208         }\r
209     }\r
210 }