rubyvis 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. data/History.txt +9 -1
  2. data/Manifest.txt +9 -4
  3. data/README.txt +59 -8
  4. data/examples/antibiotics/antibiotics.rb +16 -8
  5. data/examples/area.rb +6 -49
  6. data/examples/bar_column_chart.rb +4 -0
  7. data/examples/crimea/{crimea.rb → crimea_data.rb} +0 -0
  8. data/examples/crimea/crimea_grouped_bar.rb +2 -2
  9. data/examples/crimea/crimea_line.rb +1 -1
  10. data/examples/dot.rb +7 -8
  11. data/examples/first.rb +4 -0
  12. data/examples/grouped_charts.rb +3 -0
  13. data/examples/line.rb +19 -61
  14. data/examples/line_and_step.rb +4 -0
  15. data/examples/nested_grid.rb +53 -0
  16. data/examples/scatterplot.rb +2 -0
  17. data/examples/second.rb +14 -2
  18. data/examples/third.rb +9 -6
  19. data/lib/rubyvis/color/color.rb +8 -6
  20. data/lib/rubyvis/color/colors.rb +4 -6
  21. data/lib/rubyvis/format/number.rb +2 -2
  22. data/lib/rubyvis/internals.rb +15 -3
  23. data/lib/rubyvis/javascript_behaviour.rb +20 -8
  24. data/lib/rubyvis/layout/stack.rb +13 -16
  25. data/lib/rubyvis/mark/anchor.rb +64 -2
  26. data/lib/rubyvis/mark/area.rb +4 -3
  27. data/lib/rubyvis/mark/bar.rb +51 -2
  28. data/lib/rubyvis/mark/dot.rb +88 -5
  29. data/lib/rubyvis/mark/label.rb +94 -3
  30. data/lib/rubyvis/mark/line.rb +3 -2
  31. data/lib/rubyvis/mark/panel.rb +1 -0
  32. data/lib/rubyvis/mark/rule.rb +2 -1
  33. data/lib/rubyvis/mark/wedge.rb +2 -1
  34. data/lib/rubyvis/mark.rb +419 -54
  35. data/lib/rubyvis/nest.rb +20 -20
  36. data/lib/rubyvis/scale/linear.rb +1 -1
  37. data/lib/rubyvis/scale/log.rb +1 -1
  38. data/lib/rubyvis/scale/ordinal.rb +120 -8
  39. data/lib/rubyvis/scale/quantitative.rb +159 -15
  40. data/lib/rubyvis/scale.rb +1 -1
  41. data/lib/rubyvis/scene/svg_area.rb +12 -12
  42. data/lib/rubyvis/scene/svg_line.rb +5 -5
  43. data/lib/rubyvis/scene/svg_panel.rb +1 -1
  44. data/lib/rubyvis/scene/svg_scene.rb +1 -1
  45. data/lib/rubyvis.rb +35 -6
  46. data/spec/anchor_spec.rb +15 -15
  47. data/web/Rakefile +34 -0
  48. data/web/build_site.rb +86 -0
  49. data/web/examples.haml +26 -0
  50. data/web/index.haml +97 -0
  51. data/web/style.css +82 -0
  52. data.tar.gz.sig +0 -0
  53. metadata +14 -9
  54. metadata.gz.sig +0 -0
  55. data/lib/rubyvis/label.rb +0 -1
  56. data/web/first.svg +0 -1
  57. data/web/index.html +0 -48
data/lib/rubyvis/mark.rb CHANGED
@@ -1,11 +1,131 @@
1
1
  module Rubyvis
