#
# Simple example of using time with Madeleine.
#

$LOAD_PATH.unshift(".." + File::SEPARATOR + "lib")

require 'madeleine/clock'
require 'tk'

# The Clicker keeps track of when it was last clicked.
#
# To access the time it extends ClockedSystem, which provides
# it with the 'clock' attribute.
#
class Clicker
  include Madeleine::Clock::ClockedSystem

  def initialize
    @last_clicked = nil
  end

  def click
    @last_clicked = clock.time
  end

  def last_clicked
    return '-' if @last_clicked.nil?
    @last_clicked.to_s
  end
end

# A command to update the Clicker with.
#
class Click
  def execute(system)
    system.click
  end
end

# Launch a ClockedSnapshotMadeleine.
#
# ClockedSnapshotMadeleine works like the regular SnapshotMadeleine, but
# optimizes away redundant commands from TimeActor.
#
madeleine = ClockedSnapshotMadeleine.new("clock-demo") { Clicker.new }

# Launch the TimeActor.
#
# This provides time commands, without which the system's time would stand still.
#
Madeleine::Clock::TimeActor.launch(madeleine)

clicker = madeleine.system

# The GUI

root = TkRoot.new() { title "Madeleine Clock Example" }
label = TkLabel.new(root) {
  text "Last clicked " + clicker.last_clicked
  width 40
  pack
}
button = TkButton.new(root) {
  text 'Click'
  command proc {
    madeleine.execute_command(Click.new)
    label.text("Last clicked " + clicker.last_clicked)
  }
  pack
}

Tk.mainloop