Add keybinding infrastructure

This commit is contained in:
Simon Ser 2020-07-23 09:58:05 +02:00
parent 4d3a1548fe
commit 2951c7810f
No known key found for this signature in database
GPG key ID: 0FDE7BE0E88F5E48
3 changed files with 59 additions and 6 deletions

View file

@ -8,17 +8,13 @@ import Connect from "/components/connect.js";
import Composer from "/components/composer.js"; import Composer from "/components/composer.js";
import ScrollManager from "/components/scroll-manager.js"; import ScrollManager from "/components/scroll-manager.js";
import { html, Component, createRef } from "/lib/index.js"; import { html, Component, createRef } from "/lib/index.js";
import { SERVER_BUFFER, BufferType, Status, Unread } from "/state.js"; import { SERVER_BUFFER, BufferType, ReceiptType, Status, Unread } from "/state.js";
import commands from "/commands.js"; import commands from "/commands.js";
import { setup as setupKeybindings } from "/keybindings.js";
const CHATHISTORY_PAGE_SIZE = 100; const CHATHISTORY_PAGE_SIZE = 100;
const CHATHISTORY_MAX_SIZE = 4000; const CHATHISTORY_MAX_SIZE = 4000;
const ReceiptType = {
DELIVERED: "delivered",
READ: "read",
};
var messagesCount = 0; var messagesCount = 0;
function parseQueryString() { function parseQueryString() {
@ -758,6 +754,8 @@ export default class App extends Component {
if (this.state.connectParams.autoconnect) { if (this.state.connectParams.autoconnect) {
this.connect(this.state.connectParams); this.connect(this.state.connectParams);
} }
setupKeybindings(this);
} }
render() { render() {

50
keybindings.js Normal file
View file

@ -0,0 +1,50 @@
import { ReceiptType, Unread } from "/state.js";
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 };
});
},
},
];
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);
});
}

View file

@ -27,6 +27,11 @@ export const Unread = {
}, },
}; };
export const ReceiptType = {
DELIVERED: "delivered",
READ: "read",
};
export function getNickURL(nick) { export function getNickURL(nick) {
return "irc:///" + encodeURIComponent(nick) + ",isnick"; return "irc:///" + encodeURIComponent(nick) + ",isnick";
} }