From fa5611d2859343fb72be5ade9b7d6ff519a31d5f Mon Sep 17 00:00:00 2001 From: jschanker Date: Wed, 15 Jan 2025 20:48:58 -0800 Subject: [PATCH] feat: Save blocks and workspace options for loading --- core/course_instruction_task_flow.js | 32 +++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/core/course_instruction_task_flow.js b/core/course_instruction_task_flow.js index cc9bf0c..3461b42 100644 --- a/core/course_instruction_task_flow.js +++ b/core/course_instruction_task_flow.js @@ -38,6 +38,28 @@ class CourseInstructionTaskFlow { const storedStageKey = id != null ? id + "," + levelIndex : null; const storedStage = storedStageKey ? localStorage.getItem(storedStageKey) : 0; if (storedStage && confirm('Would you like to resume from the task you last completed?')) { + const storedOptions = localStorage.getItem(storedStageKey + ",options"); + const storedBlocksText = localStorage.getItem(storedStageKey + ",blocks"); + try { + const workspace = Blockly.getMainWorkspace(); + workspace.updateToolbox(); + workspace.render(); + if (storedOptions) { + workspace.options = new Blockly.Options(JSON.stringify(storedOptions)); + } + } catch (e) { + console.error("Error while constructing options during load:", e); + } + try { + const workspace = Blockly?.getMainWorkspace(); + if (storedBlocks) { + workspace.clear(); + xmlDom && Blockly.Xml.domToWorkspace(Blockly.Xml.textToDom(storedBlockText), workspace); + workspace.render(); + } + } catch (e) { + console.error("Error while loading workspace blocks:", e); + } currentStage = Math.max(parseInt(storedStage), 0); } let lastTime = 0; @@ -52,7 +74,15 @@ class CourseInstructionTaskFlow { this.tasks_[currentStage].finish(); ++currentStage; if(currentStage < this.tasks_.length) { - if(storedStageKey) localStorage.setItem(storedStageKey, currentStage); + if(storedStageKey) { + localStorage.setItem(storedStageKey, currentStage); + try { + localStorage.setItem(storedStageKey + ",options", JSON.stringify(Blockly.getMainWorkspace().options)); + localStorage.setItem(storedStageKey + ",blocks", Blockly.Xml.domToPrettyText(Blockly.Xml.workspaceToDom(Blockly.getMainWorkspace()))); + } catch (e) { + console.error("Error saving current state", e); + } + } this.tasks_[currentStage].startDirections(); } lastTime = ms;