1
0

drag-view-model.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. const PARAMETER_REGISTER_DRAG_THRESHOLD_PX = 12
  2. const PARAMETER_REGISTER_ROW_HEIGHT_RPX = 92
  3. function clampIndex(value, min, max) {
  4. return Math.min(Math.max(value, min), max)
  5. }
  6. function getNumberOr(value, fallback) {
  7. const numberValue = Number(value)
  8. return Number.isFinite(numberValue) ? numberValue : fallback
  9. }
  10. function getWindowWidth() {
  11. try {
  12. if (typeof wx !== 'undefined' && wx && typeof wx.getWindowInfo === 'function') {
  13. const info = wx.getWindowInfo()
  14. if (info && Number.isFinite(info.windowWidth)) return info.windowWidth
  15. }
  16. } catch (error) {}
  17. try {
  18. if (typeof wx !== 'undefined' && wx && typeof wx.getSystemInfoSync === 'function') {
  19. const info = wx.getSystemInfoSync()
  20. if (info && Number.isFinite(info.windowWidth)) return info.windowWidth
  21. }
  22. } catch (error) {}
  23. return 375
  24. }
  25. function rpxToPx(rpx, windowWidth) {
  26. return Math.round(Number(rpx || 0) * Number(windowWidth || 375) / 750)
  27. }
  28. function getFallbackDragRowOffsetPx(windowWidth) {
  29. return Math.max(44, rpxToPx(PARAMETER_REGISTER_ROW_HEIGHT_RPX, windowWidth))
  30. }
  31. function resolveDragTargetIndex(drag, currentY, totalCount) {
  32. if (!drag || !Number.isInteger(totalCount) || totalCount <= 0) return 0
  33. const sourceIndex = clampIndex(getNumberOr(drag.index, 0), 0, totalCount - 1)
  34. const rowCenters = Array.isArray(drag.rowCenters) ? drag.rowCenters : []
  35. const sourceCenter = Number(rowCenters[sourceIndex])
  36. const startY = getNumberOr(drag.startY, currentY)
  37. if (rowCenters.length === totalCount && Number.isFinite(sourceCenter)) {
  38. const currentCenter = sourceCenter + (Number(currentY) - startY)
  39. let targetIndex = sourceIndex
  40. if (currentCenter >= sourceCenter) {
  41. for (let index = sourceIndex + 1; index < totalCount; index += 1) {
  42. if (currentCenter > Number(rowCenters[index])) targetIndex = index
  43. }
  44. } else {
  45. for (let index = sourceIndex - 1; index >= 0; index -= 1) {
  46. if (currentCenter < Number(rowCenters[index])) targetIndex = index
  47. }
  48. }
  49. return clampIndex(targetIndex, 0, totalCount - 1)
  50. }
  51. const rowOffset = Math.max(1, Number(drag.rowOffset) || 1)
  52. const step = Math.round((Number(currentY) - startY) / rowOffset)
  53. return clampIndex(sourceIndex + step, 0, totalCount - 1)
  54. }
  55. function buildActiveParameterRegisterRows(group, dragState) {
  56. if (!group || !Array.isArray(group.registers)) return []
  57. const drag = dragState && dragState.groupId === group.id ? dragState : null
  58. const activeIndex = drag ? clampIndex(getNumberOr(drag.index, 0), 0, group.registers.length - 1) : -1
  59. const targetIndex = drag ? clampIndex(getNumberOr(drag.targetIndex, activeIndex), 0, group.registers.length - 1) : -1
  60. const rowOffset = drag ? Math.max(1, Math.round(Number(drag.rowOffset) || 0)) : 0
  61. const translateY = drag ? Math.round(Number(drag.translateY) || 0) : 0
  62. return group.registers.map((register, index) => {
  63. const row = {
  64. ...register,
  65. sourceIndex: index,
  66. dragClass: '',
  67. dragHandleClass: '',
  68. dragStyle: ''
  69. }
  70. if (!drag) return row
  71. const isActive = index === activeIndex
  72. let shiftY = 0
  73. if (drag.moved && rowOffset) {
  74. if (activeIndex < targetIndex && index > activeIndex && index <= targetIndex) {
  75. shiftY = -rowOffset
  76. } else if (activeIndex > targetIndex && index >= targetIndex && index < activeIndex) {
  77. shiftY = rowOffset
  78. }
  79. }
  80. if (isActive) {
  81. row.dragClass = drag.moved ? 'is-dragging' : 'is-drag-armed'
  82. row.dragHandleClass = drag.moved ? 'is-dragging' : 'is-drag-armed'
  83. row.dragStyle = drag.moved
  84. ? `transform: translate3d(0, ${translateY}px, 0) scale(1.02); z-index: 8;`
  85. : 'z-index: 3;'
  86. return row
  87. }
  88. if (shiftY) {
  89. row.dragClass = shiftY > 0 ? 'is-shift-down' : 'is-shift-up'
  90. row.dragStyle = `transform: translate3d(0, ${shiftY}px, 0);`
  91. }
  92. return row
  93. })
  94. }
  95. module.exports = {
  96. PARAMETER_REGISTER_DRAG_THRESHOLD_PX,
  97. buildActiveParameterRegisterRows,
  98. clampIndex,
  99. getFallbackDragRowOffsetPx,
  100. getWindowWidth,
  101. resolveDragTargetIndex
  102. }