Removed RCS-style IDs.
[redact.git] / lib / redact / part.rb
index b1b99786a179513975f302b1d6f17b9272b6c1df..60822d11402f70ea7b4f879db24f3adf44d5c31d 100644 (file)
@@ -1,6 +1,4 @@
 #--
-# $Id: part.rb 20 2005-04-02 22:15:29Z tilman $
-#
 # Copyright (c) 2005 Tilman Sauerbeck (tilman at code-monkey de)
 #
 # Permission is hereby granted, free of charge, to any person obtaining
@@ -31,8 +29,8 @@ module Redact
 
                include Comparable
 
-               attr_reader :collection, :id, :name, :dragable, :clip
-               attr_accessor :mouse_events, :repeat_events
+               attr_reader :collection, :id, :name, :dragable, :clip,
+                           :mouse_events, :repeat_events
 
                def initialize(collection, id, name)
                        @collection = collection
@@ -57,6 +55,14 @@ module Redact
                        @id <=> b.id
                end
 
+               def mouse_events=(val)
+                       @mouse_events = (val == true)
+               end
+
+               def repeat_events=(val)
+                       @repeat_events = (val == true)
+               end
+
                def clip=(part)
                        if part == self
                                raise(ArgumentError, "cannot clip part to itself")
@@ -104,6 +110,7 @@ module Redact
                         "dragable.y" => [@dragable.enabled[1], :char],
                         "dragable.step_y" => [@dragable.step[1]],
                         "dragable.count_y" => [@dragable.count[1]],
+                        "dragable.events_id" => [-1],
                         "dragable.counfine_id" => [confine_id]} # not a typo!
                end
 
@@ -122,22 +129,13 @@ module Redact
        end
 
        class TextPart < Part
-               EFFECT_NONE = 0
-               EFFECT_PLAIN = 1
-               EFFECT_OUTLINE = 2
-               EFFECT_SOFT_OUTLINE = 3
-               EFFECT_SHADOW = 4
-               EFFECT_SOFT_SHADOW = 5
-               EFFECT_OUTLINE_SHADOW = 6
-               EFFECT_OUTLINE_SOFT_SHADOW = 7
-
                attr_accessor :effect
 
                def initialize(collection, id, name)
                        super
 
                        @type = TYPE_TEXT
-                       @effect = EFFECT_NONE
+                       @effect = :none
                end
 
                protected
@@ -146,7 +144,20 @@ module Redact
                end
 
                def to_eet_properties
-                       super.merge!({"effect" => [@effect, :char]})
+                       effect = case @effect
+                       when :none: 0
+                       when :plain: 1
+                       when :outline: 2
+                       when :soft_outline: 3
+                       when :shadow: 4
+                       when :soft_shadow: 5
+                       when :outline_shadow: 6
+                       when :outline_soft_shadow: 7
+                       else
+                               raise(RedactError, "invalid effect value - #{@effect}")
+                       end
+
+                       super.merge!({"effect" => [effect, :char]})
                end
        end
 
@@ -190,13 +201,13 @@ module Redact
                attr_reader :rel, :to_id, :offset
 
                def initialize(rel, offset)
-                       @rel = [rel, rel]
+                       @rel = [rel.to_f, rel.to_f]
                        @to_id = [-1, -1]
                        @offset = [offset, offset]
                end
 
                def set_rel(x, y)
-                       @rel = [x, y]
+                       @rel = [x.to_f, y.to_f]
                end
 
                def set_offset(x, y)
@@ -204,13 +215,18 @@ module Redact
                end
 
                def to=(part)
-                       @to_id = [].fill(part.nil? ? -1 : part.id, 0..1)
+                       self.set_to(part)
+               end
+
+               def set_to(part_x, part_y = part_x)
+                       @to_id = [part_x.nil? ? -1 : part_x.id,
+                                 part_y.nil? ? -1 : part_y.id]
                end
        end
 
        class Description
-               attr_reader :rel, :aspect, :step
-               attr_accessor :visible, :aspect_preference, :color_class
+               attr_reader :rel, :aspect, :step, :visible, :color_class
+               attr_accessor :aspect_preference
 
                def initialize(name = "default", value = 0.0)
                        @name = name.to_str.dup.freeze
@@ -227,6 +243,28 @@ module Redact
                        @color_class = ""
                end
 
+               def inherit(other)
+                       unless other.is_a?(Description)
+                               raise(ArgumentError, "Cannot inherit from description")
+                       end
+
+                       prot = ["@name", "@value"]
+
+                       (instance_variables - prot).each do |v|
+                               n = other.instance_variable_get(v.intern)
+                               n = n.dup rescue n
+                               instance_variable_set(v.intern, n)
+                       end
+               end
+
+               def visible=(v)
+                       @visible = (v == true)
+               end
+
+               def color_class=(v)
+                       @color_class = v.to_str.dup
+               end
+
                def set_step(x = 0, y = 0)
                        @step = [x, y]
                end
@@ -273,27 +311,21 @@ module Redact
                        pairs.map { |p| p.hex }
                end
 
-               def map_aspect_preference
-                       case @aspect_preference
-                       when :none
-                               0
-                       when :vertical
-                               1
-                       when :horizontal
-                               2
-                       when :both
-                               3
-                       else
-                               raise(RedactError, "invalid aspect preference value - " +
-                                     @aspect_preference.to_s)
-                       end
-               end
-
                def to_eet_name
                        "Edje_Part_Description"
                end
 
                def to_eet_properties
+                       asp_pref = case @aspect_preference
+                       when :none: 0
+                       when :vertical: 1
+                       when :horizontal: 2
+                       when :both: 3
+                       else
+                               raise(RedactError, "invalid aspect preference value - " +
+                                     @aspect_preference.to_s)
+                       end
+
                        {"state.name" => [@name],
                         "state.value" => [@value, :double],
                         "visible" => [@visible],
@@ -307,7 +339,7 @@ module Redact
                         "step.y" => [@step[1]],
                         "aspect.min" => [@aspect[0], :double],
                         "aspect.max" => [@aspect[1], :double],
-                        "aspect.prefer" => [map_aspect_preference, :char],
+                        "aspect.prefer" => [asp_pref, :char],
                         "rel1.relative_x" => [@rel[0].rel[0], :double],
                         "rel1.relative_y" => [@rel[0].rel[1], :double],
                         "rel1.offset_x" => [@rel[0].offset[0]],
@@ -333,6 +365,7 @@ module Redact
                         "border.r" => [0],
                         "border.t" => [0],
                         "border.b" => [0],
+                        "border.no_fill" => [false],
                         "fill.smooth" => [true],
                         "fill.pos_rel_x" => [0.0, :double],
                         "fill.pos_abs_x" => [0],
@@ -372,6 +405,7 @@ module Redact
                        @id = image.id
                end
 
+               protected
                def to_eet_name
                        "Edje_Part_Image_Id"
                end
@@ -379,18 +413,34 @@ module Redact
 
        class Tweens < Array
                def <<(im)
-                       image = EDJE.image_dir.find { |e| e.filename == im }
+                       im2 = find_image(im.to_str.strip)
+                       raise(RedactError, "cannot find image - #{im}") if im2.nil?
+
+                       image = EDJE.image_dir.find { |e| e.filename == im2 }
                        if image.nil?
-                               image = ImageDirectoryEntry.new(im)
+                               image = ImageDirectoryEntry.new(im, im2)
                                EDJE.image_dir << image
                        end
 
                        super(Tween.new(image))
                end
+
+               private
+               def find_image(file)
+                       [".", OPTIONS.image_dir].each do |d|
+                               f2 = File.join(d, file)
+                               return Pathname.new(f2).cleanpath.to_s if File.file?(f2)
+                       end
+
+                       nil
+               end
+
        end
 
        class ImageDescription < Description
-               attr_reader :image, :auto_rel, :tweens
+               attr_reader :image, :auto_rel, :tweens, :border_fill_middle,
+                           :fill_smooth, :fill_pos_rel, :fill_pos_abs,
+                           :fill_rel, :fill_abs
 
                def initialize(name = "default", value = 0.0)
                        super
@@ -398,16 +448,30 @@ module Redact
                        @image = nil
                        @tweens = Tweens.new
                        @border = [0, 0, 0, 0]
+                       @border_fill_middle = true
+
                        @fill_smooth = true
+                       @fill_pos_rel = [0.0, 0.0]
+                       @fill_pos_abs = [0, 0]
+                       @fill_rel = [1.0, 1.0]
+                       @fill_abs = [0, 0]
+
                        @auto_rel = false
                end
 
+               def border_fill_middle=(var)
+                       @border_fill_middle = (var == true)
+               end
+
                def image=(im)
-                       return if !@image.nil? && im == @image.filename
+                       im2 = find_image(im.to_str.strip)
+                       raise(RedactError, "cannot find image - #{im}") if im2.nil?
+
+                       return if !@image.nil? && im2 == @image.filename
 
-                       @image = EDJE.image_dir.find { |e| e.filename == im }
+                       @image = EDJE.image_dir.find { |e| e.filename == im2 }
                        if @image.nil?
-                               @image = ImageDirectoryEntry.new(im)
+                               @image = ImageDirectoryEntry.new(im, im2)
                                EDJE.image_dir << @image
                        end
 
@@ -427,9 +491,30 @@ module Redact
                end
 
                def set_border(l = 0, r = 0, t = 0, b = 0)
-                       @border = [r, r, t, b]
+                       @border = [l, r, t, b]
+               end
+
+               def fill_smooth=(v)
+                       @fill_smooth = (v == true)
+               end
+
+               def set_fill_pos_rel(x, y)
+                       @fill_pos_rel = [x.to_f, y.to_f]
+               end
+
+               def set_fill_pos_abs(x, y)
+                       @fill_pos_abs = [x.to_i, y.to_i]
+               end
+
+               def set_fill_rel(x, y)
+                       @fill_rel = [x.to_f, y.to_f]
                end
 
+               def set_fill_abs(x, y)
+                       @fill_abs = [x.to_i, y.to_i]
+               end
+
+               protected
                def to_eet_properties
                        super.merge!(
                        {"image.id" => [@image.nil? ? -1 : @image.id],
@@ -438,21 +523,31 @@ module Redact
                         "border.r" => [@border[1]],
                         "border.t" => [@border[2]],
                         "border.b" => [@border[3]],
+                        "border.no_fill" => [!@border_fill_middle],
                         "fill.smooth" => [@fill_smooth],
-                        "fill.pos_rel_x" => [0.0, :double],
-                        "fill.pos_abs_x" => [0],
-                        "fill.rel_x" => [1.0, :double],
-                        "fill.abs_x" => [0],
-                        "fill.pos_rel_y" => [0.0, :double],
-                        "fill.pos_abs_y" => [0],
-                        "fill.rel_y" => [1.0, :double],
-                        "fill.abs_y" => [0]})
+                        "fill.pos_rel_x" => [@fill_pos_rel[0], :double],
+                        "fill.pos_abs_x" => [@fill_pos_abs[0]],
+                        "fill.rel_x" => [@fill_rel[0], :double],
+                        "fill.abs_x" => [@fill_abs[0]],
+                        "fill.pos_rel_y" => [@fill_pos_rel[1], :double],
+                        "fill.pos_abs_y" => [@fill_pos_abs[1]],
+                        "fill.rel_y" => [@fill_rel[1], :double],
+                        "fill.abs_y" => [@fill_abs[1]]})
+               end
+
+               private
+               def find_image(file)
+                       [".", OPTIONS.image_dir].each do |d|
+                               f2 = File.join(d, file)
+                               return Pathname.new(f2).cleanpath.to_s if File.file?(f2)
+                       end
+
+                       nil
                end
        end
 
        class TextDescription < Description
