OSDN Git Service

入渠と遠征のタイマー以外の部分のクリックを無効にする
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer / View / MainWindow / MissionPanel.cs
1 // Copyright (C) 2020 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.Collections.Generic;\r
17 using System.Drawing;\r
18 using System.Linq;\r
19 using System.Windows.Forms;\r
20 using KancolleSniffer.Model;\r
21 \r
22 namespace KancolleSniffer.View.MainWindow\r
23 {\r
24     public class MissionPanel : PanelWithToolTip, IUpdateTimers\r
25     {\r
26         private const int TopMargin = 3;\r
27         private const int LeftMargin = 2;\r
28         private const int LabelHeight = 12;\r
29         private const int LineHeight = 15;\r
30         private const int Lines = 3;\r
31         private readonly MissionLabels[] _labels = new MissionLabels[Lines];\r
32         private Label _caption;\r
33 \r
34         private class MissionLabels\r
35         {\r
36             public Label Number { get; set; }\r
37             public Label Name { get; set; }\r
38             public Label Params { get; set; }\r
39             public Label Timer { get; set; }\r
40         }\r
41 \r
42         public UpdateContext Context { private get; set; }\r
43 \r
44         public MissionPanel()\r
45         {\r
46             BorderStyle = BorderStyle.FixedSingle;\r
47             for (var i = 0; i < Lines; i++)\r
48             {\r
49                 var y = TopMargin + i * LineHeight;\r
50                 _labels[i] = new MissionLabels\r
51                 {\r
52                     Number = new Label\r
53                     {\r
54                         Location = new Point(LeftMargin, y),\r
55                         AutoSize = true,\r
56                         Text = "第" + new[] {"二", "三", "四"}[i]\r
57                     },\r
58                     Params = new Label\r
59                     {\r
60                         Location = new Point(LeftMargin + 54, y),\r
61                         Size = new Size(161, LabelHeight)\r
62                     },\r
63                     Name = new Label\r
64                     {\r
65                         Location = new Point(LeftMargin + 30, y),\r
66                         Size = new Size(135, LabelHeight)\r
67                     },\r
68                     Timer = new GrowLeftLabel()\r
69                     {\r
70                         Location = new Point(LeftMargin + 216, y),\r
71                         GrowLeft = true\r
72                     }\r
73                 };\r
74             }\r
75             Controls.AddRange(_labels.SelectMany(l => new Control[] {l.Number, l.Params, l.Timer, l.Name}).ToArray());\r
76             var timers = _labels.Select(l => l.Timer).ToArray();\r
77             SetCursor(timers);\r
78             SetClickHandler(timers);\r
79         }\r
80 \r
81         public void SetClickHandler(Label caption)\r
82         {\r
83             caption.Click += ClickHandler;\r
84             _caption = caption;\r
85         }\r
86 \r
87         private void SetCursor(IEnumerable<Control> controls)\r
88         {\r
89             foreach (var control in controls)\r
90                 control.Cursor = Cursors.Hand;\r
91         }\r
92 \r
93         private void SetClickHandler(IEnumerable<Control> controls)\r
94         {\r
95             foreach (var control in controls)\r
96                 control.Click += ClickHandler;\r
97         }\r
98 \r
99         private void ClickHandler(Object sender, EventArgs e)\r
100         {\r
101             Context.Config.ShowEndTime ^= TimerKind.Mission;\r
102             SetCaption();\r
103             UpdateTimers();\r
104         }\r
105 \r
106         public new void Update()\r
107         {\r
108             var names = Context.Sniffer.Missions.Select(mission => mission.Name).ToArray();\r
109             for (var i = 0; i < Lines; i++)\r
110             {\r
111                 var fleetParams = Context.Sniffer.Fleets[i + 1].MissionParameter;\r
112                 var inPort = string.IsNullOrEmpty(names[i]);\r
113                 _labels[i].Params.Visible = inPort;\r
114                 _labels[i].Params.Text = fleetParams;\r
115                 _labels[i].Name.Text = names[i];\r
116                 ToolTip.SetToolTip(_labels[i].Name, inPort ? "" : fleetParams);\r
117             }\r
118             SetCaption();\r
119         }\r
120 \r
121         private void SetCaption()\r
122         {\r
123             _caption.Text = (Context.Config.ShowEndTime & TimerKind.Mission) != 0 ? "遠征終了" : "遠征";\r
124         }\r
125 \r
126         public void UpdateTimers()\r
127         {\r
128             var now = Context.GetStep().Now;\r
129             var showEndTime = (Context.Config.ShowEndTime & TimerKind.Mission) != 0;\r
130             for (var i = 0; i < Lines; i++)\r
131             {\r
132                 var entry = Context.Sniffer.Missions[i];\r
133                 SetTimerColor(_labels[i].Timer, entry.Timer, now);\r
134                 _labels[i].Timer.Text = entry.Timer.ToString(now, showEndTime);\r
135             }\r
136         }\r
137 \r
138         private void SetTimerColor(Label label, AlarmTimer timer, DateTime now)\r
139         {\r
140             label.ForeColor = timer.IsFinished(now) ? CUDColors.Red : Color.Black;\r
141         }\r
142     }\r
143 }