|
|
|
@ -110,7 +110,10 @@ |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
|
|
|
|
<button type="submit" id="generate-btn">Generate</button> |
|
|
|
<div class="button-row"> |
|
|
|
|
|
|
|
<button type="submit" id="generate-btn">Generate</button> |
|
|
|
|
|
|
|
<button type="button" id="stop-btn" style="display: none;">Stop</button> |
|
|
|
|
|
|
|
</div> |
|
|
|
</form> |
|
|
|
</form> |
|
|
|
|
|
|
|
|
|
|
|
<div class="settings-buttons"> |
|
|
|
<div class="settings-buttons"> |
|
|
|
@ -151,6 +154,7 @@ |
|
|
|
|
|
|
|
|
|
|
|
const form = document.getElementById('generate-form'); |
|
|
|
const form = document.getElementById('generate-form'); |
|
|
|
const generateBtn = document.getElementById('generate-btn'); |
|
|
|
const generateBtn = document.getElementById('generate-btn'); |
|
|
|
|
|
|
|
const stopBtn = document.getElementById('stop-btn'); |
|
|
|
const statusDiv = document.getElementById('status'); |
|
|
|
const statusDiv = document.getElementById('status'); |
|
|
|
const statusText = document.getElementById('status-text'); |
|
|
|
const statusText = document.getElementById('status-text'); |
|
|
|
const progressContainer = document.getElementById('progress-container'); |
|
|
|
const progressContainer = document.getElementById('progress-container'); |
|
|
|
@ -167,6 +171,8 @@ |
|
|
|
let timePerImage = null; |
|
|
|
let timePerImage = null; |
|
|
|
let progressInterval = null; |
|
|
|
let progressInterval = null; |
|
|
|
let imageStartTime = null; |
|
|
|
let imageStartTime = null; |
|
|
|
|
|
|
|
let isGenerating = false; |
|
|
|
|
|
|
|
let abortController = null; |
|
|
|
|
|
|
|
|
|
|
|
const incrementSeedCheckbox = document.getElementById('increment-seed'); |
|
|
|
const incrementSeedCheckbox = document.getElementById('increment-seed'); |
|
|
|
const varyGuidanceCheckbox = document.getElementById('vary-guidance'); |
|
|
|
const varyGuidanceCheckbox = document.getElementById('vary-guidance'); |
|
|
|
@ -428,6 +434,19 @@ |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
stopBtn.addEventListener('click', async () => { |
|
|
|
|
|
|
|
stopBtn.disabled = true; |
|
|
|
|
|
|
|
stopBtn.textContent = 'Stopping...'; |
|
|
|
|
|
|
|
try { |
|
|
|
|
|
|
|
await fetch('/stop', { method: 'POST' }); |
|
|
|
|
|
|
|
if (abortController) { |
|
|
|
|
|
|
|
abortController.abort(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} catch (e) { |
|
|
|
|
|
|
|
console.error('Failed to stop:', e); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
form.addEventListener('submit', async (e) => { |
|
|
|
form.addEventListener('submit', async (e) => { |
|
|
|
e.preventDefault(); |
|
|
|
e.preventDefault(); |
|
|
|
|
|
|
|
|
|
|
|
@ -437,8 +456,13 @@ |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
isGenerating = true; |
|
|
|
|
|
|
|
abortController = new AbortController(); |
|
|
|
generateBtn.disabled = true; |
|
|
|
generateBtn.disabled = true; |
|
|
|
generateBtn.textContent = 'Generating...'; |
|
|
|
generateBtn.textContent = 'Generating...'; |
|
|
|
|
|
|
|
stopBtn.style.display = 'inline-block'; |
|
|
|
|
|
|
|
stopBtn.disabled = false; |
|
|
|
|
|
|
|
stopBtn.textContent = 'Stop'; |
|
|
|
results.innerHTML = ''; |
|
|
|
results.innerHTML = ''; |
|
|
|
showProgress(true); |
|
|
|
showProgress(true); |
|
|
|
|
|
|
|
|
|
|
|
@ -485,7 +509,8 @@ |
|
|
|
headers: { |
|
|
|
headers: { |
|
|
|
'Content-Type': 'application/json' |
|
|
|
'Content-Type': 'application/json' |
|
|
|
}, |
|
|
|
}, |
|
|
|
body: JSON.stringify(data) |
|
|
|
body: JSON.stringify(data), |
|
|
|
|
|
|
|
signal: abortController.signal |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
const reader = response.body.getReader(); |
|
|
|
const reader = response.body.getReader(); |
|
|
|
@ -542,12 +567,19 @@ |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} catch (error) { |
|
|
|
} catch (error) { |
|
|
|
setStatus('Error: ' + error.message, 'error'); |
|
|
|
if (error.name === 'AbortError') { |
|
|
|
|
|
|
|
setStatus(imageCount > 0 ? `Stopped after ${imageCount} image(s)` : 'Generation stopped', 'success'); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
setStatus('Error: ' + error.message, 'error'); |
|
|
|
|
|
|
|
} |
|
|
|
stopProgressTimer(); |
|
|
|
stopProgressTimer(); |
|
|
|
showProgress(false); |
|
|
|
showProgress(false); |
|
|
|
} finally { |
|
|
|
} finally { |
|
|
|
|
|
|
|
isGenerating = false; |
|
|
|
|
|
|
|
abortController = null; |
|
|
|
generateBtn.disabled = false; |
|
|
|
generateBtn.disabled = false; |
|
|
|
generateBtn.textContent = 'Generate'; |
|
|
|
generateBtn.textContent = 'Generate'; |
|
|
|
|
|
|
|
stopBtn.style.display = 'none'; |
|
|
|
} |
|
|
|
} |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|