From f00aef50e7ec8e484865c1e82eb6f44108821eae Mon Sep 17 00:00:00 2001 From: jjangddu Date: Mon, 8 Jun 2026 18:02:44 +0900 Subject: [PATCH] =?UTF-8?q?UI=20#5:=20=EB=8F=84=EB=84=9B=EC=B0=A8=ED=8A=B8?= =?UTF-8?q?=20=ED=81=AC=EA=B8=B0=20dev/=EC=9D=BC=EB=B0=98=20=ED=86=B5?= =?UTF-8?q?=EC=9D=BC=20+=20ml=20=ED=8F=B0=ED=8A=B8=20=ED=82=A4=EC=9B=80=20?= =?UTF-8?q?+=20Logs=20&=20Charts=20=EC=9D=BC=EB=B0=98=20=EB=AA=A8=EB=93=9C?= =?UTF-8?q?=20=EB=85=B8=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 회의 피드백: - 도넛차트 화면 비율 이상함 → 화면에 꽉 차게 - ml 숫자 너무 작아서 안 보임 → 키움 - dev mode와 일반 모드 도넛 크기 다름 → 통일 - 아래로 내렸을 때 로그/그래프 확인 가능하게 도넛 sizing 통일: - nonDonutBudget: dev=280 / 일반=360 → 일관 280dp (도넛에 공간 더 할당) - donutFitSize: coerceIn(120, 360) → (160, 420) — 화면 꽉 차게 max 키움 - baseDonutSize: dev 분기 제거 → 모두 donutFitSize 사용 - donutLineWidth/bladdySize: dev 분기 제거, 일반 모드 방식으로 통일 - volFontSize: dev=18 / 일반=24 → 일관 40sp (ml 크게) Logs & Charts 토글: - 토글 버튼: dev 모드 한정 → 일반 모드에서도 표시 (라벨: dev이면 "Developer Tools", 일반이면 "Logs & Charts") - useScrollLayout = appState.isDevMode && showDevPanels → showDevPanels만 - verticalScroll: dev 조건 제거 → useScrollLayout 따름 - dev panels 본체: appState.isDevMode && showDevPanels → showDevPanels만 → 일반 사용자도 토글로 아래 스크롤하여 BLE 로그/채널 그래프 확인 가능. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../views/monitoring/PiezoMonitoringView.kt | 55 ++++++++----------- 1 file changed, 23 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/com/example/medilightv2android/ui/views/monitoring/PiezoMonitoringView.kt b/app/src/main/java/com/example/medilightv2android/ui/views/monitoring/PiezoMonitoringView.kt index 3eb1646..e2a5f35 100644 --- a/app/src/main/java/com/example/medilightv2android/ui/views/monitoring/PiezoMonitoringView.kt +++ b/app/src/main/java/com/example/medilightv2android/ui/views/monitoring/PiezoMonitoringView.kt @@ -81,8 +81,8 @@ fun PiezoMonitoringView(appState: AppState) { val scanLogState by ScanLogStore.scanLog.collectAsState() var devTapCount by remember { mutableIntStateOf(0) } var devLastTapTime by remember { mutableLongStateOf(0L) } - // 빌드 110: 스크롤 레이아웃은 dev 패널이 실제로 표시될 때만 활성화 - val useScrollLayout = appState.isDevMode && showDevPanels + // 회의 결정: 일반 모드에서도 dev panels(로그/그래프) 토글 가능 — 아래로 내려 확인. + val useScrollLayout = showDevPanels // 빌드 108: Voiding 기록 후 큰 확인 다이얼로그 (1.5초 자동 닫힘) var showRecordedDialog by remember { mutableStateOf(false) } if (showRecordedDialog) { @@ -955,11 +955,10 @@ fun PiezoMonitoringView(appState: AppState) { // 결정한다. 가로 모드 / 작은 화면에서도 progress + 다른 컨텐츠가 모두 들어오도록. androidx.compose.foundation.layout.BoxWithConstraints(modifier = Modifier.fillMaxSize()) { val availableH = this.maxHeight - // 비-donut 컨텐츠(status badge + 정보 카드 + 버튼 + spacing + padding) 예약치. - // 이 값 빼고 남은 공간이 donut. - val nonDonutBudget = if (appState.isDevMode) 280.dp else 360.dp - // donut max를 키워서 큰 화면(태블릿 portrait, 가로 태블릿)에서도 답답하지 않게. - val donutFitSize = (availableH - nonDonutBudget).coerceIn(120.dp, 360.dp) + // 회의 결정: dev/일반 도넛 크기 통일. nonDonutBudget도 통일. + val nonDonutBudget = 280.dp + // 화면에 꽉 차게 — max를 420dp까지 허용 + val donutFitSize = (availableH - nonDonutBudget).coerceIn(160.dp, 420.dp) // spacing 도 화면 높이에 비례 — 큰 화면에서 컨텐츠 사이 여백 넉넉히. val nonDevSpacing = when { availableH > 800.dp -> 36.dp @@ -970,8 +969,8 @@ fun PiezoMonitoringView(appState: AppState) { Column( modifier = Modifier .fillMaxSize() - // dev 모드만 scroll — 일반 사용자에겐 fit-to-screen 고정 레이아웃 - .then(if (appState.isDevMode) Modifier.verticalScroll(scrollState) else Modifier) + // 회의 결정: 일반 모드도 로그/그래프 토글로 아래 스크롤 가능 + .then(if (useScrollLayout) Modifier.verticalScroll(scrollState) else Modifier) .padding(horizontal = hPad) .padding(top = if (isCompact) 8.dp else 16.dp, bottom = if (isCompact) 16.dp else 32.dp), horizontalAlignment = Alignment.CenterHorizontally, @@ -1009,25 +1008,13 @@ fun PiezoMonitoringView(appState: AppState) { .padding(horizontal = 20.dp, vertical = 8.dp) ) - // Donut + Bladdy sizing — Charles의 height-aware donutFitSize [833c110] - // 우리 UX Phase 1의 의도(Volume 폰트 축소)도 Charles의 24sp로 이미 충족됨. - val baseDonutSize = if (appState.isDevMode) { - if (isCompact) 192.dp else 244.dp - } else { - donutFitSize - } + // Donut + Bladdy sizing — 회의 결정: dev/일반 통일. + val baseDonutSize = donutFitSize val donutSize = baseDonutSize * 0.95f - val donutLineWidth = if (appState.isDevMode) { - if (isCompact) 22.dp else 30.dp - } else { - if (isCompact) 26.dp else 34.dp - } - val bladdySize = if (appState.isDevMode) { - if (isCompact) 80.dp else 110.dp - } else { - donutSize * 0.85f // donut 내부에 항상 들어가는 크기 - } - val volFontSize = if (appState.isDevMode) 18.sp else 24.sp + val donutLineWidth = if (isCompact) 26.dp else 34.dp + val bladdySize = donutSize * 0.85f + // ml 폰트 키움 — 회의 피드백 "숫자가 너무 작아서 안보임" + val volFontSize = 40.sp val maxVolumeForDonut = appState.piezoSettings.maxVolume.toDouble() val donutProgress = if (maxVolumeForDonut > 0 && maxVolumeMl > 0) @@ -1231,8 +1218,8 @@ fun PiezoMonitoringView(appState: AppState) { } } - // ── Developer Tools toggle (개발자 모드에서만 표시) ── - if (appState.isDevMode) Button( + // ── Logs & Charts toggle (회의 결정: 일반 모드도 접근 가능) ── + Button( onClick = { showDevPanels = !showDevPanels }, modifier = Modifier.fillMaxWidth(), shape = RoundedCornerShape(8.dp), @@ -1242,8 +1229,11 @@ fun PiezoMonitoringView(appState: AppState) { verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(6.dp) ) { - Icon(Icons.Default.Build, "Dev", tint = Color.White, modifier = Modifier.size(14.dp)) - Text("Developer Tools", fontSize = 12.sp, fontWeight = FontWeight.SemiBold, color = Color.White) + Icon(Icons.Default.Build, "Logs", tint = Color.White, modifier = Modifier.size(14.dp)) + Text( + if (appState.isDevMode) "Developer Tools" else "Logs & Charts", + fontSize = 12.sp, fontWeight = FontWeight.SemiBold, color = Color.White + ) Spacer(modifier = Modifier.weight(1f)) Icon( if (showDevPanels) Icons.Default.KeyboardArrowUp else Icons.Default.KeyboardArrowDown, @@ -1252,7 +1242,8 @@ fun PiezoMonitoringView(appState: AppState) { } } - if (appState.isDevMode && showDevPanels) { + // 회의 결정: 일반 모드도 로그/그래프 접근 가능 (isDevMode 조건 제거) + if (showDevPanels) { ChannelPanel( lastMultiChannelResult = lastMultiChannelResult, analyzer = analyzer,