1
- @file:OptIn(ExperimentalComposeUiApi ::class )
1
+ @file:OptIn(ExperimentalComposeUiApi ::class , ExperimentalFoundationApi :: class , ExperimentalFoundationApi :: class )
2
2
3
3
package com.jerryjeon.logjerry.ui
4
4
5
5
import androidx.compose.animation.AnimatedVisibility
6
6
import androidx.compose.animation.core.tween
7
7
import androidx.compose.animation.fadeIn
8
8
import androidx.compose.animation.fadeOut
9
- import androidx.compose.foundation.VerticalScrollbar
10
- import androidx.compose.foundation.background
11
- import androidx.compose.foundation.focusable
9
+ import androidx.compose.foundation.*
12
10
import androidx.compose.foundation.gestures.scrollBy
13
11
import androidx.compose.foundation.layout.*
14
12
import androidx.compose.foundation.lazy.LazyColumn
15
13
import androidx.compose.foundation.lazy.LazyListState
14
+ import androidx.compose.foundation.lazy.items
16
15
import androidx.compose.foundation.lazy.rememberLazyListState
17
- import androidx.compose.foundation.rememberScrollbarAdapter
18
16
import androidx.compose.material.Divider
19
17
import androidx.compose.material.MaterialTheme
20
18
import androidx.compose.material.Text
@@ -24,9 +22,10 @@ import androidx.compose.ui.ExperimentalComposeUiApi
24
22
import androidx.compose.ui.Modifier
25
23
import androidx.compose.ui.focus.FocusRequester
26
24
import androidx.compose.ui.focus.focusRequester
27
- import androidx.compose.ui.focus.onFocusChanged
28
25
import androidx.compose.ui.graphics.Color
29
26
import androidx.compose.ui.input.key.*
27
+ import androidx.compose.ui.text.style.TextAlign
28
+ import androidx.compose.ui.unit.Dp
30
29
import androidx.compose.ui.unit.dp
31
30
import androidx.compose.ui.unit.sp
32
31
import com.jerryjeon.logjerry.ColumnDivider
@@ -42,7 +41,9 @@ import com.jerryjeon.logjerry.table.Header
42
41
import com.jerryjeon.logjerry.ui.focus.DetectionFocus
43
42
import com.jerryjeon.logjerry.ui.focus.KeyboardFocus
44
43
import com.jerryjeon.logjerry.ui.focus.LogFocus
44
+ import com.jerryjeon.logjerry.ui.focus.MarkFocus
45
45
import com.jerryjeon.logjerry.util.isCtrlOrMetaPressed
46
+ import kotlinx.coroutines.GlobalScope
46
47
import kotlinx.coroutines.delay
47
48
import kotlinx.coroutines.flow.collectLatest
48
49
import kotlinx.coroutines.launch
@@ -59,7 +60,7 @@ fun LogsView(
59
60
moveToNextMark : () -> Unit ,
60
61
) {
61
62
val listState = rememberLazyListState()
62
- LaunchedEffect (refineResult) {
63
+ LaunchedEffect (refineResult.currentFocus ) {
63
64
refineResult.currentFocus.collectLatest {
64
65
if (it == null ) return @collectLatest
65
66
val headerCount = 2
@@ -92,26 +93,50 @@ fun LogsView(
92
93
(if (filteredSize != totalSize) " Filtered size : $filteredSize , " else " " )
93
94
Text (" ${filteredSizeText} Total : $totalSize " , modifier = Modifier .padding(8 .dp))
94
95
95
- LogsView (
96
- preferences = preferences,
97
- refinedLogs = refineResult.refinedLogs,
98
- detectorManager = detectorManager,
99
- header = header,
100
- listState = listState,
101
- markedRows = refineResult.markedRows,
102
- setMark = detectorManager::setMark,
103
- deleteMark = detectorManager::deleteMark,
104
- hide = hide,
105
- changeFocus = { refineResult.currentFocus.value = it },
106
- moveToPreviousMark = moveToPreviousMark,
107
- moveToNextMark = moveToNextMark,
108
- )
96
+ Box {
97
+ LogsView (
98
+ modifier = Modifier .fillMaxWidth(),
99
+ endPadding = 120 .dp,
100
+ preferences = preferences,
101
+ refinedLogs = refineResult.refinedLogs,
102
+ detectorManager = detectorManager,
103
+ header = header,
104
+ listState = listState,
105
+ markedRows = refineResult.markedRows,
106
+ setMark = detectorManager::setMark,
107
+ deleteMark = detectorManager::deleteMark,
108
+ hide = hide,
109
+ changeFocus = { refineResult.currentFocus.value = it },
110
+ moveToPreviousMark = moveToPreviousMark,
111
+ moveToNextMark = moveToNextMark,
112
+ )
113
+ LazyColumn (modifier = Modifier .width(120 .dp).fillMaxHeight().align(Alignment .CenterEnd )) {
114
+ items(refineResult.markedRows) {
115
+ val mark = it.mark!!
116
+ Box (
117
+ modifier = Modifier .fillMaxWidth().height(60 .dp).background(mark.color)
118
+ .clickable {
119
+ refineResult.selectDetection(mark)
120
+ },
121
+ ) {
122
+ Text (
123
+ mark.note,
124
+ modifier = Modifier .align(Alignment .Center ),
125
+ textAlign = TextAlign .Center ,
126
+ color = Color .Black ,
127
+ )
128
+ }
129
+ Divider ()
130
+ }
131
+ }
109
132
133
+ }
110
134
}
111
135
112
136
@Composable
113
137
fun LogsView (
114
138
modifier : Modifier = Modifier ,
139
+ endPadding : Dp ,
115
140
refinedLogs : List <RefinedLog >,
116
141
detectorManager : DetectorManager ,
117
142
preferences : Preferences ,
@@ -229,7 +254,7 @@ fun LogsView(
229
254
.focusable()
230
255
) {
231
256
Box {
232
- LazyColumn (modifier = Modifier .fillMaxSize(), state = listState) {
257
+ LazyColumn (modifier = Modifier .fillMaxSize().padding(end = endPadding) , state = listState) {
233
258
item { HeaderRow (header, divider) }
234
259
item { HeaderDivider () }
235
260
refinedLogs.forEach { refinedLog ->
0 commit comments