Skip to content

Commit f58cba6

Browse files
authored
Merge pull request #949 from arkivanov/ChildPanels-refactoring
Minor refactoring of ChildPanels composable
2 parents 1603710 + 42e50b2 commit f58cba6

File tree

2 files changed

+40
-40
lines changed

2 files changed

+40
-40
lines changed

extensions-compose-experimental/api/extensions-compose-experimental.klib.api

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,6 @@ final class com.arkivanov.decompose.extensions.compose.experimental.stack.animat
5757

5858
final val com.arkivanov.decompose.extensions.compose.experimental.panels/com_arkivanov_decompose_extensions_compose_experimental_panels_ChildPanelsAnimators$stableprop // com.arkivanov.decompose.extensions.compose.experimental.panels/com_arkivanov_decompose_extensions_compose_experimental_panels_ChildPanelsAnimators$stableprop|#static{}com_arkivanov_decompose_extensions_compose_experimental_panels_ChildPanelsAnimators$stableprop[0]
5959
final val com.arkivanov.decompose.extensions.compose.experimental.panels/com_arkivanov_decompose_extensions_compose_experimental_panels_HorizontalChildPanelsLayout$stableprop // com.arkivanov.decompose.extensions.compose.experimental.panels/com_arkivanov_decompose_extensions_compose_experimental_panels_HorizontalChildPanelsLayout$stableprop|#static{}com_arkivanov_decompose_extensions_compose_experimental_panels_HorizontalChildPanelsLayout$stableprop[0]
60-
final val com.arkivanov.decompose.extensions.compose.experimental.panels/com_arkivanov_decompose_extensions_compose_experimental_panels_PanelChild_Empty$stableprop // com.arkivanov.decompose.extensions.compose.experimental.panels/com_arkivanov_decompose_extensions_compose_experimental_panels_PanelChild_Empty$stableprop|#static{}com_arkivanov_decompose_extensions_compose_experimental_panels_PanelChild_Empty$stableprop[0]
61-
final val com.arkivanov.decompose.extensions.compose.experimental.panels/com_arkivanov_decompose_extensions_compose_experimental_panels_PanelChild_Panel$stableprop // com.arkivanov.decompose.extensions.compose.experimental.panels/com_arkivanov_decompose_extensions_compose_experimental_panels_PanelChild_Panel$stableprop|#static{}com_arkivanov_decompose_extensions_compose_experimental_panels_PanelChild_Panel$stableprop[0]
6260
final val com.arkivanov.decompose.extensions.compose.experimental.stack.animation/LocalStackAnimationProvider // com.arkivanov.decompose.extensions.compose.experimental.stack.animation/LocalStackAnimationProvider|{}LocalStackAnimationProvider[0]
6361
final fun <get-LocalStackAnimationProvider>(): androidx.compose.runtime/ProvidableCompositionLocal<com.arkivanov.decompose.extensions.compose.experimental.stack.animation/StackAnimationProvider> // com.arkivanov.decompose.extensions.compose.experimental.stack.animation/LocalStackAnimationProvider.<get-LocalStackAnimationProvider>|<get-LocalStackAnimationProvider>(){}[0]
6462
final val com.arkivanov.decompose.extensions.compose.experimental.stack.animation/com_arkivanov_decompose_extensions_compose_experimental_stack_animation_DefaultStackAnimation$stableprop // com.arkivanov.decompose.extensions.compose.experimental.stack.animation/com_arkivanov_decompose_extensions_compose_experimental_stack_animation_DefaultStackAnimation$stableprop|#static{}com_arkivanov_decompose_extensions_compose_experimental_stack_animation_DefaultStackAnimation$stableprop[0]
@@ -77,8 +75,6 @@ final fun <#A: kotlin/Any, #B: kotlin/Any> com.arkivanov.decompose.extensions.co
7775
final fun <#A: kotlin/Any, #B: kotlin/Any> com.arkivanov.decompose.extensions.compose.experimental.stack/ChildStack(com.arkivanov.decompose.value/Value<com.arkivanov.decompose.router.stack/ChildStack<#A, #B>>, androidx.compose.ui/Modifier?, com.arkivanov.decompose.extensions.compose.experimental.stack.animation/StackAnimation<#A, #B>?, kotlin/Function4<com.arkivanov.decompose.extensions.compose.experimental.stack.animation/StackAnimationScope, com.arkivanov.decompose/Child.Created<#A, #B>, androidx.compose.runtime/Composer, kotlin/Int, kotlin/Unit>, androidx.compose.runtime/Composer?, kotlin/Int, kotlin/Int) // com.arkivanov.decompose.extensions.compose.experimental.stack/ChildStack|ChildStack(com.arkivanov.decompose.value.Value<com.arkivanov.decompose.router.stack.ChildStack<0:0,0:1>>;androidx.compose.ui.Modifier?;com.arkivanov.decompose.extensions.compose.experimental.stack.animation.StackAnimation<0:0,0:1>?;kotlin.Function4<com.arkivanov.decompose.extensions.compose.experimental.stack.animation.StackAnimationScope,com.arkivanov.decompose.Child.Created<0:0,0:1>,androidx.compose.runtime.Composer,kotlin.Int,kotlin.Unit>;androidx.compose.runtime.Composer?;kotlin.Int;kotlin.Int){0§<kotlin.Any>;1§<kotlin.Any>}[0]
7876
final fun com.arkivanov.decompose.extensions.compose.experimental.panels/com_arkivanov_decompose_extensions_compose_experimental_panels_ChildPanelsAnimators$stableprop_getter(): kotlin/Int // com.arkivanov.decompose.extensions.compose.experimental.panels/com_arkivanov_decompose_extensions_compose_experimental_panels_ChildPanelsAnimators$stableprop_getter|com_arkivanov_decompose_extensions_compose_experimental_panels_ChildPanelsAnimators$stableprop_getter(){}[0]
7977
final fun com.arkivanov.decompose.extensions.compose.experimental.panels/com_arkivanov_decompose_extensions_compose_experimental_panels_HorizontalChildPanelsLayout$stableprop_getter(): kotlin/Int // com.arkivanov.decompose.extensions.compose.experimental.panels/com_arkivanov_decompose_extensions_compose_experimental_panels_HorizontalChildPanelsLayout$stableprop_getter|com_arkivanov_decompose_extensions_compose_experimental_panels_HorizontalChildPanelsLayout$stableprop_getter(){}[0]
80-
final fun com.arkivanov.decompose.extensions.compose.experimental.panels/com_arkivanov_decompose_extensions_compose_experimental_panels_PanelChild_Empty$stableprop_getter(): kotlin/Int // com.arkivanov.decompose.extensions.compose.experimental.panels/com_arkivanov_decompose_extensions_compose_experimental_panels_PanelChild_Empty$stableprop_getter|com_arkivanov_decompose_extensions_compose_experimental_panels_PanelChild_Empty$stableprop_getter(){}[0]
81-
final fun com.arkivanov.decompose.extensions.compose.experimental.panels/com_arkivanov_decompose_extensions_compose_experimental_panels_PanelChild_Panel$stableprop_getter(): kotlin/Int // com.arkivanov.decompose.extensions.compose.experimental.panels/com_arkivanov_decompose_extensions_compose_experimental_panels_PanelChild_Panel$stableprop_getter|com_arkivanov_decompose_extensions_compose_experimental_panels_PanelChild_Panel$stableprop_getter(){}[0]
8278
final fun com.arkivanov.decompose.extensions.compose.experimental.stack.animation/com_arkivanov_decompose_extensions_compose_experimental_stack_animation_DefaultStackAnimation$stableprop_getter(): kotlin/Int // com.arkivanov.decompose.extensions.compose.experimental.stack.animation/com_arkivanov_decompose_extensions_compose_experimental_stack_animation_DefaultStackAnimation$stableprop_getter|com_arkivanov_decompose_extensions_compose_experimental_stack_animation_DefaultStackAnimation$stableprop_getter(){}[0]
8379
final fun com.arkivanov.decompose.extensions.compose.experimental.stack.animation/com_arkivanov_decompose_extensions_compose_experimental_stack_animation_DefaultStackAnimator$stableprop_getter(): kotlin/Int // com.arkivanov.decompose.extensions.compose.experimental.stack.animation/com_arkivanov_decompose_extensions_compose_experimental_stack_animation_DefaultStackAnimator$stableprop_getter|com_arkivanov_decompose_extensions_compose_experimental_stack_animation_DefaultStackAnimator$stableprop_getter(){}[0]
8480
final fun com.arkivanov.decompose.extensions.compose.experimental.stack.animation/com_arkivanov_decompose_extensions_compose_experimental_stack_animation_PredictiveBackParams$stableprop_getter(): kotlin/Int // com.arkivanov.decompose.extensions.compose.experimental.stack.animation/com_arkivanov_decompose_extensions_compose_experimental_stack_animation_PredictiveBackParams$stableprop_getter|com_arkivanov_decompose_extensions_compose_experimental_stack_animation_PredictiveBackParams$stableprop_getter(){}[0]

