Skip to content

Commit 493a9f3

Browse files
committed
feat: tab containers
1 parent 6e777f4 commit 493a9f3

File tree

5 files changed

+96
-19
lines changed

5 files changed

+96
-19
lines changed

src/main/browser/tabs/index.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,19 @@ import { Browser } from "@/browser/browser";
22
import { TabGroupManager } from "@/browser/tabs/managers/tab-group-manager";
33
import { ActiveTabGroupManager } from "@/browser/tabs/managers/active-tab-group-manager";
44
import { TabManager } from "@/browser/tabs/managers/tab-manager";
5+
import { TabsContainerManager } from "@/browser/tabs/managers/tabs-container-manager";
56

67
export class TabOrchestrator {
7-
private readonly browser: Browser;
88
public readonly tabManager: TabManager;
99
public readonly tabGroupManager: TabGroupManager;
1010
public readonly activeTabGroupManager: ActiveTabGroupManager;
11+
public readonly tabsContainerManager: TabsContainerManager;
1112

1213
constructor(browser: Browser) {
13-
this.browser = browser;
1414
this.tabManager = new TabManager(browser);
1515
this.tabGroupManager = new TabGroupManager(browser);
1616
this.activeTabGroupManager = new ActiveTabGroupManager(browser);
17+
this.tabsContainerManager = new TabsContainerManager(browser);
1718
}
1819

1920
public destroy(): void {

src/main/browser/tabs/objects/tabs-container.ts renamed to src/main/browser/tabs/objects/tab-containers/base.ts

Lines changed: 42 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,73 @@
11
import { TabGroup } from "@/browser/tabs/objects/tab-group";
2+
import { TabFolder } from "@/browser/tabs/objects/tab-containers/tab-folder";
23
import { TypedEventEmitter } from "@/modules/typed-event-emitter";
34

45
// Container Child //
56
type TabGroupChild = {
67
type: "tab-group";
78
item: TabGroup;
89
};
9-
type TabContainerChild = {
10-
type: "tab-container";
11-
item: TabsContainer;
10+
type TabFolderChild = {
11+
type: "tab-folder";
12+
item: TabFolder;
1213
};
13-
export type ContainerChild = TabGroupChild | TabContainerChild;
14+
export type ContainerChild = TabGroupChild | TabFolderChild;
1415

1516
// Exported Tab Data //
17+
export type ExportedBaseTabContainer = {
18+
type: "tab-container";
19+
children: ExportedTabData[];
20+
};
21+
1622
export type ExportedTabGroup = {
1723
type: "tab-group";
1824
};
19-
export type ExportedTabsContainer = {
20-
type: "tabs-container";
25+
export type ExportedTabContainer = {
26+
type: "tab-container";
27+
children: ExportedTabData[];
28+
};
29+
export type ExportedTabsFolder = {
30+
type: "tab-folder";
2131
name: string;
2232
children: ExportedTabData[];
2333
};
24-
type ExportedTabData = ExportedTabGroup | ExportedTabsContainer;
34+
// ExportedTabContainer would not be a child: it should only be the root container.
35+
type ExportedTabData = ExportedTabGroup | ExportedTabsFolder;
2536

26-
// Tabs Container //
27-
type TabsContainerEvents = {
37+
// Base Tab Container //
38+
export type BaseTabContainerEvents = {
2839
"child-added": [child: ContainerChild];
2940
"child-removed": [child: ContainerChild];
3041
"children-moved": [];
3142
};
3243

33-
export class TabsContainer extends TypedEventEmitter<TabsContainerEvents> {
34-
public name: string;
44+
export class BaseTabContainer<
45+
TEvents extends BaseTabContainerEvents = BaseTabContainerEvents
46+
> extends TypedEventEmitter<TEvents> {
3547
public children: ContainerChild[];
3648

37-
constructor(name: string) {
49+
constructor() {
3850
super();
3951

40-
this.name = name;
4152
this.children = [];
4253
}
4354

55+
public getAllTabGroups(): TabGroup[] {
56+
const scanTabContainer = (container: BaseTabContainer): TabGroup[] => {
57+
return container.children.flatMap((child) => {
58+
if (child.type === "tab-group") {
59+
return [child.item];
60+
}
61+
if (child.type === "tab-folder") {
62+
return scanTabContainer(child.item);
63+
}
64+
return [];
65+
});
66+
};
67+
68+
return scanTabContainer(this);
69+
}
70+
4471
public addChild(child: ContainerChild): void {
4572
this.children.push(child);
4673
this.emit("child-added", child);
@@ -78,10 +105,9 @@ export class TabsContainer extends TypedEventEmitter<TabsContainerEvents> {
78105
return this.children.length;
79106
}
80107

81-
public export(): ExportedTabsContainer {
108+
protected baseExport(): ExportedBaseTabContainer {
82109
return {
83-
type: "tabs-container",
84-
name: this.name,
110+
type: "tab-container",
85111
children: this.children.map((child) => {
86112
return child.item.export();
87113
})
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { BaseTabContainer, BaseTabContainerEvents, ExportedTabContainer } from "./base";
2+
3+
type TabContainerEvents = BaseTabContainerEvents & {
4+
"space-changed": [spaceId: string];
5+
};
6+
7+
export class TabContainer extends BaseTabContainer<TabContainerEvents> {
8+
public spaceId: string;
9+
10+
constructor(spaceId: string) {
11+
super();
12+
this.spaceId = spaceId;
13+
}
14+
15+
public setSpace(spaceId: string): void {
16+
this.spaceId = spaceId;
17+
this.emit("space-changed", spaceId);
18+
}
19+
20+
public export(): ExportedTabContainer {
21+
const { children } = this.baseExport();
22+
return {
23+
type: "tab-container",
24+
children
25+
};
26+
}
27+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { BaseTabContainer, ExportedTabsFolder } from "./base";
2+
3+
export class TabFolder extends BaseTabContainer {
4+
public name: string;
5+
6+
constructor(name: string) {
7+
super();
8+
this.name = name;
9+
}
10+
11+
public setName(name: string): void {
12+
this.name = name;
13+
}
14+
15+
public export(): ExportedTabsFolder {
16+
const { children } = this.baseExport();
17+
return {
18+
type: "tab-folder",
19+
name: this.name,
20+
children
21+
};
22+
}
23+
}

src/main/browser/tabs/objects/tab-group/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
} from "@/browser/tabs/objects/tab-group/controllers";
1010
import { Browser } from "@/browser/browser";
1111
import { TabbedBrowserWindow } from "@/browser/window";
12-
import { ExportedTabGroup } from "@/browser/tabs/objects/tabs-container";
12+
import { ExportedTabGroup } from "@/browser/tabs/objects/tab-containers/base";
1313

1414
type TabGroupTypes = "normal" | "split" | "glance";
1515

0 commit comments

Comments
 (0)