Skip to content

Commit d303869

Browse files
committed
Add Ctrl + Click behavior for opening notes in new tab or split view. Merged liamcain#331
1 parent 9d54e5d commit d303869

File tree

6 files changed

+81
-33
lines changed

6 files changed

+81
-33
lines changed

src/io/dailyNotes.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { Moment } from "moment";
2-
import type { TFile } from "obsidian";
2+
import type { TFile, WorkspaceLeaf } from "obsidian";
33
import {
44
createDailyNote,
55
getDailyNoteSettings,
@@ -13,7 +13,7 @@ import { createConfirmationDialog } from "src/ui/modal";
1313
*/
1414
export async function tryToCreateDailyNote(
1515
date: Moment,
16-
inNewSplit: boolean,
16+
ctrlPressed: boolean,
1717
settings: ISettings,
1818
cb?: (newFile: TFile) => void
1919
): Promise<void> {
@@ -23,10 +23,16 @@ export async function tryToCreateDailyNote(
2323

2424
const createFile = async () => {
2525
const dailyNote = await createDailyNote(date);
26-
const leaf = inNewSplit
27-
? workspace.splitActiveLeaf()
28-
: workspace.getUnpinnedLeaf();
29-
26+
let leaf: WorkspaceLeaf;
27+
if (ctrlPressed) {
28+
if (settings.ctrlClickOpensInNewTab) {
29+
leaf = workspace.getLeaf('tab');
30+
} else {
31+
leaf = workspace.getLeaf('split', 'vertical');
32+
}
33+
} else {
34+
leaf = workspace.getLeaf(false);
35+
}
3036
await leaf.openFile(dailyNote, { active : true });
3137
cb?.(dailyNote);
3238
};

src/io/weeklyNotes.ts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { Moment } from "moment";
2-
import type { TFile } from "obsidian";
2+
import type { TFile, WorkspaceLeaf } from "obsidian";
33
import {
44
createWeeklyNote,
55
getWeeklyNoteSettings,
@@ -13,7 +13,7 @@ import { createConfirmationDialog } from "src/ui/modal";
1313
*/
1414
export async function tryToCreateWeeklyNote(
1515
date: Moment,
16-
inNewSplit: boolean,
16+
ctrlPressed: boolean,
1717
settings: ISettings,
1818
cb?: (file: TFile) => void
1919
): Promise<void> {
@@ -23,11 +23,17 @@ export async function tryToCreateWeeklyNote(
2323

2424
const createFile = async () => {
2525
const dailyNote = await createWeeklyNote(date);
26-
const leaf = inNewSplit
27-
? workspace.splitActiveLeaf()
28-
: workspace.getUnpinnedLeaf();
29-
30-
await leaf.openFile(dailyNote, { active : true });
26+
let leaf: WorkspaceLeaf;
27+
if (ctrlPressed) {
28+
if (settings.ctrlClickOpensInNewTab) {
29+
leaf = workspace.getLeaf("tab");
30+
} else {
31+
leaf = workspace.getLeaf("split", "vertical");
32+
}
33+
} else {
34+
leaf = workspace.getLeaf(false);
35+
}
36+
await leaf.openFile(dailyNote, { active: true });
3137
cb?.(dailyNote);
3238
};
3339

src/settings.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ export interface ISettings {
1010
wordsPerDot: number;
1111
weekStart: IWeekStartOption;
1212
shouldConfirmBeforeCreate: boolean;
13-
showQuarter: boolean; // Existing property
13+
ctrlClickOpensInNewTab: boolean;
14+
showQuarter: boolean;
1415
// Weekly Note settings
1516
showWeeklyNote: boolean;
1617
showWeeklyNoteRight: boolean;
@@ -34,6 +35,7 @@ const weekdays = [
3435
export const defaultSettings = Object.freeze({
3536
shouldConfirmBeforeCreate: true,
3637
weekStart: "locale" as IWeekStartOption,
38+
ctrlClickOpensInNewTab: false,
3739

3840
wordsPerDot: DEFAULT_WORDS_PER_DOT,
3941

@@ -82,6 +84,7 @@ export class CalendarSettingsTab extends PluginSettingTab {
8284
});
8385
this.addDotThresholdSetting();
8486
this.addWeekStartSetting();
87+
this.addCtrlClickSetting();
8588
this.addConfirmCreateSetting();
8689
this.addShowWeeklyNoteSetting();
8790
this.addShowWeeklyNoteRightSetting();
@@ -150,7 +153,23 @@ export class CalendarSettingsTab extends PluginSettingTab {
150153
});
151154
});
152155
}
153-
156+
addCtrlClickSetting(): void {
157+
new Setting(this.containerEl)
158+
.setName("Ctrl + Click Behaviour")
159+
.setDesc("Set the behaviour of Ctrl + Clicking on a date")
160+
.addDropdown((dropdown) => {
161+
dropdown.addOption("new-tab", "Open in new tab");
162+
dropdown.addOption("new-split", "Open in new split");
163+
dropdown.setValue(
164+
this.plugin.options.ctrlClickOpensInNewTab ? "new-tab" : "new-split"
165+
);
166+
dropdown.onChange(async (value) => {
167+
this.plugin.writeOptions(() => ({
168+
ctrlClickOpensInNewTab: value === "new-tab",
169+
}));
170+
});
171+
});
172+
}
154173
addConfirmCreateSetting(): void {
155174
new Setting(this.containerEl)
156175
.setName("Confirm before creating new note")

src/testUtils/settings.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export function getDefaultSettings(
88
{
99
weekStart: "sunday",
1010
shouldConfirmBeforeCreate: false,
11+
ctrlClickOpensInNewTab: false,
1112
wordsPerDot: 50,
1213
showWeeklyNote: false,
1314
showQuarter: true,

src/ui/fileMenu.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,15 @@ export function showFileMenu(app: App, file: TFile, position: Point): void {
1111
(<any>app).fileManager.promptForFileDeletion(file);
1212
})
1313
);
14-
14+
fileMenu.addItem((item) =>
15+
item
16+
.setTitle("Open in new tab")
17+
.setIcon("file-plus")
18+
.setSection("open")
19+
.onClick(() => {
20+
app.workspace.openLinkText(file.path, "", true);
21+
})
22+
);
1523
app.workspace.trigger(
1624
"file-menu",
1725
fileMenu,

src/view.ts

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,7 @@ export default class CalendarView extends ItemView {
433433

434434
async openOrCreateWeeklyNote(
435435
date: Moment,
436-
inNewSplit: boolean
436+
ctrlPressed: boolean
437437
): Promise<void> {
438438
const { workspace } = this.app;
439439

@@ -442,31 +442,35 @@ export default class CalendarView extends ItemView {
442442
const existingFile = getWeeklyNote(date, get(weeklyNotes));
443443

444444
if (!existingFile) {
445-
tryToCreateWeeklyNote(startOfWeek, inNewSplit, this.settings, (file) => {
445+
tryToCreateWeeklyNote(startOfWeek, ctrlPressed, this.settings, (file) => {
446446
activeFile.setFile(file);
447447
});
448448
return;
449449
}
450450

451-
const leaf = inNewSplit
452-
? workspace.splitActiveLeaf()
453-
: workspace.getUnpinnedLeaf();
451+
let leaf: WorkspaceLeaf;
452+
if (ctrlPressed) {
453+
if (this.settings.ctrlClickOpensInNewTab) {
454+
leaf = workspace.getLeaf("tab");
455+
} else {
456+
leaf = workspace.getLeaf("split", "vertical");
457+
}
458+
} else {
459+
leaf = workspace.getLeaf(false);
460+
}
454461
await leaf.openFile(existingFile);
455-
456-
activeFile.setFile(existingFile);
457-
workspace.setActiveLeaf(leaf, true, true);
458462
}
459463

460464
async openOrCreateDailyNote(
461465
date: Moment,
462-
inNewSplit: boolean
466+
ctrlPressed: boolean
463467
): Promise<void> {
464468
const { workspace } = this.app;
465469
const existingFile = getDailyNote(date, get(dailyNotes));
466470
if (!existingFile) {
467471
tryToCreateDailyNote(
468472
date,
469-
inNewSplit,
473+
ctrlPressed,
470474
this.settings,
471475
(dailyNote: TFile) => {
472476
activeFile.setFile(dailyNote);
@@ -475,13 +479,17 @@ export default class CalendarView extends ItemView {
475479
return;
476480
}
477481

478-
const mode = (this.app.vault as any).getConfig("defaultViewMode");
479-
const leaf = inNewSplit
480-
? workspace.splitActiveLeaf()
481-
: workspace.getUnpinnedLeaf();
482-
await leaf.openFile(existingFile, { active: true, mode });
483-
484-
activeFile.setFile(existingFile);
482+
let leaf: WorkspaceLeaf;
483+
if (ctrlPressed) {
484+
if (this.settings.ctrlClickOpensInNewTab) {
485+
leaf = workspace.getLeaf("tab");
486+
} else {
487+
leaf = workspace.getLeaf("split", "vertical");
488+
}
489+
} else {
490+
leaf = workspace.getLeaf(false);
491+
}
492+
await leaf.openFile(existingFile);
485493
}
486494

487495
async openOrCreateMonthlyNote(

0 commit comments

Comments
 (0)