Fade out icons before removing them.
authorTilman Sauerbeck <tilman@code-monkey.de>
Sun, 24 Sep 2006 15:30:54 +0000 (17:30 +0200)
committerTilman Sauerbeck <tilman@code-monkey.de>
Sun, 24 Sep 2006 15:49:21 +0000 (17:49 +0200)
bin/embrace

index eae0994566e2b54c2ca6a499816c95c77b4bcd0b..f7ae62b0cf9ac72c17113b558c37a80e033e568d 100755 (executable)
@@ -83,9 +83,20 @@ module Embrace
        class AlphaAnimator < ZeroToOneAnimator
                def initialize(duration, *objects)
                        super(duration) do |v|
-                               objects.each { |o| o.alpha = (255 * v).to_i }
+                               a = compute_alpha(v)
+                               objects.each { |o| o.alpha = a }
                        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 +116,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)
@@ -134,14 +155,26 @@ module Embrace
                        resize(*@img.get_size)
                end
 
-               # smart callbacks
-               def smart_show
-                       @objects.each { |o| o.show }
+               def fade_in
+                       show
 
                        @alpha_anim ||= AlphaAnimator.new(2, self)
                        @alpha_anim.on_finished { @alpha_anim = nil }
                end
 
+               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 }
 
@@ -191,6 +224,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?
@@ -208,7 +246,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
@@ -242,16 +280,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|