
class MyTimer
  attr_accessor :running
  def initialize(freq) 
    reset
    @thread = Thread.new {
      while(true) do 
        if(@running) then
          yield count 
        end
        sleep(freq) 
      end
    }
  end
  def stop
    @running = false
    @paused_time = Time.now
  end
  def start
    if(@paused_time) 
      paused = Time.now - @paused_time
      @start_time = @start_time + paused.to_i
      @paused_time = false
    end
    @running = true
  end
  def reset
    @start_time = Time.now
    stop
  end
  def add(number)
    @start_time = @start_time - (number.to_i * 60)
  end
  def count()
    now = Time.now
    if @running
      paused = 0
    else
      paused = now - @paused_time
    end
    (now - (@start_time + paused)).to_i
  end
end

class TimableItem
  attr_accessor :name, :desc, :timer,  :para, :ins, :alter,  :pause, :continue, :reset, :delete, :slot, :info, :bg, :clickslot, :is_paused
  def pretty_time(count)
    m = 60; h = 60 * m; d = 24 * h
    days = (count / d).to_i
    hours = ((count - (days * d)) / h).to_i
    minutes = ((count - ((days * d) + (hours * h))) / m).to_i
    seconds = (count - ((days * d) + (hours * h) + (minutes * m))).to_i
    return days.to_s + "d " + hours.to_s + "h " + minutes.to_s + "m " + seconds.to_s + "s"
  end
  def reset_timer
    @timer.reset unless @timer.nil?
    update_display(0)
    @timer = MyTimer.new(1) { |count| update_display(count) } if @timer.nil?
    pause_timer
  end
  def update_display(count)
      @desc = "No Description" unless @desc
      @para.text = @name; @ins.text = @desc + "\n" + pretty_time(count)
  end
  def pause_timer
    @timer.stop
    #@pause.hide
    #@continue.show
    @para.stroke = "#F00"
    @bg.hide
    @is_paused = true
  end
  def continue_timer
    @timer.start
    #@continue.hide
    #@pause.show
    @para.stroke = "#0A0"
    @bg.show
    @is_paused = false
  end
  def delete_timer
    @timer.stop
    @slot.toggle
  end
  def alter_timer
    a = @timer.add ask("Alter by how many mins?")
    update_display(a)
  end
  def toggle
    if @is_paused
      continue_timer
    else
      pause_timer
    end
  end
end

class TodoItem
  attr_accessor :slot, :text
  def delete_item
    @slot.toggle
  end
end

Shoes.app(:title=>"Timer", :height => 1000, :width => 100) {
  background "#FFF".."#AAF"
  @items = Array.new
  @todos = Array.new
  def button_to_add_item
    button "+", :width=>"100%" do
      add_item @button_inner
    end        
  end  
  def button_to_add_todo
    button "+ Add Todo", :width=>"100%" do
      add_todo @button_outer
    end        
  end
  def add_item(slot)
    t = TimableItem.new
    slot.append() do
      t.slot = stack(:width=>"100%") do
        t.clickslot = stack do
          background "#AAF".."#FFF"
          t.bg = background "#FFF".."#AFA"
          t.name = ask("Give this timed task a title")
          t.desc = ask("Enter a short description")
          t.para = para
          t.ins = inscription(:size=>"7pt")
        end
        t.clickslot.click do
          t.toggle
        end
        flow(:width => "100%") do
          background gainsboro
          t.alter = button("+/-", :width => (1.0/3.0), :height => 20) {t.alter_timer}
          t.reset = button("<¬", :width =>  (1.0/3.0), :height => 20) { t.reset_timer }
          t.delete = button("x", :width =>  (1.0/3.0), :height => 20) { t.delete_timer; @items.remove t }
        end
      end
    end
    t.reset_timer
    @items << t
  end
  
  def add_todo(slot)
    t = TodoItem.new
    slot.append() do
      t.slot = stack do
        t.text = ask("What is the message? (KISS)")
        f = flow() { para(t.text, :size=>"7pt") }
        button("x", :width => "100%", :height => 20) { t.delete_item ; @items.remove t}
      end
    end
    @items << t
  end
  
  #Things start here!
  @button_outer = stack( :width => "100%") do
    button_to_add_item
    @button_inner = stack( :width => "100%") 
    button_to_add_item  
  end
  
  button_to_add_todo    
}