Skip to content

Commit 72f264a

Browse files
committed
feat: Cmd-Click to go to folder in new window
1 parent 03b550e commit 72f264a

File tree

4 files changed

+26
-11
lines changed

4 files changed

+26
-11
lines changed

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ the selected messages.
2727
A few more tips and tricks:
2828
* If you want to move to the first folder in the search results, you can press Enter directly. No need to move down to select the folder.
2929
* You can also assign keyboard shortcuts to copy, go to a folder, or apply tags
30-
via Thunderbird's [shortcut manager](https://support.mozilla.org/en-US/kb/manage-extension-shortcuts-firefox).
30+
via Thunderbird's [shortcut manager](https://support.mozilla.org/en-US/kb/manage-extension-shortcuts-firefox).
31+
* When going to a folder, ⌘+Enter will open the folder in a new window.
32+
* Instead of ⌘+Enter you can also use the middle mouse button if you prefer to use the mouse.
3133

3234
<img title="Shortcut Options" width="600" src="src/onboarding/images/shortcuts.png">
3335

src/common/util.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,12 @@ export async function getValidatedFolders(rootNode, prefName) {
3232
return folderNodes;
3333
}
3434

35-
export function cmdOrCtrlKey(event) {
35+
export function isAltMode(event) {
3636
const isMac = navigator.platform.toUpperCase().includes("MAC");
37-
return isMac ? event.metaKey : event.ctrlKey;
37+
const keyAltMode = isMac ? event.metaKey : event.ctrlKey;
38+
const mouseAltMode = event instanceof MouseEvent ? event.button == 1 : false;
39+
40+
return keyAltMode || mouseAltMode;
3841
}
3942

4043
export async function showNotification(operation, numMessages, destination, dismissTime = 10000) {

src/popup/baseItemList.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
44
* Portions Copyright (C) Philipp Kewisch */
55

6-
import { cmdOrCtrlKey } from "../common/util.js";
6+
import { isAltMode } from "../common/util.js";
77

88
const DIACRITICS = /[\u0300-\u036f]/g;
99

@@ -381,7 +381,7 @@ export default class BaseItemList extends HTMLElement {
381381
}
382382
event.preventDefault();
383383
} else if (event.key == "Enter" && !event.repeat) {
384-
this.dispatchSelect(this.selected, cmdOrCtrlKey(event));
384+
this.dispatchSelect(this.selected, isAltMode(event));
385385
}
386386
}
387387

@@ -391,7 +391,7 @@ export default class BaseItemList extends HTMLElement {
391391
let customEvent = new CustomEvent("item-deleted", { detail: listItem.itemNode.item });
392392
this.dispatchEvent(customEvent);
393393
} else if (!this.getAttribute("readonly")) {
394-
this.dispatchSelect(event.target.closest(".item"), cmdOrCtrlKey(event));
394+
this.dispatchSelect(event.target.closest(".item"), isAltMode(event));
395395
}
396396
}
397397

@@ -434,7 +434,7 @@ export default class BaseItemList extends HTMLElement {
434434
this.selected = this.nthItem(-1);
435435
event.preventDefault();
436436
} else if (event.key == "Enter" && !event.repeat) {
437-
await this.enterSelect(cmdOrCtrlKey(event));
437+
await this.enterSelect(isAltMode(event));
438438
}
439439
}
440440

src/popup/popup.js

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* Portions Copyright (C) Philipp Kewisch */
55

66
import { RootNode } from "../common/foldernode.js";
7-
import { DEFAULT_PREFERENCES, getValidatedFolders, cmdOrCtrlKey } from "../common/util.js";
7+
import { DEFAULT_PREFERENCES, getValidatedFolders, isAltMode } from "../common/util.js";
88

99
const ALL_ACTIONS = ["move", "copy", "goto", "tag"];
1010

@@ -202,17 +202,27 @@ async function load() {
202202
let operation = document.querySelector("input[name='action']:checked").value;
203203

204204
if (operation == "move" || operation == "copy") {
205-
await browser.runtime.sendMessage({ action: "processSelectedMessages", folder: folder, operation: operation, goToFolder: altMode });
205+
await browser.runtime.sendMessage({
206+
action: "processSelectedMessages",
207+
folder: folder,
208+
operation: operation,
209+
goToFolder: altMode
210+
});
206211
} else if (operation == "goto") {
207212
let [tab] = await browser.tabs.query({ currentWindow: true, active: true });
208213

209214
try {
210-
await browser.mailTabs.update(tab.id, { displayedFolder: folder.id });
215+
if (altMode) {
216+
await browser.mailTabs.create({ displayedFolder: folder.id });
217+
} else {
218+
await browser.mailTabs.update(tab.id, { displayedFolder: folder.id });
219+
}
211220
} catch (e) {
212221
if (e.message == "Requested folder is not viewable in any of the enabled folder modes") {
213222
document.getElementById("tags-view-missing-warning").classList.remove("hidden");
214223
return;
215224
}
225+
console.error(e);
216226
}
217227
}
218228
window.close();
@@ -258,7 +268,7 @@ function keydown(event) {
258268
window.close();
259269
} else if (event.key == "ArrowLeft" || event.key == "ArrowRight") {
260270
let direction = event.key == "ArrowLeft" ? -1 : 1;
261-
if (!cmdOrCtrlKey(event)) {
271+
if (!isAltMode(event)) {
262272
let metaActionWarning = document.getElementById("meta-action-warning");
263273
if (!event.shiftKey && !metaActionWarning.classList.contains("migrated")) {
264274
metaActionWarning.classList.remove("hidden");

0 commit comments

Comments
 (0)