signature APP_WITH = sig val graphVisibility: AppType.app_type * bool -> AppType.app_type val mode: AppType.app_type * AppType.app_mode -> AppType.app_type val windowResize: AppType.app_type * int * int -> AppType.app_type val mousePosition: AppType.app_type * Real32.real * Real32.real -> AppType.app_type val fileBrowserAndPath: AppType.app_type * AppType.file_browser_item vector * string -> AppType.app_type val fileBrowserIdx: AppType.app_type * int -> AppType.app_type val arrowX: AppType.app_type * int -> AppType.app_type val arrowY: AppType.app_type * int -> AppType.app_type val undo: AppType.app_type * AppType.triangle_stage * AppType.triangle list * (Real32.real * Real32.real) -> AppType.app_type val redo: AppType.app_type * AppType.triangle_stage * AppType.triangle list * (Real32.real * Real32.real) -> AppType.app_type (* * add functions clear the redo stack, * as they are meant to be called after a click action, * and also add new click position to undo stack. *) val addTriangleStage: AppType.app_type * AppType.triangle_stage * (Real32.real * Real32.real) * int * int -> AppType.app_type val addTriangle: AppType.app_type * Real32.real * Real32.real * Real32.real * Real32.real * Real32.real * Real32.real * (Real32.real * Real32.real) * int * int -> AppType.app_type val useTrianglesAndSetNormalMode: AppType.app_type * AppType.triangle list -> AppType.app_type val num: AppType.app_type * int -> AppType.app_type val r: AppType.app_type -> AppType.app_type val g: AppType.app_type -> AppType.app_type val b: AppType.app_type -> AppType.app_type end structure AppWith :> APP_WITH = struct open AppType (* add to undo, clear redo *) fun addTriangleStage (app: app_type, newTriangleStage: triangle_stage, newUndoHd, arrowX, arrowY) : app_type = let val { triangleStage = _ , mode , triangles , numClickPointsX , numClickPointsY , xClickPoints , yClickPoints , windowWidth , windowHeight , undo , redo = _ , showGraph , mouseX , mouseY , arrowX = _ , arrowY = _ , openFilePath , fileBrowser , fileBrowserIdx , r , g , b , num } = app val newUndo = newUndoHd :: undo in { triangleStage = newTriangleStage , undo = newUndo , redo = [] , mode = mode , triangles = triangles , numClickPointsX = numClickPointsX , numClickPointsY = numClickPointsY , xClickPoints = xClickPoints , yClickPoints = yClickPoints , windowWidth = windowWidth , windowHeight = windowHeight , showGraph = showGraph , mouseX = mouseX , mouseY = mouseY , arrowX = arrowX , arrowY = arrowY , openFilePath = openFilePath , fileBrowser = fileBrowser , fileBrowserIdx = fileBrowserIdx , r = r , g = g , b = b , num = num } end fun addTriangle (app: app_type, x1, y1, x2, y2, x3, y3, newUndoHd, arrowX, arrowY) : app_type = let val { mode , triangles , triangleStage = _ , numClickPointsX , numClickPointsY , xClickPoints , yClickPoints , windowWidth , windowHeight , undo , redo = _ , showGraph , mouseX , mouseY , arrowX = _ , arrowY = _ , openFilePath , fileBrowser , fileBrowserIdx , r , g , b , num } = app val newTriangle = { x1 = x1 , y1 = y1 , x2 = x2 , y2 = y2 , x3 = x3 , y3 = y3 , r = r , g = g , b = b } val newTriangles = newTriangle :: triangles val newUndo = newUndoHd :: undo in { mode = mode , triangleStage = NO_TRIANGLE , triangles = newTriangles , undo = newUndo , redo = [] , numClickPointsX = numClickPointsX , numClickPointsY = numClickPointsY , xClickPoints = xClickPoints , yClickPoints = yClickPoints , windowWidth = windowWidth , windowHeight = windowHeight , showGraph = showGraph , mouseX = mouseX , mouseY = mouseY , arrowX = arrowX , arrowY = arrowY , openFilePath = openFilePath , fileBrowser = fileBrowser , fileBrowserIdx = fileBrowserIdx , r = r , g = g , b = b , num = num } end fun arrowX (app: app_type, arrowX) = let val { mode , xClickPoints , yClickPoints , numClickPointsX , numClickPointsY , windowWidth , windowHeight , triangles , triangleStage , undo , redo , showGraph , mouseX , mouseY , arrowX = _ , arrowY , openFilePath , fileBrowser , fileBrowserIdx , r , g , b , num } = app in { mode = mode , xClickPoints = xClickPoints , yClickPoints = yClickPoints , numClickPointsX = numClickPointsX , numClickPointsY = numClickPointsY , triangles = triangles , triangleStage = triangleStage , windowWidth = windowWidth , windowHeight = windowHeight , undo = undo , redo = redo , showGraph = showGraph , mouseX = mouseX , mouseY = mouseY , arrowX = arrowX , arrowY = arrowY , openFilePath = openFilePath , fileBrowser = fileBrowser , fileBrowserIdx = fileBrowserIdx , r = r , g = g , b = b , num = num } end fun arrowY (app: app_type, arrowY) = let val { mode , xClickPoints , yClickPoints , numClickPointsX , numClickPointsY , windowWidth , windowHeight , triangles , triangleStage , undo , redo , showGraph , mouseX , mouseY , arrowX , arrowY = _ , openFilePath , fileBrowser , fileBrowserIdx , r , g , b , num } = app in { mode = mode , xClickPoints = xClickPoints , yClickPoints = yClickPoints , numClickPointsX = numClickPointsX , numClickPointsY = numClickPointsY , triangles = triangles , triangleStage = triangleStage , windowWidth = windowWidth , windowHeight = windowHeight , undo = undo , redo = redo , showGraph = showGraph , mouseX = mouseX , mouseY = mouseY , arrowX = arrowX , arrowY = arrowY , openFilePath = openFilePath , fileBrowser = fileBrowser , fileBrowserIdx = fileBrowserIdx , r = r , g = g , b = b , num = num } end fun helpWindowResize (app: app_type, windowWidth, windowHeight, wStart, wFinish, hStart, hFinish) : app_type = let val { mode , xClickPoints = _ , yClickPoints = _ , numClickPointsX , numClickPointsY , windowWidth = _ , windowHeight = _ , triangles , triangleStage , undo , redo , showGraph , mouseX , mouseY , arrowX , arrowY , openFilePath , fileBrowser , fileBrowserIdx , r , g , b , num } = app val xClickPoints = ClickPoints.generate (wStart, wFinish, numClickPointsX) val yClickPoints = ClickPoints.generate (hStart, hFinish, numClickPointsY) in { mode = mode , xClickPoints = xClickPoints , yClickPoints = yClickPoints , numClickPointsX = numClickPointsX , numClickPointsY = numClickPointsY , triangles = triangles , triangleStage = triangleStage , windowWidth = windowWidth , windowHeight = windowHeight , undo = undo , redo = redo , showGraph = showGraph , mouseX = mouseX , mouseY = mouseY , arrowX = arrowX , arrowY = arrowY , openFilePath = openFilePath , fileBrowser = fileBrowser , fileBrowserIdx = fileBrowserIdx , r = r , g = g , b = b , num = num } end fun windowResize (app: app_type, windowWidth, windowHeight) = if windowWidth = windowHeight then helpWindowResize (app, windowWidth, windowHeight, 0, windowWidth, 0, windowHeight) else if windowWidth > windowHeight then let val difference = windowWidth - windowHeight val wStart = difference div 2 val wFinish = wStart + windowHeight in helpWindowResize (app, windowWidth, windowHeight, wStart, wFinish, 0, windowHeight) end else let val difference = windowHeight - windowWidth val hStart = difference div 2 val hFinish = hStart + windowWidth in helpWindowResize (app, windowWidth, windowHeight, 0, windowWidth, hStart, hFinish) end fun mousePosition (app: app_type, mouseX, mouseY) = let val { mode , mouseX = _ , mouseY = _ , triangles , triangleStage , numClickPointsX , numClickPointsY , xClickPoints , yClickPoints , windowWidth , windowHeight , undo , redo , showGraph , arrowX , arrowY , openFilePath , fileBrowser , fileBrowserIdx , r , g , b , num } = app in { mode = mode , mouseX = mouseX , mouseY = mouseY , triangles = triangles , triangleStage = triangleStage , numClickPointsX = numClickPointsX , numClickPointsY = numClickPointsY , xClickPoints = xClickPoints , yClickPoints = yClickPoints , windowWidth = windowWidth , windowHeight = windowHeight , undo = undo , redo = redo , showGraph = showGraph , arrowX = arrowX , arrowY = arrowY , openFilePath = openFilePath , fileBrowser = fileBrowser , fileBrowserIdx = fileBrowserIdx , r = r , g = g , b = b , num = num } end (* add to redo, pop one from undo *) fun undo (app: app_type, newTriangleStage, newTriangles, newRedoHd) = let val { mode , triangleStage = _ , triangles = _ , numClickPointsX , numClickPointsY , xClickPoints , yClickPoints , windowWidth , windowHeight , undo , redo , showGraph , mouseX , mouseY , arrowX , arrowY , openFilePath , fileBrowser , fileBrowserIdx , r , g , b , num } = app val newUndo = case undo of hd :: tl => tl | empty => empty val newRedo = newRedoHd :: redo in { mode = mode , triangleStage = newTriangleStage , triangles = newTriangles , undo = newUndo , redo = newRedo , numClickPointsX = numClickPointsX , numClickPointsY = numClickPointsY , xClickPoints = xClickPoints , yClickPoints = yClickPoints , windowWidth = windowWidth , windowHeight = windowHeight , showGraph = showGraph , mouseX = mouseX , mouseY = mouseY , arrowX = arrowX , arrowY = arrowY , openFilePath = openFilePath , fileBrowser = fileBrowser , fileBrowserIdx = fileBrowserIdx , r = r , g = g , b = b , num = num } end (* add to undo, pop one from redo *) fun redo (app: app_type, newTriangleStage, newTriangles, newUndoHd) = let val { mode , triangleStage = _ , triangles = _ , numClickPointsX , numClickPointsY , xClickPoints , yClickPoints , windowWidth , windowHeight , undo , redo , showGraph , mouseX , mouseY , arrowX , arrowY , openFilePath , fileBrowser , fileBrowserIdx , r , g , b , num } = app val newUndo = newUndoHd :: undo val newRedo = case redo of hd :: tl => tl | empty => empty in { mode = mode , triangleStage = newTriangleStage , triangles = newTriangles , undo = newUndo , redo = newRedo , numClickPointsX = numClickPointsX , numClickPointsY = numClickPointsY , xClickPoints = xClickPoints , yClickPoints = yClickPoints , windowWidth = windowWidth , windowHeight = windowHeight , showGraph = showGraph , mouseX = mouseX , mouseY = mouseY , arrowX = arrowX , arrowY = arrowY , openFilePath = openFilePath , fileBrowser = fileBrowser , fileBrowserIdx = fileBrowserIdx , r = r , g = g , b = b , num = num } end fun graphVisibility (app: app_type, shouldShowGraph) = let val { mode , triangleStage , triangles , numClickPointsX , numClickPointsY , xClickPoints , yClickPoints , windowWidth , windowHeight , undo , redo , mouseX , mouseY , arrowX , arrowY , showGraph = _ , openFilePath , fileBrowser , fileBrowserIdx , r , g , b , num } = app in { mode = mode , showGraph = shouldShowGraph , triangleStage = triangleStage , triangles = triangles , undo = undo , redo = redo , numClickPointsX = numClickPointsX , numClickPointsY = numClickPointsY , xClickPoints = xClickPoints , yClickPoints = yClickPoints , windowWidth = windowWidth , windowHeight = windowHeight , mouseX = mouseX , mouseY = mouseY , arrowX = arrowX , arrowY = arrowY , openFilePath = openFilePath , fileBrowser = fileBrowser , fileBrowserIdx = fileBrowserIdx , r = r , g = g , b = b , num = num } end fun mode (app: app_type, newMode) = let val { mode = _ , triangleStage , triangles , numClickPointsX , numClickPointsY , xClickPoints , yClickPoints , windowWidth , windowHeight , undo , redo , mouseX , mouseY , arrowX , arrowY , showGraph , openFilePath , fileBrowser , fileBrowserIdx , r , g , b , num } = app in { mode = newMode , showGraph = showGraph , triangleStage = triangleStage , triangles = triangles , undo = undo , redo = redo , numClickPointsX = numClickPointsX , numClickPointsY = numClickPointsY , xClickPoints = xClickPoints , yClickPoints = yClickPoints , windowWidth = windowWidth , windowHeight = windowHeight , mouseX = mouseX , mouseY = mouseY , arrowX = arrowX , arrowY = arrowY , openFilePath = openFilePath , fileBrowser = fileBrowser , fileBrowserIdx = fileBrowserIdx , r = r , g = g , b = b , num = num } end fun useTrianglesAndSetNormalMode (app: app_type, triangles) = let val { mode = _ , xClickPoints , yClickPoints , numClickPointsX , numClickPointsY , windowWidth , windowHeight , undo , redo , showGraph , mouseX , mouseY , arrowX , arrowY , triangles = _ , triangleStage = _ , openFilePath , fileBrowser , fileBrowserIdx , r , g , b , num } = app val triangleStage = NO_TRIANGLE in { mode = AppType.NORMAL_MODE , triangleStage = triangleStage , triangles = triangles , undo = [] , redo = [] , showGraph = showGraph , numClickPointsX = numClickPointsX , numClickPointsY = numClickPointsY , xClickPoints = xClickPoints , yClickPoints = yClickPoints , windowWidth = windowWidth , windowHeight = windowHeight , mouseX = mouseX , mouseY = mouseY , arrowX = arrowX , arrowY = arrowY , openFilePath = openFilePath , fileBrowser = fileBrowser , fileBrowserIdx = fileBrowserIdx , r = r , g = g , b = b , num = num } end fun fileBrowserAndPath (app: app_type, fileBrowser, path) = let val { mode , xClickPoints , yClickPoints , numClickPointsX , numClickPointsY , windowWidth , windowHeight , triangles , triangleStage , undo , redo , showGraph , mouseX , mouseY , arrowX , arrowY , openFilePath = _ , fileBrowser = _ , fileBrowserIdx = _ , r , g , b , num } = app in { mode = mode , xClickPoints = xClickPoints , yClickPoints = yClickPoints , numClickPointsX = numClickPointsX , numClickPointsY = numClickPointsY , triangles = triangles , triangleStage = triangleStage , windowWidth = windowWidth , windowHeight = windowHeight , undo = undo , redo = redo , showGraph = showGraph , mouseX = mouseX , mouseY = mouseY , arrowX = arrowX , arrowY = arrowY , openFilePath = path , fileBrowser = fileBrowser , fileBrowserIdx = 0 , r = r , g = g , b = b , num = num } end fun fileBrowserIdx (app: app_type, newFileBrowserIdx) = let val { mode , xClickPoints , yClickPoints , numClickPointsX , numClickPointsY , windowWidth , windowHeight , triangles , triangleStage , undo , redo , showGraph , mouseX , mouseY , arrowX , arrowY , openFilePath = openFilePath , fileBrowser = fileBrowser , fileBrowserIdx = _ , r , g , b , num } = app in { mode = mode , xClickPoints = xClickPoints , yClickPoints = yClickPoints , numClickPointsX = numClickPointsX , numClickPointsY = numClickPointsY , triangles = triangles , triangleStage = triangleStage , windowWidth = windowWidth , windowHeight = windowHeight , undo = undo , redo = redo , showGraph = showGraph , mouseX = mouseX , mouseY = mouseY , arrowX = arrowX , arrowY = arrowY , openFilePath = openFilePath , fileBrowser = fileBrowser , fileBrowserIdx = newFileBrowserIdx , r = r , g = g , b = b , num = num } end fun num (app: app_type, newNum) : app_type = let val { triangleStage , mode , triangles , numClickPointsX , numClickPointsY , xClickPoints , yClickPoints , windowWidth , windowHeight , undo , redo , showGraph , mouseX , mouseY , arrowX , arrowY , openFilePath , fileBrowser , fileBrowserIdx , r , g , b , num = _ } = app in { triangleStage = triangleStage , undo = undo , redo = [] , mode = mode , triangles = triangles , numClickPointsX = numClickPointsX , numClickPointsY = numClickPointsY , xClickPoints = xClickPoints , yClickPoints = yClickPoints , windowWidth = windowWidth , windowHeight = windowHeight , showGraph = showGraph , mouseX = mouseX , mouseY = mouseY , arrowX = arrowX , arrowY = arrowY , openFilePath = openFilePath , fileBrowser = fileBrowser , fileBrowserIdx = fileBrowserIdx , r = r , g = g , b = b , num = newNum } end fun r (app: app_type) : app_type = let val { triangleStage , mode , triangles , numClickPointsX , numClickPointsY , xClickPoints , yClickPoints , windowWidth , windowHeight , undo , redo , showGraph , mouseX , mouseY , arrowX , arrowY , openFilePath , fileBrowser , fileBrowserIdx , r = _ , g , b , num } = app val newR = Real32.fromInt num / 255.0 in { triangleStage = triangleStage , undo = undo , redo = [] , mode = mode , triangles = triangles , numClickPointsX = numClickPointsX , numClickPointsY = numClickPointsY , xClickPoints = xClickPoints , yClickPoints = yClickPoints , windowWidth = windowWidth , windowHeight = windowHeight , showGraph = showGraph , mouseX = mouseX , mouseY = mouseY , arrowX = arrowX , arrowY = arrowY , openFilePath = openFilePath , fileBrowser = fileBrowser , fileBrowserIdx = fileBrowserIdx , r = newR , g = g , b = b , num = 0 } end fun g (app: app_type) : app_type = let val { triangleStage , mode , triangles , numClickPointsX , numClickPointsY , xClickPoints , yClickPoints , windowWidth , windowHeight , undo , redo , showGraph , mouseX , mouseY , arrowX , arrowY , openFilePath , fileBrowser , fileBrowserIdx , r , g = _ , b , num } = app val newG = Real32.fromInt num / 255.0 in { triangleStage = triangleStage , undo = undo , redo = [] , mode = mode , triangles = triangles , numClickPointsX = numClickPointsX , numClickPointsY = numClickPointsY , xClickPoints = xClickPoints , yClickPoints = yClickPoints , windowWidth = windowWidth , windowHeight = windowHeight , showGraph = showGraph , mouseX = mouseX , mouseY = mouseY , arrowX = arrowX , arrowY = arrowY , openFilePath = openFilePath , fileBrowser = fileBrowser , fileBrowserIdx = fileBrowserIdx , r = r , g = newG , b = b , num = 0 } end fun b (app: app_type) : app_type = let val { triangleStage , mode , triangles , numClickPointsX , numClickPointsY , xClickPoints , yClickPoints , windowWidth , windowHeight , undo , redo , showGraph , mouseX , mouseY , arrowX , arrowY , openFilePath , fileBrowser , fileBrowserIdx , r , g , b = _ , num } = app val newB = Real32.fromInt num / 255.0 in { triangleStage = triangleStage , undo = undo , redo = [] , mode = mode , triangles = triangles , numClickPointsX = numClickPointsX , numClickPointsY = numClickPointsY , xClickPoints = xClickPoints , yClickPoints = yClickPoints , windowWidth = windowWidth , windowHeight = windowHeight , showGraph = showGraph , mouseX = mouseX , mouseY = mouseY , arrowX = arrowX , arrowY = arrowY , openFilePath = openFilePath , fileBrowser = fileBrowser , fileBrowserIdx = fileBrowserIdx , r = r , g = g , b = newB , num = 0 } end end