All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.peanuuutz.fork.ui.scene.toast.ToastOwner.kt Maven / Gradle / Ivy

package net.peanuuutz.fork.ui.scene.toast

import androidx.compose.runtime.CompositionContext
import net.minecraft.client.toast.Toast.BASE_HEIGHT
import net.minecraft.client.toast.Toast.Visibility
import net.peanuuutz.fork.ui.foundation.layout.minHeight
import net.peanuuutz.fork.ui.scene.screen.ScreenWindowInfo
import net.peanuuutz.fork.ui.ui.context.owner.AbstractOwner
import net.peanuuutz.fork.ui.ui.context.owner.OwnerContainer
import net.peanuuutz.fork.ui.ui.context.pointer.PointerService
import net.peanuuutz.fork.ui.ui.context.text.ClipboardService
import net.peanuuutz.fork.ui.ui.context.text.TextInputDispatcher
import net.peanuuutz.fork.ui.ui.context.window.CoordinateConvertor
import net.peanuuutz.fork.ui.ui.context.window.WindowInfo
import net.peanuuutz.fork.ui.ui.draw.canvas.Canvas
import net.peanuuutz.fork.ui.ui.layout.DefaultMeasurePolicy
import net.peanuuutz.fork.ui.ui.modifier.Modifier
import net.peanuuutz.fork.ui.ui.modifier.layout.onPlaced
import net.peanuuutz.fork.ui.ui.node.LayoutNode
import net.peanuuutz.fork.ui.ui.unit.FloatOffset
import net.peanuuutz.fork.ui.ui.unit.IntSize

internal class ToastOwner(
    context: CompositionContext,
    container: OwnerContainer,
    shouldReceiveEvents: Boolean,
    override val canvas: Canvas
) : AbstractOwner(
        compositionContext = context,
        container = container,
        shouldReceiveEvents = shouldReceiveEvents
    ),
    CoordinateConvertor // Small interfaces don't deserve an object
{
    var position: FloatOffset = FloatOffset.Zero

    val size: IntSize
        get() = _size

    private var _size: IntSize = IntSize(0, BASE_HEIGHT)

    val state: Visibility
        get() = _state

    private var _state: Visibility = Visibility.SHOW

    override val root: LayoutNode = LayoutNode().apply {
        modifier = Modifier
            .minHeight(BASE_HEIGHT)
            .then(focusOwner.modifier)
            .onPlaced { _size = it.size }
        measurePolicy = DefaultMeasurePolicy
    }

    override val clipboardService: ClipboardService?
        get() = null

    override val coordinateConvertor: CoordinateConvertor
        get() = this

    override val pointerService: PointerService?
        get() = null

    override val textInputDispatcher: TextInputDispatcher?
        get() = null

    override val windowInfo: WindowInfo
        get() = ScreenWindowInfo

    override fun doDraw() {
        val (x, y) = position
        canvas.translate(x, y)
        super.doDraw()
        canvas.translate(-x, -y)
    }

    override fun rootToWindow(relativeToRoot: FloatOffset): FloatOffset {
        return relativeToRoot + position
    }

    override fun windowToRoot(relativeToWindow: FloatOffset): FloatOffset {
        return relativeToWindow - position
    }

    override fun exit() {
        _state = Visibility.HIDE
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy