Refactoring: use Match to handle interactions.
[kaya.git] / lib / plugins / clocks / digital.rb
bloba1a17125786cf71b1e8bc0df876ae18de57890cb
1 require 'plugins/plugin'
2 require 'constrained_text_item'
3 require 'board/item_bag'
5 class DigitalClock < Qt::GraphicsItemGroup
6   include Plugin
7   include ItemBag
8   include ItemUtils
9   include Observer
10   
11   plugin :name => 'Digital Clock',
12          :keywords => %w(clock)
14   attr_reader :items, :rect
15   
16   OFF_TEXT = '-'
17   BASE_DIR = File.dirname(__FILE__)
18   ACTIVE_SKIN_RENDERER = Qt::SvgRenderer.new(
19       File.join(BASE_DIR, 'active_clock.svg'))
20   INACTIVE_SKIN_RENDERER = Qt::SvgRenderer.new(
21       File.join(BASE_DIR, 'inactive_clock.svg'))
22           
23   def initialize(scene)
24     super(nil, @scene = scene)
25     
26     @items = {
27       :time => ConstrainedTextItem.new(OFF_TEXT, self),
28       :player => ConstrainedTextItem.new('', self),
29       :caption => ConstrainedTextItem.new('', self)
30     }
31     
32     @active = false
33   end
34   
35   def set_geometry(rect)
36     @rect = Qt::RectF.new(rect)
37     self.pos = @rect.top_left
38     redraw
39   end
40   
41   def redraw
42     if @rect
43       add_item :skin, skin, :z => BACKGROUND_ZVALUE
44       @items[:time].constraint = Qt::RectF.new(
45         @rect.width * 0.4, @rect.height * 0.1, 
46         @rect.width * 0.6, @rect.height * 0.62)
47       @items[:caption].constraint = Qt::RectF.new(
48         @rect.width * 0.02, @rect.height * 0.22,
49         @rect.width * 0.4, @rect.height * 0.38)
50       @items[:player].constraint = Qt::RectF.new(
51         @rect.width * 0.14, @rect.height * 0.68,
52         @rect.width * 0.69, @rect.height * 0.28)
53     end
54   end
55   
56   def clock=(clock)
57     if @clock
58       @clock.delete_observer(self)
59     end
60     
61     @clock = clock
62     clock.add_observer(self)
63     on_timer(clock.timer)
64   end
65   
66   def on_timer(data)
67     min = data[:main] / 60
68     sec = data[:main] % 60
69     
70     @items[:time].text = "%02d:%02d" % [min, sec]
71   end
72   
73   def skin
74     renderer = if @active
75       ACTIVE_SKIN_RENDERER
76     else
77       INACTIVE_SKIN_RENDERER
78     end
79     Qt::Image.from_renderer(@rect.size, renderer).to_pix
80   end
81   
82   def start
83     @clock.start if @clock
84     self.active = true
85   end
86   
87   def stop
88     @clock.stop if @clock
89     self.active = false
90   end
91   
92   def active=(value)
93     @active = value
94     redraw
95   end
96   
97   def active?
98     @active
99   end
100   
101   def data=(d)
102     @caption = d[:color].to_s.capitalize
103     @player = d[:player] || '(unknown)'
104     
105     items[:caption].text = @caption
106     items[:player].text = @player
107   end