Merge lines.love

[?]
Apr 2, 2023, 4:22 PM
ZLJYLPOTXIVBVWJ4NTRM2YCQPT2FCSN7446P56MJFEFY45QTB7IAC

Dependencies

  • [2] GUOQRUL7 Merge lines.love
  • [3] ETXNVRPT Merge lines.love
  • [4] MQTFTTEK Merge lines.love
  • [5] REAIVN7W Merge lines.love
  • [6] PNHUONCT update documentation on fragments
  • [7] GGWAHCLE minor cleanup and a todo for later
  • [8] HR6MLUTX show count of test failures
  • [9] I64IPGJX avoid saving fragments in lines
  • [10] H4R5BHVY no more Text allocations
  • [11] TVCPXAAU rename
  • [12] TLOAPLBJ add a license
  • [13] ORRSP7FV deduce test names on failures
  • [14] 4SR3Z4Y3 document the version of LÖVE I've been using
  • [15] GQKUD7QX delete some logs
  • [16] AJB4LFRB try to maintain a reasonable line width
  • [17] LAW2O3NW extract variable Margin_left
  • [18] 2L5MEZV3 experiment: new edit namespace
  • [19] PFT5Y2ZY move
  • [20] H22OAXWE couple of TODOs
  • [21] AVTNUQYR basic test-enabled framework
  • [22] HIKLULFQ extract a function
  • [23] FNJF2FMQ bugfix: online help
  • [24] JKENJ2UG Merge lines.love
  • [25] FBVUNLS4 clean up some debug prints
  • [26] LZYLOTP3 rename
  • [27] OYVFFWBK move
  • [28] BJ5X5O4A let's prevent the text cursor from ever getting on a drawing
  • [29] HOSPP2AN crisp font rendering
  • [30] ZQZX364V use a helper
  • [31] NYRESFK6 source: show all files in navigator
  • [32] MP2TBKU6 bugfix: crash in Text.up() after return
  • [33] NDHQN23G done passing left/right margins everywhere
  • [34] OI4FPFIN support drawings in the source editor
  • [35] 6LJZN727 handle chords
  • [36] VXORMHME delete experimental REPL
  • [37] L2FWWEQL source: remember cursor position of multiple files
  • [38] VP5KC4XZ Merge lines.love
  • [39] CE4LZV4T drop last couple of manual tests
  • [40] MUJTM6RE bring back a level of wrapping
  • [41] FFAPDHHH show partial items in the menu
  • [42] ORKN6EOB Merge lines.love
  • [43] FS2ITYYH record a known issue
  • [44] UPCIYZEU drop an unnecessary level of indent
  • [45] OTIBCAUJ love2d scaffold
  • [46] ZTZOO2OQ Merge lines.love
  • [47] LF7BWEG4 group all editor globals
  • [48] MD3W5IRA new fork: rip out drawing support
  • [49] K74U4BAU Merge lines.love
  • [50] RPGTBMMM Merge lines.love
  • [51] 4KC7I3E2 make colors easier to edit
  • [52] U3MJNFUY Merge lines.love
  • [53] DCO5BQWV Merge lines.love
  • [54] XX7G2FFJ intermingle freehand line drawings with text
  • [55] 3PSFWAIL Merge lines.love
  • [56] 3QWK3GSA support mouse clicks in file navigator
  • [57] XW7ANEJX switch shortcuts for bifold text
  • [58] 2TQUKHBC Merge lines.love
  • [59] UN7GKYV5 support hyperlinks in the source editor
  • [60] X3F7ECSL add state arg to some functions
  • [61] VHUNJHXB Merge lines.love
  • [62] R5QXEHUI somebody stop me
  • [63] 66X36NZN a little more prose describing manual_tests
  • [64] VOU73AK6 Merge lines.love
  • [65] 2L4DL7PG go through App in a couple more places
  • [66] FZBXBUFF bugfix: search
  • [67] ASP5RVZA Merge lines.love
  • [68] MTJEVRJR add state arg to a few functions
  • [69] KKMFQDR4 editing source code from within the app
  • [70] 4YDBYBA4 clean up memory leak experiments
  • [71] J2SVGR2E experiment: blinking cursor
  • [72] VJ77YABH more efficient undo/redo
  • [73] P3K7UH5C Merge lines.love
  • [74] BULPIBEG beginnings of a module for the text editor
  • [75] 3QNOKBFM beginnings of a test harness
  • [76] CQYKYJJU remember window positions across restart/ctrl+e
  • [77] AOZX2G5F source: no commandline args
  • [78] HALS7E5U more clearly skip prints before screen top
  • [79] KYNGDE2C consistent names in a few more places
  • [80] VHQCNMAR several more modules
  • [81] ISOFHXB2 App.width can no longer take a Text
  • [82] S2QMLRXL stop creating a singleton table for every word
  • [83] T4FRZSYL delete an ancient, unused file
  • [84] 7JH2ZT3F add state arg to Drawing.draw
  • [85] OGUV4HSA remove some memory leaks from rendered fragments
  • [86] TFM6F5OD Merge lines.love
  • [87] QFTLLRGL indent
  • [88] QYIFOHW3 first test!
  • [89] LXTTOB33 extract a couple of files
  • [90] A4BSGS2C Merge lines.love
  • [91] 2CK5QI7W make love event names consistent
  • [92] G54H3YG2 get rid of all bifold text
  • [93] BLWAYPKV extract a module
  • [94] 2CTN2IEF Merge lines.love
  • [95] Q7XPSKII Merge lines.love
  • [96] 4U4VQWNY Merge lines.love
  • [97] FUOURDEY clean up some final bifold code
  • [98] D3FLL7SL start showing source menu file navigation state graphically
  • [99] R3KXFRZN get rid of to_text
  • [100] MDGHRTIF source: up/down in file navigator
  • [101] QZ2SXLHF some debug prints
  • [102] JJDUDMVX Merge lines.love
  • [103] KWOJ6XHE cut/copy selected text to clipboard
  • [104] VBU5YHLR Merge lines.love
  • [105] HGC5RGJP switch to line index in a function
  • [106] KMSL74GA support selections in the source editor
  • [107] 5RDWSYK2 consistently use App names for methods everywhere
  • [108] 2Y7YH7UP infrastructure for caching LÖVE text objects
  • [109] D4B52CQ2 Merge lines.love
  • [110] V5SYDHPQ start thinking of compute_fragments as a detail
  • [111] AH744RFR show when we're naming a point
  • [112] D2GCFTTT clean up repl functionality
  • [113] K2X6G75Z start writing some tests for drawings
  • [114] JOPVPUSA editing source code from within the app
  • [115] XS3PZI7G Merge lines.love
  • [116] 73OCE2MC after much struggle, a brute-force undo
  • [117] P4376EXK add state arg to few functions
  • [118] RSZD5A7G forgot to add json.lua
  • [119] RQUVBX62 filter candidates in file navigator
  • [120] ATQO62TF Merge lines.love

