util.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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 { LayerOrderDirection } from './constants'
  21. import { ILayerFormed } from '../../types'
  22. const sortLayers = (
  23. layers: ILayerFormed[],
  24. orderDirection: LayerOrderDirection
  25. ): ILayerFormed[] => {
  26. if (!Array.isArray(layers)) {
  27. return []
  28. }
  29. const sortedLayers = [...layers]
  30. switch (orderDirection) {
  31. case LayerOrderDirection.Asc:
  32. sortedLayers.sort((item1, item2) => item1.index - item2.index)
  33. break
  34. case LayerOrderDirection.Desc:
  35. sortedLayers.sort((item1, item2) => item2.index - item1.index)
  36. break
  37. default:
  38. break
  39. }
  40. return sortedLayers
  41. }
  42. const swapLayerIndex = (
  43. orderedSelectedLayers: ILayerFormed[],
  44. orderedLayers: ILayerFormed[]
  45. ) => {
  46. const updatedLayers: ILayerFormed[] = []
  47. orderedSelectedLayers.forEach((layer) => {
  48. const idx = orderedLayers.findIndex((l) => l.id === layer.id)
  49. if (
  50. idx === 0 ||
  51. orderedSelectedLayers.findIndex(
  52. (l) => l.id === orderedLayers[idx - 1].id
  53. ) >= 0
  54. ) {
  55. return
  56. }
  57. const tempIndex = orderedLayers[idx].index
  58. orderedLayers[idx].index = orderedLayers[idx - 1].index
  59. orderedLayers[idx - 1].index = tempIndex
  60. const temp = orderedLayers[idx]
  61. orderedLayers[idx] = orderedLayers[idx - 1]
  62. orderedLayers[idx - 1] = temp
  63. const currentLayers = [orderedLayers[idx], orderedLayers[idx - 1]]
  64. currentLayers.forEach((item) => {
  65. const exists = updatedLayers.findIndex((l) => l.id === item.id)
  66. if (exists < 0) {
  67. updatedLayers.push({ ...item })
  68. } else {
  69. updatedLayers.splice(exists, 1, { ...item })
  70. }
  71. })
  72. })
  73. return updatedLayers
  74. }
  75. export const bringToUpper = (
  76. selectedLayers: ILayerFormed[],
  77. layers: ILayerFormed[]
  78. ) => {
  79. const descSelectedLayers = sortLayers(selectedLayers, LayerOrderDirection.Desc)
  80. const descLayers = sortLayers(layers, LayerOrderDirection.Desc)
  81. return swapLayerIndex(descSelectedLayers, descLayers)
  82. }
  83. export const sendToNext = (
  84. selectedLayers: ILayerFormed[],
  85. layers: ILayerFormed[]
  86. ) => {
  87. const ascSelectedLayers = sortLayers(selectedLayers, LayerOrderDirection.Asc)
  88. const ascLayers = sortLayers(layers, LayerOrderDirection.Asc)
  89. return swapLayerIndex(ascSelectedLayers, ascLayers)
  90. }
  91. export const bringToFront = (
  92. selectedLayers: ILayerFormed[],
  93. layers: ILayerFormed[]
  94. ) => {
  95. if (selectedLayers.length <= 0) {
  96. return []
  97. }
  98. const maxLayerIndex = layers.reduce(
  99. (acc, layer) => Math.max(layer.index, acc),
  100. -Infinity
  101. )
  102. const updateLayers = sortLayers(selectedLayers, LayerOrderDirection.Asc).map<
  103. ILayerFormed
  104. >((layer, idx) => ({
  105. ...layer,
  106. index: maxLayerIndex + idx + 1
  107. }))
  108. return updateLayers
  109. }
  110. export const sendToBottom = (
  111. selectedLayers: ILayerFormed[],
  112. layers: ILayerFormed[]
  113. ) => {
  114. if (selectedLayers.length <= 0) {
  115. return []
  116. }
  117. const minLayerIndex = layers.reduce(
  118. (acc, layer) => Math.min(layer.index, acc),
  119. Infinity
  120. )
  121. const updateLayers = sortLayers(selectedLayers, LayerOrderDirection.Desc).map(
  122. (layer, idx) => ({
  123. ...layer,
  124. index: minLayerIndex - idx - 1
  125. })
  126. )
  127. return updateLayers
  128. }