render text consistently at different zoom levels

This was hard to track down because lua's print implicitly hides tiny
fractions, making non-integers look like integers. So there's a gotcha
here: ensure that parameters to edit.initialize are integers. I'm
documenting it on the caller and also defensively converting to an int
inside the callee.
This commit is contained in:
Kartik K. Agaram 2022-12-23 16:34:36 -08:00
parent 97e65935f3
commit 7f4aa51533
46 changed files with 768 additions and 3 deletions

22
0317-box_height Normal file
View File

@ -0,0 +1,22 @@
box_height = function(node)
-- return the height of a node. The result is scaled.
print('computing box height based on font size', node.scaled_fontsize, node.editor.font_height, node.editor.line_height)
if #node.editor.lines > 1 then Box_heights = {} end
local y = 0
for i=1,#node.editor.lines do
local line = node.editor.lines[i]
if node.editor.line_cache[i] == nil then
node.editor.line_cache[i] = {}
end
node.editor.line_cache[i].fragments = nil
node.editor.line_cache[i].screen_line_starting_pos = nil
Text.compute_fragments(node.editor, i)
Text.populate_screen_line_starting_pos(node.editor, i)
y = y + node.editor.line_height*#node.editor.line_cache[i].screen_line_starting_pos
if #node.editor.lines > 1 then
table.insert(Box_heights, y)
end
Text.clear_screen_line_cache(node.editor, i)
end
return y
end

1
0317-manifest Normal file
View File

@ -0,0 +1 @@
{"on.keychord_pressed":311,"scale":7,"Page":312,"on.code_changed":306,"clip":236,"clip_all":265,"on.textinput":177,"Surface":196,"on.initialize":304,"font":228,"A":309,"vx":5,"Box_heights":277,"Viewport":303,"B":316,"compute_layout":301,"vy":8,"Cursor_node":172,"on":1,"parent":316,"box_height":317,"on.mouse_pressed":179,"initialize_editor":313,"on.mouse_released":178,"to_text":180,"on.update":315,"on.draw":310}

47
0318-Page Normal file
View File

@ -0,0 +1,47 @@
Page = {
-- page
type='cols', x=0, y=0,
width=800, data={
--[[
-- editor covering left side
{
type='text',
name='editor',
doc='prose goes here, on the left half of the window',
margin=Margin_left,
data={
-- "Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.",
'1',
'2',
'3',
'mno',
'Acb',
'g',
'hij',
'klm',
'nop',
},
width=400, bg={r=1,g=1,b=0}
},
]]
-- a table on the right
{ type='rows', name='searches', margin=50, data={
{ type='text', data={''},},
{ type='cols', data={
{ type='text', data={'search:'},},
{ type='text', name='search', bg={r=0.8,g=0.8,b=0.8}, data={''}, width=90,},
}},
{ type='text', data={'table:'},},
{ type='cols', bg={r=0.8,g=0.8,b=0.8}, data={
{ type='rows', width=90, data={
{type='text', data={'abc'},},
{type='text', data={'abc'},},
}},
{ type='rows', width=90, data={
{type='text', data={'def'},},
{type='text', data={'def'},},
}},
}},
}},
},
}

1
0318-manifest Normal file
View File

@ -0,0 +1 @@
{"on.keychord_pressed":311,"scale":7,"Page":318,"on.code_changed":306,"clip":236,"clip_all":265,"on.textinput":177,"Surface":196,"on.initialize":304,"font":228,"A":309,"vx":5,"Box_heights":277,"Viewport":303,"B":316,"compute_layout":301,"vy":8,"Cursor_node":172,"on":1,"parent":317,"box_height":317,"on.mouse_pressed":179,"initialize_editor":313,"on.mouse_released":178,"to_text":180,"on.update":315,"on.draw":310}

47
0319-Page Normal file
View File

@ -0,0 +1,47 @@
Page = {
-- page
type='cols', x=0, y=0,
width=800, data={
--[[
-- editor covering left side
{
type='text',
name='editor',
doc='prose goes here, on the left half of the window',
margin=Margin_left,
data={
-- "Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.",
'1',
'2',
'3',
'mno',
'Acb',
'g',
'hij',
'klm',
'nop',
},
width=400, bg={r=1,g=1,b=0}
},
]]
-- a table on the right
{ type='rows', name='searches', margin=50, data={
-- { type='text', data={''},},
{ type='cols', data={
{ type='text', data={'search:'},},
{ type='text', name='search', bg={r=0.8,g=0.8,b=0.8}, data={''}, width=90,},
}},
{ type='text', data={'table:'},},
{ type='cols', bg={r=0.8,g=0.8,b=0.8}, data={
{ type='rows', width=90, data={
{type='text', data={'abc'},},
{type='text', data={'abc'},},
}},
{ type='rows', width=90, data={
{type='text', data={'def'},},
{type='text', data={'def'},},
}},
}},
}},
},
}

