delete images feature
This commit is contained in:
parent
0da9524f87
commit
e3be402bb0
BIN
screenshot.png
BIN
screenshot.png
Binary file not shown.
Before Width: | Height: | Size: 1.5 MiB After Width: | Height: | Size: 278 KiB |
@ -69,6 +69,11 @@
|
|||||||
box-shadow: 0 0 10px rgba(255, 107, 107, 0.5);
|
box-shadow: 0 0 10px rgba(255, 107, 107, 0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.thumbnail.selected {
|
||||||
|
border-color: #4caf50;
|
||||||
|
background-color: rgba(76, 175, 80, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
.image-viewer {
|
.image-viewer {
|
||||||
background: rgba(255,255,255,0.1);
|
background: rgba(255,255,255,0.1);
|
||||||
backdrop-filter: blur(10px);
|
backdrop-filter: blur(10px);
|
||||||
@ -182,25 +187,25 @@
|
|||||||
|
|
||||||
|
|
||||||
<article class="controls-card">
|
<article class="controls-card">
|
||||||
|
<div class="status" id="status">No folder selected</div>
|
||||||
<div class="timeline-progress" id="timelineProgress"></div>
|
<div class="timeline-progress" id="timelineProgress"></div>
|
||||||
<div class="timeline-labels" id="timelineLabels" style="display: flex; justify-content: space-between; font-size: 0.8rem; color: #fff; margin-bottom: 0.5rem;"></div>
|
<div class="timeline-labels" id="timelineLabels" style="display: flex; justify-content: space-between; font-size: 0.8rem; color: #fff; margin-bottom: 0.5rem;"></div>
|
||||||
<div class="control-group">
|
<div class="control-group">
|
||||||
|
|
||||||
|
|
||||||
<button class="button primary" onclick="selectFolder()">
|
<button class="button primary" onclick="selectFolder()">
|
||||||
<i>folder</i>
|
<i>folder</i>
|
||||||
<span>Select Folder</span>
|
<span>Select Folder</span>
|
||||||
</button>
|
</button>
|
||||||
<button class="button primary" id="playBtn" onclick="togglePlay()" disabled>
|
|
||||||
<i>play_arrow</i>
|
|
||||||
<span>Play</span>
|
|
||||||
</button>
|
|
||||||
<button class="button primary" onclick="goToFirst()" disabled id="firstBtn" class="round-btn" title="First">
|
<button class="button primary" onclick="goToFirst()" disabled id="firstBtn" class="round-btn" title="First">
|
||||||
<i>first_page</i>
|
<i>first_page</i>
|
||||||
</button>
|
</button>
|
||||||
<button class="button primary" onclick="previousImage()" disabled id="prevBtn" class="round-btn" title="Previous">
|
<button class="button primary" onclick="previousImage()" disabled id="prevBtn" class="round-btn" title="Previous">
|
||||||
<i>skip_previous</i>
|
<i>skip_previous</i>
|
||||||
</button>
|
</button>
|
||||||
|
<button class="button primary" id="playBtn" onclick="togglePlay()" disabled>
|
||||||
|
<i>play_arrow</i>
|
||||||
|
<span>Play</span>
|
||||||
|
</button>
|
||||||
<button class="button primary" onclick="nextImage()" disabled id="nextBtn" class="round-btn" title="Next">
|
<button class="button primary" onclick="nextImage()" disabled id="nextBtn" class="round-btn" title="Next">
|
||||||
<i>skip_next</i>
|
<i>skip_next</i>
|
||||||
</button>
|
</button>
|
||||||
@ -214,7 +219,9 @@
|
|||||||
<span id="speedValue">1x</span>
|
<span id="speedValue">1x</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="status" id="status">No folder selected</div>
|
<button class="button danger" id="deleteBtn" onclick="deleteSelectedImages()" disabled>
|
||||||
|
<i>delete</i>
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</article>
|
</article>
|
||||||
</div>
|
</div>
|
||||||
@ -228,6 +235,7 @@
|
|||||||
let isPlaying = false;
|
let isPlaying = false;
|
||||||
let playInterval = null;
|
let playInterval = null;
|
||||||
let playSpeed = 1000;
|
let playSpeed = 1000;
|
||||||
|
let selectedIndices = [];
|
||||||
|
|
||||||
function selectFolder() {
|
function selectFolder() {
|
||||||
document.getElementById('folderInput').click();
|
document.getElementById('folderInput').click();
|
||||||
@ -273,37 +281,60 @@
|
|||||||
function createThumbnails() {
|
function createThumbnails() {
|
||||||
const container = document.getElementById('thumbnailsScroll');
|
const container = document.getElementById('thumbnailsScroll');
|
||||||
const thumbnailsContainer = document.getElementById('thumbnailsContainer');
|
const thumbnailsContainer = document.getElementById('thumbnailsContainer');
|
||||||
|
|
||||||
container.innerHTML = '';
|
container.innerHTML = '';
|
||||||
|
|
||||||
if (images.length === 0) {
|
if (images.length === 0) {
|
||||||
thumbnailsContainer.style.display = 'none';
|
thumbnailsContainer.style.display = 'none';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
thumbnailsContainer.style.display = 'block';
|
thumbnailsContainer.style.display = 'block';
|
||||||
|
|
||||||
images.forEach((img, index) => {
|
images.forEach((img, index) => {
|
||||||
const thumb = document.createElement('img');
|
const thumb = document.createElement('img');
|
||||||
thumb.src = img.url;
|
thumb.src = img.url;
|
||||||
thumb.className = 'thumbnail';
|
thumb.className = 'thumbnail';
|
||||||
thumb.onclick = () => goToImage(index);
|
thumb.onclick = (e) => handleThumbnailClick(e, index);
|
||||||
thumb.title = `${img.name} - ${img.createdDate.toLocaleString()}`;
|
thumb.title = `${img.name} - ${img.createdDate.toLocaleString()}`;
|
||||||
container.appendChild(thumb);
|
container.appendChild(thumb);
|
||||||
});
|
});
|
||||||
|
|
||||||
updateThumbnailHighlight();
|
updateThumbnailHighlight();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function handleThumbnailClick(e, index) {
|
||||||
|
if (e.ctrlKey || e.metaKey) {
|
||||||
|
// Toggle selection
|
||||||
|
if (selectedIndices.includes(index)) {
|
||||||
|
selectedIndices = selectedIndices.filter(i => i !== index);
|
||||||
|
} else {
|
||||||
|
selectedIndices.push(index);
|
||||||
|
}
|
||||||
|
} else if (e.shiftKey && selectedIndices.length > 0) {
|
||||||
|
// Range select
|
||||||
|
const last = selectedIndices[selectedIndices.length - 1];
|
||||||
|
const [start, end] = [Math.min(last, index), Math.max(last, index)];
|
||||||
|
selectedIndices = [];
|
||||||
|
for (let i = start; i <= end; i++) selectedIndices.push(i);
|
||||||
|
} else {
|
||||||
|
// Single select
|
||||||
|
selectedIndices = [index];
|
||||||
|
}
|
||||||
|
updateThumbnailHighlight();
|
||||||
|
if (selectedIndices.length === 1) {
|
||||||
|
currentIndex = selectedIndices[0];
|
||||||
|
displayCurrentImage();
|
||||||
|
} else {
|
||||||
|
displayCurrentImage();
|
||||||
|
}
|
||||||
|
updateDeleteButton();
|
||||||
|
}
|
||||||
|
|
||||||
function updateThumbnailHighlight() {
|
function updateThumbnailHighlight() {
|
||||||
const thumbnails = document.querySelectorAll('.thumbnail');
|
const thumbnails = document.querySelectorAll('.thumbnail');
|
||||||
thumbnails.forEach((thumb, index) => {
|
thumbnails.forEach((thumb, index) => {
|
||||||
thumb.classList.toggle('active', index === currentIndex);
|
thumb.classList.toggle('active', index === currentIndex && selectedIndices.length <= 1);
|
||||||
|
thumb.classList.toggle('selected', selectedIndices.includes(index));
|
||||||
});
|
});
|
||||||
|
|
||||||
// Scroll active thumbnail into view
|
// Scroll active thumbnail into view
|
||||||
if (thumbnails[currentIndex]) {
|
if (selectedIndices.length === 1 && thumbnails[selectedIndices[0]]) {
|
||||||
thumbnails[currentIndex].scrollIntoView({
|
thumbnails[selectedIndices[0]].scrollIntoView({
|
||||||
behavior: 'smooth',
|
behavior: 'smooth',
|
||||||
block: 'nearest',
|
block: 'nearest',
|
||||||
inline: 'center'
|
inline: 'center'
|
||||||
@ -340,7 +371,10 @@
|
|||||||
container.innerHTML = '<div class="placeholder">No images loaded</div>';
|
container.innerHTML = '<div class="placeholder">No images loaded</div>';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (selectedIndices.length > 1) {
|
||||||
|
container.innerHTML = `<div class="placeholder">${selectedIndices.length} images selected. Use the Delete Selected button to remove them.</div>`;
|
||||||
|
return;
|
||||||
|
}
|
||||||
const current = images[currentIndex];
|
const current = images[currentIndex];
|
||||||
const createdDate = current.createdDate.toLocaleString();
|
const createdDate = current.createdDate.toLocaleString();
|
||||||
|
|
||||||
@ -552,6 +586,24 @@
|
|||||||
document.getElementById('status').textContent = message;
|
document.getElementById('status').textContent = message;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function updateDeleteButton() {
|
||||||
|
document.getElementById('deleteBtn').disabled = selectedIndices.length === 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function deleteSelectedImages() {
|
||||||
|
if (selectedIndices.length === 0) return;
|
||||||
|
// Remove selected images
|
||||||
|
images = images.filter((_, idx) => !selectedIndices.includes(idx));
|
||||||
|
// Reset selection and currentIndex
|
||||||
|
selectedIndices = [];
|
||||||
|
currentIndex = Math.min(currentIndex, images.length - 1);
|
||||||
|
createThumbnails();
|
||||||
|
updateButtons();
|
||||||
|
displayCurrentImage();
|
||||||
|
updateStatus(`Deleted selected images.`);
|
||||||
|
updateDeleteButton();
|
||||||
|
}
|
||||||
|
|
||||||
// Keyboard shortcuts
|
// Keyboard shortcuts
|
||||||
document.addEventListener('keydown', function(e) {
|
document.addEventListener('keydown', function(e) {
|
||||||
switch(e.code) {
|
switch(e.code) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user