You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

190 lines
7.8 KiB
TypeScript

// Copyright (C) 2021-2022 Intel Corporation
//
// SPDX-License-Identifier: MIT
import React from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { Row, Col } from 'antd/lib/grid';
import Checkbox, { CheckboxChangeEvent } from 'antd/lib/checkbox';
import Text from 'antd/lib/typography/Text';
import InputNumber from 'antd/lib/input-number';
import Select from 'antd/lib/select';
import Slider from 'antd/lib/slider';
import Button from 'antd/lib/button';
import {
switchGrid,
changeGridColor,
changeGridOpacity,
changeBrightnessLevel,
changeContrastLevel,
changeSaturationLevel,
changeGridSize,
} from 'actions/settings-actions';
import { clamp } from 'utils/math';
import { GridColor, CombinedState, PlayerSettingsState } from 'reducers';
const minGridSize = 5;
const maxGridSize = 1000;
export default function ImageSetupsContent(): JSX.Element {
const dispatch = useDispatch();
const {
brightnessLevel,
contrastLevel,
saturationLevel,
gridOpacity,
gridColor,
gridSize,
grid: gridEnabled,
} = useSelector((state: CombinedState): PlayerSettingsState => state.settings.player);
return (
<div className='cvat-canvas-image-setups-content'>
<Text>Image grid</Text>
<hr />
<Row justify='space-between' align='middle' gutter={8}>
<Col span={1} />
<Col span={6}>
<Text className='cvat-text-color'> Size </Text>
</Col>
<Col span={8}>
<Text className='cvat-text-color'> Color </Text>
</Col>
<Col span={8}>
<Text className='cvat-text-color'> Opacity </Text>
</Col>
</Row>
<Row justify='space-between' align='middle' gutter={8}>
<Col span={1}>
<Checkbox
className='cvat-text-color cvat-image-setups-grid'
checked={gridEnabled}
onChange={(event: CheckboxChangeEvent): void => {
dispatch(switchGrid(event.target.checked));
}}
/>
</Col>
<Col span={6} className='cvat-image-setups-grid-size'>
<InputNumber
className='cvat-image-setups-grid-size-input'
min={minGridSize}
max={maxGridSize}
value={gridSize}
disabled={!gridEnabled}
onChange={(value: number | undefined | null | string): void => {
if (typeof value !== 'undefined' && value !== null) {
const converted = Math.floor(clamp(+value, minGridSize, maxGridSize));
dispatch(changeGridSize(converted));
}
}}
/>
</Col>
<Col span={8} className='cvat-image-setups-grid-color'>
<Select
className='cvat-image-setups-grid-color-input'
value={gridColor}
disabled={!gridEnabled}
onChange={(color: GridColor): void => {
dispatch(changeGridColor(color));
}}
>
<Select.Option key='white' value={GridColor.White}>
White
</Select.Option>
<Select.Option key='black' value={GridColor.Black}>
Black
</Select.Option>
<Select.Option key='red' value={GridColor.Red}>
Red
</Select.Option>
<Select.Option key='green' value={GridColor.Green}>
Green
</Select.Option>
<Select.Option key='blue' value={GridColor.Blue}>
Blue
</Select.Option>
</Select>
</Col>
<Col span={8} className='cvat-image-setups-grid-opacity'>
<Slider
className='cvat-image-setups-grid-opacity-input'
min={0}
max={100}
value={gridOpacity}
disabled={!gridEnabled}
onChange={(value: number | [number, number]): void => {
dispatch(changeGridOpacity(value as number));
}}
/>
</Col>
</Row>
<Text>Color settings</Text>
<hr />
<Row justify='space-around'>
<Col span={24}>
<Row className='cvat-image-setups-brightness'>
<Col span={6}>
<Text className='cvat-text-color'> Brightness </Text>
</Col>
<Col span={12}>
<Slider
min={50}
max={200}
value={brightnessLevel}
onChange={(value: number | [number, number]): void => {
dispatch(changeBrightnessLevel(value as number));
}}
/>
</Col>
</Row>
<Row className='cvat-image-setups-contrast'>
<Col span={6}>
<Text className='cvat-text-color'> Contrast </Text>
</Col>
<Col span={12}>
<Slider
min={50}
max={200}
value={contrastLevel}
onChange={(value: number | [number, number]): void => {
dispatch(changeContrastLevel(value as number));
}}
/>
</Col>
</Row>
<Row className='cvat-image-setups-saturation'>
<Col span={6}>
<Text className='cvat-text-color'> Saturation </Text>
</Col>
<Col span={12}>
<Slider
min={0}
max={300}
value={saturationLevel}
onChange={(value: number | [number, number]): void => {
dispatch(changeSaturationLevel(value as number));
}}
/>
</Col>
</Row>
<Row className='cvat-image-setups-reset-color-settings' justify='space-around'>
<Col>
<Button
onClick={() => {
const defaultValue = 100;
dispatch(changeBrightnessLevel(defaultValue));
dispatch(changeContrastLevel(defaultValue));
dispatch(changeSaturationLevel(defaultValue));
}}
>
Reset color settings
</Button>
</Col>
</Row>
</Col>
</Row>
</div>
);
}