1
0319-manifest Normal file
View File

@ -0,0 +1 @@
{"on.keychord_pressed":311,"scale":7,"Page":319,"on.code_changed":306,"clip":236,"clip_all":265,"on.textinput":177,"Surface":196,"on.initialize":304,"font":228,"A":309,"vx":5,"Box_heights":277,"Viewport":303,"B":316,"compute_layout":301,"vy":8,"Cursor_node":172,"on":1,"parent":318,"box_height":317,"on.mouse_pressed":179,"initialize_editor":313,"on.mouse_released":178,"to_text":180,"on.update":315,"on.draw":310}

47
0320-Page Normal file
View File

@ -0,0 +1,47 @@
Page = {
-- page
type='cols', x=0, y=0,
width=800, data={
--[[
-- editor covering left side
{
type='text',
name='editor',
doc='prose goes here, on the left half of the window',
margin=Margin_left,
data={
-- "Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.",
'1',
'2',
'3',
'mno',
'Acb',
'g',
'hij',
'klm',
'nop',
},
width=400, bg={r=1,g=1,b=0}
},
]]
-- a table on the right
{ type='rows', name='searches', margin=50, data={
-- { type='text', data={''},},
{ type='cols', data={
{ type='text', data={'search:'},},
{ type='text', name='search', bg={r=0.8,g=0.8,b=0.8}, data={''}, width=90,},
}},
-- { type='text', data={'table:'},},
{ type='cols', bg={r=0.8,g=0.8,b=0.8}, data={
{ type='rows', width=90, data={
{type='text', data={'abc'},},
{type='text', data={'abc'},},
}},
{ type='rows', width=90, data={
{type='text', data={'def'},},
{type='text', data={'def'},},
}},
}},
}},
},
}

1
0320-manifest Normal file
View File

@ -0,0 +1 @@
{"on.keychord_pressed":311,"scale":7,"Page":320,"on.code_changed":306,"clip":236,"clip_all":265,"on.textinput":177,"Surface":196,"on.initialize":304,"font":228,"A":309,"vx":5,"Box_heights":277,"Viewport":303,"B":316,"compute_layout":301,"vy":8,"Cursor_node":172,"on":1,"parent":319,"box_height":317,"on.mouse_pressed":179,"initialize_editor":313,"on.mouse_released":178,"to_text":180,"on.update":315,"on.draw":310}

49
0321-Page Normal file
View File

@ -0,0 +1,49 @@
Page = {
-- page
type='cols', x=0, y=0,
width=800, data={
--[[
-- editor covering left side
{
type='text',
name='editor',
doc='prose goes here, on the left half of the window',
margin=Margin_left,
data={
-- "Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.",
'1',
'2',
'3',
'mno',
'Acb',
'g',
'hij',
'klm',
'nop',
},
width=400, bg={r=1,g=1,b=0}
},
]]
-- a table on the right
{ type='rows', name='searches', margin=50, data={
-- { type='text', data={''},},
--[[
{ type='cols', data={
{ type='text', data={'search:'},},
{ type='text', name='search', bg={r=0.8,g=0.8,b=0.8}, data={''}, width=90,},
}},
]]
-- { type='text', data={'table:'},},
{ type='cols', bg={r=0.8,g=0.8,b=0.8}, data={
{ type='rows', width=90, data={
{type='text', data={'abc'},},
{type='text', data={'abc'},},
}},
{ type='rows', width=90, data={
{type='text', data={'def'},},
{type='text', data={'def'},},
}},
}},
}},
},
}

1
0321-manifest Normal file
View File

@ -0,0 +1 @@
{"on.keychord_pressed":311,"scale":7,"Page":321,"on.code_changed":306,"clip":236,"clip_all":265,"on.textinput":177,"Surface":196,"on.initialize":304,"font":228,"A":309,"vx":5,"Box_heights":277,"Viewport":303,"B":316,"compute_layout":301,"vy":8,"Cursor_node":172,"on":1,"parent":320,"box_height":317,"on.mouse_pressed":179,"initialize_editor":313,"on.mouse_released":178,"to_text":180,"on.update":315,"on.draw":310}

49
0322-Page Normal file
View File

