From d49ac2c5656fad711f13203cd68663719ea4ee1b Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Wed, 25 Sep 2024 08:08:15 +0100 Subject: [PATCH] progress towards being able to load files dynamically --- dotscape | Bin 1049312 -> 1049312 bytes functional-core/app/app-init.sml | 2 + functional-core/app/app-type.sml | 12 ++++- functional-core/app/app-update.sml | 5 +- functional-core/app/app-with.sml | 40 +++++++++++++++ imperative-shell/file-thread.sml | 77 ++++++++++++++++++++++------- message-types/file-msg.sml | 2 + 7 files changed, 116 insertions(+), 22 deletions(-) diff --git a/dotscape b/dotscape index 3b37518260dc3a745536db19096a5feef8ec8f94..1da63a361dc5f7d28b8353e13721a6871df1b5f8 100755 GIT binary patch delta 21035 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 delta 21073 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 $5{E^3JB)?6^M5hoKS(TdAGl%MAwVCkl09AR zZugt)`7`e0e;DyUopf~1yl1TAtg(CMpT>a!(DNCOm=ehB?sg#&T{zr)W@yCM?6P}s zy@)Lw|0!Tqcm&it+}9!^3R#l(65Sg}K6hz0_H)mTiok!A;&Km;ji?J`J=}wnBR-Y? zEn!ka)WZa-$IadguQEuPnD6 diff --git a/functional-core/app/app-init.sml b/functional-core/app/app-init.sml index ca9856e..d37ab10 100644 --- a/functional-core/app/app-init.sml +++ b/functional-core/app/app-init.sml @@ -35,6 +35,8 @@ struct , showGraph = true , arrowX = 0 , arrowY = 0 + , openFilePath = "" + , fileBrowser = Vector.fromList [] } end diff --git a/functional-core/app/app-type.sml b/functional-core/app/app-type.sml index 438d399..c19618f 100644 --- a/functional-core/app/app-type.sml +++ b/functional-core/app/app-type.sml @@ -1,6 +1,8 @@ signature APP_TYPE = sig - datatype app_mode = NORMAL_MODE | SAVE_MODE + datatype app_mode = NORMAL_MODE | BROWSE_MODE + + datatype file_browser_item = FILE of string | FOLDER of string datatype triangle_stage = NO_TRIANGLE @@ -33,12 +35,16 @@ sig , mouseY: Real32.real , arrowX: int , arrowY: int + , openFilePath: string + , fileBrowser: file_browser_item vector } end structure AppType :> APP_TYPE = struct - datatype app_mode = NORMAL_MODE | SAVE_MODE + datatype app_mode = NORMAL_MODE | BROWSE_MODE + + datatype file_browser_item = FILE of string | FOLDER of string type triangle = { x1: Real32.real @@ -79,5 +85,7 @@ struct , mouseY: Real32.real , arrowX: int , arrowY: int + , openFilePath: string + , fileBrowser: file_browser_item vector } end diff --git a/functional-core/app/app-update.sml b/functional-core/app/app-update.sml index 381e5d8..be26386 100644 --- a/functional-core/app/app-update.sml +++ b/functional-core/app/app-update.sml @@ -355,7 +355,7 @@ struct fun trianglesLoadError model = (model, NO_MAILBOX) - fun update (model: app_type, inputMsg) = + fun updateNormalMode (model: app_type, inputMsg) = case inputMsg of MOUSE_MOVE {x = mouseX, y = mouseY} => let val model = AppWith.mousePosition (model, mouseX, mouseY) @@ -378,4 +378,7 @@ struct | KEY_SPACE => enterOrSpaceCoordinates model | USE_TRIANGLES triangles => useTriangles (model, triangles) | TRIANGLES_LOAD_ERROR => trianglesLoadError model + + fun update (model: app_type, inputMsg) = + case #mode model of NORMAL_MODE => updateNormalMode (model, inputMsg) end diff --git a/functional-core/app/app-with.sml b/functional-core/app/app-with.sml index ce712f7..18489e8 100644 --- a/functional-core/app/app-with.sml +++ b/functional-core/app/app-with.sml @@ -78,6 +78,8 @@ struct , mouseY , arrowX = _ , arrowY = _ + , openFilePath + , fileBrowser } = app val newUndo = newUndoHd :: undo @@ -97,6 +99,8 @@ struct , mouseY = mouseY , arrowX = arrowX , arrowY = arrowY + , openFilePath = openFilePath + , fileBrowser = fileBrowser } end @@ -120,6 +124,8 @@ struct , mouseY , arrowX = _ , arrowY = _ + , openFilePath + , fileBrowser } = app val newTriangle = {x1 = x1, y1 = y1, x2 = x2, y2 = y2, x3 = x3, y3 = y3} @@ -141,6 +147,8 @@ struct , mouseY = mouseY , arrowX = arrowX , arrowY = arrowY + , openFilePath = openFilePath + , fileBrowser = fileBrowser } end @@ -162,6 +170,8 @@ struct , mouseY , arrowX = _ , arrowY + , openFilePath + , fileBrowser } = app in { mode = mode @@ -179,6 +189,8 @@ struct , mouseY = mouseY , arrowX = arrowX , arrowY = arrowY + , openFilePath = openFilePath + , fileBrowser = fileBrowser } end @@ -200,6 +212,8 @@ struct , mouseY , arrowX , arrowY = _ + , openFilePath + , fileBrowser } = app in { mode = mode @@ -217,6 +231,8 @@ struct , mouseY = mouseY , arrowX = arrowX , arrowY = arrowY + , openFilePath = openFilePath + , fileBrowser = fileBrowser } end @@ -240,6 +256,8 @@ struct , mouseY , arrowX , arrowY + , openFilePath + , fileBrowser } = app val xClickPoints = ClickPoints.generate (wStart, wFinish, numClickPoints) @@ -260,6 +278,8 @@ struct , mouseY = mouseY , arrowX = arrowX , arrowY = arrowY + , openFilePath = openFilePath + , fileBrowser = fileBrowser } end @@ -304,6 +324,8 @@ struct , showGraph , arrowX , arrowY + , openFilePath + , fileBrowser } = app in { mode = mode @@ -321,6 +343,8 @@ struct , showGraph = showGraph , arrowX = arrowX , arrowY = arrowY + , openFilePath = openFilePath + , fileBrowser = fileBrowser } end @@ -343,6 +367,8 @@ struct , mouseY , arrowX , arrowY + , openFilePath + , fileBrowser } = app val newUndo = @@ -367,6 +393,8 @@ struct , mouseY = mouseY , arrowX = arrowX , arrowY = arrowY + , openFilePath = openFilePath + , fileBrowser = fileBrowser } end @@ -389,6 +417,8 @@ struct , mouseY , arrowX , arrowY + , openFilePath + , fileBrowser } = app val newUndo = newUndoHd :: undo @@ -412,6 +442,8 @@ struct , mouseY = mouseY , arrowX = arrowX , arrowY = arrowY + , openFilePath = openFilePath + , fileBrowser = fileBrowser } end @@ -433,6 +465,8 @@ struct , arrowX , arrowY , showGraph = _ + , openFilePath + , fileBrowser } = app in { mode = mode @@ -450,6 +484,8 @@ struct , mouseY = mouseY , arrowX = arrowX , arrowY = arrowY + , openFilePath = openFilePath + , fileBrowser = fileBrowser } end @@ -471,6 +507,8 @@ struct , arrowY , triangles = _ , triangleStage = _ + , openFilePath + , fileBrowser } = app val triangleStage = NO_TRIANGLE @@ -490,6 +528,8 @@ struct , mouseY = mouseY , arrowX = arrowX , arrowY = arrowY + , openFilePath = openFilePath + , fileBrowser = fileBrowser } end end diff --git a/imperative-shell/file-thread.sml b/imperative-shell/file-thread.sml index 5551cb8..a3df583 100644 --- a/imperative-shell/file-thread.sml +++ b/imperative-shell/file-thread.sml @@ -18,28 +18,26 @@ struct let val num = (num + 1.0) / 2.0 val num = Real32.toString num - val num = + val num = (* Problem: It seems that Real32.toString may sometimes return a string * that is recognised as an integer, like "1" instead of "1.0". * If that happens, we just add a ".0" to the end * so it's recognised as a real. *) - if String.isSubstring "." num - then num + if String.isSubstring "." num then num else num ^ ".0" in - " (((startX * (1.0 - " ^ num ^ ")) + (endX * " ^ num ^ ")) / windowWidth) - 1.0" + " (((startX * (1.0 - " ^ num ^ ")) + (endX * " ^ num + ^ ")) / windowWidth) - 1.0" end fun ndcToLerpY num = let val num = (num + 1.0) / 2.0 val num = Real32.toString num - val num = - if String.isSubstring "." num - then num - else num ^ ".0" + val num = if String.isSubstring "." num then num else num ^ ".0" in - " (((startY * (1.0 - " ^ num ^ ")) + (endY * " ^ num ^ ")) / windowHeight) - 1.0" + " (((startY * (1.0 - " ^ num ^ ")) + (endY * " ^ num + ^ ")) / windowHeight) - 1.0" end fun helpExportTriangles (io, triangles) = @@ -55,10 +53,20 @@ struct val y3 = ndcToLerpY y3 val line = String.concat - [ x1, ",\n", y1, ", r, g, b,\n" - , x2, ",\n", y2, ", r, g, b,\n" - , x3, ",\n", y3 - , case tl of [] => ", r, g, b\n" | _ => ", r, g, b,\n" + [ x1 + , ",\n" + , y1 + , ", r, g, b,\n" + , x2 + , ",\n" + , y2 + , ", r, g, b,\n" + , x3 + , ",\n" + , y3 + , case tl of + [] => ", r, g, b\n" + | _ => ", r, g, b,\n" ] val _ = TextIO.output (io, line) @@ -128,14 +136,20 @@ struct {x1, y1, x2, y2, x3, y3} :: tl => let val triString = String.concat - [ "x ", Real32.toString x1 - , " y ", Real32.toString y1 + [ "x " + , Real32.toString x1 + , " y " + , Real32.toString y1 - , " x ", Real32.toString x2 - , " y ", Real32.toString y2 + , " x " + , Real32.toString x2 + , " y " + , Real32.toString y2 - , " x ", Real32.toString x3 - , " y ", Real32.toString y3 + , " x " + , Real32.toString x3 + , " y " + , Real32.toString y3 , "\n" ] @@ -154,6 +168,30 @@ struct () end + fun getDirList (dir, acc) = + case OS.FileSys.readDir dir of + SOME path => + let + val _ = print (path ^ "\n") + val acc = + if OS.FileSys.isDir path then (AppType.FOLDER path) :: acc + else if OS.FileSys.isLink path then acc + else (AppType.FILE path) :: acc + in + getDirList (dir, acc) + end + | NONE => let val acc = List.rev acc in Vector.fromList acc end + + fun loadFiles (path, inputMailbox) = + let + val path = if String.size path = 0 then OS.FileSys.getDir () else path + val dir = OS.FileSys.openDir path + val dirList = getDirList (dir, []) + val _ = OS.FileSys.closeDir dir + in + () + end + fun run (fileMailbox, inputMailbox) = let val _ = @@ -161,6 +199,7 @@ struct SAVE_TRIANGLES triangles => saveTriangles triangles | LOAD_TRIANGLES => loadTriangles inputMailbox | EXPORT_TRIANGLES triangles => exportTriangles triangles + | LOAD_FILES path => loadFiles (path, inputMailbox) in run (fileMailbox, inputMailbox) end diff --git a/message-types/file-msg.sml b/message-types/file-msg.sml index 963f7ab..2c71251 100644 --- a/message-types/file-msg.sml +++ b/message-types/file-msg.sml @@ -4,6 +4,7 @@ sig SAVE_TRIANGLES of AppType.triangle list | LOAD_TRIANGLES | EXPORT_TRIANGLES of AppType.triangle list + | LOAD_FILES of string end structure FileMessage :> FILE_MESSAGE = @@ -12,4 +13,5 @@ struct SAVE_TRIANGLES of AppType.triangle list | LOAD_TRIANGLES | EXPORT_TRIANGLES of AppType.triangle list + | LOAD_FILES of string end