Keep Pie Menu Onscreen

I have a fairly complex series of UI panels that I’ve broken down into a Pie Menu.

There are multiple levels that the user can navigate between, but they all end in a menu that will display between 10 - 50 properties.


In general the Pie works well for navigating and displaying this much info, however it will always disappear after a single click.

Some of the properties are booleans that open sub-items, and it can be very frustrating to navigate to the item, click to open, have the pie menu close, then have to renavigate through the menu to get back to the sub-items.

The behavior that I’m looking for is what is displayed in the ‘Undo’ panels, you can adjust multiple properties and it stays onscreen until you click outside the menu.

I’ve tried to make this happen by calling the menu from within a modal operator, thought about storing a reference to the menu level in the scene then reopening it, but wasn’t sure how to add the callback, and I’m a bit stuck.

Is it possible to keep a Pie Menu open onscreen while the user selects multiple items?
To call Undo-style panels in a pie-style layout?
Or some other method that get the end result I want?

You might be stretching the pie menu system a bit too thin there so I’m not surprised it’s acting funky. I don’t remember where but I saw the devs statings pie menus are not designed to contain more than a dozen options displayed radially next to the mouse cursor.

What you might be able to do is add a callback when a property is changed from the pie menu to re-open it by code a frame later with bpy.app.timers at the original cursor location. Although I think it would be bad user experience since the menus will flicker for one frame (if even possible).

Cheers

Thanks, I had a feeling that might be the case.

I think I’m just going to call a panel at the lowest level of the menu system.

It will all be in a single column, instead of separate boxes, but it should give me the behavior I’m looking for.

The issue here is that there are 100s of properties across the codebase, so adding an update function to each is a bit cumbersome.

On the plus side, they are all pre-existing panels, so I should be able to just call their draw functions instead of manually recreating their layout.

Thanks for chiming in! :slightly_smiling_face:

1 Like