snapshot - no, that's all wrong

I've been only thinking about up arrow when cursor is at top of screen.
Hopefully this is better.
This commit is contained in:
Kartik K. Agaram 2022-05-20 16:41:21 -07:00
parent ce94f8bf79
commit c28f6ba031
3 changed files with 43 additions and 17 deletions

View File

@ -38,7 +38,7 @@ require 'icons'
-- once, and read them passively thereafter.
Lines = {{mode='text', data=''}}
Cursor_line = 1
Cursor_pos = 1 -- in Unicode codepoints, from 1 to utf8.len(line) + 1
Cursor_pos = 15 -- in Unicode codepoints, from 1 to utf8.len(line) + 1
Screen_width, Screen_height, Screen_flags = 0, 0, nil
@ -47,7 +47,7 @@ Cursor_x, Cursor_y = 0, 0 -- in pixels
-- scrolling support
Screen_top_line = 1
Screen_bottom_line = 1
Top_screen_line_starting_pos = 1 -- when top of screen starts in between a wrapped line
Top_screen_line_starting_pos = 6 -- when top of screen starts in between a wrapped line
Bottom_screen_line_starting_pos = 1 -- when bottom of screen starts in between a wrapped line
Current_drawing_mode = 'line'
@ -61,15 +61,17 @@ Filename = 'lines.txt'
function love.load(arg)
-- maximize window
love.window.setMode(0, 0) -- maximize
Screen_width, Screen_height, Screen_flags = love.window.getMode()
-- shrink slightly to account for window decoration
Screen_width = Screen_width-100
Screen_height = Screen_height-100
--? love.window.setMode(0, 0) -- maximize
--? Screen_width, Screen_height, Screen_flags = love.window.getMode()
--? -- shrink slightly to account for window decoration
--? Screen_width = Screen_width-100
--? Screen_height = Screen_height-100
Screen_width = 120
Screen_height = 200
love.window.setMode(Screen_width, Screen_height)
love.window.setTitle('Text with Lines')
--? Line_width = 100
Line_width = math.floor(Screen_width/2/40)*40
Line_width = 100
--? Line_width = math.floor(Screen_width/2/40)*40
love.keyboard.setTextInput(true) -- bring up keyboard on touch screen
love.keyboard.setKeyRepeat(true)
if #arg > 0 then

View File

@ -22,7 +22,7 @@ scrolling:
cursor remains on screen
cursor remains on text line
'up' arrow with cursor at top of screen scrolls up one line (drawings still fully in or out)
if top line wrapped before, it scrolls up by only one screen line
if cursor line wrapped before, it scrolls up by only one screen line
if previous line (above top of screen) wrapped, it scrolls up by only one screen line
'down' arrow with cursor at bottom of screen scrolls down one line (drawings still fully in or out)
if top line wrapped before, it scrolls down by only one screen line
if cursor line wrapped before, it scrolls down by only one screen line

View File

@ -219,7 +219,9 @@ function Text.keychord_pressed(chord)
save_to_disk(Lines, Filename)
elseif chord == 'up' then
assert(Lines[Cursor_line].mode == 'text')
if Top_screen_line_starting_pos == 1 then
local screen_line_index,screen_line_starting_pos = Text.pos_at_start_of_cursor_screen_line()
if screen_line_starting_pos == 1 then
print('cursor is at first screen line of its line')
-- top line is done; skip to previous text line
local new_cursor_line = Cursor_line
while new_cursor_line > 1 do
@ -233,7 +235,10 @@ function Text.keychord_pressed(chord)
end
local screen_line_starting_pos = Lines[Cursor_line].screen_line_starting_pos
screen_line_starting_pos = screen_line_starting_pos[#screen_line_starting_pos]
Top_screen_line_starting_pos = screen_line_starting_pos
print('previous screen line starts at '..tostring(screen_line_starting_pos)..' of its line')
if Screen_top_line == Cursor_line and Top_screen_line_starting_pos == screen_line_starting_pos then
Top_screen_line_starting_pos = screen_line_starting_pos
end
local s = string.sub(Lines[Cursor_line].data, screen_line_starting_pos)
Cursor_pos = screen_line_starting_pos + Text.nearest_cursor_pos(s, old_x) - 1
break
@ -244,11 +249,17 @@ function Text.keychord_pressed(chord)
end
else
-- scroll up just one screen line in current line
local screen_line_index = table.find(Lines[Cursor_line].screen_line_starting_pos, Top_screen_line_starting_pos)
print('cursor is NOT at first screen line of its line')
assert(screen_line_index > 1)
Top_screen_line_starting_pos = Lines[Cursor_line].screen_line_starting_pos[screen_line_index-1]
local s = string.sub(Lines[Cursor_line].data, Top_screen_line_starting_pos)
Cursor_pos = Text.nearest_cursor_pos(s, Cursor_x)
new_screen_line_starting_pos = Lines[Cursor_line].screen_line_starting_pos[screen_line_index-1]
print('switching pos of screen line at cursor from '..tostring(screen_line_starting_pos)..' to '..tostring(new_screen_line_starting_pos))
if Screen_top_line == Cursor_line and Top_screen_line_starting_pos == screen_line_starting_pos then
Top_screen_line_starting_pos = new_screen_line_starting_pos
print('also setting pos of top of screen to '..tostring(Top_screen_line_starting_pos))
end
local s = string.sub(Lines[Cursor_line].data, new_screen_line_starting_pos)
Cursor_pos = new_screen_line_starting_pos + Text.nearest_cursor_pos(s, Cursor_x) - 1
print('cursor pos is now '..tostring(Cursor_pos))
end
elseif chord == 'down' then
assert(Lines[Cursor_line].mode == 'text')
@ -269,6 +280,19 @@ function Text.keychord_pressed(chord)
end
end
function Text.pos_at_start_of_cursor_screen_line()
if Lines[Cursor_line].screen_line_starting_pos == nil then
return 1,1
end
for i=#Lines[Cursor_line].screen_line_starting_pos,1,-1 do
local spos = Lines[Cursor_line].screen_line_starting_pos[i]
if spos <= Cursor_pos then
return i,spos
end
end
assert(false)
end
function Text.move_cursor_down_to_next_text_line_while_scrolling_again_if_necessary()
while Cursor_line <= #Lines do
if Lines[Cursor_line].mode == 'text' then