Skip to content

Commit

Permalink
setting menu on machines
Browse files Browse the repository at this point in the history
  • Loading branch information
msarilar committed May 15, 2024
1 parent bdabd30 commit 3d067c6
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 3 deletions.
3 changes: 2 additions & 1 deletion src/layout/LayoutStyling.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,9 @@ export namespace S {
pointer-events: auto;
`;

export const Node = styled.div<{ background: string; selected: boolean }>`
export const Node = styled.div<{ background: string; selected: boolean; enabled: boolean }>`
background-color: ${(p) => p.background};
opacity: ${(p) => p.enabled ? "1" : "0.5"};
border-radius: 5px;
font-family: sans-serif;
color: white;
Expand Down
63 changes: 61 additions & 2 deletions src/layout/Node.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import * as React from "react";

import SettingsIcon from "@mui/icons-material/Settings";
import { NodeModel, PortModelAlignment, NodeModelGenerics, DiagramEngine } from "@projectstorm/react-diagrams";
import { BaseEvent, AbstractReactFactory, GenerateWidgetEvent, GenerateModelEvent, BasePositionModelOptions } from "@projectstorm/react-canvas-core";

import { Machine, MachineFactory, machineTypeToColor } from "./../machines/Machines";
import { MachinePortLabel, MachinePortModel } from "./Port";
import { S } from "./LayoutStyling";
import { IconButton, Menu, MenuItem } from "@mui/material";

interface DefaultNodeModelOptions extends BasePositionModelOptions {

Expand Down Expand Up @@ -178,13 +180,70 @@ export const MachineNodeWidget: React.FunctionComponent<MachineNodeProps> = prop
props.node.setLocked(!draggable);
}

const [settingsAnchor, setSettingsAnchor] = React.useState<null | HTMLElement>(null);
const open = Boolean(settingsAnchor);
const handleSettingsClose = () => {

setSettingsAnchor(null);
};

const handleSettingsClick = (event: React.MouseEvent<HTMLElement>) => {

setSettingsAnchor(event.currentTarget);
};

const handleDuplicate = () => {

console.log(props.node.machine.getFactory().getType());
const clone = new MachineNodeModel(props.node.machine.getFactory().createMachine(props.node.machine.getState()), props.node.machine.getFactory().getMachineCode());
props.engine.getModel().addNode(clone);
handleSettingsClose();
props.engine.repaintCanvas();
};

const toggleEnabled = () => {

props.node.machine.setEnabled(!props.node.machine.isEnabled());
handleSettingsClose();
props.engine.repaintCanvas();
};

const handleDelete = () => {

Object.keys(props.node.getMachinePorts()).forEach(key => {

const port = props.node.getMachinePorts()[key];

Object.keys(port.getLinks()).forEach(link => port.getLinks()[link].remove());
});

props.engine.getModel().removeNode(props.node);
handleSettingsClose();
props.engine.repaintCanvas();
};

return (
<S.Node
data-default-node-name={props.node.getOptions().name}
selected={props.node.isSelected()}
background={props.node.getOptions().color}>
background={props.node.getOptions().color}
enabled={props.node.machine.isEnabled()}>
<S.Title>
<S.TitleName>{props.node.getOptions().name}</S.TitleName>
<S.TitleName>{props.node.getOptions().name + (props.node.machine.isEnabled() ? "" : " (disabled)")}</S.TitleName>

<IconButton aria-label="settings"
size="small"
style={{margin: 0}}
onClick={handleSettingsClick}>
<SettingsIcon fontSize="inherit" style={{margin: 0, color: "white"}}/>
</IconButton>
<Menu anchorEl={settingsAnchor}
open={open}
onClose={handleSettingsClose}>
<MenuItem style={{margin: 0}} onClick={handleDuplicate}>Duplicate</MenuItem>
<MenuItem style={{margin: 0}} onClick={toggleEnabled}>{props.node.machine.isEnabled() ? "Disable" : "Enable"}</MenuItem>
<MenuItem style={{margin: 0}} onClick={handleDelete}>Delete</MenuItem>
</Menu>
</S.Title>
<S.Ports>
<S.PortsContainer>{Object.values(props.node.getInPorts()).map(generatePort)}</S.PortsContainer>
Expand Down
5 changes: 5 additions & 0 deletions src/machines/MachineRoutings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,11 @@ export class MachineRoutings {

const callback = (e: MachineMessage) => {

if (!target.isEnabled()) {

return;
}

const port = link.getTargetPort() as MachinePortModel;
port.setSending(true);
try {
Expand Down
18 changes: 18 additions & 0 deletions src/machines/Machines.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ export interface Machine {
setNode(node: MachineNodeModel): void;
getState(): any;
getFactory(): MachineFactory;
isEnabled(): boolean;
setEnabled(enabled: boolean): void;
}

export interface CustomNodeWidgetProps<T extends Machine> {
Expand All @@ -39,6 +41,7 @@ export abstract class AbstractMachine extends EventTarget implements Machine {
private static counters: { [machineName: string]: number } = {};
abstract getState(): any;
private readonly node: MachineNodeModel;
private enabled: boolean = true;
getNode(): MachineNodeModel {

return this.node;
Expand All @@ -65,6 +68,16 @@ export abstract class AbstractMachine extends EventTarget implements Machine {
this.node = new MachineNodeModel(this, (factory ?? this.getFactory()).getMachineCode(), factory);
}

isEnabled(): boolean {

return this.enabled;
}

setEnabled(enabled: boolean): void {

this.enabled = enabled;
}

getId() {

return this.id;
Expand All @@ -76,6 +89,11 @@ export abstract class AbstractMachine extends EventTarget implements Machine {
setEmit(emit: (messageEvent: MachineMessage, channel: number) => void) { this.emitter = emit; }
emit(messageEvent: MachineMessage, channel: number) {

if (!this.enabled) {

return;
}

(this.machineNode ?? this.getNode()).getOutPorts()[channel]?.setSending(true);
this.emitter?.(messageEvent, channel);
};
Expand Down

0 comments on commit 3d067c6

Please sign in to comment.