fix: preserve editing value in hp48 stack rendering
This commit is contained in:
+52
-16
@@ -286,13 +286,19 @@
|
||||
});
|
||||
}
|
||||
|
||||
function getLineValue(line) {
|
||||
if (line === 0 && calc.isEditing) {
|
||||
return calc.inputValue;
|
||||
}
|
||||
return calc.stack[line];
|
||||
}
|
||||
|
||||
function render() {
|
||||
const stack = calc.stack;
|
||||
const names = ['T', 'Z', 'Y', 'X'];
|
||||
const lines = [];
|
||||
for (let i = 3; i >= 0; i -= 1) {
|
||||
const value = stack[i];
|
||||
lines.push(`<div class="stack-line"><div class="label">${names[3 - i]}</div><div>${value !== undefined ? calc.formatNumber(value) : ''}</div></div>`);
|
||||
for (let line = 3; line >= 0; line -= 1) {
|
||||
const value = getLineValue(line);
|
||||
lines.push(`<div class="stack-line"><div class="label">${names[3 - line]}</div><div>${value !== undefined && value !== '' ? calc.formatNumber(value) : ''}</div></div>`);
|
||||
}
|
||||
|
||||
stackEl.innerHTML = lines.join('');
|
||||
@@ -304,22 +310,40 @@
|
||||
errorEl.textContent = '';
|
||||
}
|
||||
|
||||
function pushEditingValueIfNeeded() {
|
||||
if (!calc.isEditing) return;
|
||||
if (calc.inputValue !== '') {
|
||||
const value = calc.parseInputValue(calc.inputValue);
|
||||
if (calc.stack.length >= calc.maxSize) {
|
||||
throw new Error('Stack overflow');
|
||||
}
|
||||
calc.stack.unshift(value);
|
||||
if (calc.stack.length > 4) calc.stack.length = 4;
|
||||
}
|
||||
calc.inputValue = '';
|
||||
calc.isEditing = false;
|
||||
syncInputFromState();
|
||||
}
|
||||
|
||||
function execute(name) {
|
||||
try {
|
||||
if (name === 'swap') {
|
||||
if (calc.isEditing) calc.command('enter');
|
||||
pushEditingValueIfNeeded();
|
||||
if (calc.stack.length >= 2) calc.swap(0, 1);
|
||||
} else if (name === 'drop') {
|
||||
pushEditingValueIfNeeded();
|
||||
if (calc.stack.length >= 1) calc.remove(0);
|
||||
} else if (name === 'clear') {
|
||||
calc.clear();
|
||||
} else if (name === 'enter') {
|
||||
if (calc.isEditing) calc.command('enter');
|
||||
} else if (name === 'pi' || name === 'e') {
|
||||
calc.command(name);
|
||||
if (calc.isEditing) {
|
||||
pushEditingValueIfNeeded();
|
||||
}
|
||||
} else {
|
||||
pushEditingValueIfNeeded();
|
||||
calc.command(name);
|
||||
}
|
||||
syncInputFromState();
|
||||
render();
|
||||
} catch (error) {
|
||||
errorEl.textContent = error.message;
|
||||
@@ -338,13 +362,29 @@
|
||||
input.value = calc.inputValue;
|
||||
}
|
||||
|
||||
function editXWithKey(key) {
|
||||
if (!calc.isEditing) {
|
||||
pushEditingValueIfNeeded();
|
||||
calc.isEditing = true;
|
||||
calc.inputValue = '';
|
||||
}
|
||||
if (key === 'Backspace') {
|
||||
calc.inputValue = calc.inputValue.slice(0, -1);
|
||||
} else {
|
||||
calc.inputValue += key;
|
||||
}
|
||||
if (calc.inputValue === '') {
|
||||
calc.isEditing = false;
|
||||
}
|
||||
syncInputFromState();
|
||||
}
|
||||
|
||||
screen.addEventListener('keydown', (event) => {
|
||||
try {
|
||||
if (event.key === 'Enter') {
|
||||
event.preventDefault();
|
||||
if (calc.isEditing) {
|
||||
calc.command('enter');
|
||||
syncInputFromState();
|
||||
}
|
||||
render();
|
||||
return;
|
||||
@@ -353,9 +393,7 @@
|
||||
if (event.key === 'Backspace') {
|
||||
event.preventDefault();
|
||||
if (calc.isEditing) {
|
||||
calc.inputValue = calc.inputValue.slice(0, -1);
|
||||
if (calc.inputValue === '') calc.isEditing = false;
|
||||
syncInputFromState();
|
||||
editXWithKey('Backspace');
|
||||
render();
|
||||
}
|
||||
return;
|
||||
@@ -363,8 +401,7 @@
|
||||
|
||||
if (isInputChar(event.key)) {
|
||||
event.preventDefault();
|
||||
calc.input(event.key);
|
||||
syncInputFromState();
|
||||
editXWithKey(event.key);
|
||||
render();
|
||||
return;
|
||||
}
|
||||
@@ -380,8 +417,7 @@
|
||||
|
||||
if (keyMap[event.key]) {
|
||||
event.preventDefault();
|
||||
calc.command(keyMap[event.key]);
|
||||
render();
|
||||
execute(keyMap[event.key]);
|
||||
}
|
||||
} catch (error) {
|
||||
errorEl.textContent = error.message;
|
||||
|
||||
Reference in New Issue
Block a user