|
|
commit 9c55ad4273ff3e4327daaaf28fc06bf6bbd4a645
Author: Greg Ercolano <erco@seriss.com>
AuthorDate: Thu Jan 13 15:26:27 2022 -0800
Commit: Greg Ercolano <erco@seriss.com>
CommitDate: Thu Jan 13 15:26:27 2022 -0800
Fixes #362
FL/Fl_Input_Choice.H | 2 ++
documentation/src/input_choice.jpg | Bin 14814 -> 0 bytes
documentation/src/input_choice.png | Bin 0 -> 16484 bytes
src/Fl_Input_Choice.cxx | 54 +++++++++++++++++++++++++++++++++++--
4 files changed, 54 insertions(+), 2 deletions(-)
diff --git FL/Fl_Input_Choice.H FL/Fl_Input_Choice.H
index 56fdd10..c02195b 100644
--- FL/Fl_Input_Choice.H
+++ FL/Fl_Input_Choice.H
@@ -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_;
diff --git documentation/src/input_choice.jpg documentation/src/input_choice.jpg
deleted file mode 100644
index 7600b1c..0000000
Binary files documentation/src/input_choice.jpg and /dev/null differ
diff --git documentation/src/input_choice.png documentation/src/input_choice.png
new file mode 100644
index 0000000..42cd6e7
Binary files /dev/null and documentation/src/input_choice.png differ
diff --git src/Fl_Input_Choice.cxx src/Fl_Input_Choice.cxx
index bf52360..781e822 100644
--- src/Fl_Input_Choice.cxx
+++ src/Fl_Input_Choice.cxx
@@ -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. */
[ Direct Link to Message ] | |
|
| |