def initialize(evas, label)
super(evas)
+ self.name = label
+
@slot = nil
@alpha_anim = nil
@label = Evas::Text.new(evas)
@objects = [@img, @label]
+ @objects.each { |o| add_member(o) }
+ set_color(255, 255, 255, 0)
@img.set_color(255, 255, 255, 0)
- @label.set_color(255, 255, 255, 0)
@label.set_color(255, 0, 0, 0)
@img.set_file(ICON_FILE)
@img.set_fill(0, 0, *@img.get_size)
- @label.text = label
+ @label.text = name
@label.set_font("VeraBd", 10)
resize(*@img.get_size)
end
- def label
- @label.text
- end
-
# smart callbacks
- def on_show
+ def smart_show
@objects.each { |o| o.show }
- @alpha_anim ||= AlphaAnimator.new(2, @img, @label)
+ @alpha_anim ||= AlphaAnimator.new(2, self)
@alpha_anim.on_finished { @alpha_anim = nil }
end
- def on_hide
+ def smart_hide
@objects.each { |o| o.hide }
@alpha_anim && @alpha_anim.delete
@alpha_anim = nil
end
- def on_delete
+ def smart_delete
@objects.each { |o| o.delete }
@objects.clear
@img = @label = @alpha_anim = nil
end
- def on_layer_set(layer)
- @objects.each { |o| o.layer = layer }
- end
-
- def on_stack_above(other)
- @objects.each { |o| o.stack_above = other }
- end
-
- def on_stack_below(other)
- @objects.each { |o| o.stack_below = other }
- end
-
- def on_move(x, y)
+ def smart_move(x, y)
@objects.each { |o| o.move(x, y) }
@label.center(self)
end
- def on_resize(w, h)
+ def smart_resize(w, h)
@img.resize(w, h)
end
- end
-
- class FixedSizeArray < Array
- def initialize(siz)
- super
- end
-
- def each
- super { |item| yield item unless item.nil? }
- end
- def delete_at(i)
- self[i] = nil
+ def smart_color_set(r, g, b, a)
+ @objects.each { |o| o.alpha = a }
end
-
- undef :push
- undef :<<
- undef :unshift
-
- undef :pop
- undef :shift
- undef :delete
end
class Container < Evas::Smart
class ContainerFullError < ContainerError; end
class ContainerLockedError < ContainerError; end
- include Enumerable
-
def initialize(evas)
super
@bg = Evas::Rectangle.new(evas)
- @bg.set_color(0, 0, 0, 255)
+ @bg.set_color(0, 0, 0, 8)
+
+ add_member(@bg)
- @icons = FixedSizeArray.new(MAX_ICONS)
- @about_to_add = []
+ @icons = []
@animators = []
- @lock_count = 0
+ @about_to_add = 0
+ @add_lock_count = 0
end
- def each
- @icons.each { |i| yield i unless i.nil? }
+ def can_add?
+ !slots_left.zero? && @add_lock_count.zero?
+ end
+
+ def can_delete?
+ @about_to_add.zero? && @add_lock_count.zero?
end
def <<(i)
Kernel.raise(ContainerFullError) if slots_left.zero?
- Kernel.raise(ContainerLockedError) if @lock_count > 0
+ Kernel.raise(ContainerLockedError) unless @add_lock_count.zero?
i.move_relative(self, 0, 0)
i.slot = next_slot
movement = Main.instance.icon_height * (slots_left - 1)
- @about_to_add << i
+ @about_to_add += 1
move_time = 0.25 * slots_left
@animators << MoveAnimator.new(move_time, movement, i)
@animators.delete(ani)
@icons[i.slot] = i
- # FIXME check whether we can always shift the array instead
- #puts "really added #{i.label} now (slot #{i.slot})"
- @about_to_add.delete(i)
+ @about_to_add -= 1
end
end
def delete(icon)
- # icons that are placed above the one that's deleted need
- # to be moved
i = @icons.index(icon)
return (block_given? ? yield : nil) if i.nil?
end
def delete_at(i)
+ Kernel.raise(ContainerLockedError) unless @about_to_add.zero?
+ Kernel.raise(ContainerLockedError) unless @add_lock_count.zero?
+
+ # icons that are placed above the one that's deleted need
+ # to be moved
+ ar = @icons[(i + 1)..-1]
+
@icons[i].delete
@icons.delete_at(i)
- ar = @icons[i..-1].reject { |i| i.nil? }
- return if ar.nil?
+ return if ar.empty?
- @lock_count += 1
+ @add_lock_count += 1
@animators << MoveAnimator.new(2, Main.instance.icon_height, *ar)
@animators.last.on_finished do |ani|
@animators.delete(ani)
- @lock_count -= 1
+ @add_lock_count -= 1
end
end
- def length
- @icons.nitems
- end
-
# smart callbacks
- def on_show
+ def smart_show
@bg.show
end
- def on_hide
+ def smart_hide
@bg.hide
end
- def on_delete
+ def smart_delete
@bg.delete
@bg = nil
end
- def on_layer_set(layer)
- @bg.layer = layer
- end
-
- def on_stack_above(other)
- @bg.stack_above = other
- end
-
- def on_stack_below(other)
- @bg.stack_below = other
- end
-
- def on_move(x, y)
+ def smart_move(x, y)
@bg.move(x, y)
end
- def on_resize(w, h)
+ def smart_resize(w, h)
@bg.resize(w, h)
end
private
def slots_left
- MAX_ICONS - @icons.nitems - @about_to_add.length
+ MAX_ICONS - @icons.nitems - @about_to_add
end
def next_slot
- @icons.nitems + @about_to_add.length
+ @icons.nitems + @about_to_add
end
end
def initialize
super
- self.title = "blah"
+ self.has_alpha = true
+ self.title = "Embrace"
self.borderless = true
@icon_dim = IO.read(ICON_FILE, 8, 16).unpack("NN")
- self.on_resize { @container.resize(*geometry[2, 3]) }
+ on_resize { @container.resize(*geometry[2, 3]) }
@container = Container.new(evas)
@container.move(0, 0)
end
private
- def add_icon(name)
- @container << MailboxIcon.new(evas, name)
- end
-
def on_timer
return unless @server.nil?
lbl = md.captures.first
end
- found = @container.find { |i| i.label == lbl }
-
- begin
- if ev.count.zero?
- unless found.nil?
- #puts "removing icon #{lbl}"
- @container.delete(found)
- else
- #puts "count == 0, but icon not found (#{lbl})"
- end
- elsif found.nil?
- #puts "adding icon #{lbl}"
- add_icon(lbl)
- else
- #puts "count > 0, but already there (#{lbl})"
- end
- rescue Exception => e
- puts e.message
+ found = evas.find_object(lbl)
+
+ if ev.count.zero? && !found.nil? && @container.can_delete?
+ @container.delete(found)
+ elsif !ev.count.zero? && found.nil? && @container.can_add?
+ @container << MailboxIcon.new(evas, lbl)
end
false