2
- # Represents a data-driven graphical mark. The <tt>Mark</tt> class is
3
- # the base class for all graphical marks in Protovis; it does not provide any
4
- # specific rendering functionality, but together with {@link Panel} establishes
5
- # the core framework.
2
+ # Constructs a new mark with default properties. Marks, with the exception of
3
+ # the root panel, are not typically constructed directly; instead, they are
4
+ # added to a panel or an existing mark via Mark#add
5
+ #
6
+ # Represents a data-driven graphical mark. The +Mark+ class is
7
+ # the base class for all graphical marks in Protovis; it does not provide any
8
+ # specific rendering functionality, but together with Panel establishes
9
+ # the core framework.
10
+ #
11
+ # Concrete mark types include familiar visual elements such as bars, lines
12
+ # and labels. Although a bar mark may be used to construct a bar chart, marks
13
+ # know nothing about charts; it is only through their specification and
14
+ # composition that charts are produced. These building blocks permit many
15
+ # combinatorial possibilities.
16
+ #
17
+ # Marks are associated with <b>data</b>: a mark is generated once per
18
+ # associated datum, mapping the datum to visual <b>properties</b> such as
19
+ # position and color. Thus, a single mark specification represents a set of
20
+ # visual elements that share the same data and visual encoding. The type of
21
+ # mark defines the names of properties and their meaning. A property may be
22
+ # static, ignoring the associated datum and returning a constant; or, it may be
23
+ # dynamic, derived from the associated datum or index. Such dynamic encodings
24
+ # can be specified succinctly using anonymous functions. Special properties
25
+ # called event handlers can be registered to add interactivity.
26
+ #
27
+ # Protovis uses <b>inheritance</b> to simplify the specification of related
28
+ # marks: a new mark can be derived from an existing mark, inheriting its
29
+ # properties. The new mark can then override properties to specify new
30
+ # behavior, potentially in terms of the old behavior. In this way, the old mark
31
+ # serves as the <b>prototype</b> for the new mark. Most mark types share the
32
+ # same basic properties for consistency and to facilitate inheritance.
33
+ #
34
+ # The prioritization of redundant properties is as follows:<ol>
35
+ #
36
+ # <li>If the <tt>width</tt> property is not specified (i.e., null), its value
37
+ # is the width of the parent panel, minus this mark's left and right margins;
38
+ # the left and right margins are zero if not specified.
39
+ #
40
+ # <li>Otherwise, if the <tt>right</tt> margin is not specified, its value is
41
+ # the width of the parent panel, minus this mark's width and left margin; the
42
+ # left margin is zero if not specified.
43
+ #
44
+ # <li>Otherwise, if the <tt>left</tt> property is not specified, its value is
45
+ # the width of the parent panel, minus this mark's width and the right margin.
46
+ #
47
+ # </ol>This prioritization is then duplicated for the <tt>height</tt>,
48
+ # <tt>bottom</tt> and <tt>top</tt> properties, respectively.
49
+ #
50
+ # While most properties are <i>variable</i>, some mark types, such as lines
51
+ # and areas, generate a single visual element rather than a distinct visual
52
+ # element per datum. With these marks, some properties may be <b>fixed</b>.
53
+ # Fixed properties can vary per mark, but not <i>per datum</i>! These
54
+ # properties are evaluated solely for the first (0-index) datum, and typically
55
+ # are specified as a constant. However, it is valid to use a function if the
56
+ # property varies between panels or is dynamically generated.
57
+ #
6
58
  class Mark
59
+ # Hash storing properties names for current Mark type.
7
60
  @properties={}
