Implement support for polygon annotations

This commit is contained in:
Tim van der Meij 2017-09-23 16:50:49 +02:00
parent 99b17a494d
commit 8ccad276b2
No known key found for this signature in database
GPG Key ID: 8C3FD2925A5F2762
3 changed files with 32 additions and 3 deletions

View File

@ -90,6 +90,9 @@ class AnnotationFactory {
case 'PolyLine': case 'PolyLine':
return new PolylineAnnotation(parameters); return new PolylineAnnotation(parameters);
case 'Polygon':
return new PolygonAnnotation(parameters);
case 'Highlight': case 'Highlight':
return new HighlightAnnotation(parameters); return new HighlightAnnotation(parameters);
@ -940,6 +943,15 @@ class PolylineAnnotation extends Annotation {
} }
} }
class PolygonAnnotation extends PolylineAnnotation {
constructor(parameters) {
// Polygons are specific forms of polylines, so reuse their logic.
super(parameters);
this.data.annotationType = AnnotationType.POLYGON;
}
}
class HighlightAnnotation extends Annotation { class HighlightAnnotation extends Annotation {
constructor(parameters) { constructor(parameters) {
super(parameters); super(parameters);

View File

@ -83,6 +83,9 @@ class AnnotationElementFactory {
case AnnotationType.POLYLINE: case AnnotationType.POLYLINE:
return new PolylineAnnotationElement(parameters); return new PolylineAnnotationElement(parameters);
case AnnotationType.POLYGON:
return new PolygonAnnotationElement(parameters);
case AnnotationType.HIGHLIGHT: case AnnotationType.HIGHLIGHT:
return new HighlightAnnotationElement(parameters); return new HighlightAnnotationElement(parameters);
@ -604,7 +607,7 @@ class PopupAnnotationElement extends AnnotationElement {
render() { render() {
// Do not render popup annotations for parent elements with these types as // Do not render popup annotations for parent elements with these types as
// they create the popups themselves (because of custom trigger divs). // they create the popups themselves (because of custom trigger divs).
const IGNORE_TYPES = ['Line', 'Square', 'Circle', 'PolyLine']; const IGNORE_TYPES = ['Line', 'Square', 'Circle', 'PolyLine', 'Polygon'];
this.container.className = 'popupAnnotation'; this.container.className = 'popupAnnotation';
@ -919,6 +922,9 @@ class PolylineAnnotationElement extends AnnotationElement {
let isRenderable = !!(parameters.data.hasPopup || let isRenderable = !!(parameters.data.hasPopup ||
parameters.data.title || parameters.data.contents); parameters.data.title || parameters.data.contents);
super(parameters, isRenderable, /* ignoreBorder = */ true); super(parameters, isRenderable, /* ignoreBorder = */ true);
this.containerClassName = 'polylineAnnotation';
this.svgElementName = 'svg:polyline';
} }
/** /**
@ -929,7 +935,7 @@ class PolylineAnnotationElement extends AnnotationElement {
* @returns {HTMLSectionElement} * @returns {HTMLSectionElement}
*/ */
render() { render() {
this.container.className = 'polylineAnnotation'; this.container.className = this.containerClassName;
// Create an invisible polyline with the same points that acts as the // Create an invisible polyline with the same points that acts as the
// trigger for the popup. Only the polyline itself should trigger the // trigger for the popup. Only the polyline itself should trigger the
@ -953,7 +959,7 @@ class PolylineAnnotationElement extends AnnotationElement {
points = points.join(' '); points = points.join(' ');
let borderWidth = data.borderStyle.width; let borderWidth = data.borderStyle.width;
let polyline = this.svgFactory.createElement('svg:polyline'); let polyline = this.svgFactory.createElement(this.svgElementName);
polyline.setAttribute('points', points); polyline.setAttribute('points', points);
polyline.setAttribute('stroke-width', borderWidth); polyline.setAttribute('stroke-width', borderWidth);
polyline.setAttribute('stroke', 'transparent'); polyline.setAttribute('stroke', 'transparent');
@ -970,6 +976,16 @@ class PolylineAnnotationElement extends AnnotationElement {
} }
} }
class PolygonAnnotationElement extends PolylineAnnotationElement {
constructor(parameters) {
// Polygons are specific forms of polylines, so reuse their logic.
super(parameters);
this.containerClassName = 'polygonAnnotation';
this.svgElementName = 'svg:polygon';
}
}
class HighlightAnnotationElement extends AnnotationElement { class HighlightAnnotationElement extends AnnotationElement {
constructor(parameters) { constructor(parameters) {
let isRenderable = !!(parameters.data.hasPopup || let isRenderable = !!(parameters.data.hasPopup ||

View File

@ -192,6 +192,7 @@
.annotationLayer .squareAnnotation svg rect, .annotationLayer .squareAnnotation svg rect,
.annotationLayer .circleAnnotation svg ellipse, .annotationLayer .circleAnnotation svg ellipse,
.annotationLayer .polylineAnnotation svg polyline, .annotationLayer .polylineAnnotation svg polyline,
.annotationLayer .polygonAnnotation svg polygon,
.annotationLayer .stampAnnotation, .annotationLayer .stampAnnotation,
.annotationLayer .fileAttachmentAnnotation { .annotationLayer .fileAttachmentAnnotation {
cursor: pointer; cursor: pointer;