X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=lib%2Fredact%2Fpart.rb;h=0fd4139eeca2234f8525ccbe240c3df9ffc4d93e;hb=HEAD;hp=6b0b53696594223af9ac5991cd4e7f2d26d20417;hpb=2c25c90e2aaf57a7508a7988f58b2784d5071a7e;p=redact.git diff --git a/lib/redact/part.rb b/lib/redact/part.rb index 6b0b536..0fd4139 100644 --- a/lib/redact/part.rb +++ b/lib/redact/part.rb @@ -1,6 +1,4 @@ #-- -# $Id: part.rb 1 2005-03-26 01:32:38Z 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,19 +55,25 @@ 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 self == part + if part == self raise(ArgumentError, "cannot clip part to itself") - elsif part.nil? - @clip = nil - elsif part.collection != @collection - raise(ArgumentError, "parts' collections not identical") + elsif !part.nil? && part.collection != @collection + raise(ArgumentError, "items not in the same collection") else @clip = part end end - def description(name = "default", value = 0.0) + def description(name = "default", value = 0.0) # :yields: desc d = @descriptions[desc_key(name, value)] block_given? ? (yield d) : d @@ -106,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 @@ -124,22 +129,18 @@ 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 + @use_alternate_font_metrics = false + end + + def use_alternate_font_metrics=(b) + @use_alternate_font_metrics = (b == true) end protected @@ -148,7 +149,22 @@ 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], + "use_alternate_font_metrics" => [@use_alternate_font_metrics, :char]}) end end @@ -178,10 +194,10 @@ module Redact end def confine=(part) - if part == self + if part == @part raise(ArgumentError, "cannot confine part to itself") elsif !part.nil? && part.collection != @part.collection - raise(ArgumentError, "parts' collections not identical") + raise(ArgumentError, "items not in the same collection") else @confine = part end @@ -192,13 +208,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) @@ -206,13 +222,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 - attr_accessor :visible + 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 @@ -221,13 +242,44 @@ module Redact @align = [0.5, 0.5] @min = [0, 0] @max = [-1, -1] - @step_x = 0 - @step_y = 0 + @step = [0, 0] + @aspect = [0.0, 0.0] + @aspect_preference = :none @rel = [Relation.new(0.0, 0), Relation.new(1.0, -1)] @color = [].fill(255, 0..3) @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 + + def set_aspect(x = 0.0, y = 0.0) + @aspect = [x, y] + end + def set_align(x = 0.5, y = 0.5) @align = [x, y] end @@ -271,6 +323,16 @@ module Redact 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], @@ -280,11 +342,11 @@ module Redact "min.h" => [@min[1]], "max.w" => [@max[0]], "max.h" => [@max[1]], - "step.x" => [@step_x], - "step.y" => [@step_y], - "aspect.min" => [0.0, :double], - "aspect.max" => [0.0, :double], - "aspect.prefer" => [0, :char], + "step.x" => [@step[0]], + "step.y" => [@step[1]], + "aspect.min" => [@aspect[0], :double], + "aspect.max" => [@aspect[1], :double], + "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]], @@ -310,6 +372,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], @@ -349,6 +412,7 @@ module Redact @id = image.id end + protected def to_eet_name "Edje_Part_Image_Id" end @@ -356,18 +420,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 @@ -375,16 +455,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 @@ -404,9 +498,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], @@ -415,21 +530,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 + attr_reader :font, :text, :font_size, :text_class def initialize(name = "default", value = 0.0) super @@ -442,11 +567,24 @@ module Redact @font_size = 0 @fit = [false, false] @text_min = [false, false] + @text_max = [false, false] @text_align = [0.5, 0.5] @text_id_source = -1 @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 @@ -455,20 +593,31 @@ module Redact @text_min = [x, y] end + def set_text_max(x = false, y = false) + @text_max = [x, y] + end + def set_text_align(x = 0.5, y = 0.5) @text_align = [x, y] 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) @@ -479,6 +628,7 @@ module Redact @shadow_color = parse_hex_color(c) end + protected def to_eet_properties super.merge!( {"color2.r" => [@outline_color[0], :char], @@ -497,10 +647,22 @@ module Redact "text.fit_y" => [@fit[1]], "text.min_x" => [@text_min[0]], "text.min_y" => [@text_min[1]], + "text.max_x" => [@text_max[0]], + "text.max_y" => [@text_max[1]], "text.align.x" => [@text_align[0], :double], "text.align.y" => [@text_align[1], :double], "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