Skip to content

Commit 90477c2

Browse files
authored
Merge pull request #23 from jkj8790/feature/marks-view
Feature/marks view
2 parents 2ea00c4 + 00dd321 commit 90477c2

File tree

6 files changed

+68
-93
lines changed

6 files changed

+68
-93
lines changed

src/main/kotlin/com/jerryjeon/logjerry/logview/RefineResult.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.jerryjeon.logjerry.logview
33
import com.jerryjeon.logjerry.detector.Detection
44
import com.jerryjeon.logjerry.detector.DetectionStatus
55
import com.jerryjeon.logjerry.detector.DetectorKey
6+
import com.jerryjeon.logjerry.detector.MarkDetection
67
import com.jerryjeon.logjerry.ui.focus.DetectionFocus
78
import com.jerryjeon.logjerry.ui.focus.LogFocus
89
import kotlinx.coroutines.flow.MutableStateFlow
@@ -66,4 +67,18 @@ data class RefineResult(
6667
fun selectNextDetection(key: DetectorKey) {
6768
statusByKey.value[key]?.let { selectNextDetection(it) }
6869
}
70+
71+
fun selectDetection(detection: MarkDetection) {
72+
statusByKey.update {
73+
val status = it[detection.key] ?: return@update it
74+
val index = status.allDetections.indexOf(detection)
75+
val newStatus = status.copy(currentIndex = index, selected = detection)
76+
it + (newStatus.key to newStatus)
77+
}
78+
79+
val indexInRefinedLogs = refinedLogs.indexOfFirst { refinedLog ->
80+
refinedLog.log.index == statusByKey.value[detection.key]?.selected?.logIndex
81+
}
82+
currentFocus.value = DetectionFocus(indexInRefinedLogs)
83+
}
6984
}

src/main/kotlin/com/jerryjeon/logjerry/table/ColumnType.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,4 @@ enum class ColumnType(val text: String, val shortcut: KeyShortcut, val showDivid
1616
Priority("Lev", KeyShortcut(Key.Seven, meta = true), true),
1717
Tag("Tag", KeyShortcut(Key.Eight, meta = true), true),
1818
Log("Log", KeyShortcut(Key.Nine, meta = true), false),
19-
Detection("", KeyShortcut(Key.Zero, meta = true), false);
2019
}

src/main/kotlin/com/jerryjeon/logjerry/table/Header.kt

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,9 @@ data class Header(
1010
val priority: ColumnInfo,
1111
val tag: ColumnInfo,
1212
val log: ColumnInfo,
13-
val detection: ColumnInfo,
1413
) {
1514

16-
val asColumnList: List<ColumnInfo> = listOf(number, date, time, pid, tid, packageName, priority, tag, log, detection)
15+
val asColumnList: List<ColumnInfo> = listOf(number, date, time, pid, tid, packageName, priority, tag, log)
1716

1817
operator fun get(columnType: ColumnType): ColumnInfo {
1918
return when (columnType) {
@@ -26,7 +25,6 @@ data class Header(
2625
ColumnType.Priority -> priority
2726
ColumnType.Tag -> tag
2827
ColumnType.Log -> log
29-
ColumnType.Detection -> detection
3028
}
3129
}
3230

@@ -41,7 +39,6 @@ data class Header(
4139
ColumnType.Priority -> copy(priority = columnInfo)
4240
ColumnType.Tag -> copy(tag = columnInfo)
4341
ColumnType.Log -> copy(log = columnInfo)
44-
ColumnType.Detection -> copy(detection = columnInfo)
4542
}
4643
}
4744

@@ -56,7 +53,6 @@ data class Header(
5653
priority = ColumnInfo(ColumnType.Priority, 40, true),
5754
tag = ColumnInfo(ColumnType.Tag, 200, true),
5855
log = ColumnInfo(ColumnType.Log, null, true),
59-
detection = ColumnInfo(ColumnType.Detection, 50, true)
6056
)
6157
}
6258
}

src/main/kotlin/com/jerryjeon/logjerry/ui/LogRow.kt

Lines changed: 0 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,6 @@ fun RowScope.CellByColumnType(
127127
ColumnType.PackageName -> PackagerNameCell(preferences, columnInfo, log)
128128
ColumnType.Priority -> PriorityCell(preferences, columnInfo, log)
129129
ColumnType.Tag -> TagCell(preferences, columnInfo, log)
130-
ColumnType.Detection -> DetectionCell(columnInfo, refinedLog)
131130
ColumnType.Log -> LogCell(preferences, columnInfo, refinedLog)
132131
}
133132
}
@@ -283,70 +282,6 @@ private fun RowScope.LogCell(
283282
}
284283
}
285284

