glimmer-libui-cc-graphs_and_charts 0.1.6 → 0.1.7
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 +4 -0
- data/README.md +108 -6
- data/VERSION +1 -1
- data/glimmer-libui-cc-graphs_and_charts.gemspec +3 -3
- data/lib/glimmer/view/line_graph.rb +33 -14
- 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: c2a02d818ffec27e5d64eafa181c90e1362b62ea8f201018fe92705b0d95a664
|
4
|
+
data.tar.gz: 6de4a548a1c74d91cc389663d9917311bd66523402ba984ac05a250d8cff5baa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 738a36dedf90e91774876d7cc41f545edb00ac03d65cd6bf89eaf30eac5374b4abfa591d007d971476a02dd854ca14a262a7fcda34fdc24ac531b17509ee0dcf
|
7
|
+
data.tar.gz: 2039bf32f7d8fb7930c24fda0eba1def6c30db968d452cb219a7ceab604bfed450b87b8d68ae061d75017ea59f6161d46b9fbebd8ab5581727116ebfd32fec82
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## 0.1.7
|
4
|
+
|
5
|
+
- Scale `y` axis when using `values` option to fill up the vertical graph height if all y-axis values are smaller than `1`
|
6
|
+
|
3
7
|
## 0.1.6
|
4
8
|
|
5
9
|
- Support passing line `values` as a `Hash` map of x-axis values to y-axis values instead of using the combination of `y_values`, `x_value_start`, and `x_interval_in_seconds`
|
data/README.md
CHANGED
@@ -1,18 +1,18 @@
|
|
1
|
-
# Graphs and Charts 0.1.
|
1
|
+
# Graphs and Charts 0.1.7 (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)
|
5
5
|
|
6
6
|
Graphs and Charts (Custom Controls) for [Glimmer DSL for LibUI](https://github.com/AndyObtiva/glimmer-dsl-libui)
|
7
7
|
|
8
|
-

|
8
|
+

|
9
9
|
|
10
10
|
## Setup
|
11
11
|
|
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.7'
|
16
16
|
```
|
17
17
|
|
18
18
|
Run:
|
@@ -42,6 +42,53 @@ require 'glimmer/view/line_graph'
|
|
42
42
|
This makes the `line_graph` [Glimmer DSL for LibUI Custom Control](https://github.com/AndyObtiva/glimmer-dsl-libui#custom-components) available in the Glimmer GUI DSL.
|
43
43
|
You can then nest `line_graph` under `window` or some container like `vertical_box`. By the way, `line_graph` is implemented on top of the [`area` Glimmer DSL for LibUI control](https://github.com/AndyObtiva/glimmer-dsl-libui#area-api).
|
44
44
|
|
45
|
+
Note that you can use in absolute mode or relative mode for determining x-axis values starting from newest point to oldest point along the time x-axis:
|
46
|
+
- Absolute Mode: pass `values` which maps x-axis values to y-axis values
|
47
|
+
- Relative Mode: pass `y_values`, `x_value_start`, and `x_interval_in_seconds` (x-axis values are calculated automatically in a uniform way from `x_value_start` deducting `x_interval_in_seconds`)
|
48
|
+
|
49
|
+
**Absolute Mode:**
|
50
|
+
|
51
|
+
It supports any `Numeric` y-axis values in addition to `Time` x-axis values.
|
52
|
+
|
53
|
+
```ruby
|
54
|
+
@line_graph = line_graph(
|
55
|
+
width: 900,
|
56
|
+
height: 300,
|
57
|
+
lines: [
|
58
|
+
{
|
59
|
+
name: 'Stock 1',
|
60
|
+
stroke: [163, 40, 39, thickness: 2],
|
61
|
+
values: {
|
62
|
+
Time.new(2030, 12, 1) => 80,
|
63
|
+
Time.new(2030, 12, 2) => 36,
|
64
|
+
Time.new(2030, 12, 4) => 10,
|
65
|
+
Time.new(2030, 12, 5) => 60,
|
66
|
+
Time.new(2030, 12, 6) => 20,
|
67
|
+
},
|
68
|
+
x_value_format: -> (time) {time.strftime("%a %d %b %Y %T GMT")},
|
69
|
+
},
|
70
|
+
{
|
71
|
+
name: 'Stock 2',
|
72
|
+
stroke: [47, 109, 104, thickness: 2],
|
73
|
+
values: {
|
74
|
+
Time.new(2030, 12, 1) => 62,
|
75
|
+
Time.new(2030, 12, 2) => 0,
|
76
|
+
Time.new(2030, 12, 3) => 90,
|
77
|
+
Time.new(2030, 12, 5) => 0,
|
78
|
+
Time.new(2030, 12, 7) => 17,
|
79
|
+
},
|
80
|
+
x_value_format: -> (time) {time.strftime("%a %d %b %Y %T GMT")},
|
81
|
+
},
|
82
|
+
],
|
83
|
+
)
|
84
|
+
```
|
85
|
+
|
86
|
+

|
87
|
+
|
88
|
+
**Relative Mode:**
|
89
|
+
|
90
|
+
Currently, it only supports `Integer` y-axis values in addition to `Time` x-axis values.
|
91
|
+
|
45
92
|
```ruby
|
46
93
|
line_graph(
|
47
94
|
width: 900,
|
@@ -69,11 +116,11 @@ line_graph(
|
|
69
116
|
)
|
70
117
|
```
|
71
118
|
|
72
|
-

|
119
|
+

|
73
120
|
|
74
121
|
Look into [lib/glimmer/view/line_graph.rb](/lib/glimmer/view/line_graph.rb) to learn about all supported options.
|
75
122
|
|
76
|
-
Basic Line Graph Example
|
123
|
+
**Basic Line Graph Example:**
|
77
124
|
|
78
125
|
[examples/graphs_and_charts/basic_line_graph.rb](/examples/graphs_and_charts/basic_line_graph.rb)
|
79
126
|
|
@@ -81,6 +128,61 @@ Basic Line Graph Example:
|
|
81
128
|
require 'glimmer-dsl-libui'
|
82
129
|
require 'glimmer/view/line_graph'
|
83
130
|
|
131
|
+
class BasicLineGraph
|
132
|
+
include Glimmer::LibUI::Application
|
133
|
+
|
134
|
+
body {
|
135
|
+
window('Basic Line Graph', 900, 300) { |main_window|
|
136
|
+
@line_graph = line_graph(
|
137
|
+
width: 900,
|
138
|
+
height: 300,
|
139
|
+
lines: [
|
140
|
+
{
|
141
|
+
name: 'Stock 1',
|
142
|
+
stroke: [163, 40, 39, thickness: 2],
|
143
|
+
values: {
|
144
|
+
Time.new(2030, 12, 1) => 80,
|
145
|
+
Time.new(2030, 12, 2) => 36,
|
146
|
+
Time.new(2030, 12, 4) => 10,
|
147
|
+
Time.new(2030, 12, 5) => 60,
|
148
|
+
Time.new(2030, 12, 6) => 20,
|
149
|
+
},
|
150
|
+
x_value_format: -> (time) {time.strftime("%a %d %b %Y %T GMT")},
|
151
|
+
},
|
152
|
+
{
|
153
|
+
name: 'Stock 2',
|
154
|
+
stroke: [47, 109, 104, thickness: 2],
|
155
|
+
values: {
|
156
|
+
Time.new(2030, 12, 1) => 62,
|
157
|
+
Time.new(2030, 12, 2) => 0,
|
158
|
+
Time.new(2030, 12, 3) => 90,
|
159
|
+
Time.new(2030, 12, 5) => 0,
|
160
|
+
Time.new(2030, 12, 7) => 17,
|
161
|
+
},
|
162
|
+
x_value_format: -> (time) {time.strftime("%a %d %b %Y %T GMT")},
|
163
|
+
},
|
164
|
+
],
|
165
|
+
)
|
166
|
+
|
167
|
+
on_content_size_changed do
|
168
|
+
@line_graph.width = main_window.content_size[0]
|
169
|
+
@line_graph.height = main_window.content_size[1]
|
170
|
+
end
|
171
|
+
}
|
172
|
+
}
|
173
|
+
end
|
174
|
+
|
175
|
+
BasicLineGraph.launch
|
176
|
+
```
|
177
|
+
|
178
|
+

|
179
|
+
|
180
|
+
**Basic Line Graph Relative Example:**
|
181
|
+
|
182
|
+
```ruby
|
183
|
+
require 'glimmer-dsl-libui'
|
184
|
+
require 'glimmer/view/line_graph'
|
185
|
+
|
84
186
|
class BasicLineGraph
|
85
187
|
include Glimmer::LibUI::Application
|
86
188
|
|
@@ -121,7 +223,7 @@ end
|
|
121
223
|
BasicLineGraph.launch
|
122
224
|
```
|
123
225
|
|
124
|
-

|
226
|
+

|
125
227
|
|
126
228
|
Contributing to glimmer-libui-cc-graphs_and_charts
|
127
229
|
------------------------------------------
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.7
|
@@ -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.7 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.7".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-23"
|
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 = [
|
@@ -132,6 +132,7 @@ module Glimmer
|
|
132
132
|
@graph_point_distance_per_line = nil
|
133
133
|
@y_value_max_for_all_lines = nil
|
134
134
|
@x_resolution = nil
|
135
|
+
@y_resolution = nil
|
135
136
|
@x_value_range_for_all_lines = nil
|
136
137
|
@x_value_min_for_all_lines = nil
|
137
138
|
@x_value_max_for_all_lines = nil
|
@@ -153,15 +154,19 @@ module Glimmer
|
|
153
154
|
|
154
155
|
@graph_point_distance_per_line ||= lines.inject({}) do |hash, line|
|
155
156
|
value = (width - 2.0*graph_padding_width - graph_grid_marker_padding_width) / (line[:y_values].size - 1).to_f
|
156
|
-
value = [value,
|
157
|
+
value = [value, width_drawable].min
|
157
158
|
hash.merge(line => value)
|
158
159
|
end
|
159
160
|
end
|
160
161
|
|
161
|
-
def
|
162
|
+
def width_drawable
|
162
163
|
width - 2.0*graph_padding_width - graph_grid_marker_padding_width
|
163
164
|
end
|
164
165
|
|
166
|
+
def height_drawable
|
167
|
+
height - 2.0*graph_padding_height
|
168
|
+
end
|
169
|
+
|
165
170
|
def graph_point_distance_for_line(line)
|
166
171
|
@graph_point_distance_per_line&.[](line) || graph_point_distance
|
167
172
|
end
|
@@ -184,8 +189,15 @@ module Glimmer
|
|
184
189
|
@grid_marker_numbers ||= []
|
185
190
|
@graph_stroke_marker_values ||= []
|
186
191
|
@mod_values ||= []
|
192
|
+
if lines && lines.all? {|line| line[:values]} && !y_value_max_for_all_lines.nil? && y_value_max_for_all_lines > 1
|
193
|
+
return
|
194
|
+
end
|
187
195
|
grid_marker_points.each_with_index do |marker_point, index|
|
188
|
-
@grid_marker_number_values[index] ||=
|
196
|
+
@grid_marker_number_values[index] ||= begin
|
197
|
+
value = (grid_marker_points.size - index).to_i
|
198
|
+
value = y_value_max_for_all_lines if !y_value_max_for_all_lines.nil? && y_value_max_for_all_lines.to_i != y_value_max_for_all_lines && grid_marker_points.size == 1
|
199
|
+
value
|
200
|
+
end
|
189
201
|
grid_marker_number_value = @grid_marker_number_values[index]
|
190
202
|
@grid_marker_numbers[index] ||= (grid_marker_number_value >= 1000) ? "#{grid_marker_number_value / 1000}K" : grid_marker_number_value.to_s
|
191
203
|
grid_marker_number = @grid_marker_numbers[index]
|
@@ -215,7 +227,7 @@ module Glimmer
|
|
215
227
|
stroke graph_stroke_marker_line
|
216
228
|
}
|
217
229
|
end
|
218
|
-
if grid_marker_number_value % mod_value == comparison_value
|
230
|
+
if grid_marker_number_value % mod_value == comparison_value || grid_marker_number_value != grid_marker_number_value.to_i
|
219
231
|
grid_marker_number_width = estimate_width_of_text(grid_marker_number, grid_marker_number_font)
|
220
232
|
text(marker_point[:x] + 4 + 3, marker_point[:y] - 6, grid_marker_number_width) {
|
221
233
|
string(grid_marker_number) {
|
@@ -229,10 +241,10 @@ module Glimmer
|
|
229
241
|
|
230
242
|
def grid_marker_points
|
231
243
|
if @grid_marker_points.nil?
|
232
|
-
|
244
|
+
graph_y_max = [y_value_max_for_all_lines, y_value_max_for_all_lines.between?(0, 1) ? y_value_max_for_all_lines : 1].max
|
233
245
|
current_graph_height = (height - graph_padding_height * 2)
|
234
|
-
division_height = current_graph_height /
|
235
|
-
@grid_marker_points =
|
246
|
+
division_height = current_graph_height / graph_y_max
|
247
|
+
@grid_marker_points = graph_y_max.ceil.times.map do |marker_index|
|
236
248
|
x = graph_padding_width
|
237
249
|
y = graph_padding_height + marker_index * division_height
|
238
250
|
{x: x, y: y}
|
@@ -280,10 +292,10 @@ module Glimmer
|
|
280
292
|
if @points[graph_line].nil?
|
281
293
|
y_values = graph_line[:y_values] || []
|
282
294
|
y_values = y_values[0, max_visible_point_count(graph_line)]
|
283
|
-
|
295
|
+
graph_y_max = [y_value_max_for_all_lines, 1].max
|
284
296
|
points = y_values.each_with_index.map do |y_value, index|
|
285
297
|
x = width - graph_padding_width - (index * graph_point_distance_for_line(graph_line))
|
286
|
-
y = ((height - graph_padding_height) - y_value * ((height - graph_padding_height * 2) /
|
298
|
+
y = ((height - graph_padding_height) - y_value * ((height - graph_padding_height * 2) / graph_y_max))
|
287
299
|
{x: x, y: y, index: index, y_value: y_value}
|
288
300
|
end
|
289
301
|
@points[graph_line] = translate_points(graph_line, points)
|
@@ -300,9 +312,10 @@ module Glimmer
|
|
300
312
|
x_value_range_for_all_lines
|
301
313
|
points = values.each_with_index.map do |(x_value, y_value), index|
|
302
314
|
relative_x_value = x_value - x_value_min_for_all_lines
|
303
|
-
|
304
|
-
|
305
|
-
|
315
|
+
scaled_x_value = x_value_range_for_all_lines == 0 ? 0 : relative_x_value.to_f * x_resolution.to_f
|
316
|
+
scaled_y_value = y_value_max_for_all_lines == 0 ? 0 : y_value.to_f * y_resolution.to_f
|
317
|
+
x = width - graph_padding_width - scaled_x_value
|
318
|
+
y = height - graph_padding_height - scaled_y_value
|
306
319
|
{x: x, y: y, index: index, x_value: x_value, y_value: y_value}
|
307
320
|
end
|
308
321
|
# Translation is not supported today
|
@@ -313,9 +326,15 @@ module Glimmer
|
|
313
326
|
@points[graph_line]
|
314
327
|
end
|
315
328
|
|
316
|
-
# this is the multiplier that we must multiply by the
|
329
|
+
# this is the multiplier that we must multiply by the relative x value
|
317
330
|
def x_resolution
|
318
|
-
@x_resolution ||=
|
331
|
+
@x_resolution ||= width_drawable.to_f / x_value_range_for_all_lines.to_f
|
332
|
+
end
|
333
|
+
|
334
|
+
# this is the multiplier that we must multiply by the relative y value
|
335
|
+
def y_resolution
|
336
|
+
# TODO in the future, we will use the y range, but today, we assume it starts at 0
|
337
|
+
@y_resolution ||= height_drawable.to_f / y_value_max_for_all_lines.to_f
|
319
338
|
end
|
320
339
|
|
321
340
|
def x_value_range_for_all_lines
|
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.7
|
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-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: glimmer-dsl-libui
|