-- some constants people might like to tweak Text_color = {r=0, g=0, b=0} Cursor_color = {r=1, g=0, b=0} Hyperlink_decoration_color = {r=0.4, g=0.4, b=1} Stroke_color = {r=0, g=0, b=0} Current_stroke_color = {r=0.7, g=0.7, b=0.7} -- in process of being drawn Current_name_background_color = {r=1, g=0, b=0, a=0.1} -- name currently being edited Focus_stroke_color = {r=1, g=0, b=0} -- what mouse is hovering over Highlight_color = {r=0.7, g=0.7, b=0.9} -- selected text Line_number_color = {r=0.6, g=0.6, b=0.6} 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} Margin_top = 15 Margin_left = 25 Margin_right = 25 Drawing_padding_top = 10 Drawing_padding_bottom = 10 Drawing_padding_height = Drawing_padding_top + Drawing_padding_bottom Same_point_distance = 4 -- pixel distance at which two points are considered the same edit = {} -- run in both tests and a real run function edit.initialize_state(top, left, right, font, font_height, line_height) -- currently always draws to bottom of screen local result = { -- a line is either text or a drawing -- a text is a table with: -- mode = 'text', -- string data, -- a drawing is a table with: -- mode = 'drawing' -- a (h)eight, -- an array of points, and -- an array of shapes -- a shape is a table containing: -- a mode -- an array points for mode 'freehand' (raw x,y coords; freehand drawings don't pollute the points array of a drawing) -- an array vertices for mode 'polygon', 'rectangle', 'square' -- p1, p2 for mode 'line' -- center, radius for mode 'circle' -- center, radius, start_angle, end_angle for mode 'arc' -- 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=''}}, -- array of lines -- Lines can be too long to fit on screen, in which case they _wrap_ into -- multiple _screen lines_. -- rendering wrapped text lines needs some additional short-lived data per line: -- startpos, the index of data the line starts rendering from, can only be >1 for topmost line on screen -- screen_line_starting_pos: optional array of codepoint 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. -- -- 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. -- -- On lines that are drawings, pos will be nil. screen_top1 = {line=1, pos=1}, -- position of start of screen line at top of screen cursor1 = {line=1, pos=1}, -- position of cursor; must be on a text line selection1 = {}, -- some ex
discard """
joinable: false
"""
import tmarshal
import tparsesql