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