1
1
package jp.kaleidot725.texteditor.view
2
2
3
- import android.util.Log
4
3
import androidx.compose.foundation.clickable
5
4
import androidx.compose.foundation.interaction.MutableInteractionSource
6
5
import androidx.compose.foundation.layout.Box
@@ -20,6 +19,7 @@ import androidx.compose.ui.Modifier
20
19
import androidx.compose.ui.focus.FocusRequester
21
20
import jp.kaleidot725.texteditor.controller.rememberTextEditorController
22
21
import jp.kaleidot725.texteditor.state.TextEditorState
22
+ import java.util.Date
23
23
24
24
typealias DecorationBoxComposable = @Composable (
25
25
index: Int ,
@@ -37,37 +37,13 @@ fun TextEditor(
37
37
) {
38
38
val textEditorState by rememberUpdatedState(newValue = textEditorState)
39
39
val editableController by rememberTextEditorController(textEditorState, onChanged = { onChanged(it) })
40
- var lastEvent by remember { mutableStateOf(null as Event ? ) }
40
+ var lastScrollEvent by remember { mutableStateOf(null as ScrollEvent ? ) }
41
41
val lazyColumnState = rememberLazyListState()
42
42
val focusRequesters by remember { mutableStateOf(mutableMapOf<Int , FocusRequester >()) }
43
-
44
43
editableController.syncState(textEditorState)
45
44
46
- LaunchedEffect (lastEvent) {
47
- when (val event = lastEvent) {
48
- is Event .AddNewLine -> {
49
- lazyColumnState.animateScrollToItem(event.index)
50
- }
51
- is Event .DeleteNewLine -> {
52
- lazyColumnState.animateScrollToItem(event.index)
53
- }
54
- is Event .Down -> {
55
- lazyColumnState.animateScrollToItem(event.index)
56
- }
57
- is Event .Up -> {
58
- lazyColumnState.animateScrollToItem(event.index)
59
- }
60
- else -> {}
61
- }
62
- }
63
-
64
- LaunchedEffect (textEditorState.selectedIndices) {
65
- val targetIndex = textEditorState.selectedIndices.firstOrNull() ? : return @LaunchedEffect
66
- try {
67
- focusRequesters[targetIndex]?.requestFocus()
68
- } catch (e: Exception ) {
69
- Log .d(" TextEditor" , " Warning $e " )
70
- }
45
+ LaunchedEffect (lastScrollEvent) {
46
+ lastScrollEvent?.index?.let { lazyColumnState.scrollToItem(it) }
71
47
}
72
48
73
49
LazyColumn (
@@ -118,28 +94,34 @@ fun TextEditor(
118
94
editableController.updateField(targetIndex = index, textFieldValue = newText)
119
95
},
120
96
onContainNewLine = { newText ->
97
+ if (lastScrollEvent != null && lastScrollEvent?.isConsumed != true ) return @TextField
121
98
editableController.splitNewLine(targetIndex = index, textFieldValue = newText)
122
- lastEvent = Event . AddNewLine (index + 1 )
99
+ lastScrollEvent = ScrollEvent (index + 1 )
123
100
},
124
101
onAddNewLine = { newText ->
102
+ if (lastScrollEvent != null && lastScrollEvent?.isConsumed != true ) return @TextField
125
103
editableController.splitAtCursor(targetIndex = index, textFieldValue = newText)
126
- lastEvent = Event . AddNewLine (index + 1 )
104
+ lastScrollEvent = ScrollEvent (index + 1 )
127
105
},
128
106
onDeleteNewLine = {
107
+ if (lastScrollEvent != null && lastScrollEvent?.isConsumed != true ) return @TextField
129
108
editableController.deleteField(targetIndex = index)
130
- if (index != 0 ) lastEvent = Event . DeleteNewLine (index - 1 )
109
+ if (index != 0 ) lastScrollEvent = ScrollEvent (index - 1 )
131
110
},
132
111
onFocus = {
133
112
editableController.selectField(index)
134
113
},
135
114
onUpFocus = {
115
+ if (lastScrollEvent != null && lastScrollEvent?.isConsumed != true ) return @TextField
136
116
editableController.selectPreviousField()
137
- if (index != 0 ) lastEvent = Event . DeleteNewLine (index - 1 )
117
+ if (index != 0 ) lastScrollEvent = ScrollEvent (index - 1 )
138
118
},
139
119
onDownFocus = {
120
+ if (lastScrollEvent != null && lastScrollEvent?.isConsumed != true ) return @TextField
140
121
editableController.selectNextField()
141
- lastEvent = Event .AddNewLine (index + 1 )
142
- }
122
+ if (index != textEditorState.fields.lastIndex) lastScrollEvent = ScrollEvent (index + 1 )
123
+ },
124
+ scrollEvent = if (lastScrollEvent?.index == index) lastScrollEvent else null
143
125
)
144
126
}
145
127
}
@@ -148,9 +130,11 @@ fun TextEditor(
148
130
}
149
131
}
150
132
151
- sealed class Event (val time : Long , val index : Int = -1 ) {
152
- class Up (index : Int ) : Event(System .currentTimeMillis(), index)
153
- class Down (index : Int ) : Event(System .currentTimeMillis(), index)
154
- class AddNewLine (index : Int ) : Event(System .currentTimeMillis(), index)
155
- class DeleteNewLine (index : Int ) : Event(System .currentTimeMillis(), index)
133
+ data class ScrollEvent (val index : Int = -1 , val time : Long = Date ().time) {
134
+ var isConsumed: Boolean = false
135
+ private set
136
+
137
+ fun consume () {
138
+ isConsumed = true
139
+ }
156
140
}
0 commit comments