22581b2f创建于 2025年12月16日历史提交
/*
 * -------------------------------------------------------------------------
 * 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 { register } from './register';
import { KEYS } from '@insight/lib/utils';
import type { Session } from '../entity/session';
import { runInAction } from 'mobx';
import { PAN_RATE } from '../entity/domain';
import { clamp } from 'lodash';

enum MoveDirection {
    LEFT = -1,
    RIGHT = 1,
}

const moveDomain = (session: Session, direction: number): void => {
    const { domainRange: { domainStart, domainEnd } } = session;
    const timeDuration = domainEnd - domainStart;
    const timeOffset = direction * PAN_RATE * timeDuration;
    const newEnd = clamp(domainEnd + timeOffset, timeDuration, session.endTimeAll ?? session.domain.defaultDuration);
    runInAction(() => {
        session.domainRange = { domainStart: newEnd - timeDuration, domainEnd: newEnd };
    });
};

export const actionPanLeft = register({
    name: 'panLeft',
    label: '',
    perform: (session): void => {
        moveDomain(session, MoveDirection.LEFT);
    },
    keyTest: (event) => event.key.toLowerCase() === KEYS.A || event.key === KEYS.ARROW_LEFT,
});

export const actionPanRight = register({
    name: 'panRight',
    label: '',
    perform: (session): void => {
        moveDomain(session, MoveDirection.RIGHT);
    },
    keyTest: (event) => event.key.toLowerCase() === KEYS.D || event.key === KEYS.ARROW_RIGHT,
});