@teachinglab/omd 0.6.0 → 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +257 -251
- package/README.old.md +137 -137
- package/canvas/core/canvasConfig.js +202 -202
- package/canvas/drawing/segment.js +167 -167
- package/canvas/drawing/stroke.js +385 -385
- package/canvas/events/eventManager.js +444 -444
- package/canvas/events/pointerEventHandler.js +262 -262
- package/canvas/index.js +48 -48
- package/canvas/tools/PointerTool.js +71 -71
- package/canvas/tools/tool.js +222 -222
- package/canvas/utils/boundingBox.js +377 -377
- package/canvas/utils/mathUtils.js +258 -258
- package/docs/api/configuration-options.md +198 -198
- package/docs/api/eventManager.md +82 -82
- package/docs/api/focusFrameManager.md +144 -144
- package/docs/api/index.md +105 -105
- package/docs/api/main.md +62 -62
- package/docs/api/omdBinaryExpressionNode.md +86 -86
- package/docs/api/omdCanvas.md +83 -83
- package/docs/api/omdConfigManager.md +112 -112
- package/docs/api/omdConstantNode.md +52 -52
- package/docs/api/omdDisplay.md +87 -87
- package/docs/api/omdEquationNode.md +174 -174
- package/docs/api/omdEquationSequenceNode.md +258 -258
- package/docs/api/omdEquationStack.md +192 -192
- package/docs/api/omdFunctionNode.md +82 -82
- package/docs/api/omdGroupNode.md +78 -78
- package/docs/api/omdHelpers.md +87 -87
- package/docs/api/omdLeafNode.md +85 -85
- package/docs/api/omdNode.md +201 -201
- package/docs/api/omdOperationDisplayNode.md +117 -117
- package/docs/api/omdOperatorNode.md +91 -91
- package/docs/api/omdParenthesisNode.md +133 -133
- package/docs/api/omdPopup.md +191 -191
- package/docs/api/omdPowerNode.md +131 -131
- package/docs/api/omdRationalNode.md +144 -144
- package/docs/api/omdSequenceNode.md +128 -128
- package/docs/api/omdSimplification.md +78 -78
- package/docs/api/omdSqrtNode.md +144 -144
- package/docs/api/omdStepVisualizer.md +146 -146
- package/docs/api/omdStepVisualizerHighlighting.md +65 -65
- package/docs/api/omdStepVisualizerInteractiveSteps.md +108 -108
- package/docs/api/omdStepVisualizerLayout.md +70 -70
- package/docs/api/omdStepVisualizerNodeUtils.md +140 -140
- package/docs/api/omdStepVisualizerTextBoxes.md +76 -76
- package/docs/api/omdToolbar.md +130 -130
- package/docs/api/omdTranscriptionService.md +95 -95
- package/docs/api/omdTreeDiff.md +169 -169
- package/docs/api/omdUnaryExpressionNode.md +137 -137
- package/docs/api/omdUtilities.md +82 -82
- package/docs/api/omdVariableNode.md +123 -123
- package/docs/api/selectTool.md +74 -74
- package/docs/api/simplificationEngine.md +97 -97
- package/docs/api/simplificationRules.md +76 -76
- package/docs/api/simplificationUtils.md +64 -64
- package/docs/api/transcribe.md +43 -43
- package/docs/api-reference.md +85 -85
- package/docs/index.html +453 -453
- package/docs/index.md +38 -38
- package/docs/omd-objects.md +258 -258
- package/index.js +79 -79
- package/jsvg/index.js +3 -0
- package/jsvg/jsvg.js +898 -898
- package/jsvg/jsvgComponents.js +357 -358
- package/npm-docs/DOCUMENTATION_SUMMARY.md +220 -220
- package/npm-docs/README.md +251 -251
- package/npm-docs/api/api-reference.md +85 -85
- package/npm-docs/api/configuration-options.md +198 -198
- package/npm-docs/api/eventManager.md +82 -82
- package/npm-docs/api/expression-nodes.md +561 -561
- package/npm-docs/api/focusFrameManager.md +144 -144
- package/npm-docs/api/index.md +105 -105
- package/npm-docs/api/main.md +62 -62
- package/npm-docs/api/omdBinaryExpressionNode.md +86 -86
- package/npm-docs/api/omdCanvas.md +83 -83
- package/npm-docs/api/omdConfigManager.md +112 -112
- package/npm-docs/api/omdConstantNode.md +52 -52
- package/npm-docs/api/omdDisplay.md +87 -87
- package/npm-docs/api/omdEquationNode.md +174 -174
- package/npm-docs/api/omdEquationSequenceNode.md +258 -258
- package/npm-docs/api/omdEquationStack.md +192 -192
- package/npm-docs/api/omdFunctionNode.md +82 -82
- package/npm-docs/api/omdGroupNode.md +78 -78
- package/npm-docs/api/omdHelpers.md +87 -87
- package/npm-docs/api/omdLeafNode.md +85 -85
- package/npm-docs/api/omdNode.md +201 -201
- package/npm-docs/api/omdOperationDisplayNode.md +117 -117
- package/npm-docs/api/omdOperatorNode.md +91 -91
- package/npm-docs/api/omdParenthesisNode.md +133 -133
- package/npm-docs/api/omdPopup.md +191 -191
- package/npm-docs/api/omdPowerNode.md +131 -131
- package/npm-docs/api/omdRationalNode.md +144 -144
- package/npm-docs/api/omdSequenceNode.md +128 -128
- package/npm-docs/api/omdSimplification.md +78 -78
- package/npm-docs/api/omdSqrtNode.md +144 -144
- package/npm-docs/api/omdStepVisualizer.md +146 -146
- package/npm-docs/api/omdStepVisualizerHighlighting.md +65 -65
- package/npm-docs/api/omdStepVisualizerInteractiveSteps.md +108 -108
- package/npm-docs/api/omdStepVisualizerLayout.md +70 -70
- package/npm-docs/api/omdStepVisualizerNodeUtils.md +140 -140
- package/npm-docs/api/omdStepVisualizerTextBoxes.md +76 -76
- package/npm-docs/api/omdToolbar.md +130 -130
- package/npm-docs/api/omdTranscriptionService.md +95 -95
- package/npm-docs/api/omdTreeDiff.md +169 -169
- package/npm-docs/api/omdUnaryExpressionNode.md +137 -137
- package/npm-docs/api/omdUtilities.md +82 -82
- package/npm-docs/api/omdVariableNode.md +123 -123
- package/npm-docs/api/selectTool.md +74 -74
- package/npm-docs/api/simplificationEngine.md +97 -97
- package/npm-docs/api/simplificationRules.md +76 -76
- package/npm-docs/api/simplificationUtils.md +64 -64
- package/npm-docs/api/transcribe.md +43 -43
- package/npm-docs/guides/equations.md +854 -854
- package/npm-docs/guides/factory-functions.md +354 -354
- package/npm-docs/guides/getting-started.md +318 -318
- package/npm-docs/guides/quick-examples.md +525 -525
- package/npm-docs/guides/visualizations.md +682 -682
- package/npm-docs/index.html +12 -0
- package/npm-docs/json-schemas.md +826 -826
- package/omd/config/omdConfigManager.js +279 -267
- package/omd/core/index.js +158 -158
- package/omd/core/omdEquationStack.js +546 -546
- package/omd/core/omdUtilities.js +113 -113
- package/omd/display/omdDisplay.js +969 -962
- package/omd/display/omdToolbar.js +501 -501
- package/omd/nodes/omdBinaryExpressionNode.js +459 -459
- package/omd/nodes/omdConstantNode.js +141 -141
- package/omd/nodes/omdEquationNode.js +1327 -1327
- package/omd/nodes/omdFunctionNode.js +351 -351
- package/omd/nodes/omdGroupNode.js +67 -67
- package/omd/nodes/omdLeafNode.js +76 -76
- package/omd/nodes/omdNode.js +556 -556
- package/omd/nodes/omdOperationDisplayNode.js +321 -321
- package/omd/nodes/omdOperatorNode.js +108 -108
- package/omd/nodes/omdParenthesisNode.js +292 -292
- package/omd/nodes/omdPowerNode.js +235 -235
- package/omd/nodes/omdRationalNode.js +295 -295
- package/omd/nodes/omdSqrtNode.js +307 -307
- package/omd/nodes/omdUnaryExpressionNode.js +227 -227
- package/omd/nodes/omdVariableNode.js +122 -122
- package/omd/simplification/omdSimplification.js +140 -140
- package/omd/simplification/omdSimplificationEngine.js +887 -887
- package/omd/simplification/package.json +5 -5
- package/omd/simplification/rules/binaryRules.js +1037 -1037
- package/omd/simplification/rules/functionRules.js +111 -111
- package/omd/simplification/rules/index.js +48 -48
- package/omd/simplification/rules/parenthesisRules.js +19 -19
- package/omd/simplification/rules/powerRules.js +143 -143
- package/omd/simplification/rules/rationalRules.js +725 -725
- package/omd/simplification/rules/sqrtRules.js +48 -48
- package/omd/simplification/rules/unaryRules.js +37 -37
- package/omd/simplification/simplificationRules.js +31 -31
- package/omd/simplification/simplificationUtils.js +1055 -1055
- package/omd/step-visualizer/omdStepVisualizer.js +947 -947
- package/omd/step-visualizer/omdStepVisualizerHighlighting.js +246 -246
- package/omd/step-visualizer/omdStepVisualizerLayout.js +892 -892
- package/omd/step-visualizer/omdStepVisualizerTextBoxes.js +200 -200
- package/omd/utils/aiNextEquationStep.js +106 -106
- package/omd/utils/omdNodeOverlay.js +638 -638
- package/omd/utils/omdPopup.js +1203 -1203
- package/omd/utils/omdStepVisualizerInteractiveSteps.js +684 -684
- package/omd/utils/omdStepVisualizerNodeUtils.js +267 -267
- package/omd/utils/omdTranscriptionService.js +123 -123
- package/omd/utils/omdTreeDiff.js +733 -733
- package/package.json +59 -56
- package/readme.html +184 -120
- package/src/index.js +74 -74
- package/src/json-schemas.md +576 -576
- package/src/omd-json-samples.js +147 -147
- package/src/omdApp.js +391 -391
- package/src/omdAppCanvas.js +335 -335
- package/src/omdBalanceHanger.js +199 -199
- package/src/omdColor.js +13 -13
- package/src/omdCoordinatePlane.js +541 -541
- package/src/omdExpression.js +115 -115
- package/src/omdFactory.js +150 -150
- package/src/omdFunction.js +114 -114
- package/src/omdMetaExpression.js +290 -290
- package/src/omdNaturalExpression.js +563 -563
- package/src/omdNode.js +383 -383
- package/src/omdNumber.js +52 -52
- package/src/omdNumberLine.js +114 -112
- package/src/omdNumberTile.js +118 -118
- package/src/omdOperator.js +72 -72
- package/src/omdPowerExpression.js +91 -91
- package/src/omdProblem.js +259 -259
- package/src/omdRatioChart.js +251 -251
- package/src/omdRationalExpression.js +114 -114
- package/src/omdSampleData.js +215 -215
- package/src/omdShapes.js +512 -512
- package/src/omdSpinner.js +151 -151
- package/src/omdString.js +49 -49
- package/src/omdTable.js +498 -498
- package/src/omdTapeDiagram.js +244 -244
- package/src/omdTerm.js +91 -91
- package/src/omdTileEquation.js +349 -349
- package/src/omdUtils.js +84 -84
- package/src/omdVariable.js +51 -51
package/src/omdBalanceHanger.js
CHANGED
|
@@ -1,200 +1,200 @@
|
|
|
1
|
-
|
|
2
|
-
import { omdColor } from "./omdColor.js";
|
|
3
|
-
import { jsvgGroup, jsvgLine, jsvgEllipse, jsvgRect, jsvgTextBox } from "@teachinglab/jsvg";
|
|
4
|
-
|
|
5
|
-
export class omdBalanceHanger extends jsvgGroup
|
|
6
|
-
{
|
|
7
|
-
constructor()
|
|
8
|
-
{
|
|
9
|
-
// initialization
|
|
10
|
-
super();
|
|
11
|
-
|
|
12
|
-
this.type = "omdBalanceHanger";
|
|
13
|
-
|
|
14
|
-
this.leftValues = [];
|
|
15
|
-
this.rightValues = [];
|
|
16
|
-
this.tilt = "none";
|
|
17
|
-
this.fontFamily = "Albert Sans";
|
|
18
|
-
this.fontSize = 18;
|
|
19
|
-
|
|
20
|
-
// Background customization properties
|
|
21
|
-
this.backgroundColor = omdColor.lightGray;
|
|
22
|
-
this.backgroundCornerRadius = 5;
|
|
23
|
-
this.backgroundOpacity = 1.0;
|
|
24
|
-
this.showBackground = true;
|
|
25
|
-
|
|
26
|
-
this.updateLayout();
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
loadFromJSON( data )
|
|
30
|
-
{
|
|
31
|
-
if ( typeof data.leftValues != "undefined" )
|
|
32
|
-
this.leftValues = data.leftValues;
|
|
33
|
-
|
|
34
|
-
if ( typeof data.rightValues != "undefined" )
|
|
35
|
-
this.rightValues = data.rightValues;
|
|
36
|
-
|
|
37
|
-
if ( typeof data.tilt != "undefined" )
|
|
38
|
-
this.tilt = data.tilt;
|
|
39
|
-
|
|
40
|
-
if ( typeof data.fontFamily != "undefined" )
|
|
41
|
-
this.fontFamily = data.fontFamily;
|
|
42
|
-
|
|
43
|
-
if ( typeof data.fontSize != "undefined" )
|
|
44
|
-
this.fontSize = data.fontSize;
|
|
45
|
-
|
|
46
|
-
// Load background customization properties
|
|
47
|
-
if ( typeof data.backgroundColor != "undefined" )
|
|
48
|
-
this.backgroundColor = data.backgroundColor;
|
|
49
|
-
if ( typeof data.backgroundCornerRadius != "undefined" )
|
|
50
|
-
this.backgroundCornerRadius = data.backgroundCornerRadius;
|
|
51
|
-
if ( typeof data.backgroundOpacity != "undefined" )
|
|
52
|
-
this.backgroundOpacity = data.backgroundOpacity;
|
|
53
|
-
if ( typeof data.showBackground != "undefined" )
|
|
54
|
-
this.showBackground = data.showBackground;
|
|
55
|
-
|
|
56
|
-
this.updateLayout();
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
setLeftAndRightValues( leftValues, rightValues )
|
|
60
|
-
{
|
|
61
|
-
this.leftValues = leftValues;
|
|
62
|
-
this.rightValues = rightValues;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
updateLayout()
|
|
66
|
-
{
|
|
67
|
-
this.removeAllChildren();
|
|
68
|
-
|
|
69
|
-
// Calculate actual content dimensions
|
|
70
|
-
var maxValues = Math.max(this.leftValues.length, this.rightValues.length);
|
|
71
|
-
var bX = 50; // Half beam width
|
|
72
|
-
var bY = 0;
|
|
73
|
-
|
|
74
|
-
if ( this.tilt == "left" )
|
|
75
|
-
bY = -10;
|
|
76
|
-
if ( this.tilt == "right" )
|
|
77
|
-
bY = 10;
|
|
78
|
-
|
|
79
|
-
var slackOnTop = 20;
|
|
80
|
-
var valueStackHeight = maxValues > 0 ? (maxValues - 1) * 40 + 30 : 0; // Height of value stacks
|
|
81
|
-
|
|
82
|
-
// Calculate the actual content bounds
|
|
83
|
-
var contentWidth = bX * 2; // Total beam width
|
|
84
|
-
var contentHeight = Math.abs(bY) + slackOnTop + valueStackHeight;
|
|
85
|
-
|
|
86
|
-
// make line (centered at origin)
|
|
87
|
-
this.line = new jsvgLine();
|
|
88
|
-
this.line.setStrokeColor( "black" );
|
|
89
|
-
this.line.setStrokeWidth( 1 );
|
|
90
|
-
this.line.setEndpoints( -bX, bY, bX, -bY );
|
|
91
|
-
this.addChild( this.line );
|
|
92
|
-
|
|
93
|
-
// left line
|
|
94
|
-
var leftLine = new jsvgLine();
|
|
95
|
-
leftLine.setStrokeColor( "black" );
|
|
96
|
-
leftLine.setStrokeWidth( 1 );
|
|
97
|
-
leftLine.setEndpoints( -bX, bY, -bX, bY + slackOnTop + 40*(this.leftValues.length-1) );
|
|
98
|
-
this.addChild( leftLine );
|
|
99
|
-
|
|
100
|
-
// right line
|
|
101
|
-
var right = new jsvgLine();
|
|
102
|
-
right.setStrokeColor( "black" );
|
|
103
|
-
right.setStrokeWidth( 1 );
|
|
104
|
-
right.setEndpoints( bX, -bY, bX, -bY + slackOnTop + 40*(this.rightValues.length-1) );
|
|
105
|
-
this.addChild( right );
|
|
106
|
-
|
|
107
|
-
// center dot (centered at origin)
|
|
108
|
-
var dot = new jsvgEllipse();
|
|
109
|
-
dot.setWidthAndHeight( 10, 10 );
|
|
110
|
-
dot.setFillColor( "black" );
|
|
111
|
-
dot.setPosition( 0, 0 ); // Ellipse is centered at its transform; origin aligns with beam midpoint
|
|
112
|
-
this.addChild( dot );
|
|
113
|
-
|
|
114
|
-
this.makeValueStack( this.leftValues, -bX, bY + slackOnTop );
|
|
115
|
-
this.makeValueStack( this.rightValues, bX, -bY + slackOnTop );
|
|
116
|
-
|
|
117
|
-
// Choose a comfortable display size and center the view on origin
|
|
118
|
-
const padding = 40;
|
|
119
|
-
const displayWidth = Math.max(300, contentWidth + padding);
|
|
120
|
-
const displayHeight = Math.max(200, contentHeight + padding);
|
|
121
|
-
this.setWidthAndHeight(displayWidth, displayHeight);
|
|
122
|
-
this.svgObject.setAttribute("viewBox", `${-displayWidth/2} ${-displayHeight/2} ${displayWidth} ${displayHeight}`);
|
|
123
|
-
// Don't set position since the viewBox already handles centering
|
|
124
|
-
// this.setPosition(-displayWidth / 2, -displayHeight / 2);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
makeValueStack( values, xOffset, yOffset )
|
|
128
|
-
{
|
|
129
|
-
// make boxes on each side
|
|
130
|
-
for( var i=0; i<values.length; i++ )
|
|
131
|
-
{
|
|
132
|
-
// get value
|
|
133
|
-
var value = values[i];
|
|
134
|
-
var W = 30;
|
|
135
|
-
if ( typeof value == "string" )
|
|
136
|
-
{
|
|
137
|
-
W = 20 + value.length*10;
|
|
138
|
-
}
|
|
139
|
-
else
|
|
140
|
-
{
|
|
141
|
-
W = 30;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
// make box
|
|
145
|
-
var box;
|
|
146
|
-
if ( typeof value == "string" )
|
|
147
|
-
{
|
|
148
|
-
box = new jsvgEllipse();
|
|
149
|
-
box.setWidthAndHeight( W, 30 );
|
|
150
|
-
box.setPosition( xOffset-W/2 + W/2, yOffset + i*40 + 15);
|
|
151
|
-
}
|
|
152
|
-
else
|
|
153
|
-
{
|
|
154
|
-
box = new jsvgRect();
|
|
155
|
-
box.setWidthAndHeight( W, 30 );
|
|
156
|
-
box.setCornerRadius(5);
|
|
157
|
-
box.setPosition( xOffset-W/2, yOffset + i*40 );
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
// Apply customizable background properties
|
|
161
|
-
if (this.showBackground) {
|
|
162
|
-
box.setFillColor(this.backgroundColor);
|
|
163
|
-
if (this.backgroundOpacity < 1.0) {
|
|
164
|
-
box.setOpacity(this.backgroundOpacity);
|
|
165
|
-
}
|
|
166
|
-
} else {
|
|
167
|
-
box.setFillColor("transparent");
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
// Only apply corner radius to rectangular boxes (jsvgRect), not ellipses
|
|
171
|
-
if (this.backgroundCornerRadius > 0 && box.setCornerRadius) {
|
|
172
|
-
box.setCornerRadius(this.backgroundCornerRadius);
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
this.addChild( box );
|
|
176
|
-
|
|
177
|
-
// make box text
|
|
178
|
-
var boxText = new jsvgTextBox();
|
|
179
|
-
boxText.setWidthAndHeight( W,30 );
|
|
180
|
-
boxText.setText ( this.name );
|
|
181
|
-
boxText.setFontFamily( this.fontFamily );
|
|
182
|
-
boxText.setFontColor( "black" );
|
|
183
|
-
boxText.setFontSize( this.fontSize );
|
|
184
|
-
boxText.setAlignment("center");
|
|
185
|
-
boxText.setVerticalCentering();
|
|
186
|
-
boxText.setText( value );
|
|
187
|
-
boxText.setPosition( xOffset-W/2, yOffset + i*40 );
|
|
188
|
-
this.addChild( boxText );
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
setFont( fontFamily, fontSize )
|
|
193
|
-
{
|
|
194
|
-
this.fontFamily = fontFamily;
|
|
195
|
-
if ( fontSize )
|
|
196
|
-
this.fontSize = fontSize;
|
|
197
|
-
this.updateLayout();
|
|
198
|
-
}
|
|
199
|
-
|
|
1
|
+
|
|
2
|
+
import { omdColor } from "./omdColor.js";
|
|
3
|
+
import { jsvgGroup, jsvgLine, jsvgEllipse, jsvgRect, jsvgTextBox } from "@teachinglab/jsvg";
|
|
4
|
+
|
|
5
|
+
export class omdBalanceHanger extends jsvgGroup
|
|
6
|
+
{
|
|
7
|
+
constructor()
|
|
8
|
+
{
|
|
9
|
+
// initialization
|
|
10
|
+
super();
|
|
11
|
+
|
|
12
|
+
this.type = "omdBalanceHanger";
|
|
13
|
+
|
|
14
|
+
this.leftValues = [];
|
|
15
|
+
this.rightValues = [];
|
|
16
|
+
this.tilt = "none";
|
|
17
|
+
this.fontFamily = "Albert Sans";
|
|
18
|
+
this.fontSize = 18;
|
|
19
|
+
|
|
20
|
+
// Background customization properties
|
|
21
|
+
this.backgroundColor = omdColor.lightGray;
|
|
22
|
+
this.backgroundCornerRadius = 5;
|
|
23
|
+
this.backgroundOpacity = 1.0;
|
|
24
|
+
this.showBackground = true;
|
|
25
|
+
|
|
26
|
+
this.updateLayout();
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
loadFromJSON( data )
|
|
30
|
+
{
|
|
31
|
+
if ( typeof data.leftValues != "undefined" )
|
|
32
|
+
this.leftValues = data.leftValues;
|
|
33
|
+
|
|
34
|
+
if ( typeof data.rightValues != "undefined" )
|
|
35
|
+
this.rightValues = data.rightValues;
|
|
36
|
+
|
|
37
|
+
if ( typeof data.tilt != "undefined" )
|
|
38
|
+
this.tilt = data.tilt;
|
|
39
|
+
|
|
40
|
+
if ( typeof data.fontFamily != "undefined" )
|
|
41
|
+
this.fontFamily = data.fontFamily;
|
|
42
|
+
|
|
43
|
+
if ( typeof data.fontSize != "undefined" )
|
|
44
|
+
this.fontSize = data.fontSize;
|
|
45
|
+
|
|
46
|
+
// Load background customization properties
|
|
47
|
+
if ( typeof data.backgroundColor != "undefined" )
|
|
48
|
+
this.backgroundColor = data.backgroundColor;
|
|
49
|
+
if ( typeof data.backgroundCornerRadius != "undefined" )
|
|
50
|
+
this.backgroundCornerRadius = data.backgroundCornerRadius;
|
|
51
|
+
if ( typeof data.backgroundOpacity != "undefined" )
|
|
52
|
+
this.backgroundOpacity = data.backgroundOpacity;
|
|
53
|
+
if ( typeof data.showBackground != "undefined" )
|
|
54
|
+
this.showBackground = data.showBackground;
|
|
55
|
+
|
|
56
|
+
this.updateLayout();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
setLeftAndRightValues( leftValues, rightValues )
|
|
60
|
+
{
|
|
61
|
+
this.leftValues = leftValues;
|
|
62
|
+
this.rightValues = rightValues;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
updateLayout()
|
|
66
|
+
{
|
|
67
|
+
this.removeAllChildren();
|
|
68
|
+
|
|
69
|
+
// Calculate actual content dimensions
|
|
70
|
+
var maxValues = Math.max(this.leftValues.length, this.rightValues.length);
|
|
71
|
+
var bX = 50; // Half beam width
|
|
72
|
+
var bY = 0;
|
|
73
|
+
|
|
74
|
+
if ( this.tilt == "left" )
|
|
75
|
+
bY = -10;
|
|
76
|
+
if ( this.tilt == "right" )
|
|
77
|
+
bY = 10;
|
|
78
|
+
|
|
79
|
+
var slackOnTop = 20;
|
|
80
|
+
var valueStackHeight = maxValues > 0 ? (maxValues - 1) * 40 + 30 : 0; // Height of value stacks
|
|
81
|
+
|
|
82
|
+
// Calculate the actual content bounds
|
|
83
|
+
var contentWidth = bX * 2; // Total beam width
|
|
84
|
+
var contentHeight = Math.abs(bY) + slackOnTop + valueStackHeight;
|
|
85
|
+
|
|
86
|
+
// make line (centered at origin)
|
|
87
|
+
this.line = new jsvgLine();
|
|
88
|
+
this.line.setStrokeColor( "black" );
|
|
89
|
+
this.line.setStrokeWidth( 1 );
|
|
90
|
+
this.line.setEndpoints( -bX, bY, bX, -bY );
|
|
91
|
+
this.addChild( this.line );
|
|
92
|
+
|
|
93
|
+
// left line
|
|
94
|
+
var leftLine = new jsvgLine();
|
|
95
|
+
leftLine.setStrokeColor( "black" );
|
|
96
|
+
leftLine.setStrokeWidth( 1 );
|
|
97
|
+
leftLine.setEndpoints( -bX, bY, -bX, bY + slackOnTop + 40*(this.leftValues.length-1) );
|
|
98
|
+
this.addChild( leftLine );
|
|
99
|
+
|
|
100
|
+
// right line
|
|
101
|
+
var right = new jsvgLine();
|
|
102
|
+
right.setStrokeColor( "black" );
|
|
103
|
+
right.setStrokeWidth( 1 );
|
|
104
|
+
right.setEndpoints( bX, -bY, bX, -bY + slackOnTop + 40*(this.rightValues.length-1) );
|
|
105
|
+
this.addChild( right );
|
|
106
|
+
|
|
107
|
+
// center dot (centered at origin)
|
|
108
|
+
var dot = new jsvgEllipse();
|
|
109
|
+
dot.setWidthAndHeight( 10, 10 );
|
|
110
|
+
dot.setFillColor( "black" );
|
|
111
|
+
dot.setPosition( 0, 0 ); // Ellipse is centered at its transform; origin aligns with beam midpoint
|
|
112
|
+
this.addChild( dot );
|
|
113
|
+
|
|
114
|
+
this.makeValueStack( this.leftValues, -bX, bY + slackOnTop );
|
|
115
|
+
this.makeValueStack( this.rightValues, bX, -bY + slackOnTop );
|
|
116
|
+
|
|
117
|
+
// Choose a comfortable display size and center the view on origin
|
|
118
|
+
const padding = 40;
|
|
119
|
+
const displayWidth = Math.max(300, contentWidth + padding);
|
|
120
|
+
const displayHeight = Math.max(200, contentHeight + padding);
|
|
121
|
+
this.setWidthAndHeight(displayWidth, displayHeight);
|
|
122
|
+
this.svgObject.setAttribute("viewBox", `${-displayWidth/2} ${-displayHeight/2} ${displayWidth} ${displayHeight}`);
|
|
123
|
+
// Don't set position since the viewBox already handles centering
|
|
124
|
+
// this.setPosition(-displayWidth / 2, -displayHeight / 2);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
makeValueStack( values, xOffset, yOffset )
|
|
128
|
+
{
|
|
129
|
+
// make boxes on each side
|
|
130
|
+
for( var i=0; i<values.length; i++ )
|
|
131
|
+
{
|
|
132
|
+
// get value
|
|
133
|
+
var value = values[i];
|
|
134
|
+
var W = 30;
|
|
135
|
+
if ( typeof value == "string" )
|
|
136
|
+
{
|
|
137
|
+
W = 20 + value.length*10;
|
|
138
|
+
}
|
|
139
|
+
else
|
|
140
|
+
{
|
|
141
|
+
W = 30;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// make box
|
|
145
|
+
var box;
|
|
146
|
+
if ( typeof value == "string" )
|
|
147
|
+
{
|
|
148
|
+
box = new jsvgEllipse();
|
|
149
|
+
box.setWidthAndHeight( W, 30 );
|
|
150
|
+
box.setPosition( xOffset-W/2 + W/2, yOffset + i*40 + 15);
|
|
151
|
+
}
|
|
152
|
+
else
|
|
153
|
+
{
|
|
154
|
+
box = new jsvgRect();
|
|
155
|
+
box.setWidthAndHeight( W, 30 );
|
|
156
|
+
box.setCornerRadius(5);
|
|
157
|
+
box.setPosition( xOffset-W/2, yOffset + i*40 );
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Apply customizable background properties
|
|
161
|
+
if (this.showBackground) {
|
|
162
|
+
box.setFillColor(this.backgroundColor);
|
|
163
|
+
if (this.backgroundOpacity < 1.0) {
|
|
164
|
+
box.setOpacity(this.backgroundOpacity);
|
|
165
|
+
}
|
|
166
|
+
} else {
|
|
167
|
+
box.setFillColor("transparent");
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Only apply corner radius to rectangular boxes (jsvgRect), not ellipses
|
|
171
|
+
if (this.backgroundCornerRadius > 0 && box.setCornerRadius) {
|
|
172
|
+
box.setCornerRadius(this.backgroundCornerRadius);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
this.addChild( box );
|
|
176
|
+
|
|
177
|
+
// make box text
|
|
178
|
+
var boxText = new jsvgTextBox();
|
|
179
|
+
boxText.setWidthAndHeight( W,30 );
|
|
180
|
+
boxText.setText ( this.name );
|
|
181
|
+
boxText.setFontFamily( this.fontFamily );
|
|
182
|
+
boxText.setFontColor( "black" );
|
|
183
|
+
boxText.setFontSize( this.fontSize );
|
|
184
|
+
boxText.setAlignment("center");
|
|
185
|
+
boxText.setVerticalCentering();
|
|
186
|
+
boxText.setText( value );
|
|
187
|
+
boxText.setPosition( xOffset-W/2, yOffset + i*40 );
|
|
188
|
+
this.addChild( boxText );
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
setFont( fontFamily, fontSize )
|
|
193
|
+
{
|
|
194
|
+
this.fontFamily = fontFamily;
|
|
195
|
+
if ( fontSize )
|
|
196
|
+
this.fontSize = fontSize;
|
|
197
|
+
this.updateLayout();
|
|
198
|
+
}
|
|
199
|
+
|
|
200
200
|
}
|
package/src/omdColor.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
export var omdColor =
|
|
3
|
-
{
|
|
4
|
-
lightGray : '#EEEEEE',
|
|
5
|
-
mediumGray : '#DDDDDD',
|
|
6
|
-
darkGray : '#AAAAAA',
|
|
7
|
-
hiliteColor : '#FF69B4',
|
|
8
|
-
stepColor: "#9FDAFF",
|
|
9
|
-
explainColor: "#FFD9B3",
|
|
10
|
-
red: '#DB2323',
|
|
11
|
-
green: '#6FDE29',
|
|
12
|
-
blue: '#2386DB',
|
|
13
|
-
white: '#FFFFFF',
|
|
1
|
+
|
|
2
|
+
export var omdColor =
|
|
3
|
+
{
|
|
4
|
+
lightGray : '#EEEEEE',
|
|
5
|
+
mediumGray : '#DDDDDD',
|
|
6
|
+
darkGray : '#AAAAAA',
|
|
7
|
+
hiliteColor : '#FF69B4',
|
|
8
|
+
stepColor: "#9FDAFF",
|
|
9
|
+
explainColor: "#FFD9B3",
|
|
10
|
+
red: '#DB2323',
|
|
11
|
+
green: '#6FDE29',
|
|
12
|
+
blue: '#2386DB',
|
|
13
|
+
white: '#FFFFFF',
|
|
14
14
|
}
|