LayerDraggable.tsx 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /*
  2. * <<
  3. * Davinci
  4. * ==
  5. * Copyright (C) 2016 - 2017 EDP
  6. * ==
  7. * Licensed under the Apache License, Version 2.0 (the "License");
  8. * you may not use this file except in compliance with the License.
  9. * You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing, software
  14. * distributed under the License is distributed on an "AS IS" BASIS,
  15. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. * See the License for the specific language governing permissions and
  17. * limitations under the License.
  18. * >>
  19. */
  20. import React, { useContext, useCallback } from 'react'
  21. import { ContainerContext } from '../../Container/ContainerContext'
  22. import { LayerListContext, LayerContext } from '../util'
  23. import { DraggableCore, DraggableEventHandler } from 'react-draggable'
  24. import { DraggableProxy } from './DraggableProxy'
  25. import { DeltaPosition } from '../types'
  26. import { DragTriggerTypes } from 'app/containers/Display/constants'
  27. // @FIX when update react-draggble in next versions
  28. // to fix react-draggble@4.2.0 DraggableCore delta param in float value when scale is not 1
  29. const adjustDelta = (deltaX: number, deltaY: number): DeltaPosition => ({
  30. deltaX: Math.round(deltaX),
  31. deltaY: Math.round(deltaY)
  32. })
  33. const LayerDraggable: React.FC = (props) => {
  34. const { scale, grid } = useContext(ContainerContext)
  35. const { onDrag } = useContext(LayerListContext)
  36. const {
  37. layer: { id: layerId }, operationInfo: { editing }
  38. } = useContext(LayerContext)
  39. const start: DraggableEventHandler = useCallback((e, data) => {
  40. e.stopPropagation()
  41. if (e.target === data.node.lastElementChild) {
  42. return false
  43. }
  44. if (
  45. typeof (e as MouseEvent).button === 'number' &&
  46. (e as MouseEvent).button !== 0
  47. ) {
  48. return false
  49. }
  50. }, [])
  51. const drag: DraggableEventHandler = useCallback(
  52. (e, { deltaX, deltaY }) => {
  53. e.stopPropagation()
  54. const eventTrigger = e.type as DragTriggerTypes
  55. onDrag(layerId, adjustDelta(deltaX, deltaY), eventTrigger)
  56. },
  57. [layerId, onDrag]
  58. )
  59. const stop: DraggableEventHandler = useCallback(
  60. (e, { deltaX, deltaY }) => {
  61. e.stopPropagation()
  62. const eventTrigger = e.type as DragTriggerTypes
  63. onDrag(layerId, adjustDelta(deltaX, deltaY), eventTrigger, true)
  64. },
  65. [layerId, onDrag]
  66. )
  67. return (
  68. <DraggableCore
  69. allowAnyClick
  70. grid={grid}
  71. scale={scale[0]}
  72. onStart={start}
  73. onStop={stop}
  74. onDrag={drag}
  75. handle=".display-slide-layer"
  76. disabled ={editing}
  77. >
  78. <DraggableProxy>{props.children}</DraggableProxy>
  79. </DraggableCore>
  80. )
  81. }
  82. export default LayerDraggable