286-
@Composable
287-
private fun RowScope.DetectionCell(button: ColumnInfo, refinedLog: RefinedLog) {
288-
val showPrettyJsonDialog: MutableState<JsonObject?> = remember { mutableStateOf(null) }
289-
290-
Column(modifier = this.cellDefaultModifier(button.width)) {
291-
refinedLog.detections.values
292-
.flatten()
293-
.filterIsInstance<JsonDetection>()
294-
.forEachIndexed { index, jsonDetection ->
295-
TextButton(onClick = { showPrettyJsonDialog.value = jsonDetection.json }) {
296-
Row {
297-
Text("{ }")
298-
Text("${index + 1}", fontSize = 9.sp)
299-
}
300-
}
301-
}
302-
}
303-
304-
JsonPrettyDialog(showPrettyJsonDialog)
305-
}
306-
307-
@Composable
308-
private fun JsonPrettyDialog(
309-
showPrettyJsonDialogState: MutableState<JsonObject?>,
310-
) {
311-
showPrettyJsonDialogState.value?.let { jsonObject ->
312-
val prettyJson = json.encodeToString(JsonObject.serializer(), jsonObject)
313-
Dialog(
314-
onCloseRequest = { showPrettyJsonDialogState.value = null },
315-
title = "Pretty Json",
316-
state = DialogState(width = 800.dp, height = 600.dp),
317-
onPreviewKeyEvent = { keyEvent ->
318-
when {
319-
keyEvent.isCtrlOrMetaPressed && keyEvent.key == Key.W && keyEvent.type == KeyEventType.KeyDown -> {
320-
showPrettyJsonDialogState.value = null
321-
true
322-
}
323-
keyEvent.isCtrlOrMetaPressed && keyEvent.key == Key.C && keyEvent.type == KeyEventType.KeyDown -> {
324-
copyToClipboard(prettyJson)
325-
true
326-
}
327-
else -> {
328-
false
329-
}
330-
}
331-
}
332-
) {
333-
Box(modifier = Modifier.fillMaxSize().padding(16.dp)) {
334-
SelectionContainer(Modifier.fillMaxSize()) {
335-
BasicTextField(
336-
value = prettyJson,
337-
onValueChange = {},
338-
modifier = Modifier.fillMaxSize(),
339-
readOnly = true,
340-
)
341-
}
342-
Button(onClick = { copyToClipboard(prettyJson) }, modifier = Modifier.align(Alignment.TopEnd)) {
343-
Text("Copy all (Cmd + C)")
344-
}
345-
}
346-
}
347-
}
348-
}
349-
350285
/*
351286
@Preview
352287
@Composable

src/main/kotlin/com/jerryjeon/logjerry/ui/LogsView.kt

Lines changed: 47 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,18 @@
1-
@file:OptIn(ExperimentalComposeUiApi::class)
1+
@file:OptIn(ExperimentalComposeUiApi::class, ExperimentalFoundationApi::class, ExperimentalFoundationApi::class)
22

33
package com.jerryjeon.logjerry.ui
44

55
import androidx.compose.animation.AnimatedVisibility
66
import androidx.compose.animation.core.tween
77
import androidx.compose.animation.fadeIn
88
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.*
1210
import androidx.compose.foundation.gestures.scrollBy
1311
import androidx.compose.foundation.layout.*
1412
import androidx.compose.foundation.lazy.LazyColumn
1513
import androidx.compose.foundation.lazy.LazyListState
14+
import androidx.compose.foundation.lazy.items
1615
import androidx.compose.foundation.lazy.rememberLazyListState
17-
import androidx.compose.foundation.rememberScrollbarAdapter
1816
import androidx.compose.material.Divider
1917
import androidx.compose.material.MaterialTheme
2018
import androidx.compose.material.Text
@@ -24,9 +22,10 @@ import androidx.compose.ui.ExperimentalComposeUiApi
2422
import androidx.compose.ui.Modifier
2523
import androidx.compose.ui.focus.FocusRequester
2624
import androidx.compose.ui.focus.focusRequester
27-
import androidx.compose.ui.focus.onFocusChanged
2825
import androidx.compose.ui.graphics.Color
2926
import androidx.compose.ui.input.key.*
27+
import androidx.compose.ui.text.style.TextAlign
28+
import androidx.compose.ui.unit.Dp
3029
import androidx.compose.ui.unit.dp
3130
import androidx.compose.ui.unit.sp
3231
import com.jerryjeon.logjerry.ColumnDivider
@@ -42,7 +41,9 @@ import com.jerryjeon.logjerry.table.Header
4241
import com.jerryjeon.logjerry.ui.focus.DetectionFocus
4342
import com.jerryjeon.logjerry.ui.focus.KeyboardFocus
4443
import com.jerryjeon.logjerry.ui.focus.LogFocus
44+
import com.jerryjeon.logjerry.ui.focus.MarkFocus
4545
import com.jerryjeon.logjerry.util.isCtrlOrMetaPressed
46+
import kotlinx.coroutines.GlobalScope
4647
import kotlinx.coroutines.delay
4748
import kotlinx.coroutines.flow.collectLatest
4849
import kotlinx.coroutines.launch
@@ -59,7 +60,7 @@ fun LogsView(
5960
moveToNextMark: () -> Unit,
6061
) {
6162
val listState = rememberLazyListState()
62-
LaunchedEffect(refineResult) {
63+
LaunchedEffect(refineResult.currentFocus) {
6364
refineResult.currentFocus.collectLatest {
6465
if (it == null) return@collectLatest
6566
val headerCount = 2
@@ -92,26 +93,50 @@ fun LogsView(
9293
(if (filteredSize != totalSize) "Filtered size : $filteredSize, " else "")
9394
Text("${filteredSizeText}Total : $totalSize", modifier = Modifier.padding(8.dp))
9495

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+
}
109132

133+
}
110134
}
111135

112136
@Composable
113137
fun LogsView(
114138
modifier: Modifier = Modifier,
139+
endPadding: Dp,
115140
refinedLogs: List<RefinedLog>,
116141
detectorManager: DetectorManager,
117142
preferences: Preferences,
@@ -229,7 +254,7 @@ fun LogsView(
229254
.focusable()
230255
) {
231256
Box {
232-
LazyColumn(modifier = Modifier.fillMaxSize(), state = listState) {
257+
LazyColumn(modifier = Modifier.fillMaxSize().padding(end = endPadding), state = listState) {
233258
item { HeaderRow(header, divider) }
234259
item { HeaderDivider() }
235260
refinedLogs.forEach { refinedLog ->
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.jerryjeon.logjerry.ui.focus
2+
3+
data class MarkFocus(
4+
override val index: Int
5+
) : LogFocus

0 commit comments

Comments
 (0)