-
Notifications
You must be signed in to change notification settings - Fork 0
/
MoonPanel.cs
256 lines (222 loc) · 8.84 KB
/
MoonPanel.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
namespace Dx2Timer
{
public partial class MoonPanel : UserControl
{
const string TIMESPAN_FORMAT = @"hh\:mm\:ss";
public MoonPanel()
{
InitializeComponent();
// ラベルの親を PictureBox に設定
labelState1.Parent = pictureBox1;
labelState1.Location = new Point(0, 0);
labelState2.Parent = pictureBox2;
labelState2.Location = new Point(0, 0);
// PictureBox の色を設定
SetColor(pictureBox1, false);
SetColor(pictureBox2, false);
// なぜかデザイン時に表示されないのでここで
moonTimer1.MinutesChanged += MoonTimer1_MinutesChanged;
}
// Label の値を書き換える
void SetState1(string text)
{
if (labelState1.Text != text)
{
labelState1.Text = text;
}
}
// Label の値を書き換える
void SetState2(string text)
{
if (labelState2.Text != text)
{
labelState2.Text = text;
}
}
// PictureBox の色を設定
void SetColor(PictureBox picBox, bool state)
{
Color col, gra;
if (state)
{
col = Color.FromArgb(101, 31, 156);
gra = Color.FromArgb(212, 113, 255);
}
else
{
col = Color.FromArgb(80, 80, 80);
gra = Color.FromArgb(103, 103, 103);
}
// ラベルの疑似グラデーション
picBox.Image = new Bitmap(picBox.Width, picBox.Height);
using (Graphics g = Graphics.FromImage(picBox.Image))
using (LinearGradientBrush brush =
new LinearGradientBrush(
g.VisibleClipBounds, Color.Red, Color.Blue,
LinearGradientMode.Horizontal))
{
ColorBlend blend = new ColorBlend();
blend.Positions = new float[] { 0.0f, 0.2f, 0.8f, 1.0f };
blend.Colors = new Color[] { gra, col, col, gra };
brush.InterpolationColors = blend;
g.FillRectangle(brush, g.VisibleClipBounds);
}
}
// 月齢
MoonAges moonAge = MoonAges.none;
public MoonAges MoonAge
{
get { return moonAge; }
set
{
if (moonAge != value)
{
moonAge = value;
if (moonAge == MoonAges.Full)
{
// 満月になった
SetState1("満月 残り");
SetState2("新月 まで");
SetColor(pictureBox1, true);
}
else if (MoonAges.F7N <= moonAge & moonAge <= MoonAges.F1N)
{
// 満月終了後の 7/8 齢から 新月手前の 1/8 齢まで
SetState1("新月 まで");
SetState2("満月 まで");
SetColor(pictureBox1, false);
}
else if (moonAge == MoonAges.New)
{
// 新月になった
SetState1("新月 残り");
SetState2("満月 まで");
SetColor(pictureBox1, true);
}
else if (MoonAges.N1F <= moonAge & moonAge <= MoonAges.N7F)
{
// 新月終了後の 1/8 齢から満月手前の 7/8 齢まで
SetState1("満月 まで");
SetState2("新月 まで");
SetColor(pictureBox1, false);
}
}
}
}
// 次の満月の時間を Form に通達
public DateTime NextFullMoon => moonTimer1.NextFullMoon;
// 次の満月までの時間を Form に通達
public TimeSpan UpToFullMoon => moonTimer1.UpToNextFullMoon;
// AuraTimer の Enabled 値を Form に通達
public bool TimerEnabled
{
get { return moonTimer1.Enabled; }
set { moonTimer1.Enabled = value; }
}
// 1 秒毎イベント
private void moonTimer1_SecondChanged(object sender, EventArgs e)
{
// 時間の表示
if (MoonAge == MoonAges.Full)
{
labelTime1.Text = moonTimer1.RemainingFullMoon.ToString(TIMESPAN_FORMAT);
labelTime2.Text = moonTimer1.UpToNextNewMoon.ToString(TIMESPAN_FORMAT);
}
else if (MoonAges.F7N <= MoonAge & MoonAge <= MoonAges.F1N)
{
labelTime1.Text = moonTimer1.UpToNextNewMoon.ToString(TIMESPAN_FORMAT);
labelTime2.Text = moonTimer1.UpToNextFullMoon.ToString(TIMESPAN_FORMAT);
}
else if (MoonAge == MoonAges.New)
{
labelTime1.Text = moonTimer1.RemainingNewMoon.ToString(TIMESPAN_FORMAT);
labelTime2.Text = moonTimer1.UpToNextFullMoon.ToString(TIMESPAN_FORMAT);
}
else if (MoonAges.N1F <= MoonAge & MoonAge <= MoonAges.N7F)
{
labelTime1.Text = moonTimer1.UpToNextFullMoon.ToString(TIMESPAN_FORMAT);
labelTime2.Text = moonTimer1.UpToNextNewMoon.ToString(TIMESPAN_FORMAT);
}
OnSecondChanged();
}
// 1 分毎イベント
private void MoonTimer1_MinutesChanged(object sender, EventArgs e)
{
// 満月の 5 分前にメッセージを表示する
//if (moonTimer1.NextFullMoon.AddMinutes(-1 * Properties.Settings.Default.BeforeFullMoon) ==
// moonTimer1.Now)
// なんかおかしいなー思ったら、ミリセカンドまで比較してたのね…
// なんで最初は動いてたんやろか?
// 修正: 20180828
string fmt = "yyyyMMddHHmm";
string before = moonTimer1.NextFullMoon.AddMinutes(
Properties.Settings.Default.BeforeFullMoon * -1).ToString(fmt);
string snooze = moonTimer1.NextFullMoon.AddMinutes(
Properties.Settings.Default.SnoozeFullMoon * -1).ToString(fmt);
if (moonTimer1.Now.ToString(fmt) == before)
{
OnShowMessage(string.Format("満月の {0} 分前です", Properties.Settings.Default.BeforeFullMoon));
}
// スヌーズの部分
// 追加: 20180828
if (moonTimer1.Now.ToString(fmt) == snooze)
{
OnShowMessage(string.Format("満月の {0} 分前です", Properties.Settings.Default.SnoozeFullMoon));
}
}
// メッセージ表示イベント
public delegate void MessageEentHandler(object sender, MessageEventArgs e);
public event MessageEentHandler ShowMessage;
protected virtual void OnShowMessage(object sender, MessageEventArgs e)
{
this.ShowMessage?.Invoke(sender, e);
}
private void OnShowMessage(string msg)
{
this.OnShowMessage(this, new MessageEventArgs(msg));
}
// 月齢が変化したとき
private void moonTimer1_MoonAgeChanged(object sender, MoonAgeEventArgs e)
{
MoonAge = e.MoonAge;
OnMoonAgeChanged();
// 満月終了時にメッセージ
// コムギコ氏より要望 20180902
if (MoonAge == MoonAges.F7N)
{
OnShowMessage("満月が終了しました");
}
}
// 月齢が変化したら発生するイベント
public delegate void MoonAgeEventHandler(object sender, MoonAgeEventArgs e);
public event MoonAgeEventHandler MoonAgeChanged;
protected virtual void OnMoonAgeChanged(object sender, MoonAgeEventArgs e)
{
this.MoonAgeChanged?.Invoke(sender, e);
}
private void OnMoonAgeChanged()
{
this.OnMoonAgeChanged(this, new MoonAgeEventArgs(MoonAge));
}
// 秒が変化したら発生するイベント
public event EventHandler SecondChanged;
protected virtual void OnSecondChanged(object sender, EventArgs e)
{
this.SecondChanged?.Invoke(sender, e);
}
private void OnSecondChanged()
{
this.OnSecondChanged(this, new EventArgs());
}
}
}