X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=bin%2Fembrace;h=fa6f5534fe6abdd438800d5661409b70950844fa;hb=0f8a9c03f5838812473819e7ef2c50261e352fe7;hp=bfd91c9187e631951842089f2910c4b569019d9a;hpb=4a43ceec47783f0a66008d207a8479e324355d28;p=embrace.git diff --git a/bin/embrace b/bin/embrace index bfd91c9..fa6f553 100755 --- a/bin/embrace +++ b/bin/embrace @@ -81,11 +81,21 @@ module Embrace # an animator that runs for the specified number of seconds, # and yields values between 0 and 255 class AlphaAnimator < ZeroToOneAnimator - def initialize(duration, *objects) + def initialize(duration, object) super(duration) do |v| - objects.each { |o| o.alpha = (255 * v).to_i } + object.alpha = compute_alpha(v) end end + + def compute_alpha(v) + (255 * v).to_i + end + end + + class InverseAlphaAnimator < AlphaAnimator + def compute_alpha(v) + super((1.0 - v).abs) + end end class MoveAnimator < ZeroToOneAnimator @@ -105,6 +115,16 @@ module Embrace end class MailboxIcon < Evas::Smart + class FadeOutFinishedEvent < Ecore::Event + attr_reader :icon + + def initialize(icon) + super() + + @icon = icon + end + end + attr_accessor :slot def initialize(evas, label) @@ -121,6 +141,7 @@ module Embrace @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, 0, 0, 0) @@ -133,22 +154,34 @@ module Embrace resize(*@img.get_size) end - # smart callbacks - def on_show - @objects.each { |o| o.show } + def fade_in + 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 fade_out + @alpha_anim ||= InverseAlphaAnimator.new(2, self) + @alpha_anim.on_finished do + @alpha_anim = nil + FadeOutFinishedEvent.raise(self) + end + end + + # smart callbacks + def smart_show + @objects.each { |o| o.show } + end + + 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 @@ -157,15 +190,19 @@ module Embrace @img = @label = @alpha_anim = nil 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 + + def smart_color_set(r, g, b, a) + @objects.each { |o| o.alpha = a } + end end class Container < Evas::Smart @@ -177,7 +214,7 @@ module Embrace super @bg = Evas::Rectangle.new(evas) - @bg.set_color(0, 0, 0, 255) + @bg.set_color(0, 0, 0, 8) add_member(@bg) @@ -186,6 +223,11 @@ module Embrace @about_to_add = 0 @add_lock_count = 0 + + @handlers = [ + Ecore::EventHandler.new(MailboxIcon::FadeOutFinishedEvent, + &method(:on_icon_fade_out_finished)) + ] end def can_add? @@ -203,7 +245,7 @@ module Embrace i.move_relative(self, 0, 0) i.slot = next_slot i.clip = self - i.show + i.fade_in # check whether we need to need to move this icon if slots_left == 1 @@ -237,16 +279,23 @@ module Embrace 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] + @add_lock_count += 1 + @icons[i].fade_out + end - @icons[i].delete + def on_icon_fade_out_finished(ev) + i = @icons.index(ev.icon) + ev.icon.delete @icons.delete_at(i) - return if ar.empty? + # icons that are placed above the one that's deleted need + # to be moved. check whether are there any first + if i == @icons.length + @add_lock_count -= 1 + return + end - @add_lock_count += 1 + ar = @icons[i..-1] @animators << MoveAnimator.new(2, Main.instance.icon_height, *ar) @animators.last.on_finished do |ani| @@ -256,24 +305,24 @@ module Embrace 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_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 @@ -295,6 +344,7 @@ module Embrace def initialize super + self.has_alpha = true self.title = "Embrace" self.borderless = true