+ cursor = nil
+
+ -- a single text box
+ function add_editor()
+ -- some variables shared by all the widgets in the text box
+ local x,y, w,h = 50, Menu_bottom+10, 100, 100 -- surface coords
+ local font_height = typographic_scale[6]
+ local font = g.newFont(scale(font_height))
+ local e = edit.initialize_state(vy(y), vy(y+h), vx(x), vx(x+w), font, scale(font_height), floor(scale(font_height)*1.3))
+ --e.filename = 'example.txt'
+ --load_from_disk(e)
+ Text.redraw_all(e)
+
+ -- core editor widget
+ local r = {}
+ r.draw = function()
+ g.setFont(font)
+ edit.draw(e, {r=0.5, g=0.5, b=0.5}, cursor ~= r)
+ color(0.5,0.5,0.5)
+ rect('line', e.left-5, e.top-5, e.width+5*2, (e.bottom+5)-(e.top-5))
+ end
+ r.ispress = function(x2,y2)
+ return x2 >= e.left-5 and x2 <= e.right+5 and y2 >= e.top-5 and y2 <= e.bottom+5
+ end
+ r.press = function(x2,y2, b)
+ cursor = r
+ edit.mouse_press(e, x2,y2, b)
+ end
+ r.update = function(dt, x2,y2)
+ if cursor == r then
+ --edit.update(e, dt)
+ elseif f then
+ if s then
+ e.font_height = scale(font_height)
+ e.line_height = floor(e.font_height*1.3)
+ font = g.newFont(e.font_height)
+ end
+ g.setFont(font)
+ e.left, e.right = vx(x), vx(x+w)
+ e.width = e.right - e.left
+ e.top, e.bottom = vy(y), vy(y+h)
+ Text.redraw_all(e)
+ end
+ end
+ r.release = function(x2,y2, b) edit.mouse_release(e, x2,y2, b) end
+ r.presschord = function(chord, key) edit.keychord_press(e, chord, key) end
+ r.textinput = function(t) edit.text_input(e, t) end
+ r.releasekey = function(key) edit.key_release(e, key) end
+ --r.quit = function() edit.quit(e) end -- final save
+ table.insert(widgets, r)
+
+ -- move affordance
+ local xoff, yoff
+ table.insert(widgets, {
+ draw = function()
+ color(0.7,0.7,0.7)
+ local x,y = e.left, e.top
+ circle('fill', x+10,y-20, 15)
+ end,
+ ispress = function(x2,y2)
+ return dist({x=e.left+10, y=e.top-20}, {x=x2, y=y2}) < 15
+ end,
+ press = function(x2,y2, b)
+ xoff,yoff = x2-vx(x), y2-vy(y)
+ end,
+ update = function(dt, x2,y2)
+ if not xoff then return end
+ x,y = sx(x2-xoff), sy(y2-yoff)
+ e.left, e.right = vx(x), vx(x+w)
+ e.width = e.right - e.left
+ e.top, e.bottom = vy(y), vy(y+h)
+ Text.redraw_all(e)
+ end,
+ release = function(x2,y2, b)
+ xoff,yoff = nil
+ end,
+ })
+
+ -- resize affordances
+ local adjw, adjh = {}, {}
+ local width_adjustment, height_adjustment
+ adjw.draw = function()
+ color(0.5,0.5,0.5)
+ for i=2,4 do -- i=1 is on the border
+ line(e.right+5*i, e.top+5, e.right+5*i, e.bottom-5)
+ end
+ end
+ adjh.draw = function()
+ color(0.5,0.5,0.5)
+ for i=2,4 do -- i=1 is on the border
+ line(e.left+5, e.bottom+5*i, e.right-5, e.bottom+5*i)
+ end
+ end
+ adjw.ispress = function(x2,y2)
+ -- include a shadow to the right
+ return x2 > e.right+5 and x2 <= e.right+5*5 and y2 >= e.top and y2 <= e.bottom
+ end
+ adjh.ispress = function(x2,y2)
+ -- include a shadow below
+ return x2 >= e.left and x2 <= e.right and y2 > e.bottom+5 and y2 <= e.bottom+5*5
+ end
+ adjw.press = function(x2,y2, b) width_adjustment = x2-e.right end
+ adjh.press = function(x2,y2, b) height_adjustment = y2-e.bottom end
+ adjw.release = function(x2,y2, b) width_adjustment = nil end
+ adjh.release = function(x2,y2, b) height_adjustment = nil end
+ adjw.update = function(dt, x2,y2)
+ if not width_adjustment then return end
+ e.right = x2-width_adjustment
+ e.width = e.right - e.left
+ w = iscale(e.width)
+ g.setFont(font)
+ Text.redraw_all(e)
+ end
+ adjh.update = function(dt, x2,y2)
+ if not height_adjustment then return end
+ e.bottom = y2-height_adjustment
+ h = iscale(e.bottom-e.top)
+ end
+ table.insert(widgets, adjw)
+ table.insert(widgets, adjh)
+
+ -- font buttons
+ local update_font = function(newf)
+ if font_height == newf then return end
+ font_height = newf
+ e.font_height = scale(font_height)
+ e.font = g.newFont(e.font_height)
+ e.line_height = floor(e.font_height)*1.3
+ Text.redraw_all(e)
+ end
+ table.insert(widgets, {
+ draw = function()
+ color(0.7,0.7,0.7)
+ local x,y = e.left-35, e.top-5
+ poly('fill', x+15,y, x,y+30, x+30,y+30)
+ end,
+ ispress = function(x2,y2)
+ local x,y = e.left-35, e.top-5
+ return x2 >= x and x2 <= x+30 and y2 >= y and y2 <= y+30
+ end,
+ press = function()
+ update_font(higher_element(typographic_scale, font_height))
+ end,
+ })
+ table.insert(widgets, {
+ draw = function()
+ color(0.7,0.7,0.7)
+ local x,y = e.left-35, e.top+35
+ poly('fill', x+15,y+30, x,y, x+30,y)
+ end,
+ ispress = function(x2,y2)
+ local x,y = e.left-35, e.top+35
+ return x2 >= x and x2 <= x+30 and y2 >= y and y2 <= y+30
+ end,
+ press = function()
+ update_font(lower_element(typographic_scale, font_height))
+ end,
+ })
+ end -- phew! done with add_editor