don't delete icons while we're deleting others
[embrace.git] / bin / embrace
index 22e9be6513d06d81cc36ac71c86887a326eb29f5..2316b0ddbc3cc8bd703a4260109e85e4efc38849 100755 (executable)
@@ -117,9 +117,9 @@ module Embrace
                        @label = Evas::Text.new(evas)
 
                        @objects = [@img, @label]
+                       @objects.each { |o| add_member(o) }
 
                        @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)
@@ -170,28 +170,6 @@ module Embrace
                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
-               end
-
-               undef :push
-               undef :<<
-               undef :unshift
-
-               undef :pop
-               undef :shift
-               undef :delete
-       end
-
        class Container < Evas::Smart
                class ContainerError < StandardError; end
                class ContainerFullError < ContainerError; end
@@ -205,20 +183,22 @@ module Embrace
                        @bg = Evas::Rectangle.new(evas)
                        @bg.set_color(0, 0, 0, 255)
 
-                       @icons = FixedSizeArray.new(MAX_ICONS)
-                       @about_to_add = []
+                       add_member(@bg)
+
+                       @icons = []
                        @animators = []
 
-                       @lock_count = 0
+                       @about_to_add = 0
+                       @add_lock_count = 0
                end
 
                def each
-                       @icons.each { |i| yield i unless i.nil? }
+                       @icons.compact.each { |i| yield i }
                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
@@ -233,7 +213,7 @@ module Embrace
 
                        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)
@@ -242,15 +222,11 @@ module Embrace
                                @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?
 
@@ -258,25 +234,27 @@ module Embrace
                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
                        @bg.show
@@ -301,11 +279,11 @@ module Embrace
 
                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