61
+
62
+ # The enclosing parent panel. The parent panel is generally undefined only for the root panel; however, it is possible to create "offscreen" marks that are used only for inheritance purposes.
63
+ # @attr [Panel]
64
+ attr_accessor :parent
65
+
66
+ # The root parent panel. This may be undefined for "offscreen" marks that are
67
+ # created for inheritance purposes only.
68
+ #
69
+ # @attr [Panel]
70
+ attr_accessor :root
71
+
72
+ # The child index. -1 if the enclosing parent panel is null; otherwise, the
73
+ # zero-based index of this mark into the parent panel's <tt>children</tt>
74
+ # array.
75
+ # @attr [Number]
76
+ attr_accessor :child_index
77
+
78
+
79
+ # The scene graph. The scene graph is an array of objects; each object
80
+ # (or "node") corresponds to an instance of this mark and an element in the
81
+ # data array. The scene graph can be traversed to lookup previously-evaluated
82
+ # properties.
83
+ attr_accessor :scene
84
+
85
+ # The mark prototype, possibly undefined, from which to inherit property
86
+ # functions. The mark prototype is not necessarily of the same type as this
87
+ # mark. Any properties defined on this mark will override properties inherited
88
+ # either from the prototype or from the type-specific defaults.
89
+ # @attr [Mark]
90
+ attr_accessor :proto
91
+
92
+ # The mark anchor target, possibly undefined.
93
+ # @attr [Mark]
94
+ attr_accessor :target
95
+
96
+ # The current scale factor, based on any enclosing transforms. The current
97
+ # scale can be used to create scale-independent graphics. For example, to
98
+ # define a dot that has a radius of 10 irrespective of any zooming, say:
99
+ #
100
+ # <pre>dot.shape_radius(lambda { 10 / self.scale})</pre>
101
+ #
102
+ # Note that the stroke width and font size are defined irrespective of scale
103
+ # (i.e., in screen space) already. Also note that when a transform is applied
104
+ # to a panel, the scale affects only the child marks, not the panel itself.
105
+ # @attr [Float]
106
+ # @see Panel#transform
107
+ attr_accessor :scale
108
+
109
+ # Array with stores properties values
110
+ attr_reader :_properties
111
+
112
+ # OpenStruct which store values for scenes
113
+ attr_accessor :binds
8
114
 
115
+
116
+ # Defines a setter-getter for the specified property.
117
+ #
118
+ # If a cast function has been assigned to the specified property name, the
119
+ # property function is wrapped by the cast function, or, if a constant is
120
+ # specified, the constant is immediately cast. Note, however, that if the
121
+ # property value is null, the cast function is not invoked.
122
+ #
123
+ # Parameters:
124
+ # * @param [String] name the property name.
125
+ # * @param [Boolean] +def+ whether is a property or a def.
126
+ # * @param [Proc] +cast+ the cast function for this property.
127
+ # * @param [Class] +klass+ the klass on which property will be added
128
+
9
129
  def self.property_method(name, _def, func=nil, klass=nil)
10
130
  return if klass.method_defined? name
11
131
  klass.send(:define_method, name) do |*arguments|
@@ -43,6 +163,7 @@ module Rubyvis
43
163
  end
44
164
  end
45
165
 
166
+ # Creates a dinamic property using property_method().
46
167
  def self.attr_accessor_dsl(*attr)
47
168
  attr.each do |sym|
48
169
  if sym.is_a? Array
@@ -60,34 +181,58 @@ module Rubyvis
60
181
  end
61
182
  end
62
183
 
184
+ # Delete index
185
+ # @private
63
186
  def delete_index
64
187
  @index=nil
65
188
  @index_defined=false
66
189
  end
190
+
191
+ # The mark index. The value of this field depends on which instance (i.e.,
192
+ # which element of the data array) is currently being evaluated. During the
193
+ # build phase, the index is incremented over each datum; when handling events,
194
+ # the index is set to the instance that triggered the event.
195
+ # @return [Integer]
67
196
  def index
68
197
  @index
69
198
  end
70
-
199
+ # Returns true if index attribute is set and not deleted
71
200
  def index_defined?
72
201
  @index_defined
73
202
  end
203
+ # Set index attribute.
74
204
  def index=(v)
75
205
  @index_defined=true
76
206
  @index=v
77
207
  v
78
208
  end
79
209
 
80
-
210
+ # Sets the value of the property <i>name</i> to <i>v</i>
81
211
  def property_value(name,v)
82
212
  prop=Property.new({:name=>name, :id=>Rubyvis.id, :value=>v})
83
213
  @_properties.delete_if{|v1| v1.name==name}
84
214
  @_properties.push(prop)
85
215
  #@_properties_values[name]=v
86
- return prop
216
+ prop
87
217
  end
