* -------------------------------------------------------------------------
* This file is part of the MindStudio project.
* Copyright (c) 2025 Huawei Technologies Co.,Ltd.
*
* MindStudio is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
*
* http://license.coscl.org.cn/MulanPSL2
*
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
* -------------------------------------------------------------------------
*/
import { runInAction } from 'mobx';
import { register } from './register';
import type { Session } from '../entity/session';
import { checkCardIsIE } from './actionGenerateCurve';
const timeRangeAnalysisMenuVisible = (session: Session): boolean => {
if (session.isTimeAnalysisMode || session.selectedRangeIsLock || session.sliceSelection.active) {
return false;
}
if (session.selectedRange === undefined || session.selectedUnits === undefined) {
return false;
}
if (session.isSimulation || session.isIE) {
return false;
}
return session.selectedUnits.length !== 0;
};
const applyTimeRangeAnalysisMenuVisible = (session: Session): boolean => {
if (session.isTimeAnalysisMode || session.selectedRangeIsLock || session.sliceSelection.active || !session.selectedData) {
return false;
}
return !(session.isSimulation || checkCardIsIE(session));
};
const timeRangeAnalysis = (session: Session): void => {
if (session.selectedRange === undefined || session.selectedUnits === undefined) {
return;
}
if (session.selectedUnits.length === 0) {
return;
}
runInAction(() => {
session.isTimeAnalysisMode = true;
session.mKeyRender = true;
if (session.selectedRange !== undefined) {
session.timeAnalysisRange = [session.selectedRange[0], session.selectedRange[1]];
session.mMaskRange = [session.selectedRange[0], session.selectedRange[1]];
}
});
};
const removeTimeRangeAnalysis = (session: Session): void => {
runInAction(() => {
session.isTimeAnalysisMode = false;
session.timeAnalysisRange = undefined;
session.mKeyRender = false;
session.mMaskRange = [];
});
};
const timeRangeAnalysisAndZoomIn = (session: Session): void => {
if (session.selectedRange === undefined || session.selectedUnits === undefined) {
return;
}
if (session.selectedUnits.length === 0) {
return;
}
runInAction(() => {
session.isTimeAnalysisMode = true;
session.mKeyRender = true;
if (session.selectedRange !== undefined) {
session.timeAnalysisRange = [session.selectedRange[0], session.selectedRange[1]];
const tempRange = session.selectedRange[1] - session.selectedRange[0];
session.domainRange = {
domainStart: session.selectedRange[0] - tempRange * 0.05,
domainEnd: session.selectedRange[1] + tempRange * 0.05,
};
session.mMaskRange = [session.selectedRange[0], session.selectedRange[1]];
}
});
};
const applyTimeRangeAnalysis = (session: Session): void => {
if (session.selectedData === undefined) {
return;
}
runInAction(() => {
session.isTimeAnalysisMode = true;
session.mKeyRender = true;
const selectedData = session.selectedData;
if (selectedData !== undefined) {
session.timeAnalysisRange = [selectedData.startTime, selectedData.startTime + selectedData.duration];
session.domainRange = {
domainStart: selectedData.startTime - selectedData.duration * 0.05,
domainEnd: selectedData.startTime + selectedData.duration + selectedData.duration * 0.05,
};
session.mMaskRange = [selectedData.startTime, selectedData.startTime + selectedData.duration];
}
});
};
export const actionTimeRangeAnalysis = register({
name: 'timeRangeAnalysis',
label: 'timeline:contextMenu.Time Range Analysis',
visible: (session: Session): boolean => timeRangeAnalysisMenuVisible(session),
perform: (session): void => {
timeRangeAnalysis(session);
},
});
export const actionRemoveTimeRangeAnalysis = register({
name: 'removeTimeRangeAnalysis',
label: 'timeline:contextMenu.Remove Time Range Analysis',
visible: (session: Session): boolean => session.isTimeAnalysisMode,
perform: (session): void => {
removeTimeRangeAnalysis(session);
},
});
export const actionTimeRangeAnalysisAndZoomIn = register({
name: 'timeRangeAnalysisAndZoomIn',
label: 'timeline:contextMenu.Time Range Analysis and Zoom in',
visible: (session: Session): boolean => timeRangeAnalysisMenuVisible(session),
perform: (session): void => {
timeRangeAnalysisAndZoomIn(session);
},
});
export const actionApplyTimeRangeAnalysis = register({
name: 'applyTimeRangeAnalysis',
label: 'timeline:contextMenu.Apply Time Range Analysis',
visible: (session: Session): boolean => applyTimeRangeAnalysisMenuVisible(session),
perform: (session): void => {
applyTimeRangeAnalysis(session);
},
});