-               attr_reader :font
-               attr_accessor :text, :font_size, :text_class
+               attr_reader :font, :text, :font_size, :text_class
 
                def initialize(name = "default", value = 0.0)
                        super
@@ -470,6 +565,18 @@ module Redact
                        @text_id_text_source = -1
                end
 
+               def text=(v)
+                       @text = v.to_str.dup
+               end
+
+               def font_size=(v)
+                       @font_size = v.to_int
+               end
+
+               def text_class=(v)
+                       @text_class = v.to_str.dup
+               end
+
                def set_fit(x = false, y = false)
                        @fit = [x, y]
                end
@@ -483,15 +590,22 @@ module Redact
                end
 
                def font=(f)
-                       md = f.to_str.match(/.*\.ttf/)
+                       f = f.to_str.strip
+                       md = f.match(/.*\.ttf$/)
                        unless md.nil?
-                               found = EDJE.font_dir.find { |font| font.filename == f }
+                               f2 = find_font(f)
+                               raise(RedactError, "cannot find font - #{f}") if f2.nil?
+
+                               found = EDJE.font_dir.find { |font| font.filename == f2 }
                                if found.nil?
-                                       EDJE.font_dir << FontDirectoryEntry.new(f)
+                                       EDJE.font_dir << FontDirectoryEntry.new(f, f2)
+                                       @font = EDJE.font_dir.last.alias
+                               else
+                                       @font = found.alias
                                end
+                       else
+                               @font = f
                        end
-
-                       @font = f.dup
                end
 
                def outline_color=(c)
@@ -502,6 +616,7 @@ module Redact
                        @shadow_color = parse_hex_color(c)
                end
 
+               protected
                def to_eet_properties
                        super.merge!(
                        {"color2.r" => [@outline_color[0], :char],
@@ -525,5 +640,15 @@ module Redact
                         "text.id_source" => [@text_id_source],
                         "text.id_text_source" => [@text_id_text_source]})
                end
+
+               private
+               def find_font(file)
+                       [".", OPTIONS.font_dir].each do |d|
+                               f2 = File.join(d, file)
+                               return Pathname.new(f2).cleanpath.to_s if File.file?(f2)
+                       end
+
+                       nil
+               end
        end
 end