Skip to content
Open
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
14 changes: 3 additions & 11 deletions .github/workflows/ui-tests.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
name: UI Tests (Playwright + tauri-driver)
name: UI Tests

on:
push:
branches: [ main ]
branches: [ master ]
pull_request:

jobs:
Expand All @@ -16,19 +16,11 @@ jobs:
with:
node-version: '22'

- name: Set up Rust
uses: dtolnay/rust-toolchain@stable

- name: Install JS deps
run: npm install --no-fund

- name: Install Playwright browsers
run: npx playwright install --with-deps

- name: Install tauri-driver
run: cargo install tauri-driver --locked

- name: Run Playwright tests
env:
PATH: "$HOME/.cargo/bin:${PATH}"
- name: Run Playwright smoke tests
run: npm run test:ui
83 changes: 81 additions & 2 deletions dist/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,13 @@
<div class="controls no-drag">
<button id="prevBtn" class="btn no-drag" type="button">Previous</button>
<button id="nextBtn" class="btn no-drag" type="button">Next</button>
<button id="slideshowBtn" class="btn no-drag" type="button">Slideshow: Off</button>
<select id="slideshowInterval" class="btn no-drag" aria-label="Slideshow interval">
<option value="2000">2s</option>
<option value="5000" selected>5s</option>
<option value="10000">10s</option>
<option value="15000">15s</option>
</select>
</div>
</div>
<script>
Expand All @@ -58,8 +65,17 @@
const statusEl = document.getElementById('status');
const prevBtn = document.getElementById('prevBtn');
const nextBtn = document.getElementById('nextBtn');
const slideshowBtn = document.getElementById('slideshowBtn');
const slideshowIntervalEl = document.getElementById('slideshowInterval');
const appEl = document.getElementById('app');

const slideshowState = {
enabled: false,
intervalMs: 5000,
total: 0,
};
let slideshowTimer = null;

const defaultPlaceholder = () => {
const platform =
navigator?.userAgentData?.platform ||
Expand All @@ -78,6 +94,42 @@
statusEl.textContent = '';
prevBtn.disabled = true;
nextBtn.disabled = true;
slideshowState.total = 0;
syncSlideshowUi();
stopSlideshow();
};

const stopSlideshow = () => {
if (slideshowTimer) {
clearInterval(slideshowTimer);
slideshowTimer = null;
}
};

const syncSlideshowUi = () => {
if (!slideshowBtn || !slideshowIntervalEl) return;
slideshowBtn.textContent = `Slideshow: ${slideshowState.enabled ? 'On' : 'Off'}`;
slideshowIntervalEl.value = String(slideshowState.intervalMs);
const disabled = slideshowState.total <= 1;
slideshowBtn.disabled = disabled;
slideshowIntervalEl.disabled = disabled;
};

const startSlideshowIfNeeded = () => {
stopSlideshow();
if (!slideshowState.enabled || slideshowState.total <= 1) return;
const interval = Number(slideshowState.intervalMs) || 5000;
slideshowTimer = setInterval(() => {
invoke('next_file');
}, interval);
};

const persistSettings = async (update) => {
try {
await invoke('set_settings', { update });
} catch (err) {
console.warn('Failed to persist settings', err);
}
};

const buildSources = (path) => {
Expand Down Expand Up @@ -141,20 +193,24 @@
const index = payload?.index ?? null;
const total = payload?.total ?? null;
if (!path) {
showPlaceholder();
return;
showPlaceholder();
return;
}
const fileName = path.split(/[\\/]/).pop() || path;
fileInfoEl.textContent = fileName;
if (typeof index === 'number' && typeof total === 'number' && total > 0) {
statusEl.textContent = `File ${index + 1} of ${total}`;
prevBtn.disabled = index <= 0;
nextBtn.disabled = index >= total - 1;
slideshowState.total = total;
} else {
statusEl.textContent = '';
prevBtn.disabled = false;
nextBtn.disabled = false;
slideshowState.total = 0;
}
syncSlideshowUi();
startSlideshowIfNeeded();
showImage(path);
};

Expand All @@ -179,6 +235,13 @@
const bootstrap = async () => {
try {
const settings = await invoke('get_settings');
if (typeof settings?.slideshow_enabled === 'boolean') {
slideshowState.enabled = settings.slideshow_enabled;
}
if (typeof settings?.slideshow_interval_ms === 'number') {
slideshowState.intervalMs = settings.slideshow_interval_ms;
}
syncSlideshowUi();
if (settings?.last_file) {
renderState({ path: settings.last_file });
return;
Expand Down Expand Up @@ -223,6 +286,22 @@
showChrome();
invoke('next_file');
});
slideshowBtn?.addEventListener('click', async () => {
showChrome();
slideshowState.enabled = !slideshowState.enabled;
syncSlideshowUi();
startSlideshowIfNeeded();
await persistSettings({ slideshow_enabled: slideshowState.enabled });
});
slideshowIntervalEl?.addEventListener('change', async () => {
showChrome();
const next = Number(slideshowIntervalEl.value);
if (!Number.isFinite(next) || next < 1000) return;
slideshowState.intervalMs = next;
syncSlideshowUi();
startSlideshowIfNeeded();
await persistSettings({ slideshow_interval_ms: next });
});
</script>
</body>
</html>
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"@playwright/test": "^1.50.0"
},
"scripts": {
"test:ui": "playwright test tests/tauri-driver.spec.ts"
"test:ui": "playwright test tests/ui-mock.spec.ts",
"test:ui:tauri": "playwright test tests/tauri-driver.spec.ts"
}
}
Loading
Loading