changeset 5:57b4c281a03e

shared documents
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 31 Mar 2025 21:01:25 -0600
parents 3d6414265959
children 524d6b1c26b4
files editor.luan
diffstat 1 files changed, 43 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/editor.luan	Mon Mar 31 19:14:04 2025 -0600
+++ b/editor.luan	Mon Mar 31 21:01:25 2025 -0600
@@ -29,45 +29,21 @@
 			local new_file = new_menu_item()
 			new_file.text = "New File"
 			new_file.accelerator = "meta N"
-			new_file.add_action_listener(function()
-				new_window()
-			end)
+			new_file.add_action_listener(new_window)
 			file_menu.add(new_file)
 		end
 		do
 			local open = new_menu_item()
 			open.text = "Open..."
 			open.accelerator = "meta O"
-			open.add_action_listener(function()
-				local file_chooser = window.frame.file_chooser_load()
-				if window.file ~= nil then
-					file_chooser.directory = window.file.parent()
-				end
-				file_chooser.visible = true
-				local file = file_chooser.file
-				if file ~= nil then
-					new_window(file)
-				end
-			end)
+			open.add_action_listener(window.open)
 			file_menu.add(open)
 		end
 		do
 			local save = new_menu_item()
 			save.text = "Save"
 			save.accelerator = "meta S"
-			save.add_action_listener(function()
-				if window.file == nil then
-					local file_chooser = window.frame.file_chooser_save()
-					file_chooser.visible = true
-					local file = file_chooser.file
-					if file == nil then
-						return
-					end
-					window.file = file
-					window.frame.title = file.canonical().to_string()
-				end
-				window.file.write_text(window.text_area.text)
-			end)
+			save.add_action_listener(window.save)
 			file_menu.add(save)
 		end
 		menu_bar.add(file_menu)
@@ -90,10 +66,13 @@
 end
 
 local n_windows = 0
+local documents = {}
 
 function new_window(file)
+	local window = {}
 	local frame = new_frame()
-	frame.title = file and file.canonical().to_string() or "new"
+	local title = file and file.canonical().to_string() or "new"
+	frame.title = title
 	frame.add_close_listener(function()
 		n_windows = n_windows - 1
 		if n_windows == 0 then
@@ -101,8 +80,17 @@
 		end
 	end)
 	local text_area = new_text_area()
-	if file ~= nil and file.is_file() then
-		text_area.text = file.read_text()
+	window.text_area = text_area
+	if file ~= nil then
+		local document = documents[title]
+		if document == nil then
+			documents[title] = text_area.document
+		else
+			text_area.document = document
+		end
+		if file.is_file() then
+			text_area.text = file.read_text()
+		end
 	end
 	text_area.rows = 10
 	text_area.columns = 20
@@ -119,11 +107,31 @@
 	list.add_element("3")
 	--scroll_pane.set_row_header_view(list)
 	frame.add(scroll_pane)
-	local window = {
-		frame = frame
-		file = file
-		text_area = text_area
-	}
+	function window.open()
+		local file_chooser = frame.file_chooser_load()
+		if file ~= nil then
+			file_chooser.directory = file.parent()
+		end
+		file_chooser.visible = true
+		local new_file = file_chooser.file
+		if new_file ~= nil then
+			new_window(new_file)
+		end
+	end
+	function window.save()
+		if file == nil then
+			local file_chooser = frame.file_chooser_save()
+			file_chooser.visible = true
+			file = file_chooser.file
+			if file == nil then
+				return
+			end
+			title = file.canonical().to_string()
+			frame.title = title
+			documents[title] = text_area.document
+		end
+		file.write_text(text_area.text)
+	end
 	local menu_bar = make_menu_bar(window)
 	frame.set_menu_bar(menu_bar)
 	frame.pack()