Skip to content

Commit bf0fdcc

Browse files
authored
Merge pull request #68 from kieler/jep/edgeLabels
added background for edge labels to make them more readable
2 parents e6484a2 + 28bf840 commit bf0fdcc

File tree

4 files changed

+38
-13
lines changed

4 files changed

+38
-13
lines changed

extension/src-webview/css/diagram.css

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@
2222
@import "./fta-diagram.css";
2323
@import "./context-menu.css";
2424

25+
.label-background {
26+
fill: white;
27+
stroke: none;
28+
opacity: 0.8;
29+
}
30+
2531
.collapse-expand-triangle {
2632
fill: darkgrey;
2733
}

extension/src-webview/fta/fta-views.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import { injectable } from 'inversify';
2020
import { VNode } from "snabbdom";
2121
import { IViewArgs, PolylineEdgeView, RectangularNodeView, RenderingContext, SEdgeImpl, SGraphImpl, SGraphView, svg } from 'sprotty';
2222
import { Point } from "sprotty-protocol";
23-
import { renderAndGate, renderEllipse, renderHorizontalLine, renderInhibitGate, renderKnGate, renderOrGate, renderRectangle, renderRoundedRectangle, renderVerticalLine } from "../views-rendering";
23+
import { renderAndGate, renderEllipse, renderHorizontalLine, renderInhibitGate, renderKnGate, renderOrGate, renderRectangleForNode, renderRoundedRectangle, renderVerticalLine } from "../views-rendering";
2424
import { DescriptionNode, FTAEdge, FTAGraph, FTANode, FTAPort, FTA_DESCRIPTION_NODE_TYPE, FTA_EDGE_TYPE, FTA_NODE_TYPE, FTA_PORT_TYPE, FTNodeType } from './fta-model';
2525

