view Chronosv2/source/Presentation/Widgets/Clock/ClockWidgetViewModel.cs @ 21:dfc81f8bb838

working version for sttocks except ui within metrowpf
author adminsh@apollo
date Tue, 20 Mar 2012 15:07:31 +0000
parents 443821e55f06
children
line wrap: on
line source

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
  }
}