Skip to content

Commit 65060df

Browse files
committed
Added filterPoints option to WaveformView
This allows the user to provide a function that controls whether a particular point is displayed on the Waveform.
1 parent dac0265 commit 65060df

File tree

4 files changed

+25
-11
lines changed

4 files changed

+25
-11
lines changed

peaks.js.d.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ declare module 'peaks.js' {
8181

8282
interface GlobalSegmentDisplayOptions extends SegmentDisplayOptions {
8383
waveformColor?: WaveformColor;
84-
overlayColor?: string;
84+
overlayColor?: string;
8585
}
8686

8787
type FormatTimeFunction = (time: number) => string;
@@ -108,6 +108,7 @@ declare module 'peaks.js' {
108108
enablePoints?: boolean;
109109
enableSegments?: boolean;
110110
segmentOptions?: SegmentDisplayOptions;
111+
filterPoints?: ((p: Point) => boolean) | null;
111112
}
112113

113114
interface ZoomViewOptions extends ViewOptions {

src/main.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@ const defaultViewOptions = {
8282
fontStyle: 'normal',
8383
timeLabelPrecision: 2,
8484
enablePoints: true,
85-
enableSegments: true
85+
enableSegments: true,
86+
filterPoints: null
8687
};
8788

8889
const defaultZoomviewOptions = {
@@ -166,7 +167,8 @@ function getOverviewOptions(opts) {
166167
'highlightOffset',
167168
'enablePoints',
168169
'enableSegments',
169-
'enableEditing'
170+
'enableEditing',
171+
'filterPoints'
170172
];
171173

172174
optNames.forEach(function(optName) {
@@ -225,7 +227,8 @@ function getZoomviewOptions(opts) {
225227
'autoScrollOffset',
226228
'enablePoints',
227229
'enableSegments',
228-
'enableEditing'
230+
'enableEditing',
231+
'filterPoints'
229232
];
230233

231234
optNames.forEach(function(optName) {

src/points-layer.js

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,12 @@ import Konva from 'konva/lib/Core';
2222
* @param {Boolean} enableEditing
2323
*/
2424

25-
function PointsLayer(peaks, view, enableEditing) {
25+
function PointsLayer(peaks, view, enableEditing, filterPoints) {
2626
this._peaks = peaks;
2727
this._view = view;
2828
this._enableEditing = enableEditing;
2929
this._pointMarkers = {};
30+
this._filterPoints = filterPoints;
3031
this._layer = new Konva.Layer();
3132

3233
this._onPointsDrag = this._onPointsDrag.bind(this);
@@ -38,6 +39,7 @@ function PointsLayer(peaks, view, enableEditing) {
3839
this._onPointMarkerMouseEnter = this._onPointMarkerMouseEnter.bind(this);
3940
this._onPointMarkerMouseLeave = this._onPointMarkerMouseLeave.bind(this);
4041

42+
this._isPointVisible = this._isPointVisible.bind(this);
4143
this._onPointsUpdate = this._onPointsUpdate.bind(this);
4244
this._onPointsAdd = this._onPointsAdd.bind(this);
4345
this._onPointsRemove = this._onPointsRemove.bind(this);
@@ -79,12 +81,17 @@ PointsLayer.prototype.formatTime = function(time) {
7981
return this._view.formatTime(time);
8082
};
8183

84+
PointsLayer.prototype._isPointVisible = function(point, startTime, endTime) {
85+
const isInFrame = point.isVisible(startTime, endTime);
86+
87+
return isInFrame && (!this._filterPoints || this._filterPoints(point));
88+
};
89+
8290
PointsLayer.prototype._onPointsUpdate = function(point, options) {
91+
const pointMarker = this.getPointMarker(point);
8392
const frameStartTime = this._view.getStartTime();
8493
const frameEndTime = this._view.getEndTime();
85-
86-
const pointMarker = this.getPointMarker(point);
87-
const isVisible = point.isVisible(frameStartTime, frameEndTime);
94+
const isVisible = this._isPointVisible(point, frameStartTime, frameEndTime);
8895

8996
if (pointMarker && !isVisible) {
9097
// Remove point marker that is no longer visible.
@@ -115,7 +122,9 @@ PointsLayer.prototype._onPointsAdd = function(event) {
115122
const frameEndTime = self._view.getEndTime();
116123

117124
event.points.forEach(function(point) {
118-
if (point.isVisible(frameStartTime, frameEndTime)) {
125+
const isVisible = self._isPointVisible(point, frameStartTime, frameEndTime);
126+
127+
if (isVisible) {
119128
self._updatePoint(point);
120129
}
121130
});
@@ -331,7 +340,7 @@ PointsLayer.prototype._removeInvisiblePoints = function(startTime, endTime) {
331340
if (objectHasProperty(this._pointMarkers, pointPid)) {
332341
const point = this._pointMarkers[pointPid].getPoint();
333342

334-
if (!point.isVisible(startTime, endTime)) {
343+
if (!this._isPointVisible(point, startTime, endTime)) {
335344
this._removePoint(point);
336345
}
337346
}

src/waveform-view.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ function WaveformView(waveformData, container, peaks, viewOptions) {
7070
}
7171

7272
if (self._viewOptions.enablePoints) {
73-
self._pointsLayer = new PointsLayer(peaks, self, self._viewOptions.enableEditing);
73+
self._pointsLayer = new PointsLayer(peaks, self, self._viewOptions.enableEditing,
74+
self._viewOptions.filterPoints);
7475
self._pointsLayer.addToStage(self._stage);
7576
}
7677

0 commit comments

Comments
 (0)