From 08c130f448333a9b2a4d0dfb8070d617f5afaeb6 Mon Sep 17 00:00:00 2001 From: sanjeok77 Date: Thu, 12 Mar 2026 23:44:57 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=ED=9C=B4=EA=B0=80=20=EA=B4=80=EB=A6=AC?= =?UTF-8?q?=20=EC=BB=B4=ED=8C=A9=ED=8A=B8=ED=99=94=20+=20=EC=9E=90?= =?UTF-8?q?=EB=8F=99=20=EC=A0=80=EC=9E=A5=20+=20=EC=86=8C=EC=88=AB?= =?UTF-8?q?=EC=A0=90=20=ED=91=9C=EC=8B=9C=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 레이아웃 컴팩트하게 변경 (패딩/마진 축소, 가로 배치) - 저장 버튼 제거하고 NumberPicker 변경 시 자동 저장 - 소숫점 없을 때 정수로 표시 (22), 0.5일 때 소숫점 표시 (21.5) - ScrollView 제거 (불필요한 스크롤 최소화) Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode) Co-authored-by: Sisyphus --- .../example/shiftalarm/FragmentSettingsLab.kt | 66 ++++--- .../main/res/layout/fragment_settings_lab.xml | 171 +++++++++--------- 2 files changed, 126 insertions(+), 111 deletions(-) diff --git a/app/src/main/java/com/example/shiftalarm/FragmentSettingsLab.kt b/app/src/main/java/com/example/shiftalarm/FragmentSettingsLab.kt index 03ab9da..772e6e8 100644 --- a/app/src/main/java/com/example/shiftalarm/FragmentSettingsLab.kt +++ b/app/src/main/java/com/example/shiftalarm/FragmentSettingsLab.kt @@ -4,16 +4,18 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.Toast +import android.widget.NumberPicker import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import com.example.shiftalarm.databinding.FragmentSettingsLabBinding import kotlinx.coroutines.launch +import kotlinx.coroutines.delay class FragmentSettingsLab : Fragment() { private var _binding: FragmentSettingsLabBinding? = null private val binding get() = _binding!! + private var isInitialLoad = true override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -28,7 +30,6 @@ class FragmentSettingsLab : Fragment() { setupNumberPicker() loadAnnualLeave() - setupSaveButton() } private fun setupNumberPicker() { @@ -36,42 +37,65 @@ class FragmentSettingsLab : Fragment() { minValue = 1 maxValue = 25 wrapSelectorWheel = false + + // 값 변경 시 자동 저장 + setOnValueChangedListener { _, _, newVal -> + if (!isInitialLoad) { + saveAnnualLeave(newVal) + } + } } } private fun loadAnnualLeave() { lifecycleScope.launch { + isInitialLoad = true val repo = ShiftRepository(requireContext()) val annualLeave = repo.getAnnualLeave() annualLeave?.let { binding.npTotalDays.value = it.totalDays.toInt() - binding.tvRemainingDays.text = String.format("%.1f", it.remainingDays) + binding.tvRemainingDays.text = formatRemainingDays(it.remainingDays) } ?: run { // Default: 15 days binding.npTotalDays.value = 15 - binding.tvRemainingDays.text = "15.0" + binding.tvRemainingDays.text = "15" + } + + // 초기 로드 완료 후 플래그 변경 + delay(100) + isInitialLoad = false + } + } + + private fun saveAnnualLeave(totalDays: Int) { + lifecycleScope.launch { + val repo = ShiftRepository(requireContext()) + + repo.recalculateAndSaveAnnualLeave(totalDays.toFloat()) + + val updated = repo.getAnnualLeave() + updated?.let { + binding.tvRemainingDays.text = formatRemainingDays(it.remainingDays) + showCustomToast(requireContext(), "총 연차 ${totalDays}일로 설정되었습니다 (남은 연차: ${formatRemainingDays(it.remainingDays)}일)") } } } - private fun setupSaveButton() { - binding.btnSaveAnnualLeave.setOnClickListener { - val totalDays = binding.npTotalDays.value.toFloat() - - lifecycleScope.launch { - val repo = ShiftRepository(requireContext()) - - repo.recalculateAndSaveAnnualLeave(totalDays) - - val updated = repo.getAnnualLeave() - updated?.let { - binding.tvRemainingDays.text = String.format("%.1f", it.remainingDays) - showCustomToast(requireContext(), "연차가 저장되었습니다. (남은 연차: ${String.format("%.1f", it.remainingDays)}일)") - } - } - } - } + /** + * 남은 연차 표시 형식 개선 + * - 정수면 정수로 표시 (예: 22) + * - 소숫점 있으면 소숫점 표시 (예: 21.5) + */ + private fun formatRemainingDays(days: Float): String { + return if (days == days.toInt().toFloat()) { + // 정수인 경우 + days.toInt().toString() + } else { + // 소숫점이 있는 경우 (0.5 등) + String.format("%.1f", days) + } + } override fun onDestroyView() { super.onDestroyView() diff --git a/app/src/main/res/layout/fragment_settings_lab.xml b/app/src/main/res/layout/fragment_settings_lab.xml index a28139e..d9e1bb3 100644 --- a/app/src/main/res/layout/fragment_settings_lab.xml +++ b/app/src/main/res/layout/fragment_settings_lab.xml @@ -1,135 +1,126 @@ - + android:orientation="vertical" + android:padding="16dp" + android:gravity="center_horizontal"> - + + + + + android:layout_marginBottom="12dp" + app:cardCornerRadius="12dp" + app:cardElevation="2dp" + app:cardBackgroundColor="@color/surface"> - - - - - + android:orientation="horizontal" + android:padding="12dp" + android:gravity="center_vertical"> + + + android:orientation="horizontal" + android:gravity="center_vertical"> - - - + android:layout_width="60dp" + android:layout_height="100dp"/> - + android:textColor="@color/text_tertiary" + android:layout_marginStart="4dp"/> + + - + + - - + android:orientation="horizontal" + android:padding="12dp" + android:gravity="center_vertical"> + + - - + android:orientation="horizontal" + android:gravity="bottom"> + android:textColor="@color/primary"/> - + android:textColor="@color/text_tertiary" + android:layout_marginStart="4dp"/> + + - + + - - - - - - - - - +