-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.js
More file actions
249 lines (205 loc) · 8.24 KB
/
Copy pathmain.js
File metadata and controls
249 lines (205 loc) · 8.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
const ppro = require("premierepro");
const { localFileSystem: fs } = require("uxp").storage;
const { shell } = require("uxp");
let currentFolder = null;
let selectedFileEntry = null;
let isDebugEnabled = false;
// Interception de la console
const originalLog = console.log;
const originalWarn = console.warn;
const originalError = console.error;
function printToVisualConsole(type, args) {
if (!isDebugEnabled) return;
const consoleDiv = document.getElementById("debug-console");
if (!consoleDiv) return;
// Convertit les objets et les erreurs en texte lisible
const msg = Array.from(args).map(arg => {
if (arg instanceof Error) {
return arg.stack || arg.message; // Récupère le texte de l'erreur au lieu de {}
}
return typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg);
}).join(" ");
const line = document.createElement("div");
line.className = `log-line log-${type}`;
line.textContent = msg;
consoleDiv.appendChild(line);
consoleDiv.scrollTop = consoleDiv.scrollHeight; // Scroll automatique vers le bas
}
console.log = function(...args) { originalLog.apply(console, args); printToVisualConsole("info", args); };
console.warn = function(...args) { originalWarn.apply(console, args); printToVisualConsole("warn", args); };
console.error = function(...args) { originalError.apply(console, args); printToVisualConsole("error", args); };
// S'exécute quand l'interface est chargée
document.addEventListener("DOMContentLoaded", async () => {
// --- Gestion du Debug ---
const cbDebug = document.getElementById("cb-debug");
isDebugEnabled = localStorage.getItem("debugConsole") === "true";
cbDebug.checked = isDebugEnabled;
cbDebug.addEventListener("change", (e) => {
isDebugEnabled = e.target.checked;
localStorage.setItem("debugConsole", isDebugEnabled);
updateConsoleVisibility();
});
// Associer les clics aux boutons
document.getElementById("btn-settings").addEventListener("click", toggleViews);
document.getElementById("btn-browse").addEventListener("click", selectFolder);
document.getElementById("btn-refresh").addEventListener("click", refreshList);
document.getElementById("btn-run").addEventListener("click", runSelectedScript);
// --- Événement pour le lien externe ---
document.getElementById("link-free-scripts").addEventListener("click", (e) => {
e.preventDefault(); // Empêche le comportement HTML par défaut
shell.openExternal("https://example.com"); // <-- Modifie l'URL ici plus tard !
});
// Gestion du thème sombre/clair dynamique
const currentTheme = document.theme.getCurrent();
updateTheme(currentTheme);
document.theme.onUpdated.addListener(updateTheme);
// Au démarrage, on essaie de recharger le dossier sauvegardé
await loadSavedFolder();
});
// --- NAVIGATION ---
function toggleViews() {
const viewMain = document.getElementById("view-main");
const viewSettings = document.getElementById("view-settings");
// Bascule simple de la classe "active"
if (viewMain.classList.contains("active")) {
viewMain.classList.remove("active");
viewSettings.classList.add("active");
} else {
viewSettings.classList.remove("active");
viewMain.classList.add("active");
}
}
// --- LOGIQUE DE DOSSIER ---
async function selectFolder() {
try {
const folder = await fs.getFolder();
if (folder) {
currentFolder = folder;
// Création d'un token pour mémoriser l'accès au dossier et sauvegarde
const token = await fs.createPersistentToken(folder);
localStorage.setItem("scriptFolderToken", token);
document.getElementById("folder-path").value = folder.nativePath;
await refreshList();
}
} catch (err) {
console.error("Erreur lors de la sélection :", err);
}
}
async function loadSavedFolder() {
const token = localStorage.getItem("scriptFolderToken");
if (token) {
try {
// Tente de récupérer le dossier via le token sauvegardé
currentFolder = await fs.getEntryForPersistentToken(token);
if (currentFolder) {
document.getElementById("folder-path").value = currentFolder.nativePath;
await refreshList(); // Charge les fichiers automatiquement
}
} catch (err) {
console.warn("Le dossier sauvegardé n'existe plus ou a été déplacé.");
localStorage.removeItem("scriptFolderToken");
}
}
}
async function refreshList() {
if (!currentFolder) return;
const noFolderMsg = document.getElementById("no-folder-msg");
const listContainer = document.getElementById("list-container");
const mainActions = document.getElementById("main-actions");
const scriptList = document.getElementById("script-list");
updateConsoleVisibility();
// On vide la liste actuelle et la sélection
scriptList.innerHTML = "";
selectedFileEntry = null;
try {
const entries = await currentFolder.getEntries();
// Filtrer uniquement les fichiers .jsx (ou .js)
const scripts = entries.filter(entry =>
entry.isFile && (entry.name.endsWith(".jsx") || entry.name.endsWith(".js"))
);
// --- NOUVEAU : Si le dossier est vide ou sans .jsx ---
if (scripts.length === 0) {
noFolderMsg.classList.remove("hidden");
listContainer.classList.add("hidden");
mainActions.classList.add("hidden");
return; // On arrête l'exécution ici
}
// --- Sinon, on affiche la liste et on cache le message ---
noFolderMsg.classList.add("hidden");
listContainer.classList.remove("hidden");
mainActions.classList.remove("hidden");
scripts.forEach(fileEntry => {
const li = document.createElement("li");
// 1. Création de l'icône
const icon = document.createElement("img");
icon.src = "./icons/jsxfile.png";
icon.className = "uxp-icon"; // Utilise ta classe existante (16x16)
// 2. Création du texte
const textSpan = document.createElement("span");
textSpan.textContent = fileEntry.name;
// 3. Ajout de l'icône puis du texte dans la ligne (li)
li.appendChild(icon);
li.appendChild(textSpan);
// Clic simple : Sélectionner
li.addEventListener("click", () => {
// Enlève la classe "selected" de tous les autres
Array.from(scriptList.children).forEach(child => child.classList.remove("selected"));
li.classList.add("selected");
selectedFileEntry = fileEntry;
});
// Double-clic : Sélectionner ET exécuter
li.addEventListener("dblclick", () => {
Array.from(scriptList.children).forEach(child => child.classList.remove("selected"));
li.classList.add("selected");
selectedFileEntry = fileEntry;
runSelectedScript();
});
scriptList.appendChild(li);
});
} catch (err) {
console.error("Erreur de lecture du dossier :", err);
}
}
// --- EXÉCUTION DU SCRIPT ---
async function runSelectedScript() {
if (!selectedFileEntry) {
alert("Veuillez sélectionner un script avant de l'exécuter.");
return;
}
if (isDebugEnabled) {
document.getElementById("debug-console").innerHTML = ""; // Vide la console
console.log(`--- Démarrage de ${selectedFileEntry.name} ---`);
}
try {
const content = await selectedFileEntry.read();
// Créer la fonction dynamique
const AsyncFunction = Object.getPrototypeOf(async function(){}).constructor;
const executeScript = new AsyncFunction("require", "ppro", content);
// Exécution
await executeScript(require, ppro);
} catch (err) {
// Affiche l'erreur ET la ligne précise dans une vraie boîte de dialogue native !
console.error(err);
alert("❌ ERREUR DANS LE SCRIPT :\n\n" + (err.stack || err.message));
}
}
// --- THÈME (Optionnel mais joli) ---
function updateTheme(theme) {
const body = document.body;
if (theme && theme.includes("dark")) {
body.style.color = "#fff";
body.style.backgroundColor = "#232323";
} else {
body.style.color = "#000";
body.style.backgroundColor = "#F5F5F5";
}
}
function updateConsoleVisibility() {
const container = document.getElementById("debug-console-container");
// Ne s'affiche que si un dossier est chargé ET que le debug est coché
if (isDebugEnabled && currentFolder) {
container.classList.remove("hidden");
} else {
container.classList.add("hidden");
}
}