gamja/keybindings.js

100 lines
2.1 KiB
JavaScript
Raw Normal View History

import { ReceiptType, Unread, SERVER_BUFFER } from "./state.js";
2020-07-23 03:58:05 -04:00
export const keybindings = [
{
key: "h",
altKey: true,
description: "Mark all messages as read",
execute: (app) => {
app.setState((state) => {
var buffers = new Map();
state.buffers.forEach((buf) => {
if (buf.messages.length > 0) {
var lastMsg = buf.messages[buf.messages.length - 1];
app.setReceipt(buf.name, ReceiptType.READ, lastMsg);
}
buffers.set(buf.name, {
...buf,
unread: Unread.NONE,
});
});
return { buffers };
});
},
},
{
key: "a",
altKey: true,
description: "Jump to next buffer with activity",
execute: (app) => {
// TODO: order by priority, then by age
2021-01-21 16:15:33 -05:00
var target = { name: SERVER_BUFFER };
for (var buf of app.state.buffers.values()) {
if (buf.unread != Unread.NONE) {
2021-01-21 16:15:33 -05:00
target = buf;
break;
}
}
2020-08-13 09:41:38 -04:00
app.switchBuffer(target);
},
},
2020-08-03 09:49:30 -04:00
{
key: "ArrowUp",
altKey: true,
description: "Jump to the previous buffer",
execute: (app) => {
var prev = null;
for (var buf of app.state.buffers.values()) {
2021-01-21 16:15:33 -05:00
if (app.state.activeBuffer == buf.id) {
2020-08-03 09:49:30 -04:00
if (prev) {
2021-01-21 16:15:33 -05:00
app.switchBuffer(prev);
2020-08-03 09:49:30 -04:00
}
break;
}
prev = buf;
}
},
},
{
key: "ArrowDown",
altKey: true,
description: "Jump to the next buffer",
execute: (app) => {
var found = false;
for (var buf of app.state.buffers.values()) {
if (found) {
2021-01-21 16:15:33 -05:00
app.switchBuffer(buf);
2020-08-03 09:49:30 -04:00
break;
2021-01-21 16:15:33 -05:00
} else if (app.state.activeBuffer == buf.id) {
2020-08-03 09:49:30 -04:00
found = true;
}
}
},
},
2020-07-23 03:58:05 -04:00
];
export function setup(app) {
var byKey = {};
keybindings.forEach((binding) => {
if (!byKey[binding.key]) {
byKey[binding.key] = [];
}
byKey[binding.key].push(binding);
});
window.addEventListener("keydown", (event) => {
var candidates = byKey[event.key];
if (!candidates) {
return;
}
candidates = candidates.filter((binding) => {
return !!binding.altKey == event.altKey && !!binding.ctrlKey == event.ctrlKey;
});
if (candidates.length != 1) {
return;
}
event.preventDefault();
candidates[0].execute(app);
});
}