glimmer-libui-cc-graphs_and_charts 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/README.md +4 -2
- data/VERSION +1 -1
- data/glimmer-libui-cc-graphs_and_charts.gemspec +3 -3
- data/lib/glimmer/view/line_graph.rb +104 -67
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 13c6855a27c49f14aaa6bc865f8d954a4500a86b99943446a9b9c7d8f153bd87
|
4
|
+
data.tar.gz: 1fb52e2748e28024d4dbd46f9077a4b1e14aae00367487c16b622b514404cf56
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0ce8817b76f6b9cc5ac0c5fc88223aa4c07625f747d3a79dc95569055862a77e65578543134be4fff45f783a83098d509abf27f7db48fe1bd4fdf1412a4c9fc0
|
7
|
+
data.tar.gz: 933bdaeb6f80038e708b13dee69f43c7532fe2facc25a37f1598858179b9f8efb08d7a3665b085fee975e90c319df5ce08bc2913430103ae42933d52a738d243
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## 0.1.5
|
4
|
+
|
5
|
+
- Render circles for every point in addition to the lines connecting all the points
|
6
|
+
- Render a single point if there is only 1 value in `lines` `y_values` instead of rendering nothing until 2 values exist at least
|
7
|
+
- Support `graph_point_radius`, `graph_selected_point_radius`, and `graph_fill_selected_point` options for custimizing the circle of every rendered point and selected point.
|
8
|
+
- Avoid rendering on top of the grid markers on the left side
|
9
|
+
- Optimize performance of rendering grid markers and showing mouse hover selection stats of a point
|
10
|
+
|
11
|
+
## 0.1.4
|
12
|
+
|
13
|
+
- Fix issue with crashing at `lib/glimmer/view/line_graph.rb:243:in y_value_max_for_all_lines': undefined method max for nil:NilClass`
|
14
|
+
|
3
15
|
## 0.1.3
|
4
16
|
|
5
17
|
- Fix issue with crashing if lines had points that did not share the same x-axis values as opposed to all points in all lines falling on the same x-axis values
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Graphs and Charts 0.1.
|
1
|
+
# Graphs and Charts 0.1.5 (Alpha)
|
2
2
|
## [Glimmer DSL for LibUI](https://github.com/AndyObtiva/glimmer-dsl-libui) Custom Controls
|
3
3
|
[](http://badge.fury.io/rb/glimmer-libui-cc-graphs_and_charts)
|
4
4
|
[](https://gitter.im/AndyObtiva/glimmer?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
@@ -12,7 +12,7 @@ Graphs and Charts (Custom Controls) for [Glimmer DSL for LibUI](https://github.c
|
|
12
12
|
Add this line to Bundler `Gemfile`:
|
13
13
|
|
14
14
|
```ruby
|
15
|
-
gem 'glimmer-libui-cc-graphs_and_charts', '~> 0.1.
|
15
|
+
gem 'glimmer-libui-cc-graphs_and_charts', '~> 0.1.5'
|
16
16
|
```
|
17
17
|
|
18
18
|
Run:
|
@@ -71,6 +71,8 @@ line_graph(
|
|
71
71
|
|
72
72
|

|
73
73
|
|
74
|
+
Look into [lib/glimmer/view/line_graph.rb](/lib/glimmer/view/line_graph.rb) to learn about all supported options.
|
75
|
+
|
74
76
|
Basic Line Graph Example:
|
75
77
|
|
76
78
|
[examples/graphs_and_charts/basic_line_graph.rb](/examples/graphs_and_charts/basic_line_graph.rb)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.5
|
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: glimmer-libui-cc-graphs_and_charts 0.1.
|
5
|
+
# stub: glimmer-libui-cc-graphs_and_charts 0.1.5 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "glimmer-libui-cc-graphs_and_charts".freeze
|
9
|
-
s.version = "0.1.
|
9
|
+
s.version = "0.1.5".freeze
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib".freeze]
|
13
13
|
s.authors = ["Andy Maleh".freeze]
|
14
|
-
s.date = "2023-12-
|
14
|
+
s.date = "2023-12-21"
|
15
15
|
s.description = "Graphs and Charts (Custom Controls) for Glimmer DSL for LibUI, like Line Graph.".freeze
|
16
16
|
s.email = "andy.am@gmail.com".freeze
|
17
17
|
s.extra_rdoc_files = [
|
@@ -4,12 +4,21 @@ module Glimmer
|
|
4
4
|
module View
|
5
5
|
# General-Purpose Line Graph Custom Control
|
6
6
|
class LineGraph
|
7
|
+
class << self
|
8
|
+
def interpret_color(color_object)
|
9
|
+
@color_cache ||= {}
|
10
|
+
@color_cache[color_object] ||= Glimmer::LibUI.interpret_color(color_object)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
7
14
|
include Glimmer::LibUI::CustomControl
|
8
15
|
|
9
16
|
DEFAULT_GRAPH_PADDING_WIDTH = 5.0
|
10
17
|
DEFAULT_GRAPH_PADDING_HEIGHT = 5.0
|
11
|
-
DEFAULT_GRAPH_GRID_MARKER_PADDING_WIDTH =
|
18
|
+
DEFAULT_GRAPH_GRID_MARKER_PADDING_WIDTH = 37.0
|
12
19
|
DEFAULT_GRAPH_POINT_DISTANCE = 15.0
|
20
|
+
DEFAULT_GRAPH_POINT_RADIUS = 1.0
|
21
|
+
DEFAULT_GRAPH_SELECTED_POINT_RADIUS = 3.0
|
13
22
|
|
14
23
|
DEFAULT_GRAPH_STROKE_GRID = [185, 184, 185]
|
15
24
|
DEFAULT_GRAPH_STROKE_MARKER = [185, 184, 185]
|
@@ -17,6 +26,8 @@ module Glimmer
|
|
17
26
|
DEFAULT_GRAPH_STROKE_PERIODIC_LINE = [121, 121, 121, thickness: 1, dashes: [1, 1]]
|
18
27
|
DEFAULT_GRAPH_STROKE_HOVER_LINE = [133, 133, 133]
|
19
28
|
|
29
|
+
DEFAULT_GRAPH_FILL_SELECTED_POINT = :white
|
30
|
+
|
20
31
|
DEFAULT_GRAPH_COLOR_MARKER_TEXT = [96, 96, 96]
|
21
32
|
DEFAULT_GRAPH_COLOR_PERIOD_TEXT = [163, 40, 39]
|
22
33
|
|
@@ -44,6 +55,8 @@ module Glimmer
|
|
44
55
|
option :graph_padding_height, default: DEFAULT_GRAPH_PADDING_HEIGHT
|
45
56
|
option :graph_grid_marker_padding_width, default: DEFAULT_GRAPH_GRID_MARKER_PADDING_WIDTH
|
46
57
|
option :graph_point_distance, default: DEFAULT_GRAPH_POINT_DISTANCE
|
58
|
+
option :graph_point_radius, default: DEFAULT_GRAPH_POINT_RADIUS
|
59
|
+
option :graph_selected_point_radius, default: DEFAULT_GRAPH_SELECTED_POINT_RADIUS
|
47
60
|
|
48
61
|
option :graph_stroke_grid, default: DEFAULT_GRAPH_STROKE_GRID
|
49
62
|
option :graph_stroke_marker, default: DEFAULT_GRAPH_STROKE_MARKER
|
@@ -51,6 +64,8 @@ module Glimmer
|
|
51
64
|
option :graph_stroke_periodic_line, default: DEFAULT_GRAPH_STROKE_PERIODIC_LINE
|
52
65
|
option :graph_stroke_hover_line, default: DEFAULT_GRAPH_STROKE_HOVER_LINE
|
53
66
|
|
67
|
+
option :graph_fill_selected_point, default: DEFAULT_GRAPH_FILL_SELECTED_POINT
|
68
|
+
|
54
69
|
option :graph_color_marker_text, default: DEFAULT_GRAPH_COLOR_MARKER_TEXT
|
55
70
|
option :graph_color_period_text, default: DEFAULT_GRAPH_COLOR_PERIOD_TEXT
|
56
71
|
|
@@ -93,7 +108,7 @@ module Glimmer
|
|
93
108
|
|
94
109
|
if @hover_point && lines && lines[0] && @points && @points[lines[0]] && !@points[lines[0]].empty?
|
95
110
|
x = @hover_point[:x]
|
96
|
-
closest_point_index =
|
111
|
+
closest_point_index = ((width - graph_padding_width - x) / graph_point_distance_for_line(lines[0])).round
|
97
112
|
if closest_point_index != @closest_point_index
|
98
113
|
@closest_point_index = closest_point_index
|
99
114
|
graph_area.queue_redraw_all
|
@@ -118,6 +133,11 @@ module Glimmer
|
|
118
133
|
@y_value_max_for_all_lines = nil
|
119
134
|
@grid_marker_points = nil
|
120
135
|
@points = nil
|
136
|
+
@grid_marker_number_values = nil
|
137
|
+
@grid_marker_numbers = nil
|
138
|
+
@graph_stroke_marker_values = nil
|
139
|
+
@mod_values = nil
|
140
|
+
@estimated_widths_of_text = nil
|
121
141
|
end
|
122
142
|
|
123
143
|
def calculate_dynamic_options
|
@@ -127,8 +147,10 @@ module Glimmer
|
|
127
147
|
def calculate_graph_point_distance_per_line
|
128
148
|
return unless graph_point_distance == :width_divided_by_point_count
|
129
149
|
|
130
|
-
@graph_point_distance_per_line
|
131
|
-
|
150
|
+
@graph_point_distance_per_line ||= lines.inject({}) do |hash, line|
|
151
|
+
value = (width - 2.0*graph_padding_width - graph_grid_marker_padding_width) / (line[:y_values].size - 1).to_f
|
152
|
+
value = [value, width - 2.0*graph_padding_width - graph_grid_marker_padding_width].min
|
153
|
+
hash.merge(line => value)
|
132
154
|
end
|
133
155
|
end
|
134
156
|
|
@@ -149,12 +171,25 @@ module Glimmer
|
|
149
171
|
line(graph_padding_width, height - graph_padding_height, width - graph_padding_width, height - graph_padding_height) {
|
150
172
|
stroke graph_stroke_grid
|
151
173
|
}
|
174
|
+
grid_marker_number_font = graph_font_marker_text.merge(size: 11)
|
175
|
+
@grid_marker_number_values ||= []
|
176
|
+
@grid_marker_numbers ||= []
|
177
|
+
@graph_stroke_marker_values ||= []
|
178
|
+
@mod_values ||= []
|
152
179
|
grid_marker_points.each_with_index do |marker_point, index|
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
180
|
+
@grid_marker_number_values[index] ||= (grid_marker_points.size - index).to_i
|
181
|
+
grid_marker_number_value = @grid_marker_number_values[index]
|
182
|
+
@grid_marker_numbers[index] ||= (grid_marker_number_value >= 1000) ? "#{grid_marker_number_value / 1000}K" : grid_marker_number_value.to_s
|
183
|
+
grid_marker_number = @grid_marker_numbers[index]
|
184
|
+
@graph_stroke_marker_values[index] ||= LineGraph.interpret_color(graph_stroke_marker).tap do |color_hash|
|
185
|
+
color_hash[:thickness] = (index != grid_marker_points.size - 1 ? 2 : 1) if color_hash[:thickness].nil?
|
186
|
+
end
|
187
|
+
graph_stroke_marker_value = @graph_stroke_marker_values[index]
|
188
|
+
@mod_values[index] ||= begin
|
189
|
+
mod_value_multiplier = ((grid_marker_points.size / max_marker_count) + 1)
|
190
|
+
[((mod_value_multiplier <= 2 ? 2 : 5) * mod_value_multiplier), 1].max
|
191
|
+
end
|
192
|
+
mod_value = @mod_values[index]
|
158
193
|
comparison_value = (mod_value > 2) ? 0 : 1
|
159
194
|
if mod_value > 2
|
160
195
|
if grid_marker_number_value % mod_value == comparison_value
|
@@ -173,7 +208,6 @@ module Glimmer
|
|
173
208
|
}
|
174
209
|
end
|
175
210
|
if grid_marker_number_value % mod_value == comparison_value
|
176
|
-
grid_marker_number_font = graph_font_marker_text.merge(size: 11)
|
177
211
|
grid_marker_number_width = estimate_width_of_text(grid_marker_number, grid_marker_number_font)
|
178
212
|
text(marker_point[:x] + 4 + 3, marker_point[:y] - 6, grid_marker_number_width) {
|
179
213
|
string(grid_marker_number) {
|
@@ -216,6 +250,11 @@ module Glimmer
|
|
216
250
|
stroke graph_line[:stroke]
|
217
251
|
}
|
218
252
|
end
|
253
|
+
if last_point.nil? || graph_point_radius > 1
|
254
|
+
circle(point[:x], point[:y], graph_point_radius) {
|
255
|
+
fill graph_line[:stroke]
|
256
|
+
}
|
257
|
+
end
|
219
258
|
last_point = point
|
220
259
|
end
|
221
260
|
end
|
@@ -239,7 +278,7 @@ module Glimmer
|
|
239
278
|
def y_value_max_for_all_lines
|
240
279
|
if @y_value_max_for_all_lines.nil?
|
241
280
|
line_visible_y_values = lines.map { |line| line[:y_values][0, max_visible_point_count(line)] }
|
242
|
-
all_visible_y_values = line_visible_y_values.reduce(:+)
|
281
|
+
all_visible_y_values = line_visible_y_values.reduce(:+) || []
|
243
282
|
@y_value_max_for_all_lines = all_visible_y_values.max.to_f
|
244
283
|
end
|
245
284
|
@y_value_max_for_all_lines
|
@@ -257,14 +296,16 @@ module Glimmer
|
|
257
296
|
points
|
258
297
|
end
|
259
298
|
|
260
|
-
def max_visible_point_count(graph_line) = (width / graph_point_distance_for_line(graph_line)).to_i + 1
|
299
|
+
def max_visible_point_count(graph_line) = ((width - graph_grid_marker_padding_width) / graph_point_distance_for_line(graph_line)).to_i + 1
|
261
300
|
|
262
301
|
def periodic_lines
|
263
302
|
return unless lines && lines[0] && lines[0][:x_interval_in_seconds] && lines[0][:x_interval_in_seconds] == DAY_IN_SECONDS
|
264
303
|
day_count = lines[0][:y_values].size
|
265
304
|
case day_count
|
266
305
|
when ..7
|
267
|
-
@points[lines[0]].
|
306
|
+
@points[lines[0]].each_with_index do |point, index|
|
307
|
+
next if index == 0
|
308
|
+
|
268
309
|
line(point[:x], graph_padding_height, point[:x], height - graph_padding_height) {
|
269
310
|
stroke graph_stroke_periodic_line
|
270
311
|
}
|
@@ -323,68 +364,64 @@ module Glimmer
|
|
323
364
|
x = @hover_point[:x]
|
324
365
|
closest_points = lines.map { |line| @points[line][@closest_point_index] }
|
325
366
|
closest_x = closest_points[0]&.[](:x)
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
367
|
+
line(closest_x, graph_padding_height, closest_x, height - graph_padding_height) {
|
368
|
+
stroke graph_stroke_hover_line
|
369
|
+
}
|
370
|
+
closest_points.each_with_index do |closest_point, index|
|
371
|
+
next unless closest_point && closest_point[:x] && closest_point[:y]
|
372
|
+
|
373
|
+
circle(closest_point[:x], closest_point[:y], graph_selected_point_radius) {
|
374
|
+
fill graph_fill_selected_point == :line_stroke ? lines[index][:stroke] : graph_fill_selected_point
|
375
|
+
stroke_value = lines[index][:stroke].dup
|
376
|
+
stroke_value << {} unless stroke_value.last.is_a?(Hash)
|
377
|
+
stroke_value.last[:thickness] = 2
|
378
|
+
stroke stroke_value
|
332
379
|
}
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
closest_point_text_widths = closest_point_texts.map do |text|
|
352
|
-
estimate_width_of_text(text, graph_font_marker_text)
|
353
|
-
end
|
354
|
-
square_size = 12.0
|
355
|
-
square_to_label_padding = 10.0
|
356
|
-
label_padding = 10.0
|
357
|
-
text_label_x = width - graph_padding_width - text_label_width - label_padding -
|
358
|
-
(lines_with_closest_points.size*(square_size + square_to_label_padding) + (lines_with_closest_points.size - 1)*label_padding + closest_point_text_widths.sum)
|
359
|
-
text_label_y = height + graph_padding_height
|
380
|
+
end
|
381
|
+
text_label = formatted_x_value(@closest_point_index)
|
382
|
+
text_label_width = estimate_width_of_text(text_label, DEFAULT_GRAPH_FONT_MARKER_TEXT)
|
383
|
+
lines_with_closest_points = lines.each_with_index.map do |line, index|
|
384
|
+
next if closest_points[index].nil?
|
385
|
+
|
386
|
+
line
|
387
|
+
end.compact
|
388
|
+
closest_point_texts = lines_with_closest_points.map { |line| "#{line[:name]}: #{line[:y_values][@closest_point_index]}" }
|
389
|
+
closest_point_text_widths = closest_point_texts.map do |text|
|
390
|
+
estimate_width_of_text(text, graph_font_marker_text)
|
391
|
+
end
|
392
|
+
square_size = 12.0
|
393
|
+
square_to_label_padding = 10.0
|
394
|
+
label_padding = 10.0
|
395
|
+
text_label_x = width - graph_padding_width - text_label_width - label_padding -
|
396
|
+
(lines_with_closest_points.size*(square_size + square_to_label_padding) + (lines_with_closest_points.size - 1)*label_padding + closest_point_text_widths.sum)
|
397
|
+
text_label_y = height + graph_padding_height
|
360
398
|
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
}
|
399
|
+
text(text_label_x, text_label_y, text_label_width) {
|
400
|
+
string(text_label) {
|
401
|
+
font DEFAULT_GRAPH_FONT_MARKER_TEXT
|
402
|
+
color graph_color_marker_text
|
366
403
|
}
|
404
|
+
}
|
367
405
|
|
368
|
-
|
369
|
-
|
370
|
-
|
406
|
+
relative_x = text_label_x + text_label_width
|
407
|
+
lines_with_closest_points.size.times do |index|
|
408
|
+
square_x = relative_x + label_padding
|
371
409
|
|
372
|
-
|
373
|
-
|
374
|
-
|
410
|
+
square(square_x, text_label_y + 2, square_size) {
|
411
|
+
fill lines_with_closest_points[index][:stroke]
|
412
|
+
}
|
375
413
|
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
414
|
+
attribute_label_x = square_x + square_size + square_to_label_padding
|
415
|
+
attribute_text = closest_point_texts[index]
|
416
|
+
attribute_text_width = closest_point_text_widths[index]
|
417
|
+
relative_x = attribute_label_x + attribute_text_width
|
380
418
|
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
}
|
419
|
+
text(attribute_label_x, text_label_y, attribute_text_width) {
|
420
|
+
string(attribute_text) {
|
421
|
+
font graph_font_marker_text
|
422
|
+
color graph_color_marker_text
|
386
423
|
}
|
387
|
-
|
424
|
+
}
|
388
425
|
end
|
389
426
|
end
|
390
427
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: glimmer-libui-cc-graphs_and_charts
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Maleh
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-12-
|
11
|
+
date: 2023-12-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: glimmer-dsl-libui
|