changeset 7:ce4233ff5ce8

add revert
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 31 Mar 2025 22:36:47 -0600
parents 524d6b1c26b4
children ba302f81b38c
files editor.luan
diffstat 1 files changed, 25 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/editor.luan	Mon Mar 31 21:50:46 2025 -0600
+++ b/editor.luan	Mon Mar 31 22:36:47 2025 -0600
@@ -4,6 +4,8 @@
 local Io = require "luan:Io.luan"
 local print = Io.print or error()
 local new_file = Io.schemes.file or error()
+local Math = require "luan:Math.luan"
+local min = Math.min or error()
 local Swing = require "luan:swing/Swing.luan"
 local new_frame = require("luan:swing/Frame.luan").new or error()
 local new_label = require("luan:swing/Label.luan").new or error()
@@ -21,6 +23,7 @@
 local new_window
 
 local function make_menu_bar(window)
+	local revert
 	local menu_bar = new_menu_bar()
 	do
 		local file_menu = new_menu()
@@ -43,9 +46,20 @@
 			local save = new_menu_item()
 			save.text = "Save"
 			save.accelerator = "meta S"
-			save.add_action_listener(window.save)
+			save.add_action_listener(function()
+				if window.save() then
+					revert.set_enabled(true)
+				end
+			end)
 			file_menu.add(save)
 		end
+		do
+			revert = new_menu_item()
+			revert.text = "Revert"
+			revert.set_enabled(window.has_file)
+			revert.add_action_listener(window.revert)
+			file_menu.add(revert)
+		end
 		menu_bar.add(file_menu)
 	end
 	do
@@ -104,6 +118,7 @@
 
 function new_window(file)
 	local window = {}
+	window.has_file = file~=nil and file.is_file()
 	local frame = new_frame()
 	local title = file and file.canonical().to_string() or "new"
 	frame.title = title
@@ -132,7 +147,7 @@
 	text_area.line_wrap = true
 	text_area.tab_size = 4
 	text_area.set_font{ family="Monospaced", size=13 }
-	text_area.select(0,0)
+	text_area.caret_position = 0
 	--print(text_area.line_count)
 	local scroll_pane = new_scroll_pane(text_area)
 	local list = new_list()
@@ -158,13 +173,20 @@
 			file_chooser.visible = true
 			file = file_chooser.file
 			if file == nil then
-				return
+				return false
 			end
 			title = file.canonical().to_string()
 			frame.title = title
 			documents[title] = text_area.document
 		end
 		file.write_text(text_area.text)
+		return true
+	end
+	function window.revert()
+		local caret_position = text_area.caret_position
+		local text = file.read_text()
+		text_area.text = text
+		text_area.caret_position = min(caret_position,#text)
 	end
 	local menu_bar = make_menu_bar(window)
 	frame.set_menu_bar(menu_bar)