@@ -51,17 +51,15 @@ import androidx.compose.material3.adaptive.navigation.NavigableListDetailPaneSca
5151import androidx.compose.material3.adaptive.navigation.rememberListDetailPaneScaffoldNavigator
5252import androidx.compose.material3.rememberTopAppBarState
5353import androidx.compose.runtime.Composable
54+ import androidx.compose.runtime.LaunchedEffect
5455import androidx.compose.runtime.getValue
55- import androidx.compose.runtime.mutableIntStateOf
56- import androidx.compose.runtime.mutableStateOf
57- import androidx.compose.runtime.remember
5856import androidx.compose.runtime.rememberCoroutineScope
59- import androidx.compose.runtime.setValue
6057import androidx.compose.ui.Modifier
6158import androidx.compose.ui.graphics.ImageBitmap
6259import androidx.compose.ui.input.nestedscroll.nestedScroll
6360import androidx.compose.ui.platform.LocalContext
6461import androidx.compose.ui.unit.dp
62+ import androidx.lifecycle.compose.collectAsStateWithLifecycle
6563import com.embroidermodder.punching.Histogram
6664import de.berlindroid.zepatch.PatchablePreviewMode.BITMAP
6765import de.berlindroid.zepatch.PatchablePreviewMode.COMPOSABLE
@@ -75,9 +73,9 @@ import de.berlindroid.zepatch.ui.theme.ZePatchTheme
7573import de.berlindroid.zepatch.utils.multiLet
7674import de.berlindroid.zepatch.utils.uppercaseWords
7775import kotlinx.coroutines.launch
76+ import androidx.lifecycle.viewmodel.compose.viewModel as lifecycleViewModel
7877
79-
80- private enum class PatchablePreviewMode {
78+ enum class PatchablePreviewMode {
8179 COMPOSABLE , BITMAP , REDUCED_BITMAP , STITCHES
8280}
8381
@@ -197,18 +195,20 @@ private fun PatchableDetail(
197195 onBackClick : () -> Unit ,
198196 patchable : @Composable (Boolean , (ImageBitmap ) -> Unit ) -> Unit ,
199197) {
200- var imageBitmap by remember { mutableStateOf<ImageBitmap ?>(null ) }
201- var reducedImageBitmap by remember { mutableStateOf<ImageBitmap ?>(null ) }
202- var reducedHistogram by remember { mutableStateOf<Histogram ?>(null ) }
203- var colorCount by remember { mutableIntStateOf(3 ) }
204- var embroideryData by remember { mutableStateOf<ByteArray ?>(null ) }
205- var embroideryPreviewImage by remember { mutableStateOf<ImageBitmap ?>(null ) }
206-
207198 val context = LocalContext .current
199+
200+ val viewModel: WizardViewModel = lifecycleViewModel()
201+ val uiState by viewModel.uiState.collectAsStateWithLifecycle()
202+
203+ // Reset wizard state when a different patchable is opened
204+ LaunchedEffect (name) {
205+ viewModel.reset()
206+ }
207+
208208 val launcher = rememberLauncherForActivityResult(
209209 contract = ActivityResultContracts .StartActivityForResult ()
210210 ) { result ->
211- savePesAfterSelection(context, result, embroideryData)
211+ savePesAfterSelection(context, result, uiState. embroideryData)
212212 }
213213
214214 Scaffold (
@@ -232,38 +232,33 @@ private fun PatchableDetail(
232232 Column (
233233 modifier = Modifier .padding(innerPadding),
234234 ) {
235- var currentMode by remember { mutableStateOf(COMPOSABLE ) }
236-
237- ProgressPills (imageBitmap, reducedImageBitmap, currentMode)
235+ ProgressPills (uiState.imageBitmap, uiState.reducedImageBitmap, uiState.previewMode)
238236
239237 WizardContent (
240- currentMode ,
241- imageBitmap,
242- colorCount,
243- reducedImageBitmap,
244- reducedHistogram,
238+ uiState.previewMode ,
239+ uiState. imageBitmap,
240+ uiState. colorCount,
241+ uiState. reducedImageBitmap,
242+ uiState. reducedHistogram,
245243 name,
246- onBitmapUpdated = { imageBitmap = it },
247- onColorCountUpdated = { colorCount = it },
248- onReducedUpdated = { img, histo ->
249- reducedImageBitmap = img;reducedHistogram = histo
250- },
251- onEmbroideryUpdated = { data, preview ->
252- embroideryData = data
253- embroideryPreviewImage = preview
254- },
255- patchable
244+ onBitmapUpdated = viewModel::updateBitmap,
245+ onColorCountUpdated = viewModel::updateColorCount,
246+ computeReducedBitmap = viewModel::computeReducedBitmap,
247+ patchable = patchable
256248 )
257249
258250 WizardButtons (
259- currentMode ,
260- imageBitmap,
261- reducedImageBitmap,
262- embroideryData,
251+ uiState.previewMode ,
252+ uiState. imageBitmap,
253+ uiState. reducedImageBitmap,
254+ uiState. embroideryData,
263255 name,
264256 launcher
265257 ) {
266- currentMode = it
258+ viewModel.setPreviewMode(it)
259+ if (it == REDUCED_BITMAP ) {
260+ viewModel.computeReducedBitmap()
261+ }
267262 }
268263 }
269264 }
@@ -279,8 +274,7 @@ private fun WizardContent(
279274 name : String ,
280275 onBitmapUpdated : (ImageBitmap ) -> Unit ,
281276 onColorCountUpdated : (Int ) -> Unit ,
282- onReducedUpdated : (ImageBitmap , Histogram ) -> Unit ,
283- onEmbroideryUpdated : (ByteArray , ImageBitmap ) -> Unit ,
277+ computeReducedBitmap : () -> Unit ,
284278 patchable : @Composable (Boolean , (ImageBitmap ) -> Unit ) -> Unit ,
285279) {
286280 Card (
@@ -301,15 +295,20 @@ private fun WizardContent(
301295 image = imageBitmap,
302296 colorCount = colorCount,
303297 onColorCountChanged = onColorCountUpdated,
304- onReduced = onReducedUpdated,
298+ computeReducedBitmap = computeReducedBitmap,
299+ reducedImage = reducedImageBitmap,
305300 )
306301
307302 STITCHES -> reducedImageBitmap?.multiLet(reducedHistogram) { img, histo ->
303+ val vm: WizardViewModel = lifecycleViewModel()
304+ val ui by vm.uiState.collectAsStateWithLifecycle()
308305 BitmapToStitches (
309306 reducedImageBitmap = img,
310307 reducedHistogram = histo,
311308 name = name,
312- onEmbroidery = onEmbroideryUpdated
309+ onCreateEmbroidery = { n, b, h -> vm.createEmbroidery(n, b, h) },
310+ previewImage = ui.embroideryPreviewImage,
311+ creatingEmbroidery = ui.creatingEmbroidery,
313312 )
314313 }
315314 }
0 commit comments