Change contents

  • file deletion: help.lua (----------)
    [10.2][10.32686:32718](),[10.32718][10.25449:25449]()
    function draw_help_without_mouse_pressed(State, drawing_index)
    local drawing = State.lines[drawing_index]
    local line_cache = State.line_cache[drawing_index]
    App.color(Help_color)
    local y = line_cache.starty+10
    love.graphics.print("Things you can do:", State.left+30,y)
    y = y + State.line_height
    love.graphics.print("* Press the mouse button to start drawing a "..current_shape(State), State.left+30,y)
    y = y + State.line_height
    love.graphics.print("* Hover on a point and press 'ctrl+u' to pick it up and start moving it,", State.left+30,y)
    y = y + State.line_height
    love.graphics.print("then press the mouse button to drop it", State.left+30+bullet_indent(),y)
    y = y + State.line_height
    love.graphics.print("* Hover on a point and press 'ctrl+n', type a name, then press 'enter'", State.left+30,y)
    y = y + State.line_height
    love.graphics.print("* Hover on a point or shape and press 'ctrl+d' to delete it", State.left+30,y)
    y = y + State.line_height
    if State.current_drawing_mode ~= 'freehand' then
    love.graphics.print("* Press 'ctrl+p' to switch to drawing freehand strokes", State.left+30,y)
    y = y + State.line_height
    end
    if State.current_drawing_mode ~= 'line' then
    love.graphics.print("* Press 'ctrl+l' to switch to drawing lines", State.left+30,y)
    y = y + State.line_height
    end
    if State.current_drawing_mode ~= 'manhattan' then
    love.graphics.print("* Press 'ctrl+m' to switch to drawing horizontal/vertical lines", State.left+30,y)
    y = y + State.line_height
    end
    if State.current_drawing_mode ~= 'circle' then
    love.graphics.print("* Press 'ctrl+o' to switch to drawing circles/arcs", State.left+30,y)
    y = y + State.line_height
    end
    if State.current_drawing_mode ~= 'polygon' then
    love.graphics.print("* Press 'ctrl+g' to switch to drawing polygons", State.left+30,y)
    y = y + State.line_height
    end
    if State.current_drawing_mode ~= 'rectangle' then
    love.graphics.print("* Press 'ctrl+r' to switch to drawing rectangles", State.left+30,y)
    y = y + State.line_height
    end
    if State.current_drawing_mode ~= 'square' then
    love.graphics.print("* Press 'ctrl+s' to switch to drawing squares", State.left+30,y)
    y = y + State.line_height
    end
    love.graphics.print("* Press 'ctrl+=' or 'ctrl+-' to zoom in or out, ctrl+0 to reset zoom", State.left+30,y)
    y = y + State.line_height
    love.graphics.print("Press 'esc' now to hide this message", State.left+30,y)
    y = y + State.line_height
    App.color(Help_background_color)
    love.graphics.rectangle('fill', State.left,line_cache.starty, State.width, math.max(Drawing.pixels(drawing.h, State.width),y-line_cache.starty))
    end
    function draw_help_with_mouse_pressed(State, drawing_index)
    local drawing = State.lines[drawing_index]
    local line_cache = State.line_cache[drawing_index]
    App.color(Help_color)
    local y = line_cache.starty+10
    love.graphics.print("You're currently drawing a "..current_shape(State, drawing.pending), State.left+30,y)
    y = y + State.line_height
    love.graphics.print('Things you can do now:', State.left+30,y)
    y = y + State.line_height
    if State.current_drawing_mode == 'freehand' then
    love.graphics.print('* Release the mouse button to finish drawing the stroke', State.left+30,y)
    y = y + State.line_height
    elseif State.current_drawing_mode == 'line' or State.current_drawing_mode == 'manhattan' then
    love.graphics.print('* Release the mouse button to finish drawing the line', State.left+30,y)
    y = y + State.line_height
    elseif State.current_drawing_mode == 'circle' then
    if drawing.pending.mode == 'circle' then
    love.graphics.print('* Release the mouse button to finish drawing the circle', State.left+30,y)
    y = y + State.line_height
    love.graphics.print("* Press 'a' to draw just an arc of a circle", State.left+30,y)
    else
    love.graphics.print('* Release the mouse button to finish drawing the arc', State.left+30,y)
    end
    y = y + State.line_height
    elseif State.current_drawing_mode == 'polygon' then
    love.graphics.print('* Release the mouse button to finish drawing the polygon', State.left+30,y)
    y = y + State.line_height
    love.graphics.print("* Press 'p' to add a vertex to the polygon", State.left+30,y)
    y = y + State.line_height
    elseif State.current_drawing_mode == 'rectangle' then
    if #drawing.pending.vertices < 2 then
    love.graphics.print("* Press 'p' to add a vertex to the rectangle", State.left+30,y)
    y = y + State.line_height
    else
    love.graphics.print('* Release the mouse button to finish drawing the rectangle', State.left+30,y)
    y = y + State.line_height
    love.graphics.print("* Press 'p' to replace the second vertex of the rectangle", State.left+30,y)
    y = y + State.line_height
    end
    elseif State.current_drawing_mode == 'square' then
    if #drawing.pending.vertices < 2 then
    love.graphics.print("* Press 'p' to add a vertex to the square", State.left+30,y)
    y = y + State.line_height
    else
    love.graphics.print('* Release the mouse button to finish drawing the square', State.left+30,y)
    y = y + State.line_height
    love.graphics.print("* Press 'p' to replace the second vertex of the square", State.left+30,y)
    y = y + State.line_height
    end
    end
    love.graphics.print("* Press 'esc' then release the mouse button to cancel the current shape", State.left+30,y)
    y = y + State.line_height
    y = y + State.line_height
    if State.current_drawing_mode ~= 'line' then
    love.graphics.print("* Press 'l' to switch to drawing lines", State.left+30,y)
    y = y + State.line_height
    end
    if State.current_drawing_mode ~= 'manhattan' then
    love.graphics.print("* Press 'm' to switch to drawing horizontal/vertical lines", State.left+30,y)
    y = y + State.line_height
    end
    if State.current_drawing_mode ~= 'circle' then
    love.graphics.print("* Press 'o' to switch to drawing circles/arcs", State.left+30,y)
    y = y + State.line_height
    end
    if State.current_drawing_mode ~= 'polygon' then
    love.graphics.print("* Press 'g' to switch to drawing polygons", State.left+30,y)
    y = y + State.line_height
    end
    if State.current_drawing_mode ~= 'rectangle' then
    love.graphics.print("* Press 'r' to switch to drawing rectangles", State.left+30,y)
    y = y + State.line_height
    end
    if State.current_drawing_mode ~= 'square' then
    love.graphics.print("* Press 's' to switch to drawing squares", State.left+30,y)
    y = y + State.line_height
    end
    App.color(Help_background_color)
    love.graphics.rectangle('fill', State.left,line_cache.starty, State.width, math.max(Drawing.pixels(drawing.h, State.width),y-line_cache.starty))
    end
    function current_shape(State, shape)
    if State.current_drawing_mode == 'freehand' then
    return 'freehand stroke'
    elseif State.current_drawing_mode == 'line' then
    return 'straight line'
    elseif State.current_drawing_mode == 'manhattan' then
    return 'horizontal/vertical line'
    elseif State.current_drawing_mode == 'circle' and shape and shape.start_angle then
    return 'arc'
    else
    return State.current_drawing_mode
    end
    end
    function bullet_indent()
    return App.width(to_text('* '))
    end
  • file deletion: source_undo.lua (----------)source_undo.lua (----------)
    [10.2][10.3457:3496](),[10.2][10.3457:3496](),[10.3496][10.5:5]()
    table.insert(event.lines, {mode='drawing', h=line.h, points=deepcopy(line.points), shapes=deepcopy(line.shapes), pending={}})
    else
    print(line.mode)
    assert(false)
    end
    table.insert(event.lines, {mode='text', data=line.data}) -- I've forgotten: should we deepcopy(line.data)?
    elseif line.mode == 'drawing' then
  • file deletion: source_text.lua (----------)source_text.lua (----------)
    [10.2][10.147062:147101](),[10.2][10.147062:147101](),[10.147101][10.83723:83723]()
    local trimmed_word = rtrim(f) -- compute_fragments puts whitespace at the end
    table.insert(line_cache.fragments, frag)
    end
    x = x + frag_width
    end
    end
    table.insert(line_cache.fragments, frag1)
    frag = string.sub(frag, boffset)
    pos = pos + utf8.len(f)
    end
    end
    function Text.compute_fragments(State, line_index)
    local frag_width = App.width(f)
    if x + frag_width > State.right then
    x = State.left
    table.insert(line_cache.screen_line_starting_pos, pos)
    end
    x = x + frag_width
    Text.draw_cursor(State, x+Text.x(f, State.cursor1.pos-pos+1), y)
    App.color(Text_color)
    end
    end
    end
    x = x + frag_width
    end
    pos = pos + frag_len
    end
    App.screen.print(f, x,y)
    -- render cursor if necessary
    if starts_with(trimmed_word, '[[') and ends_with(trimmed_word, ']]') then
    local filename = trimmed_word:gsub('^..(.*)..$', '%1')
    if source.link_exists(State, filename) then
    local frag_width = App.width(f)
    if x + frag_width > State.right then
    assert(x > State.left) -- no overfull lines
    y = y + State.line_height
    if y + State.line_height > App.screen.height then
    return App.width(s_before)
    end
    function Text.to2(State, loc1)
    --? print('skipping', f)
    else
    -- render fragment
    return App.width(s_before)
    end
    function Text.x(s, pos)
    local offset = Text.offset(s, pos)
    local s_before = s:sub(1, offset-1)
    return App.width(screen_line)
    end
    frag_width = App.width(frag)
    end
    x = State.left -- new line
    end
    if #frag > 0 then
    select_color(f)
    local frag_len = utf8.len(f)
    --? print('text.draw:', f, 'at', line_index,pos, 'after', x,y)
    if pos < startpos then
    -- render nothing
    local frag1_width = App.width(frag1)
    local frag_width = App.width(frag)
    Text.populate_screen_line_starting_pos(State, line_index)
    local pos = 1
    initialize_color()
    for _, f in ipairs(line_cache.fragments) do
    App.color(Text_color)
    button(State, 'link', {x=x+App.width('[['), y=y, w=App.width(filename), h=State.line_height, color={1,1,1},
    icon = icon.hyperlink_decoration,
    onpress1 = function()
    source.switch_to_file(filename)
    end,
    })
    end
    end
  • file deletion: source_file.lua (----------)source_file.lua (----------)
    [10.2][10.152399:152438](),[10.2][10.152399:152438](),[10.152438][10.150241:150241]()
    line_info.data = line
    table.insert(result, line_info)
    table.insert(result, {mode='text', data=line})
    end
  • file deletion: source_edit.lua (----------)source_edit.lua (----------)
    [10.2][10.165725:165764](),[10.2][10.165725:165764](),[10.165764][10.152440:152440]()
    -- fragments: snippets of the line guaranteed to not straddle screen lines
    -- screen_line_starting_pos: optional array of grapheme indices if it wraps over more than one screen line
    line_cache = {},
    -- Given wrapping, any potential location for the text cursor can be described in two ways:
    -- * schema 1: As a combination of line index and position within a line (in utf8 codepoint units)
    -- * schema 2: As a combination of line index, screen line index within the line, and a position within the screen line.
  • file deletion: source.lua (----------)source.lua (----------)
    [10.2][10.177652:177686](),[10.2][10.177652:177686](),[10.177686][10.165766:165766]()
    source.initialize_window_geometry(App.width('m'))
    Editor_state = edit.initialize_state(Margin_top, Margin_left, App.screen.width-Margin_right)
  • file deletion: run.lua (----------)run.lua (----------)
    [10.2][10.184046:184077](),[10.2][10.184046:184077](),[10.184077][10.178044:178044]()
    run.initialize_window_geometry(App.width('m'))
    Editor_state = edit.initialize_state(Margin_top, Margin_left, App.screen.width-Margin_right)
    Editor_state.font_height = font_height
    Editor_state.line_height = math.floor(font_height*1.3)
    function width(s)
    return love.graphics.getFont():getWidth(s)
    end
  • file deletion: log_browser.lua (----------)log_browser.lua (----------)
    [10.2][10.203223:203262](),[10.2][10.203223:203262](),[10.203262][10.191782:191782]()
    love.graphics.print(line.section_stack[i].name, x, App.screen.height-App.width(line.section_stack[i].name)-5, --[[vertically]] math.pi/2)
    end
    end
    return log_browser.right_margin(State, line)
    end
    function should_show(line)
    -- Show a line if every single section it's in is expanded.
    for i=1,#line.section_stack do
    local section = line.section_stack[i]
    if not section.expanded then
    return false
    end
    end
    return true
    end
    function log_browser.left_margin(State, line)
    return State.left + #line.section_stack*Section_border_padding_horizontal
    end
    function log_browser.right_margin(State, line)
    return State.right - #line.section_stack*Section_border_padding_horizontal
    end
    function log_browser.update(State, dt)
    end
    function log_browser.quit(State)
    end
    love.graphics.print(line.section_stack[i].name, x+State.font_height+5, App.screen.height-App.width(line.section_stack[i].name)-5, --[[vertically]] math.pi/2)
    end
    end
    return log_browser.left_margin(State, line)
    end
    function render_stack_right_margin(State, line_index, line, y)
    App.color(Section_border_color)
    for i=1,#line.section_stack do
    local x = State.right - (i-1)*Section_border_padding_horizontal
    love.graphics.line(x,y, x,y+log_browser.height(State, line_index))
    if y < 30 then
    love.graphics.print(line.section_stack[i].name, x, y+5, --[[vertically]] math.pi/2)
    end
    if y > App.screen.height-log_browser.height(State, line_index) then
    love.graphics.print(line.section_name, xleft+50,y)
    love.graphics.line(xleft+50+App.width(line.section_name)+2,sectiony, xright,sectiony)
    end
    else
    if type(line.data) == 'string' then
    local old_left, old_right = State.left,State.right
    State.left,State.right = xleft,xright
    y = Text.draw(State, line_index, y, --[[startpos]] 1)
    State.left,State.right = old_left,old_right
    else
    height = log_render[line.data.name](line.data, xleft, y, xright-xleft)
    end
    end
    if App.mouse_x() > Log_browser_state.left and line_index == mouse_line_index then
    App.color(Cursor_line_background_color)
    love.graphics.rectangle('fill', xleft,y, xright-xleft, height)
    end
    y = y + height
    end
    end
    end
    function render_stack_left_margin(State, line_index, line, y)
    if line.section_stack == nil then
    -- assertion message
    for k,v in pairs(line) do
    print(k)
    end
    end
    App.color(Section_border_color)
    for i=1,#line.section_stack do
    local x = State.left + (i-1)*Section_border_padding_horizontal
    love.graphics.line(x,y, x,y+log_browser.height(State, line_index))
    if y < 30 then
    love.graphics.print(line.section_stack[i].name, x+State.font_height+5, y+5, --[[vertically]] math.pi/2)
    end
    if y > App.screen.height-log_browser.height(State, line_index) then
    love.graphics.print(line.section_name, xleft+50,y)
    love.graphics.line(xleft+50+App.width(line.section_name)+2,sectiony, xright,sectiony)
    else assert(line.section_end)
    local sectiony = y+State.line_height-Section_border_padding_vertical
    love.graphics.line(xleft,y, xleft,sectiony)
    love.graphics.line(xright,y, xright,sectiony)
    love.graphics.line(xleft,sectiony, xleft+50-2,sectiony)
  • file deletion: commands.lua (----------)commands.lua (----------)
    [10.2][10.207726:207762](),[10.2][10.207726:207762](),[10.207762][10.204370:204370]()
    local width = App.width(filename)
    if x + width > App.screen.width - 5 then
    y = y + Editor_state.line_height
    x = 5
    local width = App.width(filename)
    if x + width > App.screen.width - 5 then
    y = y + Editor_state.line_height
    x = 5
    end
    if i == index then
    return y, x, width
    end
    x = x + width + 30
    end
    end
    function file_index(fy, fx, fwidth)
    log_start('file index')
    log(2, ('for %d %d %d'):format(fy, fx, fwidth))
    local y,x = Menu_status_bar_height, 5
    local best_guess, best_guess_x, best_guess_width
    for i,filename in ipairs(File_navigation.candidates) do
    App.screen.print(filename, x + x3-menu_xmin, y3)
    end
    x3 = x3 + width + 30
    end
    --
    return h+20
    width = App.width(filename)
    if x3 + width > App.screen.width - 5 then
    y3 = y3 + Editor_state.line_height
    x3 = 0
    end
    if i == o.index then
    App.color(Menu_highlight_color)
    love.graphics.rectangle('fill', x + x3-menu_xmin - 5, y3-2, width+5*2, Editor_state.line_height+2*2)
    end
    if x3 >= menu_xmin and x3 + width < menu_xmax then
    App.color(Menu_command_color)
    width = App.width(filename)
    if x2 + width > App.screen.width - 5 then
    y2 = y2 + Editor_state.line_height
    x2 = 0
    end
    if i == o.index then
    break
    end
    x2 = x2 + width + 30
    App.screen.print(s, x,y)
    x = x + width + 30
    return x,y
    local width = App.width(s)
    if x + width > App.screen.width - 5 then
    y = y + Editor_state.line_height
    x = 5
    end
    local width = App.width(filename)
    if x + width > App.screen.width - 5 then
    result = result+1
    x = 5 + width
    else
    x = x + width + 30
    end
    App.screen.print(File_navigation.filter, 5, 5)
    draw_cursor(5 + App.width(File_navigation.filter), 5)
    if File_navigation.num_lines == nil then
    App.screen.print(s, Menu_cursor,5)
    Menu_cursor = Menu_cursor + width + 30
    end
    function source.draw_file_navigator()
    local width = App.width(s)
    if Menu_cursor > App.screen.width - 30 then
  • edit in undo.lua at line 61
    [10.33][10.33:81](),[10.1624][7.1:115](),[10.1624][7.1:115](),[10.1726][7.116:248](),[10.1726][7.116:248]()
    table.insert(event.lines, {data=line.data})
    table.insert(event.lines, {mode='text', data=line.data}) -- I've forgotten: should we deepcopy(line.data)?
    table.insert(event.lines, {mode='drawing', h=line.h, points=deepcopy(line.points), shapes=deepcopy(line.shapes), pending={}})
  • resolve order conflict in undo.lua at line 61
    [10.33]
  • edit in undo.lua at line 61
    [0.2]
    [10.2296]
    table.insert(event.lines, {data=line.data}) -- I've forgotten: should we deepcopy(line.data)?
  • resurrect zombie in text.lua at line 37
    [10.458][10.1743:1893](),[10.458][10.1743:1893]()
    if State.lines[State.cursor1.line].data:sub(State.cursor1.pos, State.cursor1.pos+utf8.len(State.search_term)-1) == State.search_term then
  • resurrect zombie in text.lua at line 38
    [10.608][9.741:887](),[10.608][9.741:887]()
    local lo_px = Text.draw_highlight(State, line, State.left,y, pos, State.cursor1.pos, State.cursor1.pos+utf8.len(State.search_term))
  • resolve order conflict in text.lua at line 38
    [10.1893]
    [9.741]
  • resurrect zombie in text.lua at line 88
    [10.124][10.1894:1938](),[10.124][10.1894:1938]()
    for frag in line.data:gmatch('%S*%s*') do
  • replacement in source_undo.lua at line 64
    [10.140][10.140:221]()
    table.insert(event.lines, {mode='text', data=line.data, dataB=line.dataB})
    [10.140]
    [10.221]
    table.insert(event.lines, {mode='text', data=line.data}) -- I've forgotten: should we deepcopy(line.data)?
  • replacement in source_undo.lua at line 66
    [10.260][10.260:750]()
    local points=deepcopy(line.points)
    --? print('copying', line.points, 'with', #line.points, 'points into', points)
    local shapes=deepcopy(line.shapes)
    --? print('copying', line.shapes, 'with', #line.shapes, 'shapes into', shapes)
    table.insert(event.lines, {mode='drawing', h=line.h, points=points, shapes=shapes, pending={}})
    --? table.insert(event.lines, {mode='drawing', h=line.h, points=deepcopy(line.points), shapes=deepcopy(line.shapes), pending={}})
    [10.260]
    [10.750]
    table.insert(event.lines, {mode='drawing', h=line.h, points=deepcopy(line.points), shapes=deepcopy(line.shapes), pending={}})
  • replacement in source_text.lua at line 15
    [10.87412][10.87412:87456]()
    Text.compute_fragments(State, line_index)
    [10.87412]
    [10.87456]
    Text.populate_screen_line_starting_pos(State, line_index)
  • replacement in source_text.lua at line 20
    [10.87565][10.87565:87737]()
    local frag, frag_text = f.data, f.text
    select_color(frag)
    local frag_len = utf8.len(frag)
    --? print('text.draw:', frag, 'at', line_index,pos, 'after', x,y)
    [10.87565]
    [10.87737]
    select_color(f)
    local frag_len = utf8.len(f)
    --? print('text.draw:', f, 'at', line_index,pos, 'after', x,y)
  • replacement in source_text.lua at line 25
    [10.87788][10.87788:87822]()
    --? print('skipping', frag)
    [10.87788]
    [10.87822]
    --? print('skipping', f)
  • replacement in source_text.lua at line 28
    [10.87856][10.87856:87902]()
    local frag_width = App.width(frag_text)
    [10.87856]
    [10.87902]
    local frag_width = App.width(f)
  • replacement in source_text.lua at line 43
    [10.84][10.84:172]()
    local trimmed_word = rtrim(frag) -- compute_fragments puts whitespace at the end
    [10.84]
    [10.172]
    local trimmed_word = rtrim(f) -- compute_fragments puts whitespace at the end
  • replacement in source_text.lua at line 47
    [10.367][10.367:578]()
    local filename_text = App.newText(love.graphics.getFont(), filename)
    button(State, 'link', {x=x+App.width(to_text('[[')), y=y, w=App.width(filename_text), h=State.line_height, color={1,1,1},
    [10.367]
    [10.578]
    button(State, 'link', {x=x+App.width('[['), y=y, w=App.width(filename), h=State.line_height, color={1,1,1},
  • replacement in source_text.lua at line 55
    [10.779][10.88252:88290](),[10.88252][10.88252:88290]()
    App.screen.draw(frag_text, x,y)
    [10.779]
    [10.88290]
    App.screen.print(f, x,y)
  • replacement in source_text.lua at line 66
    [10.88952][10.88952:89032]()
    Text.draw_cursor(State, x+Text.x(frag, State.cursor1.pos-pos+1), y)
    [10.88952]
    [10.89032]
    Text.draw_cursor(State, x+Text.x(f, State.cursor1.pos-pos+1), y)
  • edit in source_text.lua at line 106
    [10.91875][10.91875:91918]()
    local frag, frag_text = f.data, f.text
  • replacement in source_text.lua at line 107
    [10.91941][10.91941:91985]()
    local frag_width = App.width(frag_text)
    [10.91941]
    [10.91985]
    local frag_width = App.width(f)
  • replacement in source_text.lua at line 113
    [10.92139][10.92139:92200]()
    local frag_len = utf8.len(frag)
    pos = pos + frag_len
    [10.92139]
    [10.92200]
    pos = pos + utf8.len(f)
  • edit in source_text.lua at line 118
    [10.92262][10.92262:92343]()
    --? print('compute_fragments', line_index, 'between', State.left, State.right)
  • replacement in source_text.lua at line 128
    [10.92611][10.92611:92837]()
    local frag_text = App.newText(love.graphics.getFont(), frag)
    local frag_width = App.width(frag_text)
    --? print('x: '..tostring(x)..'; frag_width: '..tostring(frag_width)..'; '..tostring(State.right-x)..'px to go')
    [10.92611]
    [10.92837]
    local frag_width = App.width(frag)
  • edit in source_text.lua at line 130
    [10.92879][10.92879:93003]()
    --? print(('checking whether to split fragment ^%s$ of width %d when rendering from %d'):format(frag, frag_width, x))
  • edit in source_text.lua at line 131
    [10.93065][10.93065:93096]()
    --? print('splitting')
  • edit in source_text.lua at line 134
    [10.93264][10.93264:93296]()
    --? print('bpos', bpos)
  • edit in source_text.lua at line 136
    [10.93454][10.93454:93549]()
    --? print('space for '..tostring(bpos)..' graphemes, '..tostring(boffset-1)..' bytes')
  • replacement in source_text.lua at line 137
    [10.93602][10.93602:93808]()
    local frag1_text = App.newText(love.graphics.getFont(), frag1)
    local frag1_width = App.width(frag1_text)
    --? print('extracting ^'..frag1..'$ of width '..tostring(frag1_width)..'px')
    [10.93602]
    [10.93808]
    local frag1_width = App.width(frag1)
  • replacement in source_text.lua at line 139
    [10.93855][10.93855:93929]()
    table.insert(line_cache.fragments, {data=frag1, text=frag1_text})
    [10.93855]
    [10.93929]
    table.insert(line_cache.fragments, frag1)
  • replacement in source_text.lua at line 141
    [10.93970][10.93970:94075]()
    frag_text = App.newText(love.graphics.getFont(), frag)
    frag_width = App.width(frag_text)
    [10.93970]
    [10.94075]
    frag_width = App.width(frag)
  • replacement in source_text.lua at line 146
    [10.94149][10.94149:94299]()
    --? print('inserting ^'..frag..'$ of width '..tostring(frag_width)..'px')
    table.insert(line_cache.fragments, {data=frag, text=frag_text})
    [10.94149]
    [10.94996]
    table.insert(line_cache.fragments, frag)
  • replacement in source_text.lua at line 764
    [10.136039][10.136039:136153]()
    local screen_line_text = App.newText(love.graphics.getFont(), screen_line)
    return App.width(screen_line_text)
    [10.136039]
    [10.136153]
    return App.width(screen_line)
  • replacement in source_text.lua at line 852
    [10.139612][10.139612:139713]()
    local text_before = App.newText(love.graphics.getFont(), s_before)
    return App.width(text_before)
    [10.139612]
    [10.139713]
    return App.width(s_before)
  • replacement in source_text.lua at line 858
    [10.139817][10.139817:139918]()
    local text_before = App.newText(love.graphics.getFont(), s_before)
    return App.width(text_before)
    [10.139817]
    [10.139918]
    return App.width(s_before)
  • edit in source_file.lua at line 2
    [10.150360][10.150360:150407]()
    Fold = '\x1e' -- ASCII RS (record separator)
  • replacement in source_file.lua at line 29
    [10.151197][10.10664:10939]()
    local line_info = {mode='text'}
    if line:find(Fold) then
    _, _, line_info.data, line_info.dataB = line:find('([^'..Fold..']*)'..Fold..'([^'..Fold..']*)')
    else
    line_info.data = line
    end
    table.insert(result, line_info)
    [10.151197]
    [10.151227]
    table.insert(result, {mode='text', data=line})
  • edit in source_file.lua at line 49
    [10.11100][10.11100:11217]()
    if line.dataB and #line.dataB > 0 then
    outfile:write(Fold)
    outfile:write(line.dataB)
    end
  • replacement in source_file.lua at line 138
    [10.14467][10.14467:14652]()
    if line:find(Fold) then
    _, _, line_info.data, line_info.dataB = line:find('([^'..Fold..']*)'..Fold..'([^'..Fold..']*)')
    else
    line_info.data = line
    end
    [10.14467]
    [10.14652]
    line_info.data = line
  • replacement in source_edit.lua at line 57
    [10.153638][10.153638:153739]()
    -- fragments: snippets of rendered love.graphics.Text, guaranteed to not straddle screen lines
    [10.153638]
    [10.153739]
    -- fragments: snippets of the line guaranteed to not straddle screen lines
  • edit in source_edit.lua at line 91
    [10.154929][10.154929:155017]()
    em = App.newText(love.graphics.getFont(), 'm'), -- widest possible character width
  • edit in source_edit.lua at line 106
    [10.155271][10.155271:155294]()
    search_text = nil,
  • edit in source_edit.lua at line 326
    [10.158033][10.158033:158061]()
    State.search_text = nil
  • edit in source_edit.lua at line 356
    [10.158297][10.158297:158327]()
    State.search_text = nil
  • edit in source_edit.lua at line 362
    [10.158626][10.158626:158656]()
    State.search_text = nil
  • edit in source_edit.lua at line 367
    [10.158907][10.158907:158937]()
    State.search_text = nil
  • edit in source_edit.lua at line 380
    [10.159515][10.159515:159552]()
    assert(State.search_text == nil)
  • edit in source_edit.lua at line 511
    [10.164178][10.164178:164233]()
    State.em = App.newText(love.graphics.getFont(), 'm')
  • replacement in source.lua at line 165
    [10.170145][10.170145:170251]()
    local em = App.newText(love.graphics.getFont(), 'm')
    source.initialize_window_geometry(App.width(em))
    [10.170145]
    [10.170251]
    source.initialize_window_geometry(App.width('m'))
  • edit in source.lua at line 170
    [10.170444][10.170444:170467]()
    Editor_state.em = em
  • edit in source.lua at line 417
    [10.7652][10.177537:177681](),[10.177537][10.177537:177681]()
    end
    end
    -- use this sparingly
    function to_text(s)
    if Text_cache[s] == nil then
    Text_cache[s] = App.newText(love.graphics.getFont(), s)
  • edit in source.lua at line 418
    [10.177687][10.177687:177710]()
    return Text_cache[s]
  • resurrect zombie in select.lua at line 60
    [10.454][10.6213:6273](),[10.454][10.6213:6273]()
    local before = line.data:sub(pos_offset, lo_offset-1)
  • resurrect zombie in select.lua at line 61
    [10.514][10.785:817](),[10.514][10.785:817]()
    lo_px = App.width(before)
  • resolve order conflict in select.lua at line 61
    [10.6273]
    [10.785]
  • resurrect zombie in select.lua at line 64
    [10.706][10.6274:6326](),[10.706][10.6274:6326]()
    local s = line.data:sub(lo_offset, hi_offset-1)
  • replacement in run.lua at line 74
    [10.180286][10.180286:180389]()
    local em = App.newText(love.graphics.getFont(), 'm')
    run.initialize_window_geometry(App.width(em))
    [10.180286]
    [10.180389]
    run.initialize_window_geometry(App.width('m'))
  • edit in run.lua at line 78
    [10.180582][10.180582:180605]()
    Editor_state.em = em
  • replacement in run.lua at line 198
    [10.183700][10.183700:183862]()
    -- use this sparingly
    function to_text(s)
    if Text_cache[s] == nil then
    Text_cache[s] = App.newText(love.graphics.getFont(), s)
    end
    return Text_cache[s]
    [10.183700]
    [10.183862]
    function width(s)
    return love.graphics.getFont():getWidth(s)
  • edit in log_browser.lua at line 101
    [10.194910][10.194910:194966]()
    local section_text = to_text(line.section_name)
  • replacement in log_browser.lua at line 106
    [10.195274][10.195274:195420]()
    love.graphics.draw(section_text, xleft+50,y)
    love.graphics.line(xleft+50+App.width(section_text)+2,sectiony, xright,sectiony)
    [10.195274]
    [10.195420]
    love.graphics.print(line.section_name, xleft+50,y)
    love.graphics.line(xleft+50+App.width(line.section_name)+2,sectiony, xright,sectiony)
  • replacement in log_browser.lua at line 113
    [10.195713][10.195713:195859]()
    love.graphics.draw(section_text, xleft+50,y)
    love.graphics.line(xleft+50+App.width(section_text)+2,sectiony, xright,sectiony)
    [10.195713]
    [10.195859]
    love.graphics.print(line.section_name, xleft+50,y)
    love.graphics.line(xleft+50+App.width(line.section_name)+2,sectiony, xright,sectiony)
  • replacement in log_browser.lua at line 150
    [10.197122][10.197122:197295]()
    love.graphics.print(line.section_stack[i].name, x+State.font_height+5, App.screen.height-App.width(to_text(line.section_stack[i].name))-5, --[[vertically]] math.pi/2)
    [10.197122]
    [10.197295]
    love.graphics.print(line.section_stack[i].name, x+State.font_height+5, App.screen.height-App.width(line.section_stack[i].name)-5, --[[vertically]] math.pi/2)
  • replacement in log_browser.lua at line 165
    [10.197818][10.197818:197971]()
    love.graphics.print(line.section_stack[i].name, x, App.screen.height-App.width(to_text(line.section_stack[i].name))-5, --[[vertically]] math.pi/2)
    [10.197818]
    [10.197971]
    love.graphics.print(line.section_stack[i].name, x, App.screen.height-App.width(line.section_stack[i].name)-5, --[[vertically]] math.pi/2)
  • file un-deletion: help.lua (----------)help.lua (----------)
    [10.11577][10.6622:6622](),[10.2][10.11545:11577](),[10.2][10.11545:11577]()
  • resurrect zombie in help.lua at line 1
    [10.11371][10.832:857](),[10.11371][10.832:857]()
    return App.width('* ')
  • edit in help.lua at line 1
    [10.6622]
    [10.832]
    function draw_help_without_mouse_pressed(State, drawing_index)
    local drawing = State.lines[drawing_index]
    local line_cache = State.line_cache[drawing_index]
    App.color(Help_color)
    local y = line_cache.starty+10
    love.graphics.print("Things you can do:", State.left+30,y)
    y = y + State.line_height
    love.graphics.print("* Press the mouse button to start drawing a "..current_shape(State), State.left+30,y)
    y = y + State.line_height
    love.graphics.print("* Hover on a point and press 'ctrl+u' to pick it up and start moving it,", State.left+30,y)
    y = y + State.line_height
    love.graphics.print("then press the mouse button to drop it", State.left+30+bullet_indent(),y)
    y = y + State.line_height
    love.graphics.print("* Hover on a point and press 'ctrl+n', type a name, then press 'enter'", State.left+30,y)
    y = y + State.line_height
    love.graphics.print("* Hover on a point or shape and press 'ctrl+d' to delete it", State.left+30,y)
    y = y + State.line_height
    if State.current_drawing_mode ~= 'freehand' then
    love.graphics.print("* Press 'ctrl+p' to switch to drawing freehand strokes", State.left+30,y)
    y = y + State.line_height
    end
    if State.current_drawing_mode ~= 'line' then
    love.graphics.print("* Press 'ctrl+l' to switch to drawing lines", State.left+30,y)
    y = y + State.line_height
    end
    if State.current_drawing_mode ~= 'manhattan' then
    love.graphics.print("* Press 'ctrl+m' to switch to drawing horizontal/vertical lines", State.left+30,y)
    y = y + State.line_height
    end
    if State.current_drawing_mode ~= 'circle' then
    love.graphics.print("* Press 'ctrl+o' to switch to drawing circles/arcs", State.left+30,y)
    y = y + State.line_height
    end
    if State.current_drawing_mode ~= 'polygon' then
    love.graphics.print("* Press 'ctrl+g' to switch to drawing polygons", State.left+30,y)
    y = y + State.line_height
    end
    if State.current_drawing_mode ~= 'rectangle' then
    love.graphics.print("* Press 'ctrl+r' to switch to drawing rectangles", State.left+30,y)
    y = y + State.line_height
    end
    if State.current_drawing_mode ~= 'square' then
    love.graphics.print("* Press 'ctrl+s' to switch to drawing squares", State.left+30,y)
    y = y + State.line_height
    end
    love.graphics.print("* Press 'ctrl+=' or 'ctrl+-' to zoom in or out, ctrl+0 to reset zoom", State.left+30,y)
    y = y + State.line_height
    love.graphics.print("Press 'esc' now to hide this message", State.left+30,y)
    y = y + State.line_height
    App.color(Help_background_color)
    love.graphics.rectangle('fill', State.left,line_cache.starty, State.width, math.max(Drawing.pixels(drawing.h, State.width),y-line_cache.starty))
    end
    function draw_help_with_mouse_pressed(State, drawing_index)
    local drawing = State.lines[drawing_index]
    local line_cache = State.line_cache[drawing_index]
    App.color(Help_color)
    local y = line_cache.starty+10
    love.graphics.print("You're currently drawing a "..current_shape(State, drawing.pending), State.left+30,y)
    y = y + State.line_height
    love.graphics.print('Things you can do now:', State.left+30,y)
    y = y + State.line_height
    if State.current_drawing_mode == 'freehand' then
    love.graphics.print('* Release the mouse button to finish drawing the stroke', State.left+30,y)
    y = y + State.line_height
    elseif State.current_drawing_mode == 'line' or State.current_drawing_mode == 'manhattan' then
    love.graphics.print('* Release the mouse button to finish drawing the line', State.left+30,y)
    y = y + State.line_height
    elseif State.current_drawing_mode == 'circle' then
    if drawing.pending.mode == 'circle' then
    love.graphics.print('* Release the mouse button to finish drawing the circle', State.left+30,y)
    y = y + State.line_height
    love.graphics.print("* Press 'a' to draw just an arc of a circle", State.left+30,y)
    else
    love.graphics.print('* Release the mouse button to finish drawing the arc', State.left+30,y)
    end
    y = y + State.line_height
    elseif State.current_drawing_mode == 'polygon' then
    love.graphics.print('* Release the mouse button to finish drawing the polygon', State.left+30,y)
    y = y + State.line_height
    love.graphics.print("* Press 'p' to add a vertex to the polygon", State.left+30,y)
    y = y + State.line_height
    elseif State.current_drawing_mode == 'rectangle' then
    if #drawing.pending.vertices < 2 then
    love.graphics.print("* Press 'p' to add a vertex to the rectangle", State.left+30,y)
    y = y + State.line_height
    else
    love.graphics.print('* Release the mouse button to finish drawing the rectangle', State.left+30,y)
    y = y + State.line_height
    love.graphics.print("* Press 'p' to replace the second vertex of the rectangle", State.left+30,y)
    y = y + State.line_height
    end
    elseif State.current_drawing_mode == 'square' then
    if #drawing.pending.vertices < 2 then
    love.graphics.print("* Press 'p' to add a vertex to the square", State.left+30,y)
    y = y + State.line_height
    else
    love.graphics.print('* Release the mouse button to finish drawing the square', State.left+30,y)
    y = y + State.line_height
    love.graphics.print("* Press 'p' to replace the second vertex of the square", State.left+30,y)
    y = y + State.line_height
    end
    end
    love.graphics.print("* Press 'esc' then release the mouse button to cancel the current shape", State.left+30,y)
    y = y + State.line_height
    y = y + State.line_height
    if State.current_drawing_mode ~= 'line' then
    love.graphics.print("* Press 'l' to switch to drawing lines", State.left+30,y)
    y = y + State.line_height
    end
    if State.current_drawing_mode ~= 'manhattan' then
    love.graphics.print("* Press 'm' to switch to drawing horizontal/vertical lines", State.left+30,y)
    y = y + State.line_height
    end
    if State.current_drawing_mode ~= 'circle' then
    love.graphics.print("* Press 'o' to switch to drawing circles/arcs", State.left+30,y)
    y = y + State.line_height
    end
    if State.current_drawing_mode ~= 'polygon' then
    love.graphics.print("* Press 'g' to switch to drawing polygons", State.left+30,y)
    y = y + State.line_height
    end
    if State.current_drawing_mode ~= 'rectangle' then
    love.graphics.print("* Press 'r' to switch to drawing rectangles", State.left+30,y)
    y = y + State.line_height
    end
    if State.current_drawing_mode ~= 'square' then
    love.graphics.print("* Press 's' to switch to drawing squares", State.left+30,y)
    y = y + State.line_height
    end
    App.color(Help_background_color)
    love.graphics.rectangle('fill', State.left,line_cache.starty, State.width, math.max(Drawing.pixels(drawing.h, State.width),y-line_cache.starty))
    end
    function current_shape(State, shape)
    if State.current_drawing_mode == 'freehand' then
    return 'freehand stroke'
    elseif State.current_drawing_mode == 'line' then
    return 'straight line'
    elseif State.current_drawing_mode == 'manhattan' then
    return 'horizontal/vertical line'
    elseif State.current_drawing_mode == 'circle' and shape and shape.start_angle then
    return 'arc'
    else
    return State.current_drawing_mode
    end
    end
    function bullet_indent()
  • edit in help.lua at line 151
    [10.857]
    end
  • replacement in drawing.lua at line 63
    [10.12304][10.12304:12393]()
    local name_text
    -- TODO: avoid computing name width on every repaint
    [10.12304]
    [10.12393]
    local name_width
  • replacement in drawing.lua at line 65
    [10.12424][10.12424:12457]()
    name_text = State.em
    [10.12424]
    [10.12457]
    name_width = App.width('m')
  • replacement in drawing.lua at line 67
    [10.12472][10.12472:12541]()
    name_text = App.newText(love.graphics.getFont(), p.name)
    [10.12472]
    [10.12541]
    name_width = App.width(p.name)
  • replacement in drawing.lua at line 69
    [10.12555][10.12555:12643]()
    love.graphics.rectangle('fill', x,y, App.width(name_text), State.line_height)
    [10.12555]
    [10.12643]
    love.graphics.rectangle('fill', x,y, name_width, State.line_height)
  • edit in drawing.lua at line 129
    [10.1244][10.1027:1054](),[10.1244][10.1027:1054](),[10.404][10.1055:1095](),[10.404][10.1055:1095](),[10.503][10.1096:1139](),[10.503][10.1096:1139](),[10.596][10.1140:1218](),[10.596][10.1140:1218]()
    local name_width
    name_width = App.width('m')
    name_width = App.width(p.name)
    love.graphics.rectangle('fill', x,y, name_width, State.line_height)
  • resolve order conflict in drawing.lua at line 129
    [10.14879]
    [10.7397]
  • replacement in commands.lua at line 46
    [10.205361][10.1061:1123]()
    local s_text = to_text(s)
    local width = App.width(s_text)
    [10.205361]
    [10.29]
    local width = App.width(s)
  • replacement in commands.lua at line 51
    [10.205601][10.1124:1165]()
    App.screen.draw(s_text, Menu_cursor,5)
    [10.205601]
    [10.205649]
    App.screen.print(s, Menu_cursor,5)
  • replacement in commands.lua at line 57
    [10.1198][10.1198:1334]()
    local filter_text = to_text(File_navigation.filter)
    App.screen.draw(filter_text, 5, 5)
    draw_cursor(5 + App.width(filter_text), 5)
    [10.1198]
    [10.1334]
    App.screen.print(File_navigation.filter, 5, 5)
    draw_cursor(5 + App.width(File_navigation.filter), 5)
  • replacement in commands.lua at line 98
    [10.2615][10.2615:2662]()
    local width = App.width(to_text(filename))
    [10.2615]
    [10.2662]
    local width = App.width(filename)
  • replacement in commands.lua at line 110
    [10.2872][10.2872:2934]()
    local s_text = to_text(s)
    local width = App.width(s_text)
    [10.2872]
    [10.2934]
    local width = App.width(s)
  • replacement in commands.lua at line 125
    [10.206479][10.3375:3406]()
    App.screen.draw(s_text, x,y)
    [10.206479]
    [10.3406]
    App.screen.print(s, x,y)
  • replacement in commands.lua at line 189
    [10.4726][10.4726:4807]()
    local filename_text = to_text(filename)
    width = App.width(filename_text)
    [10.4726]
    [10.4807]
    width = App.width(filename)
  • replacement in commands.lua at line 206
    [10.5285][10.5285:5366]()
    local filename_text = to_text(filename)
    width = App.width(filename_text)
    [10.5285]
    [10.5366]
    width = App.width(filename)
  • replacement in commands.lua at line 217
    [10.5743][10.5743:5802]()
    App.screen.draw(filename_text, x + x3-menu_xmin, y3)
    [10.5743]
    [10.5802]
    App.screen.print(filename, x + x3-menu_xmin, y3)
  • replacement in commands.lua at line 244
    [10.6414][10.6414:6461]()
    local width = App.width(to_text(filename))
    [10.6414]
    [10.6461]
    local width = App.width(filename)
  • replacement in commands.lua at line 262
    [10.6914][10.6914:6961]()
    local width = App.width(to_text(filename))
    [10.6914]
    [10.6961]
    local width = App.width(filename)
  • replacement in app.lua at line 140
    [10.35229][10.35229:35299]()
    error('There were test failures:\n\n'..table.concat(Test_errors))
    [10.35229]
    [10.35299]
    error(('There were %d test failures:\n\n%s'):format(#Test_errors, table.concat(Test_errors)))
  • edit in app.lua at line 147
    [10.209859][10.35307:35307](),[10.60589][8.33:131](),[10.60589][8.33:131]()
    error(('There were %d test failures:\n\n%s'):format(#Test_errors, table.concat(Test_errors)))
  • resolve order conflict in app.lua at line 147
    [10.209859]
    [10.5849]