RFR: 8366739: ToolBar: overflow menu with fractional scale (2)

Cormac Redmond duke at openjdk.org
Mon Dec 22 11:49:20 UTC 2025


On Sun, 21 Dec 2025 22:08:33 GMT, John Hendrikx <jhendrikx at openjdk.org> wrote:

>> An example of length rounding due to "-=" operations (again, at 1.25 scale), when overflow should show:
>> 
>> <img width="855" height="247" alt="image" src="https://github.com/user-attachments/assets/aca455ab-0d32-4e46-9868-78d786cd4a7b" />
>> 
>> I can't (easily) get it to create any actually problems for me, but the question remains, should be re-snap it also?
>> 
>> If it's not (demonstrably) broken, don't fix it, maybe.
>
> Yeah, that's going to cause problems at some point.  It must be resnapped when doing comparisons with it.

@hjohn, thanks. I began to fix "length" there too at source (i.e., after the length manipulations, which I think is the place to do it). 

However, while doing so, I asked myself if there's any actual need to wrap a snapSize in a snapPosition in the first place?

For example, the original fix I added earlier for "x", was like this:

`x = snapPositionY(x + snapSizeY(node.prefHeight(-1)) + getSpacing());`

...but could it not simply be:

`x = snapSizeY(x + node.prefHeight(-1) + getSpacing());` ...?

This seems to be how the ToolBar length is calculated:


  private double getToolbarLength(ToolBar toolbar) {
        if (getSkinnable().getOrientation() == Orientation.VERTICAL) {
            return snapSizeY(snapSizeY(toolbar.getHeight()) - snappedTopInset() - snappedBottomInset() + getSpacing());
        } else {
            return snapSizeX(snapSizeX(toolbar.getWidth()) - snappedLeftInset() - snappedRightInset() + getSpacing());
        }
    }


If I am correct, to fix the latest "length" problem, I am thinking I can simple change it from this problematic line:

`length -= snapSizeY(overflowMenu.prefHeight(-1));`

to this:

`length = snapSizeY(length - overflowMenu.prefHeight(-1));`

I could also remove the snapPosition wrapper from my original fix for "x". I think leaving it there implies it has a required purpose (but it may not).

So overall, I am proposing doing the below to changes, instead.

New fix for `length`, change this:

        if (newOverflowNodeIndex < getSkinnable().getItems().size()) {
            if (getSkinnable().getOrientation() == Orientation.VERTICAL) {
                length -= snapSizeY(overflowMenu.prefHeight(-1));
            } else {
                length -= snapSizeX(overflowMenu.prefWidth(-1));
            }
            length -= getSpacing();
            newOverflowNodeIndex = getOverflowNodeIndex(length);
        }



... to this:


  if (newOverflowNodeIndex < getSkinnable().getItems().size()) {
            length -= getSpacing(); // MOVED
            if (getSkinnable().getOrientation() == Orientation.VERTICAL) {
                length = snapSizeY(length - overflowMenu.prefHeight(-1)); // SIMPLIFIED
            } else {
                length = snapSizeX(length - overflowMenu.prefWidth(-1)); // SIMPLIFIED
            }
            newOverflowNodeIndex = getOverflowNodeIndex(length);
        }


And, also reverting my earlier fix for `x`, from this:

  if (node.isManaged()) {
                if (getSkinnable().getOrientation() == Orientation.VERTICAL) {
                    x = snapPositionY(x + snapSizeY(node.prefHeight(-1)) + getSpacing()); // NECESSARY?
                } else {
                    x = snapPositionX(x + snapSizeX(node.prefWidth(-1)) + getSpacing()); // NECESSARY?
                }
            }


... to this:


            if (node.isManaged()) {
                if (getSkinnable().getOrientation() == Orientation.VERTICAL) {
                    x = snapSizeY(x + node.prefHeight(-1) + getSpacing()); // SIMPLIFIED
                } else {
                    x = snapSizeX(x + node.prefWidth(-1) + getSpacing()); // SIMPLIFIED
                }
            }


Test suite and manual testing isn't finding any issues.

What do you think?

-------------

PR Review Comment: https://git.openjdk.org/jfx/pull/2016#discussion_r2639607102


More information about the openjfx-dev mailing list