diff --git a/src/app/models/ModelInfoUtils.ts b/src/app/models/ModelInfoUtils.ts index 4c760c0d25..6f7aaf36eb 100644 --- a/src/app/models/ModelInfoUtils.ts +++ b/src/app/models/ModelInfoUtils.ts @@ -95,10 +95,14 @@ const defaultConfigs = { // Laser [toKey(HEAD_LASER, PROCESS_MODE_BW)]: { + greyscaleAlgorithm: 'Luma', + algorithm: 'Atkinson', invert: false, bwThreshold: 168 }, [toKey(HEAD_LASER, PROCESS_MODE_HALFTONE)]: { + greyscaleAlgorithm: 'Luma', + algorithm: 'Atkinson', invert: false, threshold: 255, // turn pixel to white bwThreshold: 168, // used by toolpath generator @@ -116,11 +120,15 @@ const defaultConfigs = { algorithm: 'Atkinson' }, [toKey(HEAD_LASER, PROCESS_MODE_VECTOR, SOURCE_TYPE.RASTER)]: { + greyscaleAlgorithm: 'Luma', + algorithm: 'Atkinson', vectorThreshold: 128, invert: false, turdSize: 2 }, [toKey(HEAD_LASER, PROCESS_MODE_VECTOR, SOURCE_TYPE.SVG)]: { + greyscaleAlgorithm: 'Luma', + algorithm: 'Atkinson', 'stroke-width': '0.25' }, [toKey(HEAD_LASER, PROCESS_MODE_VECTOR, SOURCE_TYPE.TEXT)]: { @@ -380,7 +388,7 @@ const generateModelDefaultConfigs = (headType, sourceType, mode, isRotate = fals || defaultConfigs[toKey(headType, mode, isRotate)] || defaultConfigs[toKey(headType, mode)] || defaultConfigs[toKey(headType)] - || {}; + || { greyscaleAlgorithm: 'Luma' }; const gcodeConfig = defaultGcodeConfigs[toKey(headType, mode, sourceType, isRotate)] || defaultGcodeConfigs[toKey(headType, mode, sourceType)] || defaultGcodeConfigs[toKey(headType, mode, isRotate)] diff --git a/src/app/ui/components/Input/TextArea.jsx b/src/app/ui/components/Input/TextArea.jsx index 4ddb19421f..721a4e12fc 100644 --- a/src/app/ui/components/Input/TextArea.jsx +++ b/src/app/ui/components/Input/TextArea.jsx @@ -1,5 +1,5 @@ import { debounce } from 'lodash'; -import React, { useState, useCallback, useEffect } from 'react'; +import React, { useState, useCallback } from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; import { Input } from 'antd'; @@ -8,13 +8,9 @@ import styles from './styles.styl'; const { TextArea } = Input; const TextAreaInput = React.memo(({ - className = '', value, defaultValue, disabled = false, onChange, ...rest + className = '', defaultValue, disabled = false, onChange, ...rest }) => { - const [displayValue, setDisplayValue] = useState(value); - - useEffect(() => { - setDisplayValue(value); - }, [value]); + const [displayValue, setDisplayValue] = useState(defaultValue); const changeHandler = useCallback((newValue) => { onChange && onChange(newValue); @@ -53,7 +49,6 @@ const TextAreaInput = React.memo(({ TextAreaInput.propTypes = { className: PropTypes.string, - value: PropTypes.string, defaultValue: PropTypes.string, disabled: PropTypes.bool, onChange: PropTypes.func diff --git a/src/app/ui/widgets/CncLaserShared/TextParameters.jsx b/src/app/ui/widgets/CncLaserShared/TextParameters.jsx index 5daccda5e6..8f616564fb 100644 --- a/src/app/ui/widgets/CncLaserShared/TextParameters.jsx +++ b/src/app/ui/widgets/CncLaserShared/TextParameters.jsx @@ -76,7 +76,7 @@ const TextParameters = ({ headType, modifyText, disabled }) => { disabled={disabled} className="sm-flex-width" rows="3" - value={text} + defaultValue={text} onChange={actions.onChangeText} /> diff --git a/src/app/ui/widgets/ConnectionFileTransfer/FileTransferView.tsx b/src/app/ui/widgets/ConnectionFileTransfer/FileTransferView.tsx index a25bbaa8c5..f6bddae2ce 100644 --- a/src/app/ui/widgets/ConnectionFileTransfer/FileTransferView.tsx +++ b/src/app/ui/widgets/ConnectionFileTransfer/FileTransferView.tsx @@ -102,13 +102,13 @@ const WifiTransport: React.FC = (props) => { const [showLaserStartJobModal, setShowLaserStartJobModal] = useState(false); const fileInput = useRef(); - const gcodeItemRef = useRef(); + const gcodeItemRef = useRef([]); const canvas = useRef(); const prevProps = usePrevious({ previewStage }); - const onSelectFile = useCallback((_selectFileName, name, event, needToUnselect = true) => { + const onSelectFile = useCallback((_selectFileName: string, event?: MouseEvent, needToUnselect: boolean = true) => { if (event && event.target && event.target.className && typeof event.target.className.indexOf === 'function') { if (event.target.className.indexOf('input-select') > -1 || event.target.className.indexOf('fa-check') > -1) { @@ -455,10 +455,10 @@ const WifiTransport: React.FC = (props) => { { gcodeItemRef?.current[index] = ref; }} setSelectFileIndex={setSelectFileIndex} /> @@ -474,7 +474,16 @@ const WifiTransport: React.FC = (props) => { size={24} title={i18n._('key-Workspace/Transport-Edit')} disabled={!selectedFile} - onClick={(e) => gcodeItemRef.current.remaneStart(selectedFile.uploadName, selectFileIndex, e)} + onClick={ + (e) => { + gcodeItemRef.current[selectFileIndex].remaneStart( + selectedFile.uploadName, + selectFileIndex, + selectedFile.renderGcodeFileName, + e + ); + } + } /> = (props) => { size={24} title={i18n._('key-Workspace/Transport-Delete')} disabled={!selectedFile} - onClick={() => gcodeItemRef.current.removeFile(selectedFile)} + onClick={() => gcodeItemRef.current[selectFileIndex].removeFile(selectedFile)} />
diff --git a/src/app/ui/widgets/ConnectionFileTransfer/GCodeListItem.tsx b/src/app/ui/widgets/ConnectionFileTransfer/GCodeListItem.tsx index 207cb6332a..aa21451a08 100644 --- a/src/app/ui/widgets/ConnectionFileTransfer/GCodeListItem.tsx +++ b/src/app/ui/widgets/ConnectionFileTransfer/GCodeListItem.tsx @@ -4,6 +4,7 @@ import classNames from 'classnames'; import React, { useEffect, useImperativeHandle, useRef } from 'react'; import { useDispatch } from 'react-redux'; +import { message } from 'antd'; import { pathWithRandomSuffix } from '../../../../shared/lib/random-utils'; import { actions as workspaceActions } from '../../../flux/workspace'; import gcodeActions from '../../../flux/workspace/actions-gcode'; @@ -20,9 +21,9 @@ declare interface GcodePreviewItemProps { gcodeFile: object; index: number; selected: boolean; - onSelectFile: () => {}; + onSelectFile: (_selectFileName: string, event: MouseEvent, needToUnselect?: boolean) => void; gRef: object; - setSelectFileIndex: () => {}; + setSelectFileIndex: (index: number) => void; } @@ -36,7 +37,7 @@ const GcodePreviewItem: React.FC = React.memo((props) => const { prefixName, suffixName } = normalizeNameDisplay(gcodeFile?.renderGcodeFileName || gcodeFile?.name, suffixLength); let size = ''; - const { isRenaming, uploadName } = gcodeFile; + const { isRenaming } = gcodeFile; if (!gcodeFile.size) { size = ''; } else if (gcodeFile.size / 1024 / 1024 > 1) { @@ -69,6 +70,11 @@ const GcodePreviewItem: React.FC = React.memo((props) => if (!changeNameInput.current) { return; } + if (!changeNameInput.current.value || !changeNameInput.current.value.trim()) { + message.error("file name can't be blank"); + changeNameInput.current.focus(); + return; + } let newName = changeNameInput.current.value; const m = _uploadName.match(/(\.gcode|\.cnc|\.nc)$/); if (m) { @@ -78,8 +84,9 @@ const GcodePreviewItem: React.FC = React.memo((props) => }; const onRenameStart = (_uploadName, _index, _renderGcodeFileName = '', event) => { + if (!selected) return; dispatch(workspaceActions.renameGcodeFile(_uploadName, null, true)); - event.stopPropagation(); + event && event.stopPropagation(); setTimeout(() => { changeNameInput.current.value = replace(_renderGcodeFileName, /(\.gcode|\.cnc|\.nc)$/, '') || _uploadName; changeNameInput.current.focus(); @@ -91,7 +98,7 @@ const GcodePreviewItem: React.FC = React.memo((props) => }; useImperativeHandle(gRef, () => ({ - remaneStart: (_uploadName, _index, e) => onRenameStart(_uploadName, _index, e), + remaneStart: (_uploadName, _index, _renderGcodeFileName, e) => onRenameStart(_uploadName, _index, _renderGcodeFileName, e), removeFile: (_gcodeFile) => onRemoveFile(_gcodeFile) })); @@ -109,7 +116,7 @@ const GcodePreviewItem: React.FC = React.memo((props) => )} key={pathWithRandomSuffix(gcodeFile.uploadName)} onClick={ - (event) => onSelectFile(gcodeFile.uploadName, null, event) + (event) => onSelectFile(gcodeFile.uploadName, event) } onKeyDown={noop} role="button" @@ -163,7 +170,7 @@ const GcodePreviewItem: React.FC = React.memo((props) => onRenameEnd(uploadName)} + onBlur={() => onRenameEnd(gcodeFile?.uploadName)} onKeyDown={(event) => onKeyDown(event)} ref={changeNameInput} /> @@ -180,7 +187,7 @@ const GcodePreviewItem: React.FC = React.memo((props) => className="height-48 position-absolute right-16" size={24} onClick={() => { - onSelectFile(gcodeFile.uploadName, null, null, false); + onSelectFile(gcodeFile.uploadName, null, false); dispatch(gcodeActions.renderPreviewGcodeFile(gcodeFile)); }} />