Elementa icon indicating copy to clipboard operation
Elementa copied to clipboard

FillConstraint ignores paddings by SiblingConstrains

Open semenishchev opened this issue 2 years ago • 3 comments

Describe the bug When you make a stacked component and for example use Y, and every time you use SiblingConstraint() with paddings, the space in the parent component reduces, but FillComponent ignores that and uses full size and exceeds the space given by the parent component.

To Reproduce Steps to reproduce the behavior:

val block = UIBlock().constrain {
                y = CramSiblingConstraint(3f)
                x = CramSiblingConstraint(3f)
                width = 100.pixels
                height = 110.pixels
                color = ConstantColorConstraint(VigilancePalette.getDividerDark())
            } effect ScissorEffect() childOf scroller
            UIImage.ofResource(module.logo).constrain {
                x = CenterConstraint()
                y = SiblingConstraint(3f) + 5f.pixels
                width = 64.pixels
                height = 64.pixels
            } childOf block
            UIText(module.spacedName).constrain {
                x = CenterConstraint()
                y = SiblingConstraint(10f)
            } childOf block
            val statusBlock = UIBlock(ConstantColorConstraint(BooleanDefinedColorState(module::state))).constrain {
                y = SiblingConstraint()
                x = CenterConstraint()
                width = 100.percent
                height = FillConstraint()
            } childOf block

            UIText("Enabled").constrain {
                x = CenterConstraint()
                y = CenterConstraint()
            } childOf statusBlock

Expected behavior Used hard coded values

Снимок экрана 2023-10-11 в 20 26 17

Screenshots If applicable, add screenshots to help explain your problem.

Additional context No paddings: No paddings With paddings: Paddings

semenishchev avatar Oct 11 '23 18:10 semenishchev

Should be fixed by #75

Sychic avatar Oct 11 '23 18:10 Sychic

Should be fixed by #75

I wish it’d get merged, it’s more than a year since 😭

semenishchev avatar Oct 11 '23 19:10 semenishchev

I've closed the referenced PR as it has several shortcomings that make it unfit for general use. If it works in your case, you could just create a local copy of it for your use.

Internally we've come to do something similar but with different tradeoffs than that PR, namely that it accounts for all SiblingConstraint-induced padding (or more generally any PaddingConstraint-induced padding) but not any offset induced in any other way. In particular your y = SiblingConstraint(3f) + 5f.pixels (which, given the aren't any preceding siblings (?) is just 5.pixels) wouldn't work. We've come to instead use dummy spacer components of appropriate size whenever we need extra padding at the very start/end.

Here's the relevant part of FillConstraint (at least the width; height works analogous) which we've modified:

        return if (useSiblings) {
            target.getWidth() - target.children.filter { it != component }.sumOf {
                it.getWidth().toDouble() + ((it.constraints.x as? PaddingConstraint)?.getHorizontalPadding(it) ?: 0f).toDouble()
            }.toFloat()
        } else target.getRight() - component.getLeft() + ((target.constraints.x as? PaddingConstraint)?.getHorizontalPadding(target) ?: 0f)

Beware that we only ever use it with useSiblings = true, so that else case is completely untested (and looking at it, idk what that's supposed to do; doesn't look right to me).

Johni0702 avatar Oct 12 '23 07:10 Johni0702