Skip to content

Commit 619e32d

Browse files
authored
Add BalloonState.update() function to remeasure the layout contents (#917)
1 parent 6788e5e commit 619e32d

4 files changed

Lines changed: 33 additions & 0 deletions

File tree

balloon-compose/api/balloon-compose.api

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ public final class com/skydoves/balloon/compose/BalloonState : com/skydoves/ball
9494
public fun showAlignTop (II)V
9595
public fun showAsDropDown (II)V
9696
public fun showAtCenter (IILcom/skydoves/balloon/BalloonCenterAlign;)V
97+
public final fun update ()V
9798
public fun update (II)V
9899
public fun updateAlign (Lcom/skydoves/balloon/BalloonAlign;II)V
99100
public fun updateAlignBottom (II)V

balloon-compose/src/main/kotlin/com/skydoves/balloon/compose/BalloonModifier.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,11 @@ public fun Modifier.balloon(
109109
// Track balloon layout info for measurement
110110
val balloonLayoutInfo = remember { mutableStateOf<BalloonLayoutInfo?>(null) }
111111

112+
// Connect layout info to state for update() functionality
113+
remember(balloonLayoutInfo) {
114+
state._balloonLayoutInfo = balloonLayoutInfo
115+
}
116+
112117
// Create BalloonComposeView and connect to state
113118
val balloonComposeView = remember(key) {
114119
BalloonComposeView(

balloon-compose/src/main/kotlin/com/skydoves/balloon/compose/BalloonState.kt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import android.view.MotionEvent
2121
import android.view.View
2222
import android.view.ViewGroup
2323
import androidx.compose.runtime.Composable
24+
import androidx.compose.runtime.MutableState
2425
import androidx.compose.runtime.Stable
2526
import androidx.compose.runtime.remember
2627
import androidx.compose.ui.platform.LocalContext
@@ -92,6 +93,9 @@ public class BalloonState internal constructor(
9293
/** The internal balloon window delegate. Set internally by the balloon modifier. */
9394
internal var _balloonWindow: BalloonWindow? = null
9495

96+
/** The balloon layout info state for triggering re-measurement. Set internally by the balloon modifier. */
97+
internal var _balloonLayoutInfo: MutableState<BalloonLayoutInfo?>? = null
98+
9599
override val anchorView: View
96100
get() = _anchorView
97101
?: error("BalloonState is not attached to a composable. Use Modifier.balloon() to attach.")
@@ -318,9 +322,29 @@ public class BalloonState internal constructor(
318322
override fun getBalloonArrowView(): View =
319323
_balloonWindow?.getBalloonArrowView() ?: error("BalloonState is not attached")
320324

325+
/**
326+
* Triggers re-measurement of the balloon content.
327+
* Call this method when the balloon content changes dynamically (e.g., showing/hiding elements)
328+
* to update the balloon size without closing it.
329+
*
330+
* Example usage:
331+
* ```
332+
* var showExtra by remember { mutableStateOf(false) }
333+
*
334+
* Button(onClick = {
335+
* showExtra = !showExtra
336+
* balloonState.update() // Trigger re-measurement after content change
337+
* })
338+
* ```
339+
*/
340+
public fun update() {
341+
_balloonLayoutInfo?.value = null
342+
}
343+
321344
internal fun dispose() {
322345
_balloonWindow?.dismiss()
323346
_balloonWindow = null
324347
_anchorView = null
348+
_balloonLayoutInfo = null
325349
}
326350
}

balloon/api/balloon.api

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,7 @@ public final class com/skydoves/balloon/Balloon$Builder {
333333
public final fun getWidthRatio ()F
334334
public final fun isAttachedInDecor ()Z
335335
public final fun isClipArrowEnabled ()Z
336+
public final fun isClippingEnabled ()Z
336337
public final fun isComposableContent ()Z
337338
public final fun isFocusable ()Z
338339
public final fun isRtlLayout ()Z
@@ -421,6 +422,7 @@ public final class com/skydoves/balloon/Balloon$Builder {
421422
public final fun setCircularDuration (J)Lcom/skydoves/balloon/Balloon$Builder;
422423
public final synthetic fun setCircularDuration (J)V
423424
public final synthetic fun setClipArrowEnabled (Z)V
425+
public final synthetic fun setClippingEnabled (Z)V
424426
public final synthetic fun setComposableContent (Z)V
425427
public final fun setCornerRadius (F)Lcom/skydoves/balloon/Balloon$Builder;
426428
public final synthetic fun setCornerRadius (F)V
@@ -475,6 +477,7 @@ public final class com/skydoves/balloon/Balloon$Builder {
475477
public final synthetic fun setIncludeFontPadding (Z)V
476478
public final fun setIsAttachedInDecor (Z)Lcom/skydoves/balloon/Balloon$Builder;
477479
public final fun setIsClipArrowEnabled (Z)Lcom/skydoves/balloon/Balloon$Builder;
480+
public final fun setIsClippingEnabled (Z)Lcom/skydoves/balloon/Balloon$Builder;
478481
public final fun setIsComposableContent (Z)Lcom/skydoves/balloon/Balloon$Builder;
479482
public final fun setIsStatusBarVisible (Z)Lcom/skydoves/balloon/Balloon$Builder;
480483
public final fun setIsVisibleArrow (Z)Lcom/skydoves/balloon/Balloon$Builder;

0 commit comments

Comments
 (0)