Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 23 additions & 2 deletions Browser_IDE/IDEStartupMain.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,15 @@ let CompileQueue = new ActionQueue("CompileQueue", {
cancelOn: [InitializeProjectQueue],
});

// add loadUserProject!!!!!!!!!!!!!!!!
let LoadUserProjectQueue = new ActionQueue("LoadUserProjectQueue", {
cancelRunning: false,
replaceQueued: false,
maxQueued: 100,
waitOn: [ExecutionEnvironmentLoadQueue, InitializeProjectQueue],
cancelOn: [InitializeProjectQueue, ExecutionEnvironmentLoadQueue],
});

// Whenever both execution environment and load project queue clear, mirror the project
ActionQueue.OnClear([ExecutionEnvironmentLoadQueue, InitializeProjectQueue], async function(){
MirrorProjectQueue.Schedule("Mirror", async function(){
Expand Down Expand Up @@ -98,10 +107,18 @@ async function StartIDE() {
setupIDEButtonEvents(); // uses current language

// Create execution environment and project storage objects
// These constructors don't _do_ anything important.
executionEnviroment = new ExecutionEnvironment(document.getElementById("ExecutionEnvironment"), activeLanguageSetup);
appStorage = new AppStorage();
storedProject = new IDBStoredProject(appStorage, activeLanguageSetup.getDefaultProject());

// Check if projectID exists in URL, if so, load that project
let projectID = SKO.projectID;
if (projectID) {
storedProject = new IDBStoredProject(appStorage, projectID); // Use project ID if available
}
else {
storedProject = new IDBStoredProject(appStorage, activeLanguageSetup.getDefaultProject()); // Default project
}

unifiedFS = new UnifiedFS(storedProject, executionEnviroment);

// Setup callbacks/listeners
Expand All @@ -116,6 +133,10 @@ async function StartIDE() {
setupMinifiedInterface();
});

// use LoadUserProjectQueue to load user projects!!!!!!!!!
LoadUserProjectQueue.Schedule("LoadUserProjects", async function() {
await ShowProjectLoader("Choose a project to load:", loadUserProjects);
});

CompilerInitQueue.Schedule("CompilerInit", async function CompilerInitQueue (isCanceled){
await initializeLanguageCompilerFiles(activeLanguageSetup);
Expand Down
3 changes: 2 additions & 1 deletion Browser_IDE/editorMain.js
Original file line number Diff line number Diff line change
Expand Up @@ -906,7 +906,8 @@ function setupIDEButtonEvents() {
setupProjectButton("DownloadProject", downloadProject);
setupProjectButton("NewProject", () => scheduleProjectReInitialization(activeLanguageSetup.getDefaultProject()));
setupProjectButton("LoadDemo", () => ShowProjectLoader("Choose a demo project:", LoadDemoProjects));

// Add the new "Load Project" button and its event!!!!!!!!!!!!!!!!
setupProjectButton("LoadProject", () => ShowProjectLoader("Choose a project to load:", loadUserProjects));
if (!activeLanguageSetup.supportHotReloading) document.getElementById("runOne").children[0].innerText = "Syntax Check File";
}

Expand Down
1 change: 1 addition & 0 deletions Browser_IDE/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
<li><button id="UploadProject">Import Project</button></li>
<span style="border-left:#404040 1px solid;"></span>
<li><button id="LoadDemo">Load Demo</button></li>
<li><button id="LoadProject">Load Project</button></li>
</ul>
<ul class="sk-menu">
<li>
Expand Down
91 changes: 87 additions & 4 deletions Browser_IDE/projectLoadUI.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
"use strict";


async function ShowProjectLoader(title, getChoices){
let closeButton = elem('button', {type:"button"}, [elem('i', {class: "bi bi-x-lg"}, [])]);

Expand Down Expand Up @@ -65,10 +64,11 @@ async function ShowProjectLoader(title, getChoices){
if (activeLanguage.name != item["language"])
displayEditorNotification("Switching language to " + item["language"] + "<br>Page will reload.", NotificationIcons.INFO);

let reroutedURL = await rerouteURL(item["file"]);
// wait until the project has loaded, only then switch language if needed
await loadProjectFromURL(await rerouteURL(item["file"]));

scheduleLoadProjectFromURL(reroutedURL);
schedulePotentialLanguageSwitch(item["language"]);
if (activeLanguage.name != item["language"])
switchActiveLanguage(item["language"]);
});
}
gridContainer.appendChild(set);
Expand All @@ -87,3 +87,86 @@ function LoadDemoProjects(){
return json;
});
}

//!!!!!!!!!!!!!!!!
async function loadUserProjects() {
return new Promise((resolve, reject) => {
// Open the database
let dbRequest = indexedDB.open('SplashkitOnline', 1);

dbRequest.onupgradeneeded = function(event) {
let db = event.target.result;
// Create the 'userProjects' object store if it doesn't exist
if (!db.objectStoreNames.contains('userProjects')) {
db.createObjectStore('userProjects', { keyPath: 'id', autoIncrement: true });
}
};

dbRequest.onsuccess = function(event) {
let db = event.target.result;
let transaction = db.transaction(['userProjects'], 'readonly');
let objectStore = transaction.objectStore('userProjects');

// Get all projects
let getRequest = objectStore.getAll();

getRequest.onsuccess = function() {
// Convert to display format
let userProjects = getRequest.result.map(project => ({
title: project.name, // project name
language: project.language || "Unknown", // default language
file: project.filePath || "", // file path
thumbnail: project.thumbnail || "" // thumbnail
}));
resolve(userProjects);
};

getRequest.onerror = function() {
reject('Failed to load user project data');
};
};

dbRequest.onerror = function() {
reject('Failed to open IndexedDB');
};
});
}

//!!!!!!!!!!!!!!!!
async function ShowProjectLoader(title, getChoices) {
let closeButton = elem('button', {type:"button"}, [elem('i', {class: "bi bi-x-lg"}, [])]);

let loadingText = elem('div', {class: "sk-demo-window-loading-text", id:"DemoChooserLoader", style:{'position':'absolute'}}, [
elem('h2', {style:{'text-align':'center'}}, ["Loading..."])
]);

let mainRows = elem('div', {class: "sk-column"}, [
elem('div', {class: "sk-header sk-header-indent"}, [
elem('div', {class: "flex-column"}, [title]),
elem('div', {class: "flex-column"}, [closeButton]),
]),
loadingText,
]);

let loaderWindow = elem('div', {class: "sk-main-columns sk-demo-window-container fade-on-create"}, [
elem('div', {class: "sk-notification sk-notification-body sk-contents sk-contents-focusable sk-demo-window", tabindex: "10"}, [
mainRows,
]),
]);

closeButton.addEventListener('click', function() {
removeFadeOut(loaderWindow, 200);
});

// Show the window
document.body.appendChild(loaderWindow);

try {
let choices = await getChoices();
console.log(choices);
removeFadeOut(loadingText, 200);
} catch(e) {
console.error("Failed to load project data:", e);
loadingText.childNodes[0].innerText = "Failed to load project list, sorry!";
}
}
1 change: 1 addition & 0 deletions Browser_IDE/splashKitOnlineEnvParams.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,6 @@ let SKO = (function(){
useCompressedBinaries: getEnvParam("useCompressedBinaries", "on", true) == "on",
useMinifiedInterface: getEnvParam("useMinifiedInterface") == "on",
isPRPreview: getEnvParam("isPRPreview", isPreview ? "on" : "off") == "on",
projectID: getEnvParam("projectID", null, true) // add projectID
};
})();
Loading