get rid of all bifold text
It's just uneconomic to maintain given how little I've used it. I have a bug right now and no time to port the bugfix to all the complexities of the B side. I briefly considered tossing out the entire source editor. But I _have_ been using it to browse logs across sessions. The live editor doesn't quite cover all my use cases just yet. We now have duplication in the source editor only for: * syntax highlighting * hyperlinking [[WikiWords]] * ability to hide cursor (when showing file browser or Focus is in log browser)
This commit is contained in:
parent
ae429cd78a
commit
8c373fdb60
14
source.lua
14
source.lua
|
@ -75,7 +75,7 @@ function source.initialize()
|
|||
love.window.setTitle('lines.love - source')
|
||||
end
|
||||
|
||||
-- environment for a mutable file of bifolded text
|
||||
-- environment for a mutable file
|
||||
-- TODO: some initialization is also happening in load_settings/initialize_default_settings. Clean that up.
|
||||
function source.initialize_edit_side()
|
||||
load_from_disk(Editor_state)
|
||||
|
@ -89,17 +89,12 @@ function source.initialize_edit_side()
|
|||
end
|
||||
edit.check_locs(Editor_state)
|
||||
|
||||
-- We currently start out with side B collapsed.
|
||||
-- Other options:
|
||||
-- * save all expanded state by line
|
||||
-- * expand all if any location is in side B
|
||||
if Editor_state.cursor1.line > #Editor_state.lines then
|
||||
Editor_state.cursor1 = {line=1, pos=1}
|
||||
end
|
||||
if Editor_state.screen_top1.line > #Editor_state.lines then
|
||||
Editor_state.screen_top1 = {line=1, pos=1}
|
||||
end
|
||||
edit.eradicate_locations_after_the_fold(Editor_state)
|
||||
|
||||
if rawget(_G, 'jit') then
|
||||
jit.off()
|
||||
|
@ -253,13 +248,6 @@ end
|
|||
function source.quit()
|
||||
edit.quit(Editor_state)
|
||||
log_browser.quit(Log_browser_state)
|
||||
-- convert any bifold files here
|
||||
end
|
||||
|
||||
function source.convert_bifold_text(infilename, outfilename)
|
||||
local contents = love.filesystem.read(infilename)
|
||||
contents = contents:gsub('\u{1e}', ';')
|
||||
love.filesystem.write(outfilename, contents)
|
||||
end
|
||||
|
||||
function source.settings()
|
||||
|
|
103
source_edit.lua
103
source_edit.lua
|
@ -10,8 +10,6 @@ Highlight_color = {r=0.7, g=0.7, b=0.9} -- selected text
|
|||
Icon_color = {r=0.7, g=0.7, b=0.7} -- color of current mode icon in drawings
|
||||
Help_color = {r=0, g=0.5, b=0}
|
||||
Help_background_color = {r=0, g=0.5, b=0, a=0.1}
|
||||
Fold_color = {r=0, g=0.6, b=0}
|
||||
Fold_background_color = {r=0, g=0.7, b=0}
|
||||
|
||||
Margin_top = 15
|
||||
Margin_left = 25
|
||||
|
@ -28,12 +26,10 @@ edit = {}
|
|||
-- run in both tests and a real run
|
||||
function edit.initialize_state(top, left, right, font_height, line_height) -- currently always draws to bottom of screen
|
||||
local result = {
|
||||
-- a line is either bifold text or a drawing
|
||||
-- a line of bifold text consists of an A side and an optional B side
|
||||
-- a line is either text or a drawing
|
||||
-- a text is a table with:
|
||||
-- mode = 'text',
|
||||
-- string data,
|
||||
-- string dataB,
|
||||
-- expanded: whether to show B side
|
||||
-- a drawing is a table with:
|
||||
-- mode = 'drawing'
|
||||
-- a (y) coord in pixels (updated while painting screen),
|
||||
|
@ -50,7 +46,7 @@ function edit.initialize_state(top, left, right, font_height, line_height) -- c
|
|||
-- Unless otherwise specified, coord fields are normalized; a drawing is always 256 units wide
|
||||
-- The field names are carefully chosen so that switching modes in midstream
|
||||
-- remembers previously entered points where that makes sense.
|
||||
lines = {{mode='text', data='', dataB=nil, expanded=nil}}, -- array of lines
|
||||
lines = {{mode='text', data=''}}, -- array of lines
|
||||
|
||||
-- Lines can be too long to fit on screen, in which case they _wrap_ into
|
||||
-- multiple _screen lines_.
|
||||
|
@ -65,16 +61,15 @@ function edit.initialize_state(top, left, right, font_height, line_height) -- c
|
|||
-- 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.
|
||||
-- Positions (and screen line indexes) can be in either the A or the B side.
|
||||
--
|
||||
-- Most of the time we'll only persist positions in schema 1, translating to
|
||||
-- schema 2 when that's convenient.
|
||||
--
|
||||
-- Make sure these coordinates are never aliased, so that changing one causes
|
||||
-- action at a distance.
|
||||
screen_top1 = {line=1, pos=1, posB=nil}, -- position of start of screen line at top of screen
|
||||
cursor1 = {line=1, pos=1, posB=nil}, -- position of cursor
|
||||
screen_bottom1 = {line=1, pos=1, posB=nil}, -- position of start of screen line at bottom of screen
|
||||
screen_top1 = {line=1, pos=1}, -- position of start of screen line at top of screen
|
||||
cursor1 = {line=1, pos=1}, -- position of cursor
|
||||
screen_bottom1 = {line=1, pos=1}, -- position of start of screen line at bottom of screen
|
||||
|
||||
selection1 = {},
|
||||
-- some extra state to compute selection between mouse press and release
|
||||
|
@ -154,7 +149,7 @@ function edit.draw(State, hide_cursor)
|
|||
assert(false)
|
||||
end
|
||||
if not Text.le1(State.screen_top1, State.cursor1) then
|
||||
print(State.screen_top1.line, State.screen_top1.pos, State.screen_top1.posB, State.cursor1.line, State.cursor1.pos, State.cursor1.posB)
|
||||
print(State.screen_top1.line, State.screen_top1.pos, State.cursor1.line, State.cursor1.pos)
|
||||
assert(false)
|
||||
end
|
||||
State.cursor_x = nil
|
||||
|
@ -163,18 +158,14 @@ function edit.draw(State, hide_cursor)
|
|||
--? print('== draw')
|
||||
for line_index = State.screen_top1.line,#State.lines do
|
||||
local line = State.lines[line_index]
|
||||
--? print('draw:', y, line_index, line, line.mode)
|
||||
--? print('draw:', y, line_index, line)
|
||||
if y + State.line_height > App.screen.height then break end
|
||||
State.screen_bottom1 = {line=line_index, pos=nil, posB=nil}
|
||||
State.screen_bottom1 = {line=line_index, pos=nil}
|
||||
if line.mode == 'text' then
|
||||
--? print('text.draw', y, line_index)
|
||||
local startpos, startposB = 1, nil
|
||||
--? print('text.draw', y, line_index)
|
||||
local startpos = 1
|
||||
if line_index == State.screen_top1.line then
|
||||
if State.screen_top1.pos then
|
||||
startpos = State.screen_top1.pos
|
||||
else
|
||||
startpos, startposB = nil, State.screen_top1.posB
|
||||
end
|
||||
startpos = State.screen_top1.pos
|
||||
end
|
||||
if line.data == '' then
|
||||
-- button to insert new drawing
|
||||
|
@ -192,7 +183,7 @@ function edit.draw(State, hide_cursor)
|
|||
end,
|
||||
})
|
||||
end
|
||||
y, State.screen_bottom1.pos, State.screen_bottom1.posB = Text.draw(State, line_index, y, startpos, startposB, hide_cursor)
|
||||
y, State.screen_bottom1.pos = Text.draw(State, line_index, y, startpos, hide_cursor)
|
||||
y = y + State.line_height
|
||||
--? print('=> y', y)
|
||||
elseif line.mode == 'drawing' then
|
||||
|
@ -255,10 +246,11 @@ function edit.mouse_press(State, x,y, mouse_button)
|
|||
State.old_cursor1 = State.cursor1
|
||||
State.old_selection1 = State.selection1
|
||||
State.mousepress_shift = App.shift_down()
|
||||
local pos,posB = Text.to_pos_on_line(State, line_index, x, y)
|
||||
--? print(x,y, 'setting cursor:', line_index, pos, posB)
|
||||
State.selection1 = {line=line_index, pos=pos, posB=posB}
|
||||
--? print('selection', State.selection1.line, State.selection1.pos, State.selection1.posB)
|
||||
State.selection1 = {
|
||||
line=line_index,
|
||||
pos=Text.to_pos_on_line(State, line_index, x, y),
|
||||
}
|
||||
--? print('selection', State.selection1.line, State.selection1.pos)
|
||||
break
|
||||
end
|
||||
elseif line.mode == 'drawing' then
|
||||
|
@ -289,9 +281,11 @@ function edit.mouse_release(State, x,y, mouse_button)
|
|||
if line.mode == 'text' then
|
||||
if Text.in_line(State, line_index, x,y) then
|
||||
--? print('reset selection')
|
||||
local pos,posB = Text.to_pos_on_line(State, line_index, x, y)
|
||||
State.cursor1 = {line=line_index, pos=pos, posB=posB}
|
||||
--? print('cursor', State.cursor1.line, State.cursor1.pos, State.cursor1.posB)
|
||||
State.cursor1 = {
|
||||
line=line_index,
|
||||
pos=Text.to_pos_on_line(State, line_index, x, y),
|
||||
}
|
||||
--? print('cursor', State.cursor1.line, State.cursor1.pos)
|
||||
if State.mousepress_shift then
|
||||
if State.old_selection1.line == nil then
|
||||
State.selection1 = State.old_cursor1
|
||||
|
@ -360,11 +354,7 @@ function edit.keychord_press(State, chord, key)
|
|||
State.search_term = string.sub(State.search_term, 1, byte_offset-1)
|
||||
State.search_text = nil
|
||||
elseif chord == 'down' then
|
||||
if State.cursor1.pos then
|
||||
State.cursor1.pos = State.cursor1.pos+1
|
||||
else
|
||||
State.cursor1.posB = State.cursor1.posB+1
|
||||
end
|
||||
State.cursor1.pos = State.cursor1.pos+1
|
||||
Text.search_next(State)
|
||||
elseif chord == 'up' then
|
||||
Text.search_previous(State)
|
||||
|
@ -373,35 +363,10 @@ function edit.keychord_press(State, chord, key)
|
|||
elseif chord == 'C-f' then
|
||||
State.search_term = ''
|
||||
State.search_backup = {
|
||||
cursor={line=State.cursor1.line, pos=State.cursor1.pos, posB=State.cursor1.posB},
|
||||
screen_top={line=State.screen_top1.line, pos=State.screen_top1.pos, posB=State.screen_top1.posB},
|
||||
cursor={line=State.cursor1.line, pos=State.cursor1.pos},
|
||||
screen_top={line=State.screen_top1.line, pos=State.screen_top1.pos},
|
||||
}
|
||||
assert(State.search_text == nil)
|
||||
-- bifold text
|
||||
elseif chord == 'M-b' then
|
||||
State.expanded = not State.expanded
|
||||
Text.redraw_all(State)
|
||||
if not State.expanded then
|
||||
for _,line in ipairs(State.lines) do
|
||||
line.expanded = nil
|
||||
end
|
||||
edit.eradicate_locations_after_the_fold(State)
|
||||
end
|
||||
elseif chord == 'M-d' then
|
||||
if State.cursor1.posB == nil then
|
||||
local before = snapshot(State, State.cursor1.line)
|
||||
if State.lines[State.cursor1.line].dataB == nil then
|
||||
State.lines[State.cursor1.line].dataB = ''
|
||||
end
|
||||
State.lines[State.cursor1.line].expanded = true
|
||||
State.cursor1.pos = nil
|
||||
State.cursor1.posB = 1
|
||||
if Text.cursor_out_of_screen(State) then
|
||||
Text.snap_cursor_to_bottom_of_screen(State, State.left, State.right)
|
||||
end
|
||||
schedule_save(State)
|
||||
record_undo_event(State, {before=before, after=snapshot(State, State.cursor1.line)})
|
||||
end
|
||||
-- zoom
|
||||
elseif chord == 'C-=' then
|
||||
edit.update_font_settings(State, State.font_height+2)
|
||||
|
@ -449,7 +414,7 @@ function edit.keychord_press(State, chord, key)
|
|||
-- clipboard
|
||||
elseif chord == 'C-a' then
|
||||
State.selection1 = {line=1, pos=1}
|
||||
State.cursor1 = {line=#State.lines, pos=utf8.len(State.lines[#State.lines].data)+1, posB=nil}
|
||||
State.cursor1 = {line=#State.lines, pos=utf8.len(State.lines[#State.lines].data)+1}
|
||||
elseif chord == 'C-c' then
|
||||
local s = Text.selection(State)
|
||||
if s then
|
||||
|
@ -524,20 +489,6 @@ function edit.keychord_press(State, chord, key)
|
|||
end
|
||||
end
|
||||
|
||||
function edit.eradicate_locations_after_the_fold(State)
|
||||
-- eradicate side B from any locations we track
|
||||
if State.cursor1.posB then
|
||||
State.cursor1.posB = nil
|
||||
State.cursor1.pos = utf8.len(State.lines[State.cursor1.line].data)
|
||||
State.cursor1.pos = Text.pos_at_start_of_screen_line(State, State.cursor1)
|
||||
end
|
||||
if State.screen_top1.posB then
|
||||
State.screen_top1.posB = nil
|
||||
State.screen_top1.pos = utf8.len(State.lines[State.screen_top1.line].data)
|
||||
State.screen_top1.pos = Text.pos_at_start_of_screen_line(State, State.screen_top1)
|
||||
end
|
||||
end
|
||||
|
||||
function edit.key_release(State, key, scancode)
|
||||
end
|
||||
|
||||
|
|
878
source_text.lua
878
source_text.lua
File diff suppressed because it is too large
Load Diff
1
text.lua
1
text.lua
|
@ -156,7 +156,6 @@ function Text.text_input(State, t)
|
|||
if State.cursor_y > App.screen.height - State.line_height then
|
||||
Text.populate_screen_line_starting_pos(State, State.cursor1.line)
|
||||
Text.snap_cursor_to_bottom_of_screen(State, State.left, State.right)
|
||||
--? print('=>', State.screen_top1.line, State.screen_top1.pos, State.cursor1.line, State.cursor1.pos, State.screen_bottom1.line, State.screen_bottom1.pos)
|
||||
end
|
||||
record_undo_event(State, {before=before, after=snapshot(State, State.cursor1.line)})
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue