UNPKG

label-studio

Version:

Data Labeling Tool that is backend agnostic and can be embedded into your applications

145 lines (122 loc) 4.04 kB
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 };