Skip to content

Commit 07125d4

Browse files
authored
refactor: move initialization to left bar (#97)
This PR moves some initialization code from `src/index.ts` to `LeftBar`.
1 parent b88e8a6 commit 07125d4

File tree

9 files changed

+116
-118
lines changed

9 files changed

+116
-118
lines changed

src/context.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
} from "./types/viewportManager";
99
import { Layer } from "./types/devices/device";
1010
import { IpAddress, IpAddressGenerator } from "./packets/ip";
11-
import { layerFromName } from "./types/devices/utils";
11+
import { layerFromName } from "./types/devices/layer";
1212

1313
export class GlobalContext {
1414
private viewport: Viewport = null;

src/graphics/left_bar.ts

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,24 @@
1+
import RouterSvg from "../assets/router.svg";
2+
import ComputerSvg from "../assets/pc.svg";
3+
import { addDevice } from "../types/viewportManager";
4+
import { GlobalContext } from "../context";
5+
import { DeviceType } from "../types/devices/device";
6+
import { Layer, layerFromName } from "../types/devices/layer";
7+
18
export class LeftBar {
29
private leftBar: HTMLElement;
10+
private ctx: GlobalContext;
311

4-
constructor(leftBar: HTMLElement) {
12+
constructor(leftBar: HTMLElement, ctx: GlobalContext) {
513
this.leftBar = leftBar;
14+
this.ctx = ctx;
615
}
716

8-
static getFrom(document: Document) {
9-
return new LeftBar(document.getElementById("left-bar"));
17+
static getFrom(document: Document, ctx: GlobalContext) {
18+
return new LeftBar(document.getElementById("left-bar"), ctx);
1019
}
1120

12-
addButton(src: string, onClick: () => void, label: string) {
21+
private addButton(src: string, onClick: () => void, label: string) {
1322
const button = document.createElement("button");
1423
button.classList.add("icon-button");
1524
button.setAttribute("title", label); // Shows Text
@@ -23,7 +32,29 @@ export class LeftBar {
2332
button.appendChild(img);
2433
}
2534

26-
clear() {
35+
private clear() {
2736
this.leftBar.textContent = "";
2837
}
38+
39+
private addRouterButton() {
40+
const addRouter = () => addDevice(this.ctx, DeviceType.Router);
41+
this.addButton(RouterSvg, addRouter, "Add Router");
42+
}
43+
44+
private addHostButton() {
45+
const addHost = () => addDevice(this.ctx, DeviceType.Host);
46+
this.addButton(ComputerSvg, addHost, "Add Host");
47+
}
48+
49+
setButtonsByLayer(layerName: string) {
50+
this.clear();
51+
52+
const layer = layerFromName(layerName);
53+
54+
this.addHostButton();
55+
56+
if (layer <= Layer.Network) {
57+
this.addRouterButton();
58+
}
59+
}
2960
}

src/index.ts

Lines changed: 26 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,8 @@
11
import { Application, Assets } from "pixi.js";
22

3-
import {
4-
AddDevice,
5-
loadFromFile,
6-
saveToFile,
7-
urManager,
8-
} from "./types/viewportManager";
3+
import { loadFromFile, saveToFile, urManager } from "./types/viewportManager";
94
import { DataGraph } from "./types/graphs/datagraph";
105
import { Packet } from "./types/packet";
11-
import { DeviceType } from "./types/devices/device";
126
import { LeftBar } from "./graphics/left_bar";
137
import { RightBar } from "./graphics/right_bar";
148
import { Viewport } from "./graphics/viewport";
@@ -23,24 +17,29 @@ import PlaySvg from "./assets/play-icon.svg";
2317
import PauseSvg from "./assets/pause-icon.svg";
2418
import UndoSvg from "./assets/left-curve-arrow.svg";
2519
import RedoSvg from "./assets/right-curve-arrow.svg";
26-
import { layerToName } from "./types/devices/utils";
20+
import { layerToName } from "./types/devices/layer";
21+
22+
const assets = [RouterSvg, ComputerSvg, PlaySvg, PauseSvg, UndoSvg, RedoSvg];
23+
24+
async function loadAssets(otherPromises: Promise<void>[]) {
25+
await Promise.all([...otherPromises, ...assets.map((as) => Assets.load(as))]);
26+
}
2727

2828
// IIFE to avoid errors
2929
(async () => {
3030
// Initialization
3131
const app = new Application();
32-
await app.init({
32+
const appInitPromise = app.init({
3333
width: window.innerWidth,
3434
height: window.innerHeight,
3535
resolution: window.devicePixelRatio || 1,
3636
autoDensity: true,
3737
antialias: true,
3838
});
39+
await loadAssets([appInitPromise]);
3940

4041
const canvasPlaceholder = document.getElementById("canvas");
4142
canvasPlaceholder.replaceWith(app.canvas);
42-
await Assets.load(RouterSvg);
43-
await Assets.load(ComputerSvg);
4443

4544
// Background container initialization
4645
const viewport = new Viewport(app.renderer.events);
@@ -56,38 +55,12 @@ import { layerToName } from "./types/devices/utils";
5655

5756
layerSelect.value = layerToName(ctx.getCurrentLayer());
5857

59-
// Left bar logic
60-
const leftBar = LeftBar.getFrom(document);
58+
// Initialize RightBar
6159
RightBar.getInstance();
6260

63-
const addRouterButton = () =>
64-
leftBar.addButton(
65-
RouterSvg,
66-
() => AddDevice(ctx, DeviceType.Router),
67-
"Add Router",
68-
);
69-
70-
const addHostButton = () =>
71-
leftBar.addButton(
72-
ComputerSvg,
73-
() => AddDevice(ctx, DeviceType.Host),
74-
"Add Host",
75-
);
76-
77-
function setButtonsByLayer(layer: string) {
78-
leftBar.clear();
79-
80-
const buttonConfig: Record<string, (() => void)[]> = {
81-
application: [addHostButton],
82-
transport: [addHostButton],
83-
network: [addRouterButton, addHostButton],
84-
link: [addRouterButton, addHostButton],
85-
};
86-
87-
buttonConfig[layer]?.forEach((addButton) => addButton());
88-
}
89-
90-
setButtonsByLayer(layerSelect.value);
61+
// Left bar logic
62+
const leftBar = LeftBar.getFrom(document, ctx);
63+
leftBar.setButtonsByLayer(layerSelect.value);
9164

9265
// Ticker logic
9366
// app.ticker.add(() => { });
@@ -168,22 +141,17 @@ import { layerToName } from "./types/devices/utils";
168141

169142
// Add keyboard shortcuts for Undo (Ctrl+Z) and Redo (Ctrl+Y)
170143
document.addEventListener("keydown", (event) => {
171-
if (!event.ctrlKey) {
172-
return;
173-
}
174-
switch (event.key) {
175-
case "Z": // Ctrl+Shift+Z for Redo
176-
event.preventDefault(); // Prevent default browser action (like undo in text inputs)
177-
triggerRedo();
178-
break;
179-
case "z": // Ctrl+Z for Undo
180-
event.preventDefault(); // Prevent default browser action (like undo in text inputs)
181-
triggerUndo();
182-
break;
183-
case "y": // Ctrl+Y for Redo
184-
event.preventDefault(); // Prevent default browser action
185-
triggerRedo();
186-
break;
144+
if (event.ctrlKey) {
145+
switch (event.key) {
146+
case "z": // Ctrl+Z for Undo
147+
event.preventDefault(); // Prevent default browser action (like undo in text inputs)
148+
triggerUndo();
149+
break;
150+
case "y": // Ctrl+Y for Redo
151+
event.preventDefault(); // Prevent default browser action
152+
triggerRedo();
153+
break;
154+
}
187155
}
188156
});
189157

@@ -223,7 +191,7 @@ import { layerToName } from "./types/devices/utils";
223191
if (selectedLayer) {
224192
ctx.changeViewGraph(selectedLayer);
225193
// LeftBar is reset
226-
setButtonsByLayer(selectedLayer);
194+
leftBar.setButtonsByLayer(selectedLayer);
227195
}
228196
};
229197

src/types/devices/device.ts

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,26 @@ import { DeviceInfo } from "../../graphics/renderables/device_info";
2020
import { IpAddress } from "../../packets/ip";
2121
import { DeviceId } from "../graphs/datagraph";
2222
import { DragDeviceMove, EdgeData, AddEdgeMove } from "../undo-redo";
23+
import { Layer } from "./layer";
2324

24-
export const DEVICE_SIZE = 20;
25+
export { Layer } from "./layer";
2526

26-
export enum Layer {
27-
App = 0,
28-
Transport = 1,
29-
Network = 2,
30-
Link = 3,
31-
}
27+
export const DEVICE_SIZE = 20;
3228

3329
export enum DeviceType {
3430
Router = 0,
3531
Host = 1,
3632
}
3733

34+
export function layerFromType(type: DeviceType) {
35+
switch (type) {
36+
case DeviceType.Router:
37+
return Layer.Network;
38+
case DeviceType.Host:
39+
return Layer.App;
40+
}
41+
}
42+
3843
export abstract class Device extends Sprite {
3944
readonly id: DeviceId;
4045
readonly viewgraph: ViewGraph;

src/types/devices/host.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Device, DeviceType, Layer } from "./device";
1+
import { Device, DeviceType } from "./device";
22
import { ViewGraph } from "../graphs/viewgraph";
33
import PcImage from "../../assets/pc.svg";
44
import { Position } from "../common";
@@ -7,6 +7,7 @@ import { createDropdown, DeviceInfo, RightBar } from "../../graphics/right_bar";
77
import { ProgramInfo } from "../../graphics/renderables/device_info";
88
import { sendPacket } from "../packet";
99
import { Ticker } from "pixi.js";
10+
import { Layer } from "./layer";
1011

1112
const DEFAULT_ECHO_DELAY = 250; // ms
1213

src/types/devices/layer.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
export enum Layer {
2+
Link = 0,
3+
Network = 1,
4+
Transport = 2,
5+
App = 3,
6+
}
7+
8+
const layerFromNameMap: Record<string, Layer> = {
9+
application: Layer.App,
10+
transport: Layer.Transport,
11+
network: Layer.Network,
12+
link: Layer.Link,
13+
};
14+
15+
const layerToNameMap = new Map([
16+
[Layer.App, "application"],
17+
[Layer.Transport, "transport"],
18+
[Layer.Network, "network"],
19+
[Layer.Link, "link"],
20+
]);
21+
22+
export function layerFromName(name: string): Layer {
23+
return layerFromNameMap[name];
24+
}
25+
26+
export function layerToName(layer: Layer): string {
27+
return layerToNameMap.get(layer);
28+
}
29+
30+
export function layerIncluded(layer1: Layer, layer2: Layer) {
31+
// Determines whether layer1 is included within layer2’s abstraction.
32+
return layer1 >= layer2;
33+
}

src/types/devices/utils.ts

Lines changed: 1 addition & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { IpAddress } from "../../packets/ip";
22
import { ViewGraph } from "../graphs/viewgraph";
3-
import { Device, DeviceType, Layer } from "./device";
3+
import { Device, DeviceType } from "./device";
44
import { Host } from "./host";
55
import { Router } from "./router";
66

@@ -28,39 +28,3 @@ export function createDevice(
2828
return new Host(deviceInfo.id, viewgraph, position, ip, mask);
2929
}
3030
}
31-
32-
const layerFromNameMap: Record<string, Layer> = {
33-
application: Layer.App,
34-
transport: Layer.Transport,
35-
network: Layer.Network,
36-
link: Layer.Link,
37-
};
38-
39-
const layerToNameMap = new Map([
40-
[Layer.App, "application"],
41-
[Layer.Transport, "transport"],
42-
[Layer.Network, "network"],
43-
[Layer.Link, "link"],
44-
]);
45-
46-
export function layerFromName(name: string): Layer {
47-
return layerFromNameMap[name];
48-
}
49-
50-
export function layerToName(layer: Layer): string {
51-
return layerToNameMap.get(layer);
52-
}
53-
54-
export function layerIncluded(layer1: Layer, layer2: Layer) {
55-
// Determines whether layer1 is included within layer2’s abstraction.
56-
return layer1.valueOf() <= layer2.valueOf();
57-
}
58-
59-
export function layerFromType(type: DeviceType) {
60-
switch (type) {
61-
case DeviceType.Router:
62-
return Layer.Network;
63-
case DeviceType.Host:
64-
return Layer.App;
65-
}
66-
}

src/types/graphs/viewgraph.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,9 @@ import { Device } from "./../devices/index"; // Import the Device class
22
import { Edge } from "./../edge";
33
import { DataGraph, DeviceId, GraphNode, isRouter } from "./datagraph";
44
import { Viewport } from "../../graphics/viewport";
5-
import { Layer } from "../devices/device";
6-
import {
7-
CreateDevice,
8-
createDevice,
9-
layerFromType,
10-
layerIncluded,
11-
} from "../devices/utils";
5+
import { Layer, layerIncluded } from "../devices/layer";
6+
import { CreateDevice, createDevice } from "../devices/utils";
7+
import { layerFromType } from "../devices/device";
128

139
export type EdgeId = number;
1410

src/types/viewportManager.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,8 @@ document.addEventListener("keydown", (event) => {
105105
});
106106

107107
// Function to add a device at the center of the viewport
108-
export function AddDevice(ctx: GlobalContext, type: DeviceType) {
109-
console.log(`Entered AddDevice with ${type}`);
108+
export function addDevice(ctx: GlobalContext, type: DeviceType) {
109+
console.log(`Entered addDevice with ${type}`);
110110
deselectElement();
111111
const viewgraph = ctx.getViewGraph();
112112
const datagraph = ctx.getDataGraph();

0 commit comments

Comments
 (0)