|
@@ -364,7 +364,7 @@ fun ReplaceRuleScreen(
|
|
|
)
|
|
)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- /*if (inSelectionMode) {
|
|
|
|
|
|
|
+ if (inSelectionMode) {
|
|
|
DraggableSelectionHandler(
|
|
DraggableSelectionHandler(
|
|
|
listState = listState,
|
|
listState = listState,
|
|
|
rules = rules,
|
|
rules = rules,
|
|
@@ -377,7 +377,7 @@ fun ReplaceRuleScreen(
|
|
|
.width(60.dp)
|
|
.width(60.dp)
|
|
|
.align(Alignment.TopStart)
|
|
.align(Alignment.TopStart)
|
|
|
)
|
|
)
|
|
|
- }*/
|
|
|
|
|
|
|
+ }
|
|
|
AnimatedVisibility(
|
|
AnimatedVisibility(
|
|
|
visible = inSelectionMode,
|
|
visible = inSelectionMode,
|
|
|
modifier = Modifier
|
|
modifier = Modifier
|
|
@@ -448,24 +448,27 @@ fun DraggableSelectionHandler(
|
|
|
haptic: HapticFeedback,
|
|
haptic: HapticFeedback,
|
|
|
modifier: Modifier = Modifier
|
|
modifier: Modifier = Modifier
|
|
|
) {
|
|
) {
|
|
|
|
|
+ val latestSelectedRuleIds by rememberUpdatedState(selectedRuleIds)
|
|
|
var isAddingMode by remember { mutableStateOf(true) }
|
|
var isAddingMode by remember { mutableStateOf(true) }
|
|
|
var lastProcessedIndex by remember { mutableIntStateOf(-1) }
|
|
var lastProcessedIndex by remember { mutableIntStateOf(-1) }
|
|
|
|
|
|
|
|
fun findRuleAtOffset(offsetY: Float): Pair<Int, ReplaceRuleItemUi>? {
|
|
fun findRuleAtOffset(offsetY: Float): Pair<Int, ReplaceRuleItemUi>? {
|
|
|
- val visibleItem = listState.layoutInfo.visibleItemsInfo.find { item ->
|
|
|
|
|
- offsetY >= item.offset && offsetY <= item.offset + item.size
|
|
|
|
|
- }
|
|
|
|
|
- return visibleItem?.let { item ->
|
|
|
|
|
- rules.getOrNull(item.index)?.let { rule ->
|
|
|
|
|
- item.index to rule
|
|
|
|
|
|
|
+ val itemInfo = listState.layoutInfo.visibleItemsInfo
|
|
|
|
|
+ .firstOrNull { item ->
|
|
|
|
|
+ offsetY >= item.offset && offsetY <= item.offset + item.size
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return itemInfo?.let { info ->
|
|
|
|
|
+ rules.getOrNull(info.index)?.let { rule ->
|
|
|
|
|
+ info.index to rule
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
fun applySelection(id: Long, add: Boolean) {
|
|
fun applySelection(id: Long, add: Boolean) {
|
|
|
|
|
+ val current = latestSelectedRuleIds
|
|
|
onSelectionChange(
|
|
onSelectionChange(
|
|
|
- if (add) selectedRuleIds + id
|
|
|
|
|
- else selectedRuleIds - id
|
|
|
|
|
|
|
+ if (add) current + id else current - id
|
|
|
)
|
|
)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -479,11 +482,10 @@ fun DraggableSelectionHandler(
|
|
|
if (result != null) {
|
|
if (result != null) {
|
|
|
val (_, rule) = result
|
|
val (_, rule) = result
|
|
|
val id = rule.id
|
|
val id = rule.id
|
|
|
|
|
+ val current = latestSelectedRuleIds
|
|
|
onSelectionChange(
|
|
onSelectionChange(
|
|
|
- if (selectedRuleIds.contains(id))
|
|
|
|
|
- selectedRuleIds - id
|
|
|
|
|
- else
|
|
|
|
|
- selectedRuleIds + id
|
|
|
|
|
|
|
+ if (current.contains(id)) current - id
|
|
|
|
|
+ else current + id
|
|
|
)
|
|
)
|
|
|
haptic.performHapticFeedback(
|
|
haptic.performHapticFeedback(
|
|
|
HapticFeedbackType.TextHandleMove
|
|
HapticFeedbackType.TextHandleMove
|
|
@@ -493,6 +495,7 @@ fun DraggableSelectionHandler(
|
|
|
)
|
|
)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // 拖拽多选
|
|
|
launch {
|
|
launch {
|
|
|
detectDragGestures(
|
|
detectDragGestures(
|
|
|
onDragStart = { offset ->
|
|
onDragStart = { offset ->
|
|
@@ -502,7 +505,8 @@ fun DraggableSelectionHandler(
|
|
|
lastProcessedIndex = index
|
|
lastProcessedIndex = index
|
|
|
|
|
|
|
|
val id = rule.id
|
|
val id = rule.id
|
|
|
- isAddingMode = !selectedRuleIds.contains(id)
|
|
|
|
|
|
|
+ val current = latestSelectedRuleIds
|
|
|
|
|
+ isAddingMode = !current.contains(id)
|
|
|
applySelection(id, isAddingMode)
|
|
applySelection(id, isAddingMode)
|
|
|
|
|
|
|
|
haptic.performHapticFeedback(
|
|
haptic.performHapticFeedback(
|