Restrict popup menu height

Hi !

I am working on an interface containing combo boxes with a lot of items in it. When one of the combo box's popup menu is deployed, it takes most of the time a huge part of the screen. What I would like to do is to restrict the number of items displayed by the popup menu and enable the scrolling.

There’s apparently no way to do this using a custom lookandfeel or a custom combo box as the popup menu display is computed in an inline class called MenuWindow in juce_PopupMenu.cpp.

 

Can you add a listbox as a custom item to your popup menu?

http://klangfreund.github.io/jucedoc/doc/classPopupMenu_1_1CustomComponent.html

 

 

That would be a very clunky way to do it! Not recommended!

Yeah, I don't think anyone's asked for control over that before. Not a bad request, I'll backlog it..

..actually, just thinking about it, you can probably already do this.

If you override the ComboBox::showPopup method, you can tweak the options, and could use the Options::withTargetScreenArea to limit the space it can occupy.

My bad ! Thanks ! :)

Hello Jules,

 

I'm facing similar problem : I want to draw a PopupMenu within a delimited space, but withTargetScreenArea don't seems to work for me.

Here's what I'm doing : 

I have a button in Hello world and on click I do :

Rectangle <int> rect (button->getX(),button->getY(),100,200);

        PopupMenu menu;

         for (int i = 1; i<50; i++)      {

            menu.addItem(i, String(i));

        }

                const int result = menu.showMenu (PopupMenu::Options()

                                          .withTargetScreenArea(localAreaToGlobal (rect))

                                          .withMaximumNumColumns (1)

                                          );

But the popup draws filing the whole height of my screen...

If I change the X & Y coordinate, it indeed move it's drawing point, but I can't have it constrained inside a specific height as I would like...

I'm still using Juce 3.1.1 Could it be that this has been fixed since then ?

 

Thanks,

 

Salvator

Sorry, what I said was wrong - the target screen area is the area to position the menu around, not inside. There's currently nothing in there that would support limiting the overall size, but it could be added to the options, I guess.

Thanks for the clarification.

+1 for the new option, or even just something like ".withMaximumNumRows(int maxNumRow)

Best,

Salvator

 

1 Like

was anything like this ever added? I’m having the same problems now

Yeah, this would be a nice feature. Am I missing another way this could be achieved? The size of the menu doesn’t look so nice depending on the size of the plugin window, so it’d be nice to have more control.

1 Like

Perhaps you could provide the popup menu with a parent component, which might be a dirty workaround.

That would be possible if I was using the popup menu on its own but it’s being created in the ComboBox, so I think I can only change things with the getOptionsForComboBoxPopupMenu method.

Yes, you could provide a parent component with that function. But you will have to create a LAF for each combobox :innocent: I have done something similar to restrict the popup menu to the main editor.

Are you saying a blank combobox whose child is the real combobox?

The parent component could be a blank juce::Component. Popup menu is not a child of the combobox.