sábado, 3 de octubre de 2009

Aplicación Pomodoro en C# Mobile 6.5 – Construyendo el reloj

Bueno, como los requisitos son súper sencillos no voy a comerme mucho el tarro con esta pequeña práctica y voy a hacer una aplicación de una sola capa que tenga todo.

Por lo cual para el formulario voy a utilizar el logotipo de Pomodoro que es el siguiente:

pomodoro

Y a continuación los dos controles tipo label en donde voy a escribir la cuenta atrás y la fase en la que estoy. Por último, también tendré en cuenta los dos botones en la barra de menú inferior, quedando un formulario así:
form

La primera tarea que quiero hacer es todo el tema del cronometro, por lo cual me dejo la lectura de la configuración a un lado y directamente meto los parámetros en el constructor de la clase, eso sí lo dejo listo para más adelante hacer la clase de gestión de la configuración y que no tenga que modificar prácticamente nada.

Por ello también declaro una serie de constantes dentro de la propia clase. En vez de sacarlo a una estructura externa.

Para hacer el cronómetro me he apoyado en el control Timer de .NET, el cual indicándole un intervalo en milisegundos, me lanza un evento onTick en el cual le indico todo lo que tiene que ocurrir.

He creado un método pausa() que detiene y reinicia la cuenta atrás y visualiza los mensajes y los menús adecuados a cada fase.

Con cuidadin, ya que es una versión Beta inicial, aquí os dejo el código como está ahora mismo.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Media;


namespace Pomodoro
{
public partial class Pomodoro : Form
{
private int minutosDescansoLargo;
private int minutosDescansoCorto;
private int minutosTrabajo;
private int numIteracionesTrabajo;

public TimeSpan horario;

public int minutoActual;
public int minutoFin;
public int iteraciones;

/// <summary>
/// Nos indica si estamos en periodo de trabajo
/// </summary>
public bool trabajo;
/// <summary>
/// Nos indica si el reloj está iniciado
/// </summary>
public bool encendido;
/// <summary>
/// Repositorio temporal de mensajes
/// </summary>
public string mensajeTemporal;

/// <summary>
/// Objeto reproductor de sonidos
/// </summary>
sonido sonidos;

/// <summary>
/// Constantes de mensajes"
/// </summary>
public const string mensajeIniciar = "Iniciar";
public const string mensajePausa = "Pausa";
public const string mensajeContinuar = "Continuar";
public const string mensajeDescansoCorto = "Descanso breve";
public const string mensajeDescansoLargo = "Descanso largo";
public const string mensajeTrabaja = "Trabajando";


/// <summary>
/// Constructor del formulario
/// </summary>
public Pomodoro()
{
InitializeComponent();
sonidos
= new sonido();
leeConfiguracion();
}

/// <summary>
/// Lee la configuración desde un fichero xml
/// </summary>
public void leeConfiguracion()
{
// Lee configuración del xml
// En desarrollo meto los valores a cañon.
minutosDescansoLargo = 15;
minutosDescansoCorto
= 5;
minutosTrabajo
= 25;
numIteracionesTrabajo
= 4;

//Reinicio los valores
horario = TimeSpan.FromMinutes(minutosTrabajo);

iteraciones
= numIteracionesTrabajo;
menuItem2.Text
= mensajeIniciar;
lblMensaje.Text
= string.Empty;
this.BackColor = Color.WhiteSmoke;

timer1.Interval
= 1000; //Un segundo
encendido = false;
trabajo
= true;
}

/// <summary>
/// Reloj. Gestiona los mensajes y los contadores de fases.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void timer1_Tick(object sender, EventArgs e)
{
lblReloj.Text
= timeSpan2minutos(horario);
horario
= horario - TimeSpan.FromSeconds(1);

// Si hemos llegado al final de la cuenta regresiva
if (horario.Minutes == 0 && horario.Seconds == 0)
{
// Si entramos en un periodo distinto del de trabajo
if (trabajo == true)
{
// Si entramos en un periodo de descansoCorto
if (iteraciones > 0)
{
iteraciones
--;
horario
= TimeSpan.FromMinutes(minutosDescansoCorto);
lblMensaje.Text
= mensajeDescansoCorto;
}
else
{
iteraciones
= numIteracionesTrabajo;
horario
= TimeSpan.FromMinutes(minutosDescansoLargo);
lblMensaje.Text
= mensajeDescansoLargo;
}
trabajo
= false;
}
else
{
horario
= TimeSpan.FromMinutes(minutosTrabajo);
trabajo
= true;
lblMensaje.Text
= mensajeTrabaja;
}
alarma();
}
}

/// <summary>
/// Pausa/continuar
/// </summary>
private void pausa()
{
lblReloj.Text
= timeSpan2minutos(horario);

switch (menuItem2.Text)
{
// Ponemos el mensaje de trabaja
case mensajeIniciar:
lblMensaje.Text
= mensajeTrabaja;
menuItem2.Text
= mensajePausa;
break;


// Guardamos el mensaje de texto
// Y ponemos el mensaje de pausa
case mensajePausa:

mensajeTemporal
= lblMensaje.Text;
lblMensaje.Text
= mensajePausa;
menuItem2.Text
= mensajeContinuar;
break;


// Recuperamos el mensaje de texto original
// Y lo visualizamos
case mensajeContinuar:
lblMensaje.Text
= mensajeTemporal;
menuItem2.Text
= mensajePausa;
break;
}

encendido
= !encendido;
timer1.Enabled
= encendido;
if (encendido == true)
{
this.BackColor = Color.WhiteSmoke; }
}

/// <summary>
/// Efecto de alarma y pausa el cronómetro.
/// </summary>
private void alarma()
{
this.BackColor = Color.YellowGreen;
pausa();
}


/// <summary>
/// Formatea el TimeSpan en minutos.
/// </summary>
/// <param name="horario">El TimeSpan a ser convertido a string</param>
/// <returns>Los minutos y segundos en formato "00:00"</returns>
private string timeSpan2minutos(TimeSpan horario)
{
return horario.Minutes.ToString("00") + ":" + horario.Seconds.ToString("00");
}

/// <summary>
/// Menú izquierdo
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void menuItem1_Click(object sender, EventArgs e)
{
leeConfiguracion();
lblReloj.Text
= timeSpan2minutos(horario);
menuItem2.Text
= mensajeIniciar;
lblMensaje.Text
= mensajeIniciar;
timer1.Enabled
= false;
}
/// <summary>
/// Menú derecho
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void menuItem2_Click(object sender, EventArgs e)
{
pausa();
}
/// <summary>
/// Imágen del tomate
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void pictureBox1_Click(object sender, EventArgs e)
{
//DrawString();
sonidos.click.Play();
pausa();
}

/// <summary>
/// Botón de salir
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void bSalir_Click(object sender, EventArgs e)
{
Application.Exit();
}
}

/// <summary>
/// Clase que inicializa los sonidos utilizados en la aplicación.
/// </summary>
public class sonido
{
public SoundPlayer click = new SoundPlayer("\\Windows\\splat.wav");
public sonido()
{
click.Play();
}
}
}


¿Lo siguiente?



Efectos sonoros y visuales….

No hay comentarios: