mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-27 15:54:39 +00:00
change drag move image scale (#8075)
This commit is contained in:
@@ -75,19 +75,27 @@ class FileContent extends React.Component {
|
|||||||
if (transforms.length > 0) {
|
if (transforms.length > 0) {
|
||||||
style.transform = transforms.join(' ');
|
style.transform = transforms.join(' ');
|
||||||
}
|
}
|
||||||
if (scale > 1 && offset && typeof offset === 'object') {
|
if (offset && typeof offset === 'object') {
|
||||||
if (offset.x !== undefined) style.left = offset.x;
|
if (offset.x !== undefined) {
|
||||||
if (offset.y !== undefined) style.top = offset.y;
|
style.left = offset.x;
|
||||||
|
}
|
||||||
|
if (offset.y !== undefined) {
|
||||||
|
style.top = offset.y;
|
||||||
|
}
|
||||||
style.position = 'relative';
|
style.position = 'relative';
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="file-view-content flex-1 image-file-view d-flex align-items-center justify-content-center">
|
<div className="file-view-content flex-1 image-file-view d-flex align-items-center justify-content-center">
|
||||||
{previousImage && (
|
{previousImage && (
|
||||||
<a href={previousImageUrl} id="img-prev" title={gettext('you can also press ← ')}><span className="sf3-font sf3-font-down rotate-90 d-inline-block"></span></a>
|
<a href={previousImageUrl} id="img-prev" title={gettext('you can also press ← ')}>
|
||||||
|
<span className="sf3-font sf3-font-down rotate-90 d-inline-block"></span>
|
||||||
|
</a>
|
||||||
)}
|
)}
|
||||||
{nextImage && (
|
{nextImage && (
|
||||||
<a href={nextImageUrl} id="img-next" title={gettext('you can also press →')}><span className="sf3-font sf3-font-down rotate-270 d-inline-block"></span></a>
|
<a href={nextImageUrl} id="img-next" title={gettext('you can also press →')}>
|
||||||
|
<span className="sf3-font sf3-font-down rotate-270 d-inline-block"></span>
|
||||||
|
</a>
|
||||||
)}
|
)}
|
||||||
<img src={thumbnailURL || rawPath} alt={fileName} id="image-view" onError={this.handleLoadFailure} style={style} />
|
<img src={thumbnailURL || rawPath} alt={fileName} id="image-view" onError={this.handleLoadFailure} style={style} />
|
||||||
</div>
|
</div>
|
||||||
|
@@ -139,7 +139,10 @@ class FileToolbar extends React.Component {
|
|||||||
<div className="d-none d-md-flex justify-content-between align-items-center flex-shrink-0 ml-4">
|
<div className="d-none d-md-flex justify-content-between align-items-center flex-shrink-0 ml-4">
|
||||||
{(fileType == 'Image' && !err) && (
|
{(fileType == 'Image' && !err) && (
|
||||||
<>
|
<>
|
||||||
<ImageZoomer setImageScale={this.props.setImageScale} />
|
<ImageZoomer
|
||||||
|
setImageScale={this.props.setImageScale}
|
||||||
|
setDefaultPageFitScale={this.props.setDefaultPageFitScale}
|
||||||
|
/>
|
||||||
{['psd', 'heic'].indexOf(fileExt) == -1 && (
|
{['psd', 'heic'].indexOf(fileExt) == -1 && (
|
||||||
<IconButton
|
<IconButton
|
||||||
id="rotate-image"
|
id="rotate-image"
|
||||||
|
@@ -158,6 +158,7 @@ class FileView extends React.Component {
|
|||||||
rotateImage={this.props.rotateImage}
|
rotateImage={this.props.rotateImage}
|
||||||
lineWrapping={this.props.lineWrapping}
|
lineWrapping={this.props.lineWrapping}
|
||||||
updateLineWrapping={this.props.updateLineWrapping}
|
updateLineWrapping={this.props.updateLineWrapping}
|
||||||
|
setDefaultPageFitScale={this.props.setDefaultPageFitScale}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
@@ -13,7 +13,7 @@ const SCALE_OPTIONS_2 = [
|
|||||||
];
|
];
|
||||||
const DEFAULT_SCALE = SCALE_OPTIONS_2[0];
|
const DEFAULT_SCALE = SCALE_OPTIONS_2[0];
|
||||||
|
|
||||||
const ImageZoomer = ({ setImageScale }) => {
|
const ImageZoomer = ({ setImageScale, setDefaultPageFitScale }) => {
|
||||||
|
|
||||||
const [curScale, setScale] = useState(1);
|
const [curScale, setScale] = useState(1);
|
||||||
const [curScaleText, setScaleText] = useState(DEFAULT_SCALE.text); // for the text shown in the input
|
const [curScaleText, setScaleText] = useState(DEFAULT_SCALE.text); // for the text shown in the input
|
||||||
@@ -59,7 +59,7 @@ const ImageZoomer = ({ setImageScale }) => {
|
|||||||
if (!imageElement || (imageElement.clientWidth === 2 && imageElement.clientHeight === 2)) {
|
if (!imageElement || (imageElement.clientWidth === 2 && imageElement.clientHeight === 2)) {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
scaleImageToPageFit();
|
scaleImageToPageFit();
|
||||||
}, 100);
|
}, 1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const borderWidth = 1;
|
const borderWidth = 1;
|
||||||
@@ -77,7 +77,8 @@ const ImageZoomer = ({ setImageScale }) => {
|
|||||||
const scale = Math.min(hScale, vScale);
|
const scale = Math.min(hScale, vScale);
|
||||||
setScale(scale);
|
setScale(scale);
|
||||||
scaleImage(scale);
|
scaleImage(scale);
|
||||||
}, [setScale, scaleImage]);
|
setDefaultPageFitScale(scale);
|
||||||
|
}, [setScale, scaleImage, setDefaultPageFitScale]);
|
||||||
|
|
||||||
const onMenuItemClick = useCallback((value) => {
|
const onMenuItemClick = useCallback((value) => {
|
||||||
setSelectedScale(value);
|
setSelectedScale(value);
|
||||||
|
@@ -29,6 +29,7 @@ class InnerFileView extends React.Component {
|
|||||||
dragOrigin: null,
|
dragOrigin: null,
|
||||||
};
|
};
|
||||||
this.imageContainerRef = React.createRef();
|
this.imageContainerRef = React.createRef();
|
||||||
|
this.defaultPageFitScale = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
setImageScale = (scale) => {
|
setImageScale = (scale) => {
|
||||||
@@ -38,6 +39,10 @@ class InnerFileView extends React.Component {
|
|||||||
}));
|
}));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
setDefaultPageFitScale = (scale) => {
|
||||||
|
this.defaultPageFitScale = scale;
|
||||||
|
};
|
||||||
|
|
||||||
rotateImage = () => {
|
rotateImage = () => {
|
||||||
this.setState({
|
this.setState({
|
||||||
imageAngle: (this.state.imageAngle - 90) % 360 // counter-clockwise
|
imageAngle: (this.state.imageAngle - 90) % 360 // counter-clockwise
|
||||||
@@ -53,7 +58,7 @@ class InnerFileView extends React.Component {
|
|||||||
};
|
};
|
||||||
|
|
||||||
handleImageMouseDown = (e) => {
|
handleImageMouseDown = (e) => {
|
||||||
if (this.state.imageScale <= 1) return;
|
if (this.state.imageScale < this.defaultPageFitScale) return;
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
this.setState({
|
this.setState({
|
||||||
isDragging: true,
|
isDragging: true,
|
||||||
@@ -97,7 +102,7 @@ class InnerFileView extends React.Component {
|
|||||||
<div
|
<div
|
||||||
ref={this.imageContainerRef}
|
ref={this.imageContainerRef}
|
||||||
className="d-flex w-100 h-100"
|
className="d-flex w-100 h-100"
|
||||||
style={{ cursor: imageScale > 1 ? 'move' : 'default' }}
|
style={{ cursor: imageScale >= this.defaultPageFitScale ? 'move' : 'default' }}
|
||||||
onMouseDown={this.handleImageMouseDown}
|
onMouseDown={this.handleImageMouseDown}
|
||||||
onMouseMove={this.handleImageMouseMove}
|
onMouseMove={this.handleImageMouseMove}
|
||||||
onMouseUp={this.handleImageMouseUp}
|
onMouseUp={this.handleImageMouseUp}
|
||||||
@@ -131,6 +136,7 @@ class InnerFileView extends React.Component {
|
|||||||
<FileView
|
<FileView
|
||||||
content={content}
|
content={content}
|
||||||
setImageScale={this.setImageScale}
|
setImageScale={this.setImageScale}
|
||||||
|
setDefaultPageFitScale={this.setDefaultPageFitScale}
|
||||||
rotateImage={this.rotateImage}
|
rotateImage={this.rotateImage}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
Reference in New Issue
Block a user