111 lines
2.9 KiB
Lua
111 lines
2.9 KiB
Lua
local c = {}
|
|
|
|
local Plot = require 'Plot'
|
|
local Text = require 'Text'
|
|
|
|
local _CAIRO_SET_SOURCE = cairo_set_source
|
|
local _CAIRO_SET_FONT_FACE = cairo_set_font_face
|
|
local _CAIRO_SET_FONT_SIZE = cairo_set_font_size
|
|
local _CAIRO_MOVE_TO = cairo_move_to
|
|
local _CAIRO_SHOW_TEXT = cairo_show_text
|
|
local _CAIRO_STROKE = cairo_stroke
|
|
|
|
local X_LABEL_PAD = 8
|
|
local Y_LABEL_PAD = 5
|
|
|
|
local draw = function(obj, cr)
|
|
local labels_x = obj.labels.x
|
|
local labels_y = obj.labels.y
|
|
local labels_x_1 = labels_x[1]
|
|
|
|
_CAIRO_SET_FONT_FACE(cr, labels_x_1.font_face)
|
|
_CAIRO_SET_FONT_SIZE(cr, labels_x_1.font_size)
|
|
_CAIRO_SET_SOURCE(cr, labels_x_1.source)
|
|
|
|
for i = 1, #labels_x do
|
|
local current_label = labels_x[i]
|
|
_CAIRO_MOVE_TO(cr, current_label.x, current_label.y)
|
|
_CAIRO_SHOW_TEXT(cr, current_label.text)
|
|
end
|
|
|
|
for i = 1, #labels_y do
|
|
local current_label = labels_y[i]
|
|
_CAIRO_MOVE_TO(cr, current_label.x, current_label.y)
|
|
_CAIRO_SHOW_TEXT(cr, current_label.text)
|
|
end
|
|
|
|
Plot.draw(obj.plot, cr)
|
|
end
|
|
|
|
local populate_x_labels = function(obj, cr, input_factor)
|
|
local labels_x = obj.labels.x
|
|
local n = #labels_x - 1
|
|
input_factor = input_factor or 1
|
|
for i = 0, n do
|
|
Text.set(labels_x[i + 1], cr, labels_x._func(input_factor * i / n))
|
|
end
|
|
labels_x.height = labels_x[1].height + X_LABEL_PAD
|
|
local plot = obj.plot
|
|
plot.height = obj.height - labels_x.height
|
|
plot.bottom_y = plot.height - plot.y
|
|
end
|
|
|
|
local __get_y_axis_width = function(obj)
|
|
local labels_y = obj.labels.y
|
|
local width = labels_y[1].width
|
|
for i = 2, #labels_y do
|
|
local current_width = labels_y[i].width
|
|
if current_width > width then
|
|
width = current_width
|
|
end
|
|
end
|
|
return width + Y_LABEL_PAD
|
|
end
|
|
|
|
local populate_y_labels = function(obj, cr, input_factor)
|
|
local labels_y = obj.labels.y
|
|
local n = #labels_y - 1
|
|
input_factor = input_factor or 1
|
|
for i = 0, n do
|
|
Text.set(labels_y[i + 1], cr, labels_y._func(input_factor * (n - i) / n))
|
|
end
|
|
labels_y.width = __get_y_axis_width(obj)
|
|
|
|
local plot = obj.plot
|
|
plot.x = obj.x + labels_y.width
|
|
plot.width = obj.width - labels_y.width
|
|
end
|
|
|
|
local position_x_labels = function(obj)
|
|
local start_x = obj.plot.x
|
|
local labels_x = obj.labels.x
|
|
local x_intrvl_width = obj.plot.width / (#labels_x - 1)
|
|
for i = 1, #labels_x do
|
|
Text.move_to_x(labels_x[i], start_x + x_intrvl_width * (i - 1))
|
|
end
|
|
end
|
|
|
|
local position_y_labels = function(obj)
|
|
local labels_y = obj.labels.y
|
|
local y_intrvl_height = obj.plot.height / (#labels_y - 1)
|
|
for i = 1, #labels_y do
|
|
Text.move_to_y(labels_y[i], obj.y + y_intrvl_height * (i - 1))
|
|
end
|
|
end
|
|
|
|
local update = function(obj, value)
|
|
Plot.update(obj.plot, value)
|
|
end
|
|
|
|
c.update = update
|
|
c.draw = draw
|
|
c.position_x_intrvls = Plot.position_x_intrvls
|
|
c.position_y_intrvls = Plot.position_y_intrvls
|
|
c.position_graph_outline = Plot.position_graph_outline
|
|
c.populate_x_labels = populate_x_labels
|
|
c.populate_y_labels = populate_y_labels
|
|
c.position_x_labels = position_x_labels
|
|
c.position_y_labels = position_y_labels
|
|
|
|
return c
|