2626
@injectable()
@@ -58,7 +58,7 @@ export class FTAInvisibleEdgeView extends PolylineArrowEdgeViewFTA {
5858
export class DescriptionNodeView extends RectangularNodeView {
5959
render(node: DescriptionNode, context: RenderingContext): VNode | undefined {
6060
// render the description node similar to an on edge label
61-
const element = renderRectangle(node);
61+
const element = renderRectangleForNode(node);
6262
const border1 = renderHorizontalLine(node);
6363
const border2 = renderHorizontalLine(node);
6464
const edge = renderVerticalLine(node);
@@ -93,7 +93,7 @@ export class FTANodeView extends RectangularNodeView {
9393
{context.renderChildren(node)}
9494
</g>;
9595
case FTNodeType.TOPEVENT:
96-
element = renderRectangle(node);
96+
element = renderRectangleForNode(node);
9797
break;
9898
case FTNodeType.COMPONENT:
9999
case FTNodeType.CONDITION:
@@ -112,7 +112,7 @@ export class FTANodeView extends RectangularNodeView {
112112
element = renderInhibitGate(node);
113113
break;
114114
default:
115-
element = renderRectangle(node);
115+
element = renderRectangleForNode(node);
116116
break;
117117
}
118118

extension/src-webview/stpa/stpa-views.tsx

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import { Point, toDegrees } from "sprotty-protocol";
2323
import { DISymbol } from '../di.symbols';
2424
import { ColorStyleOption, DifferentFormsOption, FeedbackStyleOption, RenderOptionsRegistry, dottedFeedback, lightGreyFeedback } from '../options/render-options-registry';
2525
import { SendModelRendererAction } from '../snippets/actions';
26-
import { renderCollapseIcon, renderDiamond, renderEllipse, renderExpandIcon, renderHexagon, renderMirroredTriangle, renderOval, renderPentagon, renderRectangle, renderRoundedRectangle, renderTrapez, renderTriangle } from '../views-rendering';
26+
import { renderCollapseIcon, renderDiamond, renderEllipse, renderExpandIcon, renderHexagon, renderMirroredTriangle, renderOval, renderPentagon, renderRectangle, renderRectangleForNode, renderRoundedRectangle, renderTrapez, renderTriangle } from '../views-rendering';
2727
import { collectAllChildren } from './helper-methods';
2828
import { CSEdge, CSNode, CS_EDGE_TYPE, CS_INTERMEDIATE_EDGE_TYPE, CS_NODE_TYPE, EdgeType, STPAAspect, STPAEdge, STPANode, STPA_EDGE_TYPE, STPA_INTERMEDIATE_EDGE_TYPE } from './stpa-model';
2929

@@ -179,7 +179,7 @@ export class STPANodeView extends RectangularNodeView {
179179
element = renderTrapez(node);
180180
break;
181181
case STPAAspect.HAZARD:
182-
element = renderRectangle(node);
182+
element = renderRectangleForNode(node);
183183
break;
184184
case STPAAspect.SYSTEMCONSTRAINT:
185185
element = renderHexagon(node);
@@ -200,7 +200,7 @@ export class STPANodeView extends RectangularNodeView {
200200
element = renderDiamond(node);
201201
break;
202202
default:
203-
element = renderRectangle(node);
203+
element = renderRectangleForNode(node);
204204
break;
205205
}
206206
} else if (lessColoredNode) {
@@ -210,7 +210,7 @@ export class STPANodeView extends RectangularNodeView {
210210
case STPAAspect.SYSTEMCONSTRAINT:
211211
case STPAAspect.UCA:
212212
case STPAAspect.SCENARIO:
213-
element = renderRectangle(node);
213+
element = renderRectangleForNode(node);
214214
break;
215215
case STPAAspect.HAZARD:
216216
case STPAAspect.RESPONSIBILITY:
@@ -219,11 +219,11 @@ export class STPANodeView extends RectangularNodeView {
219219
element = renderRoundedRectangle(node);
220220
break;
221221
default:
222-
element = renderRectangle(node);
222+
element = renderRectangleForNode(node);
223223
break;
224224
}
225225
} else {
226-
element = renderRectangle(node);
226+
element = renderRectangleForNode(node);
227227
}
228228

229229
// if an STPANode is selected, the components not connected to it should fade out
@@ -344,8 +344,12 @@ export class EdgeLabelView extends SLabelView {
344344
if (vnode?.data?.class) {
345345
vnode.data.class['missing-feedback-label'] = missingFeedbackLabel ?? false;
346346
}
347-
348-
return vnode;
347+
// add a background to the label to make it better readable
348+
const background = renderRectangle(0, 2-label.bounds.height, label.bounds.width, label.bounds.height);
349+
return <g>
350+
<g class-label-background={true}>{background}</g>
351+
{vnode}
352+
</g>;
349353
}
350354
}
351355

extension/src-webview/views-rendering.tsx

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,28 @@ export function renderEllipse(x: number | undefined, y: number | undefined, widt
5656
* @param node The node that should be represented by a rectangle.
5757
* @returns A rectangle for {@code node}.
5858
*/
59-
export function renderRectangle(node: SNodeImpl): VNode {
59+
export function renderRectangleForNode(node: SNodeImpl): VNode {
6060
return <rect
6161
x="0" y="0"
6262
width={Math.max(node.size.width, 0)} height={Math.max(node.size.height, 0)}
6363
/>;
6464
}
6565

66+
/**
67+
* Creates a rectangle for with the given parameters.
68+
* @param x The x-coordinate of the rectangle.
69+
* @param y The y-coordinate of the rectangle.
70+
* @param width The width of the rectangle.
71+
* @param height The height of the rectangle.
72+
* @returns A rectangle with the given parameters.
73+
*/
74+
export function renderRectangle(x: number, y: number, width: number, height: number): VNode {
75+
return <rect
76+
x={x} y={y}
77+
width={Math.max(width, 0)} height={Math.max(height, 0)}
78+
/>;
79+
}
80+
6681
export function renderPort(x:number, y: number, width: number, height: number): VNode {
6782
return <rect
6883
x={x} y={y}

0 commit comments

Comments
 (0)