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 |