218
+
219
+ # Alias for setting the left, right, top and bottom properties simultaneously.
220
+ #
221
+ # @see Mark#left
222
+ # @see Mark#right
223
+ # @see Mark#top
224
+ # @see Mark#bottom
225
+ # @return [Mark] self
88
226
  def margin(n)
89
227
  self.left(n).right(n).top(n).bottom(n)
90
228
  end
229
+
230
+
231
+ # @private Returns the current instance of this mark in the scene graph.
232
+ # This is typically equivalent to <tt>this.scene[this.index]</tt>, however if the scene or index is unset, the default instance of the mark is returned. If no default is set, the default is the last instance.
233
+ # Similarly, if the scene or index of the parent panel is unset, the default instance of this mark in the last instance of the enclosing panel is returned, and so on.
234
+ #
235
+ # @return a node in the scene graph.
91
236
  def instance(default_index=nil)
92
237
  scene=self.scene
93
238
  scene||=self.parent.instance(-1).children[self.child_index]
@@ -97,46 +242,143 @@ module Rubyvis
97
242
  scene[index<0 ? scene.size-1: index]
98
243
  end
99
244
 
100
-
101
-
102
- attr_accessor :parent, :root, :child_index, :scene, :proto, :target, :scale
103
- attr_reader :_properties
245
+ ##
246
+ # :section: Marks properties
247
+ ##
248
+
249
+ ##
250
+ # :attr: data
251
+ # The data property; an array of objects. The size of the array determines the number of marks that will be instantiated; each element in the array will be passed to property functions to compute the property values. Typically, the data property is specified as a constant array, such as
252
+ # m.data([1, 2, 3, 4, 5])
253
+ # However, it is perfectly acceptable to define the data property as a
254
+ # proc. This function might compute the data dynamically, allowing
255
+ # different data to be used per enclosing panel. For instance, in the stacked
256
+ # area graph example (see Mark#scene), the data function on the area mark
257
+ # dereferences each series.
258
+
259
+ ##
260
+ # :attr: visible
261
+ # The visible property; a boolean determining whether or not the mark instance
262
+ # is visible. If a mark instance is not visible, its other properties will not
263
+ # be evaluated. Similarly, for panels no child marks will be rendered.
264
+
265
+ ##
266
+ # :attr: left
267
+ # The left margin; the distance, in pixels, between the left edge of the
268
+ # enclosing panel and the left edge of this mark. Note that in some cases this
269
+ # property may be redundant with the right property, or with the conjunction of
270
+ # right and width.
271
+
272
+ ##
273
+ # :attr: right
274
+ # The right margin; the distance, in pixels, between the right edge of the
275
+ # enclosing panel and the right edge of this mark. Note that in some cases this
276
+ # property may be redundant with the left property, or with the conjunction of
277
+ # left and width.
278
+
279
+ ##
280
+ # :attr: top
281
+ # The top margin; the distance, in pixels, between the top edge of the
282
+ # enclosing panel and the top edge of this mark. Note that in some cases this
283
+ # property may be redundant with the bottom property, or with the conjunction
284
+ # of bottom and height.
285
+
286
+ ##
287
+ # :attr: bottom
288
+ # The bottom margin; the distance, in pixels, between the bottom edge of the
289
+ # enclosing panel and the bottom edge of this mark. Note that in some cases
290
+ # this property may be redundant with the top property, or with the conjunction
291
+ # of top and height.
292
+
293
+ ##
294
+ # :attr: cursor
295
+ # The cursor property; corresponds to the CSS cursor property. This is
296
+ # typically used in conjunction with event handlers to indicate interactivity.
297
+ # See {CSS 2 cursor}[http://www.w3.org/TR/CSS2/ui.html#propdef-cursor]
298
+
299
+ ##
300
+ # :attr: title
301
+ # The title property; corresponds to the HTML/SVG title property, allowing the
302
+ # general of simple plain text tooltips.
303
+
304
+
305
+ ##
306
+ # :attr: events
307
+ # The events property; corresponds to the SVG pointer-events property,
308
+ # specifying how the mark should participate in mouse events. The default value
309
+ # is "painted". Supported values are:
310
+ #
311
+ # <p>"painted": The given mark may receive events when the mouse is over a
312
+ # "painted" area. The painted areas are the interior (i.e., fill) of the mark
313
+ # if a 'fillStyle' is specified, and the perimeter (i.e., stroke) of the mark
314
+ # if a 'strokeStyle' is specified.
315
+ #
316
+ # <p>"all": The given mark may receive events when the mouse is over either the
317
+ # interior (i.e., fill) or the perimeter (i.e., stroke) of the mark, regardless
318
+ # of the specified fillStyle and strokeStyle.
319
+ #
320
+ # <p>"none": The given mark may not receive events.
321
+
322
+ ##
323
+ # :attr: reverse
324
+ # The reverse property; a boolean determining whether marks are ordered from
325
+ # front-to-back or back-to-front. SVG does not support explicit z-ordering;
326
+ # shapes are rendered in the order they appear. Thus, by default, marks are
327
+ # rendered in data order. Setting the reverse property to false reverses the
328
+ # order in which they are rendered; however, the properties are still evaluated
329
+ # (i.e., built) in forward order.
104
330
 
