Mercurial Hosting > editor
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 |