in src/main/kotlin/git4ideaClasses/IRGitModel.kt [363:398]
fun moveElements(
moveGroup: List<Element<T>>,
position: Int,
) {
if (moveGroup.isEmpty()) {
return
}
var moveGroupNewFirstIndex = position.coerceIn(0, _elements.size - moveGroup.size)
val elementAtNewPosition = _elements[moveGroupNewFirstIndex]
moveGroupNewFirstIndex = shiftIndexIfNeeded(moveGroup, position, elementAtNewPosition, moveGroupNewFirstIndex)
val minIndex = min(moveGroup.first().index, moveGroupNewFirstIndex)
val maxIndex = max(moveGroup.last().index, (moveGroupNewFirstIndex + moveGroup.size).coerceAtMost(_elements.size - 1))
val moveGroupIndices = moveGroup.map { it.index }.toSet()
val saveElements = (minIndex..maxIndex).filter { it !in moveGroupIndices }.map { _elements[it] }
val saveElementsBeforeCount = moveGroupNewFirstIndex - minIndex
val saveElementsBeforeMoveGroup = saveElements.take(saveElementsBeforeCount)
val saveElementsAfterMoveGroup = saveElements.drop(saveElementsBeforeCount)
val changedElementsInterval = saveElementsBeforeMoveGroup + moveGroup + saveElementsAfterMoveGroup
changedElementsInterval.forEachIndexed { i, element ->
val newIndex = minIndex + i
_elements[newIndex] = element
element.index = newIndex
}
changedElementsInterval
.map { element -> if (element is Element.UniteChild) element.root else element }
.filterIsInstance<Element.UniteRoot<T>>()
.distinct()
.forEach { root ->
root.childrenIndicesChanged()
}
}