This commit is contained in:
Greg Ercolano 2022-01-13 15:26:27 -08:00
parent 47cd9a11a0
commit 9c55ad4273
4 changed files with 54 additions and 2 deletions

View File

@ -45,8 +45,10 @@ class FL_EXPORT Fl_Input_Choice : public Fl_Group {
// Private class to handle slightly 'special' behavior of menu button
class InputMenuButton : public Fl_Menu_Button {
void draw();
const Fl_Menu_Item* popup();
public:
InputMenuButton(int X, int Y, int W, int H, const char *L=0);
int handle(int e);
};
Fl_Input *inp_;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -32,8 +32,8 @@
\brief A combination of the input widget and a menu button.
\image html input_choice.jpg
\image latex input_choice.jpg "Fl_Input_Choice widget" width=6cm
\image html input_choice.png
\image latex input_choice.png "Fl_Input_Choice widget" width=6cm
The user can either type into the input area, or use the
menu button chooser on the right to choose an item which loads
@ -142,6 +142,56 @@ void Fl_Input_Choice::InputMenuButton::draw() {
if (Fl::focus() == this) draw_focus();
}
// Make pulldown menu appear under entire width of widget
const Fl_Menu_Item* Fl_Input_Choice::InputMenuButton::popup() {
menu_end();
redraw();
Fl_Widget_Tracker mb(this);
// Make menu appear under entire width of Fl_Input_Choice parent group
const Fl_Menu_Item *m = menu()->pulldown(parent()->x(), y(), parent()->w(), h(), 0, this);
picked(m);
if (mb.exists()) redraw();
return m;
}
// Invokes our popup() method to ensure pulldown menu appears full width under widget
// (This is the same handle() code in Fl_Menu_Button and Fl_Choice)
//
int Fl_Input_Choice::InputMenuButton::handle(int e) {
if (!menu() || !menu()->text) return 0;
switch (e) {
case FL_ENTER: /* FALLTHROUGH */
case FL_LEAVE:
return (box() && !type()) ? 1 : 0;
case FL_PUSH:
if (!box()) {
if (Fl::event_button() != 3) return 0;
} else if (type()) {
if (!(type() & (1 << (Fl::event_button()-1)))) return 0;
}
if (Fl::visible_focus()) Fl::focus(this);
popup();
return 1;
case FL_KEYBOARD:
if (!box()) return 0;
if (Fl::event_key() == ' ' &&
!(Fl::event_state() & (FL_SHIFT | FL_CTRL | FL_ALT | FL_META))) {
popup();
return 1;
} else return 0;
case FL_SHORTCUT:
if (Fl_Widget::test_shortcut()) {popup(); return 1;}
return test_shortcut() != 0;
case FL_FOCUS: /* FALLTHROUGH */
case FL_UNFOCUS:
if (box() && Fl::visible_focus()) {
redraw();
return 1;
}
default:
return 0;
}
}
/** Callback for the Fl_Input_Choice menu. */