extensions-compose-experimental/src/commonMain/kotlin/com/arkivanov/decompose/extensions/compose/experimental/panels/ChildPanels.kt

Lines changed: 40 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.arkivanov.decompose.extensions.compose.experimental.stack.ChildStack
1313
import com.arkivanov.decompose.extensions.compose.experimental.stack.animation.PredictiveBackParams
1414
import com.arkivanov.decompose.extensions.compose.experimental.stack.animation.StackAnimationScope
1515
import com.arkivanov.decompose.extensions.compose.experimental.stack.animation.stackAnimation
16+
import com.arkivanov.decompose.extensions.compose.experimental.stack.size
1617
import com.arkivanov.decompose.extensions.compose.subscribeAsState
1718
import com.arkivanov.decompose.router.panels.ChildPanels
1819
import com.arkivanov.decompose.router.panels.ChildPanelsMode
@@ -211,7 +212,7 @@ fun <MC : Any, MT : Any, DC : Any, DT : Any, EC : Any, ET : Any> ChildPanels(
211212
val details = remember(panels.details) { panels.details?.asPanelChild() }
212213
val extra = remember(panels.extra) { panels.extra?.asPanelChild() }
213214
val mode = panels.mode
214-
val broadcastPredictiveBackParams = rememberBroadcastPredictiveBackParams(key = panels, count = 2) { predictiveBackParams(panels) }
215+
val broadcastPredictiveBackParams = rememberBroadcastPredictiveBackParams(key = panels) { predictiveBackParams(panels) }
215216

216217
Box(modifier = modifier) {
217218
layout.Layout(
@@ -255,7 +256,7 @@ fun <MC : Any, MT : Any, DC : Any, DT : Any, EC : Any, ET : Any> ChildPanels(
255256
@ExperimentalDecomposeApi
256257
@Composable
257258
private fun <MC : Any, MT : Any> MainPanel(
258-
main: Child.Created<MC, PanelChild.Panel<MC, MT>>,
259+
main: Child.Created<MC, PanelChild<MC, MT>>,
259260
mode: ChildPanelsMode,
260261
hasDetails: Boolean,
261262
hasExtra: Boolean,
@@ -276,20 +277,20 @@ private fun <MC : Any, MT : Any> MainPanel(
276277
DUAL -> animators.dual.first
277278
TRIPLE -> animators.triple.first
278279
},
279-
predictiveBackParams = { if (it.active != main) predictiveBackParams.value else null },
280+
predictiveBackParams = { if (it.items.size == 2) predictiveBackParams.value else null },
280281
),
281282
) {
282-
when (val child = it.instance) {
283-
is PanelChild.Panel -> content(child.child)
284-
is PanelChild.Empty -> Unit // no-op
283+
val child = it.instance.child
284+
if (child != null) {
285+
content(child)
285286
}
286287
}
287288
}
288289

289290
@ExperimentalDecomposeApi
290291
@Composable
291292
private fun <DC : Any, DT : Any> DetailsPanel(
292-
details: Child.Created<DC, PanelChild.Panel<DC, DT>>?,
293+
details: Child.Created<DC, PanelChild<DC, DT>>?,
293294
mode: ChildPanelsMode,
294295
hasExtra: Boolean,
295296
animators: ChildPanelsAnimators,
@@ -311,30 +312,27 @@ private fun <DC : Any, DT : Any> DetailsPanel(
311312
TRIPLE -> animators.triple.second
312313
},
313314
predictiveBackParams = { stack ->
314-
when {
315-
stack.active == EmptyChild2 -> predictiveBackParams.value
316-
(stack.active == details) && (stack.items.first() == EmptyChild1) -> predictiveBackParams.value
317-
else -> null
315+
if ((stack.items.first() == EmptyChild1) && stack.items.any { !it.instance.isEmpty }) {
316+
predictiveBackParams.value
317+
} else {
318+
null
318319
}
319320
},
320321
),
321322
) {
322-
when (val child = it.instance) {
323-
is PanelChild.Panel -> content(child.child)
324-
325-
is PanelChild.Empty -> {
326-
if (it == EmptyChild3) {
327-
placeholder()
328-
}
329-
}
323+
val child = it.instance.child
324+
if (child != null) {
325+
content(child)
326+
} else if (it == EmptyChild3) {
327+
placeholder()
330328
}
331329
}
332330
}
333331

334332
@ExperimentalDecomposeApi
335333
@Composable
336334
private fun <EC : Any, ET : Any> ExtraPanel(
337-
extra: Child.Created<EC, PanelChild.Panel<EC, ET>>?,
335+
extra: Child.Created<EC, PanelChild<EC, ET>>?,
338336
mode: ChildPanelsMode,
339337
animators: ChildPanelsAnimators,
340338
predictiveBackParams: Lazy<PredictiveBackParams?>,
@@ -357,25 +355,27 @@ private fun <EC : Any, ET : Any> ExtraPanel(
357355
DUAL -> animators.dual.second
358356
TRIPLE -> animators.triple.third
359357
},
360-
predictiveBackParams = { if (it.backStack.first() == EmptyChild1) predictiveBackParams.value else null },
358+
predictiveBackParams = { stack ->
359+
if ((stack.items.first() == EmptyChild1) && (stack.size > 1)) {
360+
predictiveBackParams.value
361+
} else {
362+
null
363+
}
364+
},
361365
),
362366
) {
363-
when (val child = it.instance) {
364-
is PanelChild.Panel -> content(child.child)
365-
366-
is PanelChild.Empty -> {
367-
if (it == EmptyChild3) {
368-
placeholder()
369-
}
370-
}
367+
val child = it.instance.child
368+
if (child != null) {
369+
content(child)
370+
} else if (it == EmptyChild3) {
371+
placeholder()
371372
}
372373
}
373374
}
374375

375376
@Composable
376377
private fun rememberBroadcastPredictiveBackParams(
377378
key: Any,
378-
count: Int,
379379
params: () -> PredictiveBackParams?
380380
): Lazy<PredictiveBackParams?> =
381381
rememberLazy(key) {
@@ -385,7 +385,7 @@ private fun rememberBroadcastPredictiveBackParams(
385385
copy(
386386
backHandler = BroadcastBackHandler(backHandler),
387387
onBack = {
388-
if (++onBackCallCount == count) {
388+
if (++onBackCallCount == 2) {
389389
onBackCallCount = 0
390390
onBack()
391391
}
@@ -399,8 +399,8 @@ private fun <C : Any, T : Any> stackOfNotNull(vararg stack: Child.Created<C, T>?
399399
ChildStack(active = it.last(), backStack = it.dropLast(1))
400400
}
401401

402-
private fun <C : Any, T : Any> Child.Created<C, T>.asPanelChild(): Child.Created<C, PanelChild.Panel<C, T>> =
403-
Child.Created(configuration = configuration, PanelChild.Panel(child = this))
402+
private fun <C : Any, T : Any> Child.Created<C, T>.asPanelChild(): Child.Created<C, PanelChild<C, T>> =
403+
Child.Created(configuration = configuration, PanelChild(child = this))
404404

405405
private val EmptyChild1 = Child.Created(configuration = EmptyConfig(value = 1), instance = PanelChild.Empty)
406406
private val EmptyChild2 = Child.Created(configuration = EmptyConfig(value = 2), instance = PanelChild.Empty)
@@ -409,7 +409,11 @@ private val EmptyChild4 = Child.Created(configuration = EmptyConfig(value = 4),
409409

410410
private data class EmptyConfig(val value: Any)
411411

412-
private sealed interface PanelChild<out C : Any, out T : Any> {
413-
class Panel<out C : Any, out T : Any>(val child: Child.Created<C, T>) : PanelChild<C, T>
414-
data object Empty : PanelChild<Nothing, Nothing>
412+
private class PanelChild<out C : Any, out T : Any>(val child: Child.Created<C, T>?) {
413+
414+
companion object {
415+
val Empty: PanelChild<Nothing, Nothing> = PanelChild(child = null)
416+
}
415417
}
418+
419+
private val PanelChild<*, *>.isEmpty: Boolean get() = child == null

0 commit comments

Comments
 (0)