331
+ ##
332
+ # :attr: id
333
+ # The instance identifier, for correspondence across animated transitions. If
334
+ # no identifier is specified, correspondence is determined using the mark
335
+ # index. Identifiers are not global, but local to a given mark.
105
336
 
106
- attr_accessor_dsl :data,:visible, :left, :right, :top, :bottom, :cursor, :title, :reverse, :antialias, :events, :id
337
+ #
338
+
339
+ attr_accessor_dsl :data, :visible, :left, :right, :top, :bottom, :cursor, :title, :reverse, :antialias, :events, :id
107
340
 
108
341
  @scene=nil
109
342
  @stack=[]
110
343
  @index=nil
111
344
 
345
+ # @private Records which properties are defined on this mark type.
112
346
  def self.properties
113
347
  @properties
114
348
  end
349
+ # Common index for all marks
115
350
  def Mark.index
116
351
  @index
117
352
  end
353
+
354
+ # Set common index for all marks
118
355
  def Mark.index=(v)
119
356
  @index=v
120
357
  end
121
-
122
-
123
-
358
+ # Get common scene for all marks
124
359
  def self.scene
125
360
  @scene
126
361
  end
362
+ # Set common scene for all marks
127
363
  def self.scene=(v)
128
364
  @scene=v
129
365
  end
366
+
367
+
368
+ # Return properties for current mark
130
369
  def properties
131
370
  (self.class).properties
132
371
  end
372
+ # Get common stack for all marks
133
373
  def Mark.stack
134
374
  @stack
135
375
  end
376
+ # Set common stack for all marks
136
377
  def Mark.stack=(v)
137
378
  @stack=v
138
379
  end
139
380
 
381
+ # Create a new Mark
140
382
  def initialize(opts=Hash.new)
141
383
  @_properties=[]