@ -0,0 +1,49 @@
Page = {
-- page
type='cols', x=0, y=0,
width=800, data={
--[[
-- editor covering left side
{
type='text',
name='editor',
doc='prose goes here, on the left half of the window',
margin=Margin_left,
data={
-- "Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.",
'1',
'2',
'3',
'mno',
'Acb',
'g',
'hij',
'klm',
'nop',
},
width=400, bg={r=1,g=1,b=0}
},
]]
-- a table on the right
{ type='rows', name='searches', margin=50, data={
-- { type='text', data={''},},
--[[
{ type='cols', data={
{ type='text', data={'search:'},},
{ type='text', name='search', bg={r=0.8,g=0.8,b=0.8}, data={''}, width=90,},
}},
]]
-- { type='text', data={'table:'},},
{ type='cols', bg={r=0.8,g=0.8,b=0.8}, data={
{ type='rows', width=90, data={
{type='text', data={'abc'},},
-- {type='text', data={'abc'},},
}},
{ type='rows', width=90, data={
{type='text', data={'def'},},
{type='text', data={'def'},},
}},
}},
}},
},
}

1
0322-manifest Normal file
View File

@ -0,0 +1 @@
{"on.keychord_pressed":311,"scale":7,"Page":322,"on.code_changed":306,"clip":236,"clip_all":265,"on.textinput":177,"Surface":196,"on.initialize":304,"font":228,"A":309,"vx":5,"Box_heights":277,"Viewport":303,"B":316,"compute_layout":301,"vy":8,"Cursor_node":172,"on":1,"parent":321,"box_height":317,"on.mouse_pressed":179,"initialize_editor":313,"on.mouse_released":178,"to_text":180,"on.update":315,"on.draw":310}

51
0323-Page Normal file
View File

@ -0,0 +1,51 @@
Page = {
-- page
type='cols', x=0, y=0,
width=800, data={
--[[
-- editor covering left side
{
type='text',
name='editor',
doc='prose goes here, on the left half of the window',
margin=Margin_left,
data={
-- "Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.",
'1',
'2',
'3',
'mno',
'Acb',
'g',
'hij',
'klm',
'nop',
},
width=400, bg={r=1,g=1,b=0}
},
]]
-- a table on the right
{ type='rows', name='searches', margin=50, data={
-- { type='text', data={''},},
--[[
{ type='cols', data={
{ type='text', data={'search:'},},
{ type='text', name='search', bg={r=0.8,g=0.8,b=0.8}, data={''}, width=90,},
}},
]]
-- { type='text', data={'table:'},},
{ type='cols', bg={r=0.8,g=0.8,b=0.8}, data={
--[[
{ type='rows', width=90, data={
{type='text', data={'abc'},},
{type='text', data={'abc'},},
}},
]]
{ type='rows', width=90, data={
{type='text', data={'def'},},
{type='text', data={'def'},},
}},
}},
}},
},
}

1
0323-manifest Normal file
View File

@ -0,0 +1 @@
{"on.keychord_pressed":311,"scale":7,"Page":323,"on.code_changed":306,"clip":236,"clip_all":265,"on.textinput":177,"Surface":196,"on.initialize":304,"font":228,"A":309,"vx":5,"Box_heights":277,"Viewport":303,"B":316,"compute_layout":301,"vy":8,"Cursor_node":172,"on":1,"parent":322,"box_height":317,"on.mouse_pressed":179,"initialize_editor":313,"on.mouse_released":178,"to_text":180,"on.update":315,"on.draw":310}

51
0324-Page Normal file
View File

@ -0,0 +1,51 @@
Page = {
-- page
type='cols', x=0, y=0,
width=800, data={
--[[
-- editor covering left side
{
type='text',
name='editor',
doc='prose goes here, on the left half of the window',
margin=Margin_left,
data={
-- "Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.",
'1',
'2',
'3',
'mno',
'Acb',
'g',
'hij',
'klm',
'nop',
},
width=400, bg={r=1,g=1,b=0}
},
]]
-- a table on the right
{ type='rows', name='searches', margin=50, data={
-- { type='text', data={''},},
--[[
{ type='cols', data={
{ type='text', data={'search:'},},
{ type='text', name='search', bg={r=0.8,g=0.8,b=0.8}, data={''}, width=90,},
}},
]]
-- { type='text', data={'table:'},},
{ type='cols', bg={r=0.8,g=0.8,b=0.8}, data={
--[[
{ type='rows', width=90, data={
{type='text', data={'abc'},},
{type='text', data={'abc'},},
}},
]]
{ type='rows', width=90, data={
-- {type='text', data={'def'},},
{type='text', data={'def'},},
}},
}},
}},
},
}

1
0324-manifest Normal file
View File

@ -0,0 +1 @@
{"on.keychord_pressed":311,"scale":7,"Page":324,"on.code_changed":306,"clip":236,"clip_all":265,"on.textinput":177,"Surface":196,"on.initialize":304,"font":228,"A":309,"vx":5,"Box_heights":277,"Viewport":303,"B":316,"compute_layout":301,"vy":8,"Cursor_node":172,"on":1,"parent":323,"box_height":317,"on.mouse_pressed":179,"initialize_editor":313,"on.mouse_released":178,"to_text":180,"on.update":315,"on.draw":310}

