Hey , we’re using 4.9 custom binaries. The UI is for a timeline-like system used for choreographing gameplay, ie attacks, buffs, etc.
A screenshot below shows the basic idea, you can lay out tasks on a grid, select them, drag them around, and resize them. They collide with each other as well, so they don’t accidentally overlap. The overall layout in this case is the root widget, with a child widget for every bar.
The “Section1” with the green handles and vertical lines that you see is also a widget as a child of the root widget, and is what I was referring to in my post. The two vertical green lines denote the beginning and end of the section, additional text can also appear in between the start and end handles describing stuff about the section. You can drag the handles to resize the section.
I implemented a SSectionWidget, and at first I was doing additional checks in the various events (OnMouseDown, OnCursorQuery, etc) to test if the cursor was over the left or right handle of the section, and returned FReply::Unhandled() if it wasn’t. This works fine, until two sections overlap, which is allowed. Since the sections are peers, both children of the root widget, the bubble routing policy does not pass any events to the section covered by another one, it always just goes to the parent immediately.
I considered breaking up the SSectionWidget into subwidgets, adding each handle, text, line, individually to the root widget but that made the code very messy. It was much simpler to just add an OnHitTest() to the SectionWidget and only return true if one of the handles was hit, making the center of the section widget transparent to clicks. In FHittestGrid::GetHitIndexFromCellIndex I added a call to OnHitTest() to do the more detailed collision test.