142
384
  opts.each {|k,v|
@@ -148,20 +390,39 @@ module Rubyvis
148
390
  @index_defined = true
149
391
  @scale=1
150
392
  @scene=nil
151
-
152
393
  end
394
+
395
+
396
+ # The mark type; a lower name. The type name controls rendering
397
+ # behavior, and unless the rendering engine is extended, must be one of the
398
+ # built-in concrete mark types: area, bar, dot, image, label, line, panel,
399
+ # rule, or wedge.
153
400
  def type
154
401
  "mark"
155
402
  end
403
+
404
+ # Default properties for all mark types. By default, the data array is the
405
+ # parent data as a single-element array; if the data property is not
406
+ # specified, this causes each mark to be instantiated as a singleton
407
+ # with the parents datum. The visible property is true by default,
408
+ # and the reverse property is false.
156
409
  def self.defaults
157
410
  Mark.new({:data=>lambda {|d| [d]}, :visible=>true, :antialias=>true, :events=>'painted'})
158
411
  end
412
+
413
+ # Sets the prototype of this mark to the specified mark. Any properties not
414
+ # defined on this mark may be inherited from the specified prototype mark,
415
+ # or its prototype, and so on. The prototype mark need not be the same
416
+ # type of mark as this mark. (Note that for inheritance to be useful,
417
+ # properties with the same name on different mark types should
418
+ # have equivalent meaning.)
159
419
  def extend(proto)
160
420
  @proto=proto
161
421
  @target=proto.target
162
422
  self
163
423
  end
164
-
424
+ # Find the instances of this mark that match source.
425
+ # @see Anchor
165
426
  def instances(source)
166
427
  mark = self
167
428
  _index = []
@@ -188,11 +449,24 @@ module Rubyvis
188
449
  s.right = s.top = s.left = s.bottom = 0;
189
450
  return [s];
190
451
  end
191
- return scene;
452
+ scene
192
453
  end
454
+
455
+
456
+ #Returns the previous instance of this mark in the scene graph, or
457
+ # null if this is the first instance.
458
+ #
459
+ # @return a node in the scene graph, or null.
193
460
  def sibling
194
461
  (self.index==0) ? nil: self.scene[self.index-1]
195
462
  end
463
+
464
+
465
+ # Returns the current instance in the scene graph of this mark,
466
+ # in the previous instance of the enclosing parent panel.
467
+ # May return null if this instance could not be found.
468
+ #
469
+ # @return a node in the scene graph, or null.
196
470
  def cousin
197
471
  par=self.parent
198
472
  s= par ? par.sibling : nil
@@ -201,29 +475,60 @@ module Rubyvis
201
475
  def add(type)
202
476
  parent.add(type).extend(self)
203
477
  end
478
+ # Returns an anchor with the specified name. All marks support the five
479
+ # standard anchor names:
480
+ # * top
481
+ # * left
482
+ # * center
483
+ # * bottom
484
+ # * right
485
+ #
486
+ # In addition to positioning properties (left, right, top bottom), the
487
+ # anchors support text rendering properties (text-align, text-baseline).
488
+ # Text is rendered to appear inside the mark by default.
489
+ #
490
+ # To facilitate stacking, anchors are defined in terms of their opposite
491
+ # edge. For example, the top anchor defines the bottom property,
492
+ # such that the mark extends upwards; the bottom anchor instead defines
493
+ # the top property, such that the mark extends downwards. See also Layout::Stack
494
+ #
495
+ # While anchor names are typically constants, the anchor name is a true
496
+ # property, which means you can specify a function to compute the anchor name
497
+ # dynamically. See the Anchor#name property for details.
498
+ #
499
+ # @param [String] name the anchor name; either a string or a property function.
500
+ # @return [Anchor] the new anchor.
204
501
  def anchor(name='center')
205
502
  mark_anchor(name)
206
503
  end
207
- def mark_anchor(name="center")
208
- anchor=Rubyvis::Anchor.new(self).name(name).data(lambda {
504
+ # Implementation of mark anchor
505
+ def mark_anchor(name="center") # :nodoc:
506
+ anchor=Rubyvis::Anchor.
507
+ new(self).
508
+ name(name).
509
+ data(lambda {
209
510
  pp self.scene.target if $DEBUG
210
- a=self.scene.target.map {|s| puts "s:#{s.data}" if $DEBUG; s.data}
211
- p a if $DEBUG
212
- a
213
- }).visible(lambda {
214
- self.scene.target[self.index].visible
215
- }).id(lambda {self.scene.target[self.index].id}).left(lambda {
216
- s = self.scene.target[self.index]
217
- w = s.width
218
- w||=0
219
- if ['bottom','top','center'].include?(self.name)
220
- s.left + w / 2.0
221
- elsif self.name=='left'
222
- nil
223
- else
224
- s.left + w
225
- end
226
- }).top(lambda {
511
+ a=self.scene.target.map {|s| puts "s:#{s.data}" if $DEBUG; s.data}
512
+ p a if $DEBUG
513
+ a
514
+ }).
515
+ visible(lambda {
516
+ self.scene.target[self.index].visible
517
+ }).
518
+ id(lambda {self.scene.target[self.index].id}).
519
+ left(lambda {
520
+ s = self.scene.target[self.index]
521
+ w = s.width
522
+ w||=0
523
+ if ['bottom','top','center'].include?(self.name)
524
+ s.left + w / 2.0
525
+ elsif self.name=='left'
526
+ nil
527
+ else
528
+ s.left + w
529
+ end
530
+ }).
531
+ top(lambda {
227
532
  s = self.scene.target[self.index]
228
533
  h = s.height
229
534
  h||= 0
@@ -261,12 +566,19 @@ module Rubyvis
261
566
  end
262
567
 
263
568
 
264
-
265
- def build_implied(s)
569
+ # Computes the implied properties for this mark for the specified
570
+ # instance <tt>s</tt> in the scene graph. Implied properties are those with
571
+ # dependencies on multiple other properties; for example, the width property
572
+ # may be implied if the left and right properties are set. This method can be
573
+ # overridden by concrete mark types to define new implied properties, if
574
+ # necessary.
575
+ #
576
+ # @param s a node in the scene graph; the instance of the mark to build.
577
+ def build_implied(s) # :nodoc:
266
578
  mark_build_implied(s)
267
579
  end
268
-
269
- def mark_build_implied(s)
580
+
581
+ def mark_build_implied(s) # :nodoc:
270
582
  l=s.left
271
583
  r=s.right
272
584
  t=s.top
@@ -330,6 +642,17 @@ module Rubyvis
330
642
  s.fill_style=Rubyvis::Color.transparent if prop[:fill_style] and !s.fill_style
331
643
  s.stroke_style=Rubyvis::Color.transparent if prop[:stroke_style] and !s.stroke_style
332
644
  end
645
+ # Renders this mark, including recursively rendering all child marks if this is
646
+ # a panel. This method finds all instances of this mark and renders them. This
647
+ # method descends recursively to the level of the mark to be rendered, finding
648
+ # all visible instances of the mark. After the marks are rendered, the scene
649
+ # and index attributes are removed from the mark to restore them to a clean
650
+ # state.
651
+ #
652
+ # <p>If an enclosing panel has an index property set (as is the case inside in
653
+ # an event handler), then only instances of this mark inside the given instance
654
+ # of the panel will be rendered; otherwise, all visible instances of the mark
655
+ # will be rendered.
333
656
  def render
334
657
  parent=self.parent
335
658
  @stack=Mark.stack
@@ -351,7 +674,7 @@ module Rubyvis
351
674
 
352
675
  end
353
676
 
354
- def render_render(mark,depth,scale)
677
+ def render_render(mark,depth,scale) # :nodoc:
355
678
  mark.scale=scale
356
679
  if (depth < @indexes.size)
357
680
  @stack.unshift(nil)
@@ -367,14 +690,14 @@ module Rubyvis
367
690
  stack.shift
368
691
  else
369
692
  mark.build
370
- pv.Scene.scale = scale;
371
- pv.Scene.update_all(mark.scene);
693
+ Rubyvis.Scene.scale = scale;
694
+ Rubyvis.Scene.update_all(mark.scene);
372
695
  end
373
696
  mark.scale=nil
374
697
  end
375
698
 
376
699
 
377
- def render_instance(mark,depth,scale)
700
+ def render_instance(mark,depth,scale) # :nodoc:
378
701
  s=mark.scene[mark.index]
379
702
  if s.visible
380
703
  child_index=@indexes[depth]
@@ -397,7 +720,6 @@ module Rubyvis
397
720
 
398
721
  end
399
722
  end
400
- private :render_render, :render_instance
401
723
  def bind_bind(mark)
402
724
  begin
403
725
  mark._properties.each {|v|
@@ -419,12 +741,14 @@ module Rubyvis
419
741
  }
420
742
  end while(mark = mark.proto)
421
743
  end
422
-
423
- attr_accessor :binds
744
+ private :bind_bind, :render_render, :render_instance
745
+ # @private In the bind phase, inherited property definitions are cached so they
746
+ # do not need to be queried during build.
424
747
  def bind
425
748
  mark_bind
426
749
  end
427
- def mark_bind()
750
+
751
+ def mark_bind() # :nodoc:
428
752
  @seen={}
429
753
  @types={1=>[],2=>[],3=>[]}
430
754
  @_data=nil
@@ -517,6 +841,38 @@ module Rubyvis
517
841
  end
518
842
  end
519
843
 
844
+ # Evaluates properties and computes implied properties. Properties are
845
+ # stored in the Mark.scene array for each instance of this mark.
846
+ #
847
+ # As marks are built recursively, the Mark.index property is updated to
848
+ # match the current index into the data array for each mark. Note that the
849
+ # index property is only set for the mark currently being built and its
850
+ # enclosing parent panels. The index property for other marks is unset, but is
851
+ # inherited from the global +Mark+ class prototype. This allows mark
852
+ # properties to refer to properties on other marks <i>in the same panel</i>
853
+ # conveniently; however, in general it is better to reference mark instances
854
+ # specifically through the scene graph rather than depending on the magical
855
+ # behavior of Mark#index.
856
+ #
857
+ # The root scene array has a special property, <tt>data</tt>, which stores
858
+ # the current data stack. The first element in this stack is the current datum,
859
+ # followed by the datum of the enclosing parent panel, and so on. The data
860
+ # stack should not be accessed directly; instead, property functions are passed
861
+ # the current data stack as arguments.
862
+ #
863
+ # <p>The evaluation of the <tt>data</tt> and <tt>visible</tt> properties is
864
+ # special. The <tt>data</tt> property is evaluated first; unlike the other
865
+ # properties, the data stack is from the parent panel, rather than the current
866
+ # mark, since the data is not defined until the data property is evaluated.
867
+ # The <tt>visible</tt> property is subsequently evaluated for each instance;
868
+ # only if true will the {@link #buildInstance} method be called, evaluating
869
+ # other properties and recursively building the scene graph.
870
+ #
871
+ # <p>If this mark is being re-built, any old instances of this mark that no
872
+ # longer exist (because the new data array contains fewer elements) will be
873
+ # cleared using {@link #clearInstance}.
874
+ #
875
+ # @param parent the instance of the parent panel from the scene graph.
520
876
  def build
521
877
  scene=self.scene
522
878
  stack=Mark.stack
@@ -563,17 +919,26 @@ module Rubyvis
563
919
  stack.shift()
564
920
  self
565
921
  end
566
-
567
- def build_instance(s)
922
+ # @private
923
+ def build_instance(s) # :nodoc:
568
924
  mark_build_instance(s)
569
925
  end
570
- def mark_build_instance(s1)
926
+ # @private
927
+ def mark_build_instance(s1) # :nodoc:
571
928
  build_properties(s1, self.binds.required)
572
929
  if s1.visible
573
930
  build_properties(s1, self.binds.optional)
574
931
  build_implied(s1)
575
932
  end
576
933
  end
934
+
935
+
936
+
937
+ # Evaluates the specified array of properties for the specified
938
+ # instance <tt>s</tt> in the scene graph.
939
+ #
940
+ # @param s a node in the scene graph; the instance of the mark to build.
941
+ # @param properties an array of properties.
577
942
  def build_properties(ss, props)
578
943
  #p props
579
944
  props.each do |prop|
@@ -585,11 +950,11 @@ module Rubyvis
585
950
  end
586
951
  ss.send((prop.name.to_s+"=").to_sym, v)
587
952
  end
588
- # p ss
589
953
  end
954
+ # @todo implement
590
955
  def event(type,handler)
591
956
  #@_handlers[type]=handler
592
- return self
957
+ self
593
958
  end
594
959
  end
595
960
  end