13
0325-initialize_editor Normal file
View File

@ -0,0 +1,13 @@
initialize_editor = function(obj)
if obj.w then
-- use an editor to wrap the text
local scaled_fontsize = scale(20)
local scaled_lineheight = math.floor(scaled_fontsize*1.3)
print('init', obj.data[1], obj.w)
print('at zoom', Viewport.zoom)
print('with width', obj.w)
obj.editor = edit.initialize_state(vy(obj.y), vx(obj.x), vx(obj.x+obj.w), scaled_fontsize, scaled_lineheight)
obj.editor.lines = load_array(obj.data)
Text.redraw_all(obj.editor)
end
end

1
0325-manifest Normal file
View File

@ -0,0 +1 @@
{"on.keychord_pressed":311,"scale":7,"Page":324,"on.code_changed":306,"clip":236,"clip_all":265,"on.textinput":177,"Surface":196,"on.initialize":304,"font":228,"A":309,"vx":5,"Box_heights":277,"Viewport":303,"B":316,"compute_layout":301,"vy":8,"Cursor_node":172,"on":1,"parent":324,"box_height":317,"on.mouse_pressed":179,"initialize_editor":325,"on.mouse_released":178,"to_text":180,"on.update":315,"on.draw":310}

13
0326-initialize_editor Normal file
View File

@ -0,0 +1,13 @@
initialize_editor = function(obj)
if obj.w then
-- use an editor to wrap the text
local scaled_fontsize = scale(20)
local scaled_lineheight = math.floor(scaled_fontsize*1.3)
print('init', obj.data[1], obj.w)
print('at zoom', Viewport.zoom)
print('width', obj.w, 'scales to', scale(obj.w))
obj.editor = edit.initialize_state(vy(obj.y), vx(obj.x), vx(obj.x+obj.w), scaled_fontsize, scaled_lineheight)
obj.editor.lines = load_array(obj.data)
Text.redraw_all(obj.editor)
end
end

1
0326-manifest Normal file
View File

@ -0,0 +1 @@
{"on.keychord_pressed":311,"scale":7,"Page":324,"on.code_changed":306,"clip":236,"clip_all":265,"on.textinput":177,"Surface":196,"on.initialize":304,"font":228,"A":309,"vx":5,"Box_heights":277,"Viewport":303,"B":316,"compute_layout":301,"vy":8,"Cursor_node":172,"on":1,"parent":325,"box_height":317,"on.mouse_pressed":179,"initialize_editor":326,"on.mouse_released":178,"to_text":180,"on.update":315,"on.draw":310}

16
0327-initialize_editor Normal file
View File

@ -0,0 +1,16 @@
initialize_editor = function(obj)
if obj.w then
-- use an editor to wrap the text
local scaled_fontsize = scale(20)
local scaled_lineheight = math.floor(scaled_fontsize*1.3)
print('init', obj.data[1], obj.w)
print('at zoom', Viewport.zoom)
print('width', obj.w, 'scales to', scale(obj.w))
print('left', vx(obj.x))
print('right', vx(obj.x+obj.w))
print('width', vx(obj.x+obj.w)-vx(obj.x))
obj.editor = edit.initialize_state(vy(obj.y), vx(obj.x), vx(obj.x+obj.w), scaled_fontsize, scaled_lineheight)
obj.editor.lines = load_array(obj.data)
Text.redraw_all(obj.editor)
end
end

1
0327-manifest Normal file
View File

@ -0,0 +1 @@
{"on.keychord_pressed":311,"scale":7,"Page":324,"on.code_changed":306,"clip":236,"clip_all":265,"on.textinput":177,"Surface":196,"on.initialize":304,"font":228,"A":309,"vx":5,"Box_heights":277,"Viewport":303,"B":316,"compute_layout":301,"vy":8,"Cursor_node":172,"on":1,"parent":326,"box_height":317,"on.mouse_pressed":179,"initialize_editor":327,"on.mouse_released":178,"to_text":180,"on.update":315,"on.draw":310}

18
0328-initialize_editor Normal file
View File

@ -0,0 +1,18 @@
initialize_editor = function(obj)
if obj.w then
-- use an editor to wrap the text
local scaled_fontsize = scale(20)
local scaled_lineheight = math.floor(scaled_fontsize*1.3)
--[[
print('init', obj.data[1], obj.w)
print('at zoom', Viewport.zoom)
print('width', obj.w, 'scales to', scale(obj.w))
print('left', vx(obj.x))
print('right', vx(obj.x+obj.w))
print('width', vx(obj.x+obj.w)-vx(obj.x))
]]
obj.editor = edit.initialize_state(vy(obj.y), vx(obj.x), vx(obj.x+obj.w), scaled_fontsize, scaled_lineheight)
obj.editor.lines = load_array(obj.data)
Text.redraw_all(obj.editor)
end
end

