Mercurial > silverbladetech
diff Chronosv2/source/Presentation/Widgets/Clock/ClockWidgetViewModel.cs @ 10:443821e55f06
Initial cleaned up add from Codeplex files
author | stevenh7776 stevenhollidge@hotmail.com |
---|---|
date | Tue, 21 Feb 2012 17:25:44 +0700 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Chronosv2/source/Presentation/Widgets/Clock/ClockWidgetViewModel.cs Tue Feb 21 17:25:44 2012 +0700 @@ -0,0 +1,307 @@ +using System; +using System.Windows; +using System.Windows.Media; +using System.Windows.Threading; +using Chronos.Presentation.ViewModel; + +namespace Chronos.Presentation.Widgets +{ + /// <summary> + /// Based on http://moonydesk.codeplex.com/ + /// </summary> + public sealed class ClockWidgetViewModel + : WidgetViewModel + { + #region · Fields · + + private Point degreeStartPoint; + private Point degreeCurrentPoint; + private bool isLargeArc; + private int dayOfYear; + private int year; + private string seconds; + private string minutes; + private string hours; + private string pmAm; + private bool hours24; + private string date; + private string dayOfWeek; + private int angle; + + #endregion + + #region · Properties · + + public Point DegreeStartPoint + { + get { return this.degreeStartPoint; } + set + { + if (this.degreeStartPoint != value) + { + this.degreeStartPoint = value; + + this.NotifyPropertyChanged(() => DegreeStartPoint); + } + } + } + + public Point DegreeCurrentPoint + { + get { return this.degreeCurrentPoint; } + set + { + if (this.degreeCurrentPoint != value) + { + this.degreeCurrentPoint = value; + + this.NotifyPropertyChanged(() => DegreeCurrentPoint); + } + } + } + + public bool IsLargeArc + { + get { return this.isLargeArc; } + set + { + if (this.isLargeArc != value) + { + this.isLargeArc = value; + + this.NotifyPropertyChanged(() => IsLargeArc); + } + } + } + + public string Seconds + { + get { return this.seconds; } + set + { + if (this.seconds != value) + { + this.seconds = value; + + this.NotifyPropertyChanged(() => Seconds); + } + } + } + + public string Minutes + { + get { return this.minutes; } + set + { + if (this.minutes != value) + { + this.minutes = value; + + this.NotifyPropertyChanged(() => Minutes); + } + } + } + + public string Hours + { + get { return this.hours; } + set + { + if (this.hours != value) + { + this.hours = value; + + this.NotifyPropertyChanged(() => Hours); + } + } + } + + public string PmAm + { + get { return this.pmAm; } + set + { + if (this.pmAm != value) + { + this.pmAm = value; + + this.NotifyPropertyChanged(() => PmAm); + } + } + } + + public bool Hours24 + { + get { return this.hours24; } + set + { + if (this.hours24 != value) + { + this.hours24 = value; + + this.NotifyPropertyChanged(() => Hours24); + } + } + } + + public string Date + { + get { return this.date; } + set + { + if (this.date != value) + { + this.date = value; + + this.NotifyPropertyChanged(() => Date); + } + } + } + + public string DayOfWeek + { + get { return this.dayOfWeek; } + set + { + if (this.dayOfWeek != value) + { + this.dayOfWeek = value; + + this.NotifyPropertyChanged(() => DayOfWeek); + } + } + } + + public int Angle + { + get { return this.angle; } + set + { + if (this.angle != value) + { + this.angle = value; + + this.NotifyPropertyChanged(() => Angle); + } + } + } + + public int DayOfYear + { + get { return this.dayOfYear; } + set + { + if (this.dayOfYear != value) + { + this.dayOfYear = value; + + this.NotifyPropertyChanged(() => DayOfYear); + } + } + } + + public int Year + { + get { return this.year; } + set + { + if (this.year != value) + { + this.year = value; + + this.NotifyPropertyChanged(() => DayOfYear); + } + } + } + + #endregion + + #region · Constructors · + + public ClockWidgetViewModel() + : base() + { + this.DayOfYear = -1; + this.Year = -1; + this.Angle = -4; + this.Hours24 = Properties.Settings.Default.hours24; + this.DegreeStartPoint = new Point(110, 10); + this.DegreeCurrentPoint = new Point(110, 210); + } + + #endregion + + #region · Methods · + + public void Start() + { + DispatcherTimer timer = new DispatcherTimer(); + + timer.Interval = TimeSpan.FromSeconds(0.1); + timer.Tick += new EventHandler(OnTimerTick); + timer.Start(); + + this.SetCurTime(); + } + + #endregion + + #region · Private Methods · + + /// <summary> + /// Set current time + /// </summary> + private void SetCurTime() + { + DateTime now = DateTime.Now; + + this.SetDeg((now.Second + now.Millisecond / 1000.0) * 6); + this.Seconds = now.Second.ToString("00"); + this.Minutes = now.Minute.ToString("00"); + + if (this.Hours24) + { + this.Hours = now.Hour.ToString("00"); + this.PmAm = String.Empty; + } + else + { + this.Hours = now.ToString("hh"); + this.PmAm = now.ToString("tt"); + } + + if (now.DayOfYear != this.DayOfYear || now.Year != this.Year) + { + this.Date = now.ToString("d MMMM yyyy"); + this.DayOfWeek = now.ToString("dddd"); + this.DayOfYear = now.DayOfYear; + this.Year = now.Year; + } + } + + /// <summary> + /// Set seconds arc degree + /// </summary> + /// <param name="degree"></param> + private void SetDeg(double degree) + { + double offset = this.DegreeStartPoint.X; + double x = Math.Cos((degree - 90) * Math.PI / 180) * 100.0 + offset; + double y = Math.Sin((degree - 90) * Math.PI / 180) * 100.0 + offset; + + this.DegreeCurrentPoint = new Point(x, y); + this.IsLargeArc = (degree > 180); + } + + #endregion + + #region · Event Handlers · + + private void OnTimerTick(object sender, EventArgs e) + { + this.SetCurTime(); + } + + #endregion + } +}