Implement ActionList::Entry#clear.
[kaya.git] / lib / item.rb
blob510f492efb78889c0258c630c7422ed18384f65a
1 # Copyright (c) 2009 Paolo Capriotti <p.capriotti@gmail.com>
2
3 # This program is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; either version 2 of the License, or
6 # (at your option) any later version.
8 require 'toolkit'
10 class Item < Qt::GraphicsPixmapItem
11   attr_reader :name, :item
12   attr_reader :opacity
13   
14   # name is whatever information the caller needs
15   # to recreate this piece with a different size
16   # 
17   def initialize(name, pixmap, parent)
18     super(pixmap || Qt::Pixmap.new, parent)
19     @name = name
20     @opacity = 1.0
21   end
22   
23   def paint(p, options, widget)
24     if pixmap
25       p.saving do |p|
26         p.opacity = @opacity
27         super p, options, widget
28       end
29     end
30   end
31   
32   def opacity=(value)
33     @opacity = value
34     update
35   end
36   
37   def remove
38     scene.remove_item self
39   end
40   
41   def pixmap=(pixmap)
42     super(pixmap)
43     # Qt::Pixmap#effects is private, use __send__ to override
44     pixmap.__send__(:effects).each do |effect|
45       set_graphics_effect(effect)
46     end
47     pixmap.instance_variable_set("@effects", [])
48   end
49 end
51 class ReloadableItem < Item
52   def initialize(name, reloader, parent)
53     super(name, nil, parent)
54     @reloader = reloader
55   end
56   
57   def reload(key)
58     @reloader[key, self]
59   end
60 end
62 class AutoreloadableItem < Item
63   def initialize(name, pix_loader, parent)
64     super(name, nil, parent)
65     @pix_loader = pix_loader
66   end
67   
68   def set_geometry(rect)
69     self.pos = rect.top_left.to_f
70     self.pixmap = @pix_loader[rect.size]
71   end
72 end
74 module ItemUtils
75   BACKGROUND_ZVALUE = -10
76   TEMP_ZVALUE = 10
77   
78   def create_item(opts)
79     item_factory, arg = if opts[:reloader]
80       [ReloadableItem, opts[:reloader]]
81     elsif opts[:pix_loader]
82       [AutoreloadableItem, opts[:pix_loader]]
83     else
84       [Item, opts[:pixmap]]
85     end
86     
87     item = item_factory.new(opts[:name], arg, opts.fetch(:parent, item_parent))
88     item.pos = opts[:pos] || Qt::PointF.new(0, 0)
89     item.z_value = opts[:z] || 0
90     item.visible = false if opts[:hidden]
91     item
92   end
93   
94   def destroy_item(item)
95     scene.remove_item item
96   end
97   
98   def raise(item)
99     item.z_value = TEMP_ZVALUE
100   end
101   
102   def lower(item)
103     item.z_value = 0
104   end
105   
106   def item_parent
107     self
108   end