1
0328-manifest Normal file
View File

@ -0,0 +1 @@
{"on.keychord_pressed":311,"scale":7,"Page":324,"on.code_changed":306,"clip":236,"clip_all":265,"on.textinput":177,"Surface":196,"on.initialize":304,"font":228,"A":309,"vx":5,"Box_heights":277,"Viewport":303,"B":316,"compute_layout":301,"vy":8,"Cursor_node":172,"on":1,"parent":327,"box_height":317,"on.mouse_pressed":179,"initialize_editor":328,"on.mouse_released":178,"to_text":180,"on.update":315,"on.draw":310}

18
0329-initialize_editor Normal file
View File

@ -0,0 +1,18 @@
initialize_editor = function(obj)
if obj.w then
-- use an editor to wrap the text
local scaled_fontsize = scale(20)
local scaled_lineheight = math.floor(scaled_fontsize*1.3)
----[[
print('init', obj.data[1], obj.w)
print('at zoom', Viewport.zoom)
print('width', obj.w, 'scales to', scale(obj.w))
print('left', vx(obj.x))
print('right', vx(obj.x+obj.w))
print('width', vx(obj.x+obj.w)-vx(obj.x))
-- ]]
obj.editor = edit.initialize_state(vy(obj.y), vx(obj.x), vx(obj.x+obj.w), scaled_fontsize, scaled_lineheight)
obj.editor.lines = load_array(obj.data)
Text.redraw_all(obj.editor)
end
end

1
0329-manifest Normal file
View File

@ -0,0 +1 @@
{"on.keychord_pressed":311,"scale":7,"Page":324,"on.code_changed":306,"clip":236,"clip_all":265,"on.textinput":177,"Surface":196,"on.initialize":304,"font":228,"A":309,"vx":5,"Box_heights":277,"Viewport":303,"B":316,"compute_layout":301,"vy":8,"Cursor_node":172,"on":1,"parent":328,"box_height":317,"on.mouse_pressed":179,"initialize_editor":329,"on.mouse_released":178,"to_text":180,"on.update":315,"on.draw":310}

18
0330-initialize_editor Normal file
View File

@ -0,0 +1,18 @@
initialize_editor = function(obj)
if obj.w then
-- use an editor to wrap the text
local scaled_fontsize = scale(20)
local scaled_lineheight = math.floor(scaled_fontsize*1.3)
--[[
print('init', obj.data[1], obj.w)
print('at zoom', Viewport.zoom)
print('width', obj.w, 'scales to', scale(obj.w))
print('left', vx(obj.x))
print('right', vx(obj.x+obj.w))
print('width', vx(obj.x+obj.w)-vx(obj.x))
-- ]]
obj.editor = edit.initialize_state(vy(obj.y), vx(obj.x), vx(obj.x+obj.w), scaled_fontsize, scaled_lineheight)
obj.editor.lines = load_array(obj.data)
Text.redraw_all(obj.editor)
end
end

1
0330-manifest Normal file
View File

@ -0,0 +1 @@
{"on.keychord_pressed":311,"scale":7,"Page":324,"on.code_changed":306,"clip":236,"clip_all":265,"on.textinput":177,"Surface":196,"on.initialize":304,"font":228,"A":309,"vx":5,"Box_heights":277,"Viewport":303,"B":316,"compute_layout":301,"vy":8,"Cursor_node":172,"on":1,"parent":329,"box_height":317,"on.mouse_pressed":179,"initialize_editor":330,"on.mouse_released":178,"to_text":180,"on.update":315,"on.draw":310}

18
0331-initialize_editor Normal file
View File

@ -0,0 +1,18 @@
initialize_editor = function(obj)
if obj.w then
-- use an editor to wrap the text
local scaled_fontsize = scale(20)
local scaled_lineheight = math.floor(scaled_fontsize*1.3)
----[[
print('init', obj.data[1], obj.w)
print('at zoom', Viewport.zoom)
print('width', obj.w, 'scales to', scale(obj.w))
print('left', vx(obj.x))
print('right', vx(obj.x+obj.w))
print('width', vx(obj.x+obj.w)-vx(obj.x))
-- ]]
obj.editor = edit.initialize_state(vy(obj.y), vx(obj.x), vx(obj.x+obj.w), scaled_fontsize, scaled_lineheight)
obj.editor.lines = load_array(obj.data)
Text.redraw_all(obj.editor)
end
end

1
0331-manifest Normal file
View File

