aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/InkingStroke.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/views/InkingStroke.tsx')
-rw-r--r--src/client/views/InkingStroke.tsx80
1 files changed, 45 insertions, 35 deletions
diff --git a/src/client/views/InkingStroke.tsx b/src/client/views/InkingStroke.tsx
index 2fd6cc4d6..111f1695f 100644
--- a/src/client/views/InkingStroke.tsx
+++ b/src/client/views/InkingStroke.tsx
@@ -6,7 +6,7 @@
point 1, tangent pt 1, tangent pt 2, point 2, point 3, tangent pt 3, ... (Note that segment endpoints are duplicated ie Point2 = Point 3)
brokenIndices - an array of indexes into the data field where the incoming and outgoing tangents are not constrained to be equal
text - a text field that will be centered within a closed ink stroke
- isInkMask - a flag that makes the ink stroke render as a mask over its collection where the stroke itself is mixBlendMode multiplied by
+ stroke_isInkMask - a flag that makes the ink stroke render as a mask over its collection where the stroke itself is mixBlendMode multiplied by
the underlying collection content, and everything outside the stroke is covered by a semi-opaque dark gray mask.
The coordinates of the ink data need to be mapped to the screen since ink points are not changed when the DocumentView is translated or scaled.
@@ -23,7 +23,8 @@
import React = require('react');
import { action, IReactionDisposer, observable, reaction } from 'mobx';
import { observer } from 'mobx-react';
-import { Doc, HeightSym, WidthSym } from '../../fields/Doc';
+import { Doc } from '../../fields/Doc';
+import { Height, Width } from '../../fields/DocSymbols';
import { InkData, InkField } from '../../fields/InkField';
import { BoolCast, Cast, NumCast, RTFCast, StrCast } from '../../fields/Types';
import { TraceMobx } from '../../fields/util';
@@ -87,7 +88,13 @@ export class InkingStroke extends ViewBoxBaseComponent<FieldViewProps>() {
if (!addAsAnnotation && !pinProps) return this.rootDoc;
- const anchor = Docs.Create.InkAnchorDocument({ title: 'Ink anchor:' + this.rootDoc.title, presDuration: 1100, presTransition: 1000, unrendered: true, annotationOn: this.rootDoc });
+ const anchor = Docs.Create.InkConfigDocument({
+ title: 'Ink anchor:' + this.rootDoc.title,
+ // set presentation timing for restoring shape
+ presDuration: 1100,
+ presTransition: 1000,
+ annotationOn: this.rootDoc,
+ });
if (anchor) {
anchor.backgroundColor = 'transparent';
// /* addAsAnnotation &&*/ this.addDocument(anchor);
@@ -134,7 +141,7 @@ export class InkingStroke extends ViewBoxBaseComponent<FieldViewProps>() {
* dimmed by a semi-opaque overlay mask.
*/
public static toggleMask = action((inkDoc: Doc) => {
- inkDoc.isInkMask = !inkDoc.isInkMask;
+ inkDoc.stroke_isInkMask = !inkDoc.stroke_isInkMask;
});
@observable controlUndo: UndoManager.Batch | undefined;
/**
@@ -241,7 +248,7 @@ export class InkingStroke extends ViewBoxBaseComponent<FieldViewProps>() {
*/
inkScaledData = () => {
const inkData = Cast(this.dataDoc[this.fieldKey], InkField)?.inkData ?? [];
- const inkStrokeWidth = NumCast(this.rootDoc.strokeWidth, 1);
+ const inkStrokeWidth = NumCast(this.rootDoc.stroke_width, 1);
const inkTop = Math.min(...inkData.map(p => p.Y)) - inkStrokeWidth / 2;
const inkBottom = Math.max(...inkData.map(p => p.Y)) + inkStrokeWidth / 2;
const inkLeft = Math.min(...inkData.map(p => p.X)) - inkStrokeWidth / 2;
@@ -310,9 +317,9 @@ export class InkingStroke extends ViewBoxBaseComponent<FieldViewProps>() {
.map(p => ({ X: p[0], Y: p[1] }));
const screenHdlPts = screenPts;
- const startMarker = StrCast(this.layoutDoc.strokeStartMarker);
- const endMarker = StrCast(this.layoutDoc.strokeEndMarker);
- const markerScale = NumCast(this.layoutDoc.strokeMarkerScale);
+ const startMarker = StrCast(this.layoutDoc.stroke_startMarker);
+ const endMarker = StrCast(this.layoutDoc.stroke_endMarker);
+ const markerScale = NumCast(this.layoutDoc.stroke_markerScale);
return SnappingManager.GetIsDragging() ? null : !InkStrokeProperties.Instance._controlButton ? (
!this.props.isSelected() || InkingStroke.IsClosed(inkData) ? null : (
<div className="inkstroke-UI" style={{ clip: `rect(${boundsTop}px, 10000px, 10000px, ${boundsLeft}px)` }}>
@@ -328,14 +335,14 @@ export class InkingStroke extends ViewBoxBaseComponent<FieldViewProps>() {
Colors.MEDIUM_BLUE,
screenInkWidth[0],
screenSpaceCenterlineStrokeWidth,
- StrCast(inkDoc.strokeLineJoin),
- StrCast(this.layoutDoc.strokeLineCap),
- StrCast(inkDoc.strokeBezier),
+ StrCast(inkDoc.stroke_lineJoin),
+ StrCast(this.layoutDoc.stroke_lineCap),
+ StrCast(inkDoc.stroke_bezier),
'none',
startMarker,
endMarker,
markerScale * Math.min(screenSpaceCenterlineStrokeWidth, screenInkWidth[0] / screenSpaceCenterlineStrokeWidth),
- StrCast(inkDoc.strokeDash),
+ StrCast(inkDoc.stroke_dash),
1,
1,
'',
@@ -355,19 +362,19 @@ export class InkingStroke extends ViewBoxBaseComponent<FieldViewProps>() {
TraceMobx();
const { inkData, inkStrokeWidth, inkLeft, inkTop, inkScaleX, inkScaleY, inkWidth, inkHeight } = this.inkScaledData();
- const startMarker = StrCast(this.layoutDoc.strokeStartMarker);
- const endMarker = StrCast(this.layoutDoc.strokeEndMarker);
- const markerScale = NumCast(this.layoutDoc.strokeMarkerScale, 1);
+ const startMarker = StrCast(this.layoutDoc.stroke_startMarker);
+ const endMarker = StrCast(this.layoutDoc.stroke_endMarker);
+ const markerScale = NumCast(this.layoutDoc.stroke_markerScale, 1);
const closed = InkingStroke.IsClosed(inkData);
- const isInkMask = BoolCast(this.layoutDoc.isInkMask);
+ const isInkMask = BoolCast(this.layoutDoc.stroke_isInkMask);
const fillColor = isInkMask ? DashColor(StrCast(this.layoutDoc.fillColor, 'transparent')).blacken(0).rgb().toString() : this.props.styleProvider?.(this.rootDoc, this.props, StyleProp.FillColor) ?? 'transparent';
const strokeColor = !closed && fillColor && fillColor !== 'transparent' ? fillColor : this.props.styleProvider?.(this.layoutDoc, this.props, StyleProp.Color) ?? StrCast(this.layoutDoc.color);
// bcz: Hack!! Not really sure why, but having fractional values for width/height of mask ink strokes causes the dragging clone (see DragManager) to be offset from where it should be.
- if (isInkMask && (this.layoutDoc[WidthSym]() !== Math.round(this.layoutDoc[WidthSym]()) || this.layoutDoc[HeightSym]() !== Math.round(this.layoutDoc[HeightSym]()))) {
+ if (isInkMask && (this.layoutDoc[Width]() !== Math.round(this.layoutDoc[Width]()) || this.layoutDoc[Height]() !== Math.round(this.layoutDoc[Height]()))) {
setTimeout(() => {
- this.layoutDoc._width = Math.round(NumCast(this.layoutDoc[WidthSym]()));
- this.layoutDoc._height = Math.round(NumCast(this.layoutDoc[HeightSym]()));
+ this.layoutDoc._width = Math.round(NumCast(this.layoutDoc[Width]()));
+ this.layoutDoc._height = Math.round(NumCast(this.layoutDoc[Height]()));
});
}
@@ -379,14 +386,14 @@ export class InkingStroke extends ViewBoxBaseComponent<FieldViewProps>() {
strokeColor,
inkStrokeWidth,
inkStrokeWidth,
- StrCast(this.layoutDoc.strokeLineJoin),
- StrCast(this.layoutDoc.strokeLineCap),
- StrCast(this.layoutDoc.strokeBezier),
+ StrCast(this.layoutDoc.stroke_lineJoin),
+ StrCast(this.layoutDoc.stroke_lineCap),
+ StrCast(this.layoutDoc.stroke_bezier),
!closed ? 'none' : fillColor === 'transparent' ? 'none' : fillColor,
startMarker,
endMarker,
markerScale,
- StrCast(this.layoutDoc.strokeDash),
+ StrCast(this.layoutDoc.stroke_dash),
inkScaleX,
inkScaleY,
'',
@@ -396,20 +403,23 @@ export class InkingStroke extends ViewBoxBaseComponent<FieldViewProps>() {
);
const highlight = !this.controlUndo && this.props.styleProvider?.(this.rootDoc, this.props, StyleProp.Highlighting);
const highlightIndex = highlight?.highlightIndex;
- const highlightColor = highlight?.highlightIndex ? highlight?.highlightColor : StrCast(this.layoutDoc.strokeOutlineColor, !closed && fillColor && fillColor !== 'transparent' ? StrCast(this.layoutDoc.color, 'transparent') : 'transparent');
+ const highlightColor =
+ (!this.props.isSelected() || !isInkMask) && highlight?.highlightIndex
+ ? highlight?.highlightColor
+ : StrCast(this.layoutDoc.stroke_outlineColor, !closed && fillColor && fillColor !== 'transparent' ? StrCast(this.layoutDoc.color, 'transparent') : 'transparent');
// Invisible polygonal line that enables the ink to be selected by the user.
- const clickableLine = (downHdlr?: (e: React.PointerEvent) => void, suppressFill: boolean = false, mask: boolean = false) =>
+ const clickableLine = (downHdlr?: (e: React.PointerEvent) => void, mask: boolean = false) =>
InteractionUtils.CreatePolyline(
inkData,
inkLeft,
inkTop,
- highlightColor,
+ mask && highlightColor === 'transparent' ? strokeColor : highlightColor,
inkStrokeWidth,
inkStrokeWidth + (fillColor ? (closed ? 2 : (highlightIndex ?? 0) + 2) : 2),
- StrCast(this.layoutDoc.strokeLineJoin),
- StrCast(this.layoutDoc.strokeLineCap),
- StrCast(this.layoutDoc.strokeBezier),
- !closed ? 'none' : !isInkMask && (fillColor === 'transparent' || suppressFill) ? 'none' : fillColor,
+ StrCast(this.layoutDoc.stroke_lineJoin),
+ StrCast(this.layoutDoc.stroke_lineCap),
+ StrCast(this.layoutDoc.stroke_bezier),
+ !closed || !fillColor || DashColor(fillColor).alpha() === 0 ? 'none' : fillColor,
'',
'',
markerScale,
@@ -423,7 +433,7 @@ export class InkingStroke extends ViewBoxBaseComponent<FieldViewProps>() {
downHdlr,
mask
);
- const fsize = +StrCast(this.props.Document.fontSize, '12px').replace('px', '');
+ const fsize = +StrCast(this.props.Document._text_fontSize, '12px').replace('px', '');
// bootsrap 3 style sheet sets line height to be 20px for default 14 point font size.
// this attempts to figure out the lineHeight ratio by inquiring the body's lineHeight and dividing by the fontsize which should yield 1.428571429
// see: https://bibwild.wordpress.com/2019/06/10/bootstrap-3-to-4-changes-in-how-font-size-line-height-and-spacing-is-done-or-what-happened-to-line-height-computed/
@@ -444,12 +454,12 @@ export class InkingStroke extends ViewBoxBaseComponent<FieldViewProps>() {
<svg
className="inkStroke"
style={{
- transform: this.props.Document.isInkMask ? `rotate(-${NumCast(this.props.CollectionFreeFormDocumentView?.().Rot)}deg) translate(${InkingStroke.MaskDim / 2}px, ${InkingStroke.MaskDim / 2}px)` : undefined,
+ transform: isInkMask ? `rotate(-${NumCast(this.props.CollectionFreeFormDocumentView?.().Rot)}deg) translate(${InkingStroke.MaskDim / 2}px, ${InkingStroke.MaskDim / 2}px)` : undefined,
// mixBlendMode: this.layoutDoc.tool === InkTool.Highlighter ? 'multiply' : 'unset',
cursor: this.props.isSelected() ? 'default' : undefined,
}}
{...interactions}>
- {clickableLine(this.onPointerDown, undefined, isInkMask)}
+ {clickableLine(this.onPointerDown, isInkMask)}
{isInkMask ? null : inkLine}
</svg>
{!closed || (!RTFCast(this.rootDoc.text)?.Text && (!this.props.isSelected() || Doc.UserDoc().activeInkHideTextLabels)) ? null : (
@@ -458,7 +468,7 @@ export class InkingStroke extends ViewBoxBaseComponent<FieldViewProps>() {
style={{
color: StrCast(this.layoutDoc.textColor, 'black'),
pointerEvents: this.props.isDocumentActive?.() ? 'all' : undefined,
- width: this.layoutDoc[WidthSym](),
+ width: this.layoutDoc[Width](),
transform: `scale(${this.props.NativeDimScaling?.() || 1})`,
transformOrigin: 'top left',
//top: (this.props.PanelHeight() - (lineHeightGuess * fsize + 20) * (this.props.NativeDimScaling?.() || 1)) / 2,
@@ -469,7 +479,7 @@ export class InkingStroke extends ViewBoxBaseComponent<FieldViewProps>() {
setContentView={this.setSubContentView} // this makes the inkingStroke the "dominant" component - ie, it will show the inking UI when selected (not text)
yPadding={10}
xPadding={10}
- fieldKey={'text'}
+ fieldKey="text"
fontSize={fsize}
dontRegisterView={true}
noSidebar={true}