From f2e43b84bedf7542b68c9b87668ab1372b9ab233 Mon Sep 17 00:00:00 2001 From: Pavel Djundik Date: Sat, 17 Dec 2016 22:03:12 +0200 Subject: [PATCH] Implement color hotkeys --- client/js/lounge.js | 110 +++++++++++++++++++++++++++++--------------- 1 file changed, 73 insertions(+), 37 deletions(-) diff --git a/client/js/lounge.js b/client/js/lounge.js index 81275fbd..0d2a08ec 100644 --- a/client/js/lounge.js +++ b/client/js/lounge.js @@ -1284,45 +1284,81 @@ $(function() { forms.find(".username").val(nick); }); - Mousetrap.bind([ - "command+up", - "command+down", - "ctrl+up", - "ctrl+down" - ], function(e, keys) { - var channels = sidebar.find(".chan"); - var index = channels.index(channels.filter(".active")); - var direction = keys.split("+").pop(); - switch (direction) { - case "up": - // Loop - var upTarget = (channels.length + (index - 1 + channels.length)) % channels.length; - channels.eq(upTarget).click(); - break; + (function HotkeysScope() { + Mousetrap.bind([ + "command+up", + "command+down", + "ctrl+up", + "ctrl+down" + ], function(e, keys) { + var channels = sidebar.find(".chan"); + var index = channels.index(channels.filter(".active")); + var direction = keys.split("+").pop(); + switch (direction) { + case "up": + // Loop + var upTarget = (channels.length + (index - 1 + channels.length)) % channels.length; + channels.eq(upTarget).click(); + break; - case "down": - // Loop - var downTarget = (channels.length + (index + 1 + channels.length)) % channels.length; - channels.eq(downTarget).click(); - break; + case "down": + // Loop + var downTarget = (channels.length + (index + 1 + channels.length)) % channels.length; + channels.eq(downTarget).click(); + break; + } + }); + + Mousetrap.bind([ + "command+shift+l", + "ctrl+shift+l" + ], function(e) { + if (e.target === input[0]) { + clear(); + e.preventDefault(); + } + }); + + Mousetrap.bind([ + "escape" + ], function() { + contextMenuContainer.hide(); + }); + + var colorsHotkeys = { + k: "\x03", + b: "\x02", + u: "\x1F", + i: "\x1D", + o: "\x0F", + }; + + for (var hotkey in colorsHotkeys) { + Mousetrap.bind([ + "command+" + hotkey, + "ctrl+" + hotkey + ], function(e) { + e.preventDefault(); + + const cursorPosStart = input.prop("selectionStart"); + const cursorPosEnd = input.prop("selectionEnd"); + const value = input.val(); + let newValue = value.substring(0, cursorPosStart) + colorsHotkeys[e.key]; + + if (cursorPosStart === cursorPosEnd) { + // If no text is selected, insert at cursor + newValue += value.substring(cursorPosEnd, value.length); + } else { + // If text is selected, insert formatting character at start and the end + newValue += value.substring(cursorPosStart, cursorPosEnd) + colorsHotkeys[e.key] + value.substring(cursorPosEnd, value.length); + } + + input + .val(newValue) + .get(0).setSelectionRange(cursorPosStart + 1, cursorPosEnd + 1); + }); } - }); - - Mousetrap.bind([ - "command+k", - "ctrl+shift+l" - ], function(e) { - if (e.target === input[0]) { - clear(); - e.preventDefault(); - } - }); - - Mousetrap.bind([ - "escape" - ], function() { - contextMenuContainer.hide(); - }); + }()); setInterval(function() { chat.find(".chan:not(.active)").each(function() {