@ -0,0 +1 @@
{"on.keychord_pressed":311,"scale":7,"Page":324,"on.code_changed":306,"clip":236,"clip_all":265,"on.textinput":177,"Surface":196,"on.initialize":304,"font":228,"A":309,"vx":5,"Box_heights":277,"Viewport":303,"B":316,"compute_layout":301,"vy":8,"Cursor_node":172,"on":1,"parent":330,"box_height":317,"on.mouse_pressed":179,"initialize_editor":331,"on.mouse_released":178,"to_text":180,"on.update":315,"on.draw":310}

18
0332-initialize_editor Normal file
View File

@ -0,0 +1,18 @@
initialize_editor = function(obj)
if obj.w then
-- use an editor to wrap the text
local scaled_fontsize = scale(20)
local scaled_lineheight = math.floor(scaled_fontsize*1.3)
----[[
print('init', obj.data[1], obj.w)
print('at zoom', Viewport.zoom)
print('width', obj.w, 'scales to', scale(obj.w))
print('left', vx(obj.x))
print('right', vx(obj.x+obj.w))
print('width', vx(obj.x+obj.w)-vx(obj.x))
-- ]]
obj.editor = edit.initialize_state(vy(obj.y), vx(obj.x), vx(obj.x+obj.w), scaled_fontsize, scaled_lineheight)
obj.editor.lines = load_array(obj.data)
Text.redraw_all(obj.editor)
end
end

1
0332-manifest Normal file
View File

@ -0,0 +1 @@
{"on.keychord_pressed":311,"scale":7,"Page":324,"on.code_changed":306,"clip":236,"clip_all":265,"on.textinput":177,"Surface":196,"on.initialize":304,"font":228,"A":309,"vx":5,"Box_heights":277,"Viewport":303,"B":316,"compute_layout":301,"vy":8,"Cursor_node":172,"on":1,"parent":331,"box_height":317,"on.mouse_pressed":179,"initialize_editor":332,"on.mouse_released":178,"to_text":180,"on.update":315,"on.draw":310}

18
0333-initialize_editor Normal file
View File

@ -0,0 +1,18 @@
initialize_editor = function(obj)
if obj.w then
-- use an editor to wrap the text
local scaled_fontsize = scale(20)
local scaled_lineheight = math.floor(scaled_fontsize*1.3)
----[[
print('init', obj.data[1], obj.w)
print('at zoom', Viewport.zoom)
print('width', obj.w, 'scales to', scale(obj.w))
print('left', vx(obj.x))
print('right', vx(obj.x+obj.w))
print('width', vx(obj.x+obj.w)-vx(obj.x))
-- ]]
obj.editor = edit.initialize_state(vy(obj.y), vx(obj.x), vx(obj.x+obj.w), scaled_fontsize, scaled_lineheight)
obj.editor.lines = load_array(obj.data)
Text.redraw_all(obj.editor)
end
end

1
0333-manifest Normal file
View File

@ -0,0 +1 @@
{"parent":332,"font":228,"on.mouse_released":178,"on.update":315,"box_height":317,"on.keychord_pressed":311,"compute_layout":301,"to_text":180,"Page":324,"clip":236,"on.code_changed":306,"scale":7,"on.initialize":304,"Surface":196,"A":309,"on.draw":310,"Box_heights":277,"initialize_editor":333,"vx":5,"on.mouse_pressed":179,"Viewport":303,"on":1,"Cursor_node":172,"vy":8,"B":316,"clip_all":265,"on.textinput":177}

92
0334-compute_layout Normal file
View File

@ -0,0 +1,92 @@
compute_layout = function(node, x,y, nodes_to_render)
-- append to nodes_to_render flattened instructions to render a hierarchy of nodes
-- return x,y rendered until (surface coordinates)
if node.type == 'text' then
-- leaf node containing raw text
node.x = x
node.y = y
-- render background if necessary
local node_to_render
if node.bg then
node_to_render = {type='rectangle', r=node.bg.r, g=node.bg.g, b=node.bg.b, x=node.x, y=node.y}
table.insert(nodes_to_render, node_to_render)
end
-- render contents
if node.width then
node.w = node.width
else
node.w = 0
for i,s in ipairs(node.data) do
local text = love.graphics.newText(20, node.data)
local width = text:getWidth()
print(node.data[i], 'has width', width)
if node.w < width then node.w = width end
end
end
initialize_editor(node)
node.h = box_height(node)
table.insert(nodes_to_render, node)
if node_to_render then
node_to_render.w = node.w
node_to_render.h = node.h
end
elseif node.type == 'rows' then
node.x = x
node.y = y
local node_to_render
if node.bg then
node_to_render = {type='rectangle', r=node.bg.r, g=node.bg.g, b=node.bg.b, x=node.x, y=node.y}
table.insert(nodes_to_render, node_to_render)
end
-- lay out children top to bottom
local subx,suby = x,y
local w,h = 0,0
local subnodes
for _,child in ipairs(node.data) do
if child.margin then
suby = suby+child.margin
h = h+child.margin
end
subx,suby = compute_layout(child, x,suby, nodes_to_render)
if w < child.w then
w = child.w
end
h = h+child.h
end
node.w = w
node.h = h
if node_to_render then
node_to_render.w = w
node_to_render.h = h
end
elseif node.type == 'cols' then
node.x = x
node.y = y
-- lay out children left to right
local node_to_render
if node.bg then
node_to_render = {type='rectangle', r=node.bg.r, g=node.bg.g, b=node.bg.b, x=node.x, y=node.y}
table.insert(nodes_to_render, node_to_render)
end
local subx,suby = x,y
local w,h = 0,0
for _,child in ipairs(node.data) do
if child.margin then
subx = subx+child.margin
w = w+child.margin
end
subx,suby = compute_layout(child, subx,y, nodes_to_render)
w = w + child.w
if h < child.h then
h = child.h
end
end
node.w = w
node.h = h
if node_to_render then
node_to_render.w = w
node_to_render.h = h
end
end
return x+node.w,y+node.h
end

1
0334-manifest Normal file
View File

@ -0,0 +1 @@
{"parent":333,"font":228,"on.mouse_released":178,"on.update":315,"box_height":317,"on.keychord_pressed":311,"compute_layout":334,"to_text":180,"Page":324,"clip":236,"on.code_changed":306,"scale":7,"on.initialize":304,"Surface":196,"A":309,"on.draw":310,"Box_heights":277,"initialize_editor":333,"vx":5,"on.mouse_pressed":179,"Viewport":303,"on":1,"Cursor_node":172,"vy":8,"B":316,"clip_all":265,"on.textinput":177}

92
0335-compute_layout Normal file
View File

@ -0,0 +1,92 @@
compute_layout = function(node, x,y, nodes_to_render)
-- append to nodes_to_render flattened instructions to render a hierarchy of nodes
-- return x,y rendered until (surface coordinates)
if node.type == 'text' then
-- leaf node containing raw text
node.x = x
node.y = y
-- render background if necessary
local node_to_render
if node.bg then
node_to_render = {type='rectangle', r=node.bg.r, g=node.bg.g, b=node.bg.b, x=node.x, y=node.y}
table.insert(nodes_to_render, node_to_render)
end
-- render contents
if node.width then
node.w = node.width
else
node.w = 0
for i,s in ipairs(node.data) do
local text = love.graphics.newText(font(20), node.data)
local width = text:getWidth()
print(node.data[i], 'has width', width)
if node.w < width then node.w = width end
end
end
initialize_editor(node)
node.h = box_height(node)
table.insert(nodes_to_render, node)
if node_to_render then
node_to_render.w = node.w
node_to_render.h = node.h
end
elseif node.type == 'rows' then
node.x = x
node.y = y
local node_to_render
if node.bg then
node_to_render = {type='rectangle', r=node.bg.r, g=node.bg.g, b=node.bg.b, x=node.x, y=node.y}
table.insert(nodes_to_render, node_to_render)
end
-- lay out children top to bottom
local subx,suby = x,y
local w,h = 0,0
local subnodes
for _,child in ipairs(node.data) do
if child.margin then
suby = suby+child.margin
h = h+child.margin
end
subx,suby = compute_layout(child, x,suby, nodes_to_render)
if w < child.w then
w = child.w
end
h = h+child.h
end
node.w = w
node.h = h
if node_to_render then
node_to_render.w = w
node_to_render.h = h
end
elseif node.type == 'cols' then
node.x = x
node.y = y
-- lay out children left to right
local node_to_render
if node.bg then
node_to_render = {type='rectangle', r=node.bg.r, g=node.bg.g, b=node.bg.b, x=node.x, y=node.y}
table.insert(nodes_to_render, node_to_render)
end
local subx,suby = x,y
local w,h = 0,0
for _,child in ipairs(node.data) do
if child.margin then
subx = subx+child.margin
w = w+child.margin
end
subx,suby = compute_layout(child, subx,y, nodes_to_render)
w = w + child.w
if h < child.h then
h = child.h
end
end
node.w = w
node.h = h
if node_to_render then
node_to_render.w = w
node_to_render.h = h
end
end
return x+node.w,y+node.h
end

1
0335-manifest Normal file
View File

@ -0,0 +1 @@
{"parent":334,"font":228,"on.mouse_released":178,"on.update":315,"box_height":317,"on.keychord_pressed":311,"compute_layout":335,"to_text":180,"Page":324,"clip":236,"on.code_changed":306,"scale":7,"on.initialize":304,"Surface":196,"A":309,"on.draw":310,"Box_heights":277,"initialize_editor":333,"vx":5,"on.mouse_pressed":179,"Viewport":303,"on":1,"Cursor_node":172,"vy":8,"B":316,"clip_all":265,"on.textinput":177}

18
0336-initialize_editor Normal file
View File

@ -0,0 +1,18 @@
initialize_editor = function(obj)
if obj.w then
-- use an editor to wrap the text
local scaled_fontsize = scale(20)
local scaled_lineheight = math.floor(scaled_fontsize*1.3)
----[[
print('init', obj.data[1], obj.w)
print('at zoom', Viewport.zoom)
print('width', obj.w, 'scales to', scale(obj.w))
print('left', vx(obj.x))
print('right', vx(obj.x+obj.w))
print('width', vx(obj.x+obj.w)-vx(obj.x))
-- ]]
obj.editor = edit.initialize_state(vy(obj.y), vx(obj.x), math.ceil(vx(obj.x+obj.w)), scaled_fontsize, scaled_lineheight)
obj.editor.lines = load_array(obj.data)
Text.redraw_all(obj.editor)
end
end

1
0336-manifest Normal file
View File

@ -0,0 +1 @@
{"on.mouse_released":178,"initialize_editor":336,"on.update":315,"to_text":180,"compute_layout":335,"A":309,"box_height":317,"Box_heights":277,"Page":324,"clip":236,"on.code_changed":306,"on.textinput":177,"Surface":196,"on":1,"on.draw":310,"vx":5,"clip_all":265,"Viewport":303,"B":316,"vy":8,"scale":7,"parent":335,"Cursor_node":172,"font":228,"on.initialize":304,"on.mouse_pressed":179,"on.keychord_pressed":311}

18
0337-initialize_editor Normal file
View File

@ -0,0 +1,18 @@
initialize_editor = function(obj)
if obj.w then
-- use an editor to wrap the text
local scaled_fontsize = scale(20)
local scaled_lineheight = math.floor(scaled_fontsize*1.3)
----[[
print('init', obj.data[1], obj.w)
print('at zoom', Viewport.zoom)
print('width', obj.w, 'scales to', scale(obj.w))
print('left', vx(obj.x))
print('right', vx(obj.x+obj.w))
print('width', vx(obj.x+obj.w)-vx(obj.x))
-- ]]
obj.editor = edit.initialize_state(vy(obj.y), math.floor(vx(obj.x)), math.ceil(vx(obj.x+obj.w)), scaled_fontsize, scaled_lineheight)
obj.editor.lines = load_array(obj.data)
Text.redraw_all(obj.editor)
end
end

1
0337-manifest Normal file
View File

@ -0,0 +1 @@
{"on.initialize":304,"Surface":196,"B":316,"on.draw":310,"on":1,"vx":5,"on.mouse_released":178,"Viewport":303,"initialize_editor":337,"box_height":317,"vy":8,"compute_layout":335,"to_text":180,"Page":324,"on.keychord_pressed":311,"Box_heights":277,"on.mouse_pressed":179,"on.code_changed":306,"Cursor_node":172,"font":228,"clip":236,"parent":336,"clip_all":265,"scale":7,"on.textinput":177,"on.update":315,"A":309}

10
0338-initialize_editor Normal file
View File

@ -0,0 +1,10 @@
initialize_editor = function(obj)
if obj.w then
-- use an editor to wrap the text
local scaled_fontsize = scale(20)
local scaled_lineheight = math.floor(scaled_fontsize*1.3)
obj.editor = edit.initialize_state(vy(obj.y), math.floor(vx(obj.x)), math.ceil(vx(obj.x+obj.w)), scaled_fontsize, scaled_lineheight)
obj.editor.lines = load_array(obj.data)
Text.redraw_all(obj.editor)
end
end

1
0338-manifest Normal file
View File

@ -0,0 +1 @@
{"on.mouse_released":178,"Box_heights":277,"on":1,"on.keychord_pressed":311,"Page":324,"A":309,"on.update":315,"on.textinput":177,"clip_all":265,"parent":337,"Surface":196,"scale":7,"on.code_changed":306,"on.draw":310,"font":228,"vx":5,"Cursor_node":172,"Viewport":303,"clip":236,"on.mouse_pressed":179,"vy":8,"initialize_editor":338,"box_height":317,"B":316,"compute_layout":335,"on.initialize":304,"to_text":180}

View File

@ -60,8 +60,8 @@ function edit.initialize_state(top, left, right, font_height, line_height) -- c
em = App.newText(love.graphics.getFont(), 'm'), -- widest possible character width
top = top,
left = left,
right = right,
left = math.floor(left),
right = math.floor(right),
width = right-left,
filename = love.filesystem.getUserDirectory()..'/lines.txt', -- '/' should work even on Windows

2
head
View File

@ -1 +1 @@
316
338