import { types } from "mobx-state-tree"; import { AudioModel } from "../../tags/object/Audio/model"; import Utils from "../../utils"; import Constants from "../../core/Constants"; import { clamp } from "../../utils/utilities"; export const AudioRegionModel = types .model("AudioRegionModel", { type: "audioregion", object: types.late(() => types.reference(AudioModel)), start: types.number, end: types.number, channel: types.optional(types.number, 0), selectedregionbg: types.optional(types.string, "rgba(0, 0, 0, 0.5)"), }) .volatile(() => ({ hideable: true, _ws_region: null, })) .views((self) => ({ get bboxTriggers() { return [self.start, self.end, self._ws_region, self.object?._ws, self.object?._wfFrame]; }, get bboxCoordsCanvas() { if (!self.bboxTriggers) { return null; } const { _ws_region } = self; if (!_ws_region) return null; if (!_ws_region.inViewport) return null; const { xStart, xEnd, yStart, yEnd, visualizer } = _ws_region; return { left: clamp(xStart, 0, visualizer.width), top: yStart, right: clamp(xEnd, 0, visualizer.width), bottom: yEnd, }; }, wsRegionOptions() { const reg = { id: self.id, start: self.start, end: self.end, color: self.getColor(), visible: !self.hidden, updateable: !self.isReadOnly(), deletable: !self.isReadOnly(), channel: self.channel ?? 0, }; return reg; }, })) .actions((self) => { /** * @returns {AudioRegionResult} */ const Super = { setProperty: self.setProperty, setLocked: self.setLocked, }; return { serialize() { const res = { original_length: self.object._ws?.duration, value: { start: self.start, end: self.end, channel: self.channel, }, }; return res; }, getColor(alpha = 1) { return Utils.Colors.convertToRGBA(self.getOneColor(), alpha); }, updateColor(alpha = 1) { const color = self.getColor(alpha); self._ws_region?.updateColor(color); }, updatePosition(start, end) { self._ws_region?.updatePosition(start ?? self.start, end ?? self.end); }, /** * Select audio region */ selectRegion() { if (!self._ws_region) return; self._ws_region.handleSelected(true); self._ws_region.bringToFront(); self._ws_region.scrollToRegion(); }, deleteRegion() { self.annotation.deleteRegion(self); }, /** * Unselect audio region */ afterUnselectRegion() { if (!self._ws_region) return; self._ws_region.handleSelected(false); }, setHighlight(val) { self._highlighted = val; if (!self._ws_region) return; self._ws_region.handleHighlighted(val); }, beforeDestroy() { if (self._ws_region) self._ws_region.remove(); }, setLocked(locked) { Super.setLocked(locked); if (self._ws_region) self._ws_region.setLocked(self.locked); }, onMouseOver() { if (self.annotation.isLinkingMode) { self.setHighlight(true); self._ws_region.switchCursor(Constants.LINKING_MODE_CURSOR); } }, onMouseLeave() { if (self.annotation.isLinkingMode) { self.setHighlight(false); self._ws_region.switchCursor(Constants.MOVE_CURSOR); } }, onUpdateEnd() { self.start = self._ws_region.start; self.end = self._ws_region.end; self.notifyDrawingFinished(); }, toggleHidden(e) { e?.stopPropagation(); self.hidden = !self.hidden; if (!self._ws_region) return; self._ws_region.setVisibility(!self.hidden); }, setProperty(propName, value) { Super.setProperty(propName, value); if (["start", "end"].includes(propName)) { self.updatePosition(); } }, setWSRegion(wsRegion) { self._ws_region = wsRegion; if (wsRegion) { wsRegion.on("mouseOver", self.onMouseOver); wsRegion.on("mouseLeave", self.onMouseLeave); } }, }; });