comparison editor.luan @ 10:a83c8842ca3b

add edited
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 02 Apr 2025 21:19:25 -0600
parents 9d8440e0aecc
children 538cb5ad031c
comparison
equal deleted inserted replaced
9:9d8440e0aecc 10:a83c8842ca3b
21 21
22 22
23 local new_window 23 local new_window
24 24
25 local function make_menu_bar(window) 25 local function make_menu_bar(window)
26 local revert
27 local menu_bar = new_menu_bar() 26 local menu_bar = new_menu_bar()
28 do 27 do
29 local file_menu = new_menu() 28 local file_menu = new_menu()
30 file_menu.text = "File" 29 file_menu.text = "File"
31 do 30 do
40 open.text = "Open..." 39 open.text = "Open..."
41 open.accelerator = "meta O" 40 open.accelerator = "meta O"
42 open.add_action_listener(window.open) 41 open.add_action_listener(window.open)
43 file_menu.add(open) 42 file_menu.add(open)
44 end 43 end
44 local revert
45 do 45 do
46 local save = new_menu_item() 46 local save = new_menu_item()
47 save.text = "Save" 47 save.text = "Save"
48 save.accelerator = "meta S" 48 save.accelerator = "meta S"
49 save.add_action_listener(function() 49 save.add_action_listener(function()
65 do 65 do
66 local edit_menu = new_menu() 66 local edit_menu = new_menu()
67 edit_menu.text = "Edit" 67 edit_menu.text = "Edit"
68 local document = window.text_area.document 68 local document = window.text_area.document
69 local undo, redo 69 local undo, redo
70 do
71 undo = new_menu_item()
72 undo.text = "Undo"
73 undo.accelerator = "meta Z"
74 undo.add_action_listener(document.undo)
75 edit_menu.add(undo)
76 end
77 do
78 redo = new_menu_item()
79 redo.text = "Redo"
80 redo.accelerator = "meta shift Z"
81 redo.add_action_listener(document.redo)
82 edit_menu.add(redo)
83 end
70 local function update_undo_redo() 84 local function update_undo_redo()
71 undo.set_enabled(document.can_undo()) 85 undo.set_enabled(document.can_undo())
72 redo.set_enabled(document.can_redo()) 86 redo.set_enabled(document.can_redo())
73 end 87 end
74 edit_menu.update_undo_redo = update_undo_redo -- prevent gc 88 edit_menu.update_undo_redo = update_undo_redo -- prevent gc
75 do
76 undo = new_menu_item()
77 undo.text = "Undo"
78 undo.accelerator = "meta Z"
79 undo.add_action_listener(function()
80 document.undo()
81 update_undo_redo()
82 end)
83 edit_menu.add(undo)
84 end
85 do
86 redo = new_menu_item()
87 redo.text = "Redo"
88 redo.accelerator = "meta shift Z"
89 redo.add_action_listener(function()
90 document.redo()
91 update_undo_redo()
92 end)
93 edit_menu.add(redo)
94 end
95 update_undo_redo() 89 update_undo_redo()
96 document.add_undoable_edit_listener(update_undo_redo) 90 document.add_undo_listener(update_undo_redo)
97 edit_menu.add_separator() 91 edit_menu.add_separator()
98 do 92 do
99 local cut = new_menu_item() 93 local cut = new_menu_item()
100 cut.text = "Cut" 94 cut.text = "Cut"
101 cut.accelerator = "meta X" 95 cut.accelerator = "meta X"
149 function new_window(file) 143 function new_window(file)
150 local window = {} 144 local window = {}
151 window.has_file = file~=nil and file.is_file() 145 window.has_file = file~=nil and file.is_file()
152 local frame = new_frame() 146 local frame = new_frame()
153 local title = file and file.canonical().to_string() or "new" 147 local title = file and file.canonical().to_string() or "new"
154 frame.title = title
155 frame.add_close_listener(function() 148 frame.add_close_listener(function()
156 n_windows = n_windows - 1 149 n_windows = n_windows - 1
157 if n_windows == 0 then 150 if n_windows == 0 then
158 Luan.exit() 151 Luan.exit()
159 end 152 end
169 end 162 end
170 if file.is_file() then 163 if file.is_file() then
171 text_area.text = file.read_text() 164 text_area.text = file.read_text()
172 end 165 end
173 end 166 end
167 local function set_title()
168 local s = title
169 if not text_area.document.is_unedited() then
170 s = s.." *"
171 end
172 frame.title = s
173 end
174 set_title()
175 text_area.set_title = set_title -- no gc
176 text_area.document.add_undo_listener(set_title)
174 text_area.rows = 10 177 text_area.rows = 10
175 text_area.columns = 20 178 text_area.columns = 20
176 text_area.wrap_style_word = true 179 text_area.wrap_style_word = true
177 text_area.line_wrap = true 180 text_area.line_wrap = true
178 text_area.tab_size = 4 181 text_area.tab_size = 4
208 title = file.canonical().to_string() 211 title = file.canonical().to_string()
209 frame.title = title 212 frame.title = title
210 documents[title] = text_area.document 213 documents[title] = text_area.document
211 end 214 end
212 file.write_text(text_area.text) 215 file.write_text(text_area.text)
216 text_area.document.set_unedited()
213 return true 217 return true
214 end 218 end
215 function window.revert() 219 function window.revert()
216 local caret_position = text_area.caret_position 220 local caret_position = text_area.caret_position
217 local text = file.read_text() 221 local text = file.read_text()
218 text_area.text = text 222 text_area.text = text
219 text_area.caret_position = min(caret_position,#text) 223 text_area.caret_position = min(caret_position,#text)
224 text_area.document.set_unedited()
220 end 225 end
221 local menu_bar = make_menu_bar(window) 226 local menu_bar = make_menu_bar(window)
222 frame.set_menu_bar(menu_bar) 227 frame.set_menu_bar(menu_bar)
223 frame.pack() 228 frame.pack()
224 frame.visible = true 229 frame.visible = true