diff --git a/hdyc-svelte/src/lib/components/Calculator.svelte b/hdyc-svelte/src/lib/components/Calculator.svelte index 8031124..8aff362 100644 --- a/hdyc-svelte/src/lib/components/Calculator.svelte +++ b/hdyc-svelte/src/lib/components/Calculator.svelte @@ -14,6 +14,7 @@ let val2 = ''; let val3 = ''; let activeField: 1 | 2 | 3 = 1; + let swapState: { originalField: 1 | 2; originalValue: string } | null = null; $: has3 = ['3col', '3col-mul'].includes(config.type) || !!config.labels.in3; $: isTextInput = ['base', 'text-bin', 'bin-text', 'dec-frac', 'dms-dd', 'dd-dms'].includes(config.type); @@ -25,7 +26,10 @@ let paramsInitializing = true; - function handleInput(source: 1 | 2 | 3) { + function handleInput(source: 1 | 2 | 3, options?: { preserveSwap?: boolean }) { + if (!options?.preserveSwap) { + swapState = null; + } activeField = source; const result = solve(config, source, val1, val2, val3); if (source !== 1) val1 = result.val1; @@ -34,14 +38,30 @@ } function swap() { - const nextSource: 1 | 2 = activeField === 1 ? 2 : 1; - handleInput(nextSource); + if (!swapState) { + const manualField: 1 | 2 = activeField === 1 ? 1 : 2; + const manualValue = manualField === 1 ? val1 : val2; + const targetField: 1 | 2 = manualField === 1 ? 2 : 1; + swapState = { originalField: manualField, originalValue: manualValue }; + if (targetField === 1) val1 = manualValue; + else val2 = manualValue; + handleInput(targetField, { preserveSwap: true }); + return; + } + + const manualField = swapState.originalField; + const manualValue = swapState.originalValue; + if (manualField === 1) val1 = manualValue; + else val2 = manualValue; + swapState = null; + handleInput(manualField, { preserveSwap: true }); } function clear() { val1 = ''; val2 = ''; val3 = ''; + swapState = null; } onMount(() => {