label-studio
Version:
Data Labeling Tool that is backend agnostic and can be embedded into your applications
145 lines (122 loc) • 4.04 kB
JavaScript
import { types, getParentOfType, getRoot } from "mobx-state-tree";
import Constants from "../core/Constants";
import NormalizationMixin from "../mixins/Normalization";
import RegionsMixin from "../mixins/Regions";
import Utils from "../utils";
import { AudioPlusModel } from "../tags/object/AudioPlus";
import { LabelsModel } from "../tags/control/Labels";
import { RatingModel } from "../tags/control/Rating";
import { guidGenerator } from "../core/Helpers";
const Model = types
.model("AudioRegionModel", {
id: types.optional(types.identifier, guidGenerator),
pid: types.optional(types.string, guidGenerator),
start: types.number,
end: types.number,
states: types.maybeNull(types.array(types.union(LabelsModel, RatingModel))),
selectedregionbg: types.optional(types.string, "rgba(0, 0, 0, 0.5)"),
})
.views(self => ({
get parent() {
return getParentOfType(self, AudioPlusModel);
},
get completion() {
return getRoot(self).completionStore.selected;
},
}))
.actions(self => ({
/**
* When you try to send completion
*/
toStateJSON() {
const parent = self.parent;
const buildTree = obj => {
const tree = {
id: self.pid,
from_name: obj.name,
to_name: parent.name,
source: parent.value,
type: "region",
value: {
start: self.start,
end: self.end,
},
};
if (self.normalization) tree["normalization"] = self.normalization;
return tree;
};
if (self.states && self.states.length) {
return self.states.map(s => {
const tree = buildTree(s);
// in case of labels it's gonna be, labels: ["label1", "label2"]
tree["value"][s.type] = s.getSelectedNames();
tree["type"] = s.type;
return tree;
});
} else {
return buildTree(parent);
}
},
/**
* Select audio region
*/
selectRegion() {
self.selected = true;
self.completion.setHighlightedNode(self);
self._ws_region.update({ color: Utils.Colors.rgbaChangeAlpha(self.selectedregionbg, 0.8) });
},
/**
* Unselect audio region
*/
unselectRegion() {
self.selected = false;
self.completion.setHighlightedNode(null);
if (self._ws_region.update) {
self._ws_region.update({ color: self.selectedregionbg });
}
},
setHighlight(val) {
self.highlighted = val;
if (val) {
self._ws_region.update({ color: Utils.Colors.rgbaChangeAlpha(self.selectedregionbg, 0.8) });
self._ws_region.element.style.border = Constants.HIGHLIGHTED_CSS_BORDER;
} else {
self._ws_region.update({ color: self.selectedregionbg });
self._ws_region.element.style.border = "none";
}
},
setNormalization(val) {
// console.log(val)
},
beforeDestroy() {
if (self._ws_region) self._ws_region.remove();
},
onClick(wavesurfer) {
if (!self.completion.edittable) return;
if (!self.completion.relationMode) {
// Object.values(wavesurfer.regions.list).forEach(r => {
// // r.update({ color: self.selectedregionbg });
// });
self._ws_region.update({ color: Utils.Colors.rgbaChangeAlpha(self.selectedregionbg, 0.8) });
}
self.onClickRegion();
},
onMouseOver() {
if (self.completion.relationMode) {
self.setHighlight(true);
self._ws_region.element.style.cursor = Constants.RELATION_MODE_CURSOR;
}
},
onMouseLeave() {
if (self.completion.relationMode) {
self.setHighlight(false);
self._ws_region.element.style.cursor = Constants.MOVE_CURSOR;
}
},
onUpdateEnd(wavesurfer) {
self.start = self._ws_region.start;
self.end = self._ws_region.end;
},
}));
const AudioRegionModel = types.compose("AudioRegionModel", RegionsMixin, NormalizationMixin, Model);
export { AudioRegionModel };