lib/dogviz.rb in dogviz-0.0.16 vs lib/dogviz.rb in dogviz-0.0.17
- old
+ new
@@ -101,10 +101,15 @@
rollup? || under_rollup?
end
def on_top_rollup?
rollup? && !under_rollup?
end
+ def inherited_render_options
+ inherited = {}
+ inherited[:fontname] = parent.render_options[:fontname] if parent.render_options.include?(:fontname)
+ inherited
+ end
end
module Parent
def find_all(&matcher)
raise MissingMatchBlockError.new unless block_given?
@by_name.find_all &matcher
@@ -133,17 +138,43 @@
@children << child
child
end
end
+ class Colorizer
+ def initialize
+ @i = 0
+ @colors = %w(#9e0142
+#d53e4f
+#e45d33
+#ed9e61
+#762a83
+#9970ab
+#c6f578
+#abdda4
+#66c2a5
+#3288bd
+#5e4fa2)
+ end
+
+ def next
+ color = @colors[@i]
+ @i += 1
+ @i = 0 unless @i < @colors.length
+ color
+ end
+ end
+
class Thing
include Common
include Nominator
include Flowable
attr_reader :parent
attr_reader :name, :id, :pointers, :edge_heads
+ @@colorizer = Colorizer.new
+
def initialize(parent, name, options = {})
@parent = parent
@name = name
@id = create_id(name, parent)
@pointers = []
@@ -154,21 +185,15 @@
rollup! if options[:rollup]
options.delete(:rollup)
@render_options = options
- setup_render_attributes label: name
+ setup_render_attributes({label: name}.merge inherited_render_options)
parent.register name, self
end
- def do_render_node(renderer)
- render_options = @render_options
- attributes = @attributes
- renderer.render_node(parent, id, render_options, attributes)
- end
-
def points_to_all(*others)
others.each {|other|
points_to other
}
end
@@ -178,28 +203,43 @@
other
end
def render(renderer)
do_render_node(renderer) unless in_rollup? || in_skip?
- end
+ end
def render_edges(renderer)
pointers.each {|p|
render_pointer p, renderer
}
end
private
+ def do_render_node(renderer)
+ render_options = @render_options
+ attributes = @attributes
+ renderer.render_node(parent, id, render_options, attributes)
+ end
+
def setup_render_edge(other, options)
pointers << {
other: other,
options: {
- label: options[:name],
+ xlabel: options[:name],
style: options[:style]
- }
+ }.merge(inherited_render_options)
}
+
+ if options[:colorize] || root.colorize_edges?
+ edge_color = next_colorizer_color
+ pointers.last[:options].merge!({
+ color: edge_color,
+ fontcolor: edge_color
+ })
+ end
+
end
def render_pointer(pointer, renderer)
other = pointer[:other]
while (other.in_rollup? && !other.on_top_rollup?) do
@@ -245,10 +285,14 @@
resolved << next_in_line
end
}
resolved
end
+
+ def next_colorizer_color
+ @@colorizer.next
+ end
end
class Container
include Common
include Nominator
@@ -267,11 +311,11 @@
init_rollup options
setup_render_attributes label: name
- @render_options = options
+ @render_options = options.merge inherited_render_options
parent.register name, self
end
def register(name, thing)
@@ -517,14 +561,16 @@
include Nominator
attr_reader :render_hints, :title, :children, :graph
alias :name :title
+ alias :render_options :render_hints
def initialize(name, hints = {splines: 'line'})
@children = []
@by_name = Registry.new name
+ @non_render_hints = remove_dogviz_hints!(hints)
@render_hints = hints
@title = create_title(name)
@rendered = false
end
@@ -565,10 +611,22 @@
def register(name, thing)
@by_name.register name, thing
end
+ def colorize_edges?
+ @non_render_hints[:colorize_edges]
+ end
+
private
+
+ def remove_dogviz_hints!(hints)
+ dogviz_only_hints = {}
+ %i(colorize_edges).each {|k|
+ dogviz_only_hints[k] = hints.delete k
+ }
+ dogviz_only_hints
+ end
def create_title(name)
now = DateTime.now
"#{now.strftime '%H:%M'} #{name} #{now.strftime '%F'}"
end