mirror of
https://codeberg.org/PLG-Development/PLG-MuDiCS
synced 2026-07-06 00:47:09 +00:00
chore(control): add settings with screenshot preview settings
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
<script lang="ts">
|
||||
import type { NumberSetting } from '$lib/ts/types';
|
||||
import { ChevronDown, ChevronUp, Minus, Plus } from 'lucide-svelte';
|
||||
import Button from './Button.svelte';
|
||||
|
||||
let {
|
||||
number_setting,
|
||||
on_change,
|
||||
className = '',
|
||||
disabled = false,
|
||||
}: {
|
||||
number_setting: NumberSetting;
|
||||
on_change: (new_value: number) => void;
|
||||
className?: string;
|
||||
disabled?: boolean;
|
||||
} = $props();
|
||||
|
||||
let el: HTMLInputElement | null = null;
|
||||
|
||||
function increase() {
|
||||
if (!el) return;
|
||||
el.stepUp();
|
||||
el.dispatchEvent(new Event('input', { bubbles: true }));
|
||||
on_change(Number(el.value));
|
||||
}
|
||||
|
||||
function decrease() {
|
||||
if (!el) return;
|
||||
el.stepDown();
|
||||
el.dispatchEvent(new Event('input', { bubbles: true }));
|
||||
on_change(Number(el.value));
|
||||
}
|
||||
|
||||
function on_blur() {
|
||||
if (!el) return;
|
||||
let value = Number(el.value);
|
||||
if (value > number_setting.max) value = number_setting.max;
|
||||
else if (value < number_setting.min) value = number_setting.min;
|
||||
el.value = String(value);
|
||||
on_change(value);
|
||||
}
|
||||
</script>
|
||||
|
||||
<div class="flex flex-row {className}">
|
||||
<Button click_function={increase} className="rounded-r-none" disabled={disabled}>
|
||||
<ChevronUp />
|
||||
</Button>
|
||||
<input
|
||||
bind:this={el}
|
||||
class="bg-stone-700 focus:bg-stone-550 focus:outline-none transition-colors duration-200 py-2 px-4 w-15 text-center
|
||||
{disabled ? 'text-stone-500 cursor-not-allowed' : 'hover:bg-stone-600'}
|
||||
[appearance:textfield]
|
||||
[&::-webkit-outer-spin-button]:appearance-none
|
||||
[&::-webkit-inner-spin-button]:appearance-none"
|
||||
type="number"
|
||||
disabled={disabled}
|
||||
max={number_setting.max}
|
||||
min={number_setting.min}
|
||||
value={number_setting.now}
|
||||
step={number_setting.step}
|
||||
onblur={on_blur}
|
||||
/>
|
||||
<Button click_function={decrease} className="rounded-l-none" disabled={disabled}>
|
||||
<ChevronDown />
|
||||
</Button>
|
||||
</div>
|
||||
@@ -13,6 +13,7 @@ import { delete_and_deselect_unique_files_from_display } from './files';
|
||||
import { db } from '../database';
|
||||
import { dev } from '$app/environment';
|
||||
import { remove_display_from_loading_displays } from '../main';
|
||||
import { preview_settings } from './ui_behavior';
|
||||
|
||||
export const local_displays: Writable<DisplayIdGroup[]> = writable<DisplayIdGroup[]>([]);
|
||||
|
||||
@@ -117,7 +118,13 @@ export async function get_display_by_id(display_id: string): Promise<Display | n
|
||||
return (await db.displays.get(display_id)) ?? null;
|
||||
}
|
||||
|
||||
export async function screenshot_loop(display_id: string, initial_retry_count: number = 5) {
|
||||
export async function screenshot_loop(display_id: string) {
|
||||
const settings = get(preview_settings);
|
||||
if (settings.mode === 'never') return;
|
||||
|
||||
const initial_retry_count = settings.retry_count.now;
|
||||
const retry_seconds = get(preview_settings).retry_seconds.now;
|
||||
|
||||
const display = await db.displays.get(display_id);
|
||||
if (!display || display.preview.currently_updating) return;
|
||||
|
||||
@@ -128,7 +135,7 @@ export async function screenshot_loop(display_id: string, initial_retry_count: n
|
||||
|
||||
let retry_count = initial_retry_count;
|
||||
while (retry_count > 0) {
|
||||
retry_count -= 1;
|
||||
if (settings.mode !== 'always') retry_count -= 1;
|
||||
|
||||
const new_blob = await get_screenshot(display.ip);
|
||||
if (!new_blob) {
|
||||
@@ -149,7 +156,7 @@ export async function screenshot_loop(display_id: string, initial_retry_count: n
|
||||
retry_count = initial_retry_count;
|
||||
}
|
||||
|
||||
await new Promise((resolve) => setTimeout(resolve, 2000)); // sleep 2s
|
||||
await new Promise((resolve) => setTimeout(resolve, retry_seconds * 1000)); // sleep
|
||||
}
|
||||
|
||||
display.preview.currently_updating = false;
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { writable, type Writable } from 'svelte/store';
|
||||
import type { NumberSetting } from '../types';
|
||||
|
||||
export const dnd_flip_duration_ms = 300;
|
||||
|
||||
@@ -23,6 +24,30 @@ export const current_height: Writable<Record<string, number>> = writable<Record<
|
||||
export const is_group_drag: Writable<boolean> = writable<boolean>(false);
|
||||
export const is_display_drag: Writable<boolean> = writable<boolean>(false);
|
||||
|
||||
export const preview_settings: Writable<{
|
||||
mode: 'never' | 'normal' | 'always';
|
||||
retry_seconds: NumberSetting;
|
||||
retry_count: NumberSetting;
|
||||
}> = writable<{
|
||||
mode: 'never' | 'normal' | 'always';
|
||||
retry_seconds: NumberSetting;
|
||||
retry_count: NumberSetting;
|
||||
}>({
|
||||
mode: 'normal',
|
||||
retry_seconds: {
|
||||
max: 10,
|
||||
min: 0.5,
|
||||
now: 2,
|
||||
step: 0.5
|
||||
},
|
||||
retry_count: {
|
||||
max: 10,
|
||||
min: 1,
|
||||
now: 5,
|
||||
step: 1
|
||||
}
|
||||
});
|
||||
|
||||
export const pinned_display_id: Writable<string | null> = writable<string | null>(null);
|
||||
|
||||
export function change_height(key: 'display' | 'file', factor: number) {
|
||||
|
||||
@@ -141,6 +141,13 @@ export type PopupContent = {
|
||||
closable?: boolean;
|
||||
};
|
||||
|
||||
export type NumberSetting = {
|
||||
max: number,
|
||||
min: number,
|
||||
now: number,
|
||||
step: number
|
||||
}
|
||||
|
||||
export type DisplayStatus = 'host_offline' | 'app_offline' | 'app_online' | null;
|
||||
|
||||
export function to_display_status(value: string): DisplayStatus {
|
||||
|
||||
Reference in New Issue
Block a user