X-Git-Url: https://projects.mako.cc/source/selectricity-live/blobdiff_plain/1a62f78f4f3818ab697bddf51f80a1ba150ce9e7..131cab23209cb1dfa81930240b8cf722d2302131:/lib/gruff-0.2.8/lib/gruff/mini/legend.rb diff --git a/lib/gruff-0.2.8/lib/gruff/mini/legend.rb b/lib/gruff-0.2.8/lib/gruff/mini/legend.rb new file mode 100644 index 0000000..25039cf --- /dev/null +++ b/lib/gruff-0.2.8/lib/gruff/mini/legend.rb @@ -0,0 +1,77 @@ +module Gruff + module Mini + module Legend + + ## + # The canvas needs to be bigger so we can put the legend beneath it. + + def expand_canvas_for_vertical_legend + @original_rows = @raw_rows + @rows += @data.length * calculate_caps_height(scale_fontsize(@legend_font_size)) * 1.7 + render_background + end + + ## + # Draw the legend beneath the existing graph. + + def draw_vertical_legend + + @legend_labels = @data.collect {|item| item[Gruff::Base::DATA_LABEL_INDEX] } + + legend_square_width = 40.0 # small square with color of this item + legend_square_margin = 10.0 + @legend_left_margin = 40.0 + legend_top_margin = 40.0 + + # May fix legend drawing problem at small sizes + @d.font = @font if @font + @d.pointsize = @legend_font_size + + current_x_offset = @graph_left + @legend_left_margin + current_y_offset = @original_rows + legend_top_margin + + debug { @d.line 0.0, current_y_offset, @raw_columns, current_y_offset } + + @legend_labels.each_with_index do |legend_label, index| + + # Draw label + @d.fill = @font_color + @d.font = @font if @font + @d.pointsize = scale_fontsize(@legend_font_size) + @d.stroke = 'transparent' + @d.font_weight = Magick::NormalWeight + @d.gravity = Magick::WestGravity + @d = @d.annotate_scaled( @base_image, + @raw_columns, 1.0, + current_x_offset + (legend_square_width * 1.7), current_y_offset, + truncate_legend_label(legend_label), @scale) + + # Now draw box with color of this dataset + @d = @d.stroke 'transparent' + @d = @d.fill @data[index][Gruff::Base::DATA_COLOR_INDEX] + @d = @d.rectangle(current_x_offset, + current_y_offset - legend_square_width / 2.0, + current_x_offset + legend_square_width, + current_y_offset + legend_square_width / 2.0) + + current_y_offset += calculate_caps_height(@legend_font_size) * 1.7 + end + @color_index = 0 + end + + ## + # Shorten long labels so they will fit on the canvas. + # + # Department of Hu... + + def truncate_legend_label(label) + truncated_label = label.to_s + while calculate_width(scale_fontsize(@legend_font_size), truncated_label) > (@columns - @legend_left_margin - Gruff::Base::RIGHT_MARGIN) && (truncated_label.length > 1) + truncated_label = truncated_label[0..truncated_label.length-2] + end + truncated_label + (truncated_label.length < label.to_s.length ? "…" : '') + end + + end + end +end