Mercurial Hosting > editor
comparison editor.luan @ 7:ce4233ff5ce8
add revert
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 31 Mar 2025 22:36:47 -0600 |
parents | 524d6b1c26b4 |
children | 9d8440e0aecc |
comparison
equal
deleted
inserted
replaced
6:524d6b1c26b4 | 7:ce4233ff5ce8 |
---|---|
2 local error = Luan.error | 2 local error = Luan.error |
3 local ipairs = Luan.ipairs or error() | 3 local ipairs = Luan.ipairs or error() |
4 local Io = require "luan:Io.luan" | 4 local Io = require "luan:Io.luan" |
5 local print = Io.print or error() | 5 local print = Io.print or error() |
6 local new_file = Io.schemes.file or error() | 6 local new_file = Io.schemes.file or error() |
7 local Math = require "luan:Math.luan" | |
8 local min = Math.min or error() | |
7 local Swing = require "luan:swing/Swing.luan" | 9 local Swing = require "luan:swing/Swing.luan" |
8 local new_frame = require("luan:swing/Frame.luan").new or error() | 10 local new_frame = require("luan:swing/Frame.luan").new or error() |
9 local new_label = require("luan:swing/Label.luan").new or error() | 11 local new_label = require("luan:swing/Label.luan").new or error() |
10 local new_text_area = require("luan:swing/Text_area.luan").new or error() | 12 local new_text_area = require("luan:swing/Text_area.luan").new or error() |
11 local new_scroll_pane = require("luan:swing/Scroll_pane.luan").new or error() | 13 local new_scroll_pane = require("luan:swing/Scroll_pane.luan").new or error() |
19 | 21 |
20 | 22 |
21 local new_window | 23 local new_window |
22 | 24 |
23 local function make_menu_bar(window) | 25 local function make_menu_bar(window) |
26 local revert | |
24 local menu_bar = new_menu_bar() | 27 local menu_bar = new_menu_bar() |
25 do | 28 do |
26 local file_menu = new_menu() | 29 local file_menu = new_menu() |
27 file_menu.text = "File" | 30 file_menu.text = "File" |
28 do | 31 do |
41 end | 44 end |
42 do | 45 do |
43 local save = new_menu_item() | 46 local save = new_menu_item() |
44 save.text = "Save" | 47 save.text = "Save" |
45 save.accelerator = "meta S" | 48 save.accelerator = "meta S" |
46 save.add_action_listener(window.save) | 49 save.add_action_listener(function() |
50 if window.save() then | |
51 revert.set_enabled(true) | |
52 end | |
53 end) | |
47 file_menu.add(save) | 54 file_menu.add(save) |
55 end | |
56 do | |
57 revert = new_menu_item() | |
58 revert.text = "Revert" | |
59 revert.set_enabled(window.has_file) | |
60 revert.add_action_listener(window.revert) | |
61 file_menu.add(revert) | |
48 end | 62 end |
49 menu_bar.add(file_menu) | 63 menu_bar.add(file_menu) |
50 end | 64 end |
51 do | 65 do |
52 local edit_menu = new_menu() | 66 local edit_menu = new_menu() |
102 local n_windows = 0 | 116 local n_windows = 0 |
103 local documents = {} | 117 local documents = {} |
104 | 118 |
105 function new_window(file) | 119 function new_window(file) |
106 local window = {} | 120 local window = {} |
121 window.has_file = file~=nil and file.is_file() | |
107 local frame = new_frame() | 122 local frame = new_frame() |
108 local title = file and file.canonical().to_string() or "new" | 123 local title = file and file.canonical().to_string() or "new" |
109 frame.title = title | 124 frame.title = title |
110 frame.add_close_listener(function() | 125 frame.add_close_listener(function() |
111 n_windows = n_windows - 1 | 126 n_windows = n_windows - 1 |
130 text_area.columns = 20 | 145 text_area.columns = 20 |
131 text_area.wrap_style_word = true | 146 text_area.wrap_style_word = true |
132 text_area.line_wrap = true | 147 text_area.line_wrap = true |
133 text_area.tab_size = 4 | 148 text_area.tab_size = 4 |
134 text_area.set_font{ family="Monospaced", size=13 } | 149 text_area.set_font{ family="Monospaced", size=13 } |
135 text_area.select(0,0) | 150 text_area.caret_position = 0 |
136 --print(text_area.line_count) | 151 --print(text_area.line_count) |
137 local scroll_pane = new_scroll_pane(text_area) | 152 local scroll_pane = new_scroll_pane(text_area) |
138 local list = new_list() | 153 local list = new_list() |
139 list.add_element("1") | 154 list.add_element("1") |
140 list.add_element("2") | 155 list.add_element("2") |
156 if file == nil then | 171 if file == nil then |
157 local file_chooser = frame.file_chooser_save() | 172 local file_chooser = frame.file_chooser_save() |
158 file_chooser.visible = true | 173 file_chooser.visible = true |
159 file = file_chooser.file | 174 file = file_chooser.file |
160 if file == nil then | 175 if file == nil then |
161 return | 176 return false |
162 end | 177 end |
163 title = file.canonical().to_string() | 178 title = file.canonical().to_string() |
164 frame.title = title | 179 frame.title = title |
165 documents[title] = text_area.document | 180 documents[title] = text_area.document |
166 end | 181 end |
167 file.write_text(text_area.text) | 182 file.write_text(text_area.text) |
183 return true | |
184 end | |
185 function window.revert() | |
186 local caret_position = text_area.caret_position | |
187 local text = file.read_text() | |
188 text_area.text = text | |
189 text_area.caret_position = min(caret_position,#text) | |
168 end | 190 end |
169 local menu_bar = make_menu_bar(window) | 191 local menu_bar = make_menu_bar(window) |
170 frame.set_menu_bar(menu_bar) | 192 frame.set_menu_bar(menu_bar) |
171 frame.pack() | 193 frame.pack() |
172 frame.visible = true | 194 frame.visible = true |