X-Git-Url: https://projects.mako.cc/source/selectricity/blobdiff_plain/1a62f78f4f3818ab697bddf51f80a1ba150ce9e7..131cab23209cb1dfa81930240b8cf722d2302131:/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 index 0000000..7240da0 --- /dev/null +++ b/lib/gruff-0.2.8/lib/gruff/photo_bar.rb @@ -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 +