Added the Gruff library to the lib/ directory of the the rails folder, and the
[selectricity] / lib / gruff-0.2.8 / lib / gruff / photo_bar.rb
diff --git a/lib/gruff-0.2.8/lib/gruff/photo_bar.rb b/lib/gruff-0.2.8/lib/gruff/photo_bar.rb
new file mode 100644 (file)
index 0000000..7240da0
--- /dev/null
@@ -0,0 +1,100 @@
+require File.dirname(__FILE__) + '/base'
+
+# EXPERIMENTAL!
+#
+# Doesn't work yet.
+#
+class Gruff::PhotoBar < Gruff::Base
+
+# TODO
+#
+# define base and cap in yml
+# allow for image directory to be located elsewhere
+# more exact measurements for bar heights (go all the way to the bottom of the graph)
+# option to tile images instead of use a single image
+# drop base label a few px lower so photo bar graphs can have a base dropping over the lower marker line
+#
+
+  # The name of a pre-packaged photo-based theme.
+  attr_reader :theme
+
+#   def initialize(target_width=800)
+#     super
+#     init_photo_bar_graphics()
+#   end
+
+  def draw
+    super
+    return unless @has_data
+
+    return # TODO Remove for further development
+
+    init_photo_bar_graphics()
+    
+    #Draw#define_clip_path()
+    #Draw#clip_path(pathname)
+    #Draw#composite....with bar graph image OverCompositeOp
+    #
+    # See also
+    #
+    # Draw.pattern # define an image to tile as the filling of a draw object
+    # 
+
+    # Setup spacing.
+    #
+    # Columns sit side-by-side.
+    spacing_factor = 0.9
+    @bar_width = @norm_data[0][DATA_COLOR_INDEX].columns
+
+    @norm_data.each_with_index do |data_row, row_index|
+  
+      data_row[1].each_with_index do |data_point, point_index|
+        data_point = 0 if data_point.nil?
+        # Use incremented x and scaled y
+        left_x = @graph_left + (@bar_width * (row_index + point_index + ((@data.length - 1) * point_index)))
+        left_y = @graph_top + (@graph_height - data_point * @graph_height) + 1
+        right_x = left_x + @bar_width * spacing_factor
+        right_y = @graph_top + @graph_height - 1
+      
+        bar_image_width = data_row[DATA_COLOR_INDEX].columns
+        bar_image_height = right_y.to_f - left_y.to_f
+      
+        # Crop to scale for data
+        bar_image = data_row[DATA_COLOR_INDEX].crop(0, 0, bar_image_width, bar_image_height)
+        
+        @d.gravity = NorthWestGravity
+        @d = @d.composite(left_x, left_y, bar_image_width, bar_image_height, bar_image)
+      
+        # Calculate center based on bar_width and current row
+        label_center = @graph_left + (@data.length * @bar_width * point_index) + (@data.length * @bar_width / 2.0)
+        draw_label(label_center, point_index)
+      end
+
+    end
+
+    @d.draw(@base_image)    
+  end
+
+
+  # Return the chosen theme or the default
+  def theme
+    @theme || 'plastik'
+  end
+
+protected
+
+  # Sets up colors with a list of images that will be used.
+  # Images should be 340px tall
+  def init_photo_bar_graphics    
+    color_list = Array.new
+    theme_dir = File.dirname(__FILE__) + '/../../assets/' + theme
+
+    Dir.open(theme_dir).each do |file|
+      next unless /\.png$/.match(file)
+      color_list << Image.read("#{theme_dir}/#{file}").first
+    end
+    @colors = color_list
+  end
+
+end
+

Benjamin Mako Hill || Want to submit a patch?