[macruby-changes] [483] MacRuby/trunk/lib/hotcocoa/layout_view.rb

source_changes at macosforge.org source_changes at macosforge.org
Mon Aug 25 20:22:46 PDT 2008


Revision: 483
          http://trac.macosforge.org/projects/ruby/changeset/483
Author:   rich at infoether.com
Date:     2008-08-25 20:22:46 -0700 (Mon, 25 Aug 2008)
Log Message:
-----------
changed the layout class a lot to simplify the use of it

Modified Paths:
--------------
    MacRuby/trunk/lib/hotcocoa/layout_view.rb

Modified: MacRuby/trunk/lib/hotcocoa/layout_view.rb
===================================================================
--- MacRuby/trunk/lib/hotcocoa/layout_view.rb	2008-08-26 02:25:45 UTC (rev 482)
+++ MacRuby/trunk/lib/hotcocoa/layout_view.rb	2008-08-26 03:22:46 UTC (rev 483)
@@ -14,6 +14,8 @@
 end
 
 class LayoutOptions
+
+  VALID_EXPANSIONS = [nil, :height, :width, [:height, :width], [:width, :height]]
   
   attr_accessor :defaults_view
   attr_reader   :view
@@ -24,11 +26,11 @@
   #    Whether the view is packed at the start or the end of the packing view.
   #    Default value is true.
   #
-  #  :expand -> bool
+  #  :expand -> :vertical, :horizontal, [:vertical, :horizontal]
   #    Whether the view's first dimension (width for horizontal and height for vertical)
   #    should be expanded to the maximum possible size, and should be variable according
   #    to the packing view frame.
-  #    Default value is false.
+  #    Default value is nil.
   #
   #  :padding         -> float
   #  :left_padding    -> float
@@ -40,27 +42,29 @@
   #    padding flags are ignored.
   #    Default value is 0.0 for all flags.
   #
-  #  :other -> mode
-  #    Controls the view's second dimension (height for horizontal and width for vertical).
+  #  :align -> mode
+  #    Controls the view's alignment if its not expanded in the other dimension
   #    Modes can be:
-  #      :align_head
-  #        Will be aligned to the head (start) of the packing area.
-  #      :align_center
-  #        Will be centered inside the packing area.
-  #      :align_tail
-  #        Will be aligned to the tail (end) of the packing area.
-  #      :fill
-  #        Will be filled to the maximum size.
+  #      :left
+  #        For horizontal layouts, align left
+  #      :center
+  #        Align center for horizontal or vertical layouts
+  #      :right
+  #        For horizontal layouts, align right
+  #      :top
+  #        For vertical layouts, align top
+  #      :bottom
+  #        For vertical layouts, align bottom
   def initialize(view, options={})
     @view = view
     @start          = options[:start]
     @expand         = options[:expand]
     @padding        = options[:padding]
-    @left_padding   = options[:left_padding]    || @padding
-    @right_padding  = options[:right_padding]   || @padding
-    @top_padding    = options[:top_padding]     || @padding
-    @bottom_padding = options[:bottom_padding]  || @padding
-    @other          = options[:other]
+    @left_padding   = @padding || options[:left_padding]
+    @right_padding  = @padding || options[:right_padding]
+    @top_padding    = @padding || options[:top_padding]
+    @bottom_padding = @padding || options[:bottom_padding]
+    @align          = options[:align]
     @defaults_view  = options[:defaults_view]
   end
   
@@ -81,18 +85,31 @@
   
   def expand=(value)
     return if value == @expand
+    unless VALID_EXPANSIONS.include?(value)
+      raise ArgumentError, "Expand must be nil, :height, :width or [:width, :height] not #{value.inspect}"
+    end
     @expand = value
     update_layout_views!
   end
   
-  def expand?
+  def expand
     return @expand unless @expand.nil?
     if in_layout_view?
-      @view.superview.default_layout.expand?
+      @view.superview.default_layout.expand
     else
       false
     end
   end
+
+  def expand_width?
+    e = self.expand
+    e == :width || (e.respond_to?(:include?) && e.include?(:width))
+  end
+
+  def expand_height?
+    e = self.expand
+    e == :height || (e.respond_to?(:include?) && e.include?(:height))
+  end
   
   def left_padding=(value)
     return if value == @left_padding
@@ -158,18 +175,18 @@
     end
   end
   
-  def other
-    return @other unless @other.nil?
+  def align
+    return @align unless @align.nil?
     if in_layout_view?
-      @view.superview.default_layout.other
+      @view.superview.default_layout.align
     else
-      :align_head
+      :left
     end
   end
 
-  def other=(value)
-    return if value == @other
-    @other = value
+  def align=(value)
+    return if value == @align
+    @align = value
     update_layout_views!
   end
   
@@ -185,7 +202,7 @@
   end
   
   def inspect
-    "#<#{self.class} start=#{start?}, expand=#{expand?}, left_padding=#{left_padding}, right_padding=#{right_padding}, top_padding=#{top_padding}, bottom_padding=#{bottom_padding}, other=#{other.inspect}, view=#{view.inspect}>"
+    "#<#{self.class} start=#{start?}, expand=#{expand.inspect}, left_padding=#{left_padding}, right_padding=#{right_padding}, top_padding=#{top_padding}, bottom_padding=#{bottom_padding}, align=#{align.inspect}, view=#{view.inspect}>"
   end
 
   def update_layout_views!
@@ -322,7 +339,7 @@
     expandable_views = 0
     subviews.each do |view|
       next if !view.respond_to?(:layout) || view.layout.nil?
-      if view.layout.expand?
+      if (vertical ? view.layout.expand_height? : view.layout.expand_width?)
         expandable_views += 1
       else
         expandable_size -= vertical ? view.frameSize.height : view.frameSize.width
@@ -354,7 +371,7 @@
         view_frame.origin.y = @margin
       end
 
-      if options.expand?
+      if (vertical ? options.expand_height? : options.expand_width?)
         if vertical
           view_frame.size.height = expandable_size
         else
@@ -362,31 +379,32 @@
         end
         subview_dimension = expandable_size
       end
-
-      case options.other
-      when :fill
+      
+      if (vertical ? options.expand_width? : options.expand_height?)
         if vertical
           view_frame.size.width = view_size.width - (2 * @margin)
         else
           view_frame.size.height = view_size.height - (2 * @margin)
-        end           
+        end
+      else
+        case options.align
+        when :left, :bottom
+          # Nothing to do
 
-      when :align_head
-        # Nothing to do
+        when :center
+          if vertical
+            view_frame.origin.x = (view_size.width / 2.0) - (subview_size.width / 2.0)
+          else
+            view_frame.origin.y = (view_size.height / 2.0) - (subview_size.height / 2.0)
+          end
 
-      when :align_center
-        if vertical
-          view_frame.origin.x = (view_size.width / 2.0) - (subview_size.width / 2.0)
-        else
-          view_frame.origin.y = (view_size.height / 2.0) - (subview_size.height / 2.0)
+        when :right, :top
+          if vertical
+            view_frame.origin.x = view_size.width - subview_size.width - @margin
+          else
+            view_frame.origin.y = view_size.height - subview_size.height - @margin
+          end
         end
-
-      when :align_tail
-        if vertical
-          view_frame.origin.x = view_size.width - subview_size.width - @margin
-        else
-          view_frame.origin.y = view_size.height - subview_size.height - @margin
-        end
       end
 
       puts "view #{view} options #{options} final frame #{view_frame}" if $DEBUG
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macruby-changes/attachments/20080825/91db7a61/attachment.html 


More information about the macruby-changes mailing list