From 6a61772c80dee13b4ff120b4b3e53259eae52a78 Mon Sep 17 00:00:00 2001 From: Matthias Melcher Date: Mon, 14 Jan 2019 01:14:40 +0100 Subject: STR 3460: Fluid menu item types Added pulldown menus to create radio style and checkbox style menu items without going through the Class menu. --- fluid/Fl_Menu_Type.cxx | 20 +++++++++++++++++++- fluid/Fl_Type.h | 11 +++++++++++ fluid/factory.cxx | 4 ++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/fluid/Fl_Menu_Type.cxx b/fluid/Fl_Menu_Type.cxx index e4c09be01..448b898e6 100644 --- a/fluid/Fl_Menu_Type.cxx +++ b/fluid/Fl_Menu_Type.cxx @@ -49,6 +49,7 @@ extern const char* i18n_file; extern const char* i18n_set; static char submenuflag; +static uchar menuitemtype = 0; void Fl_Input_Choice_Type::build_menu() { Fl_Input_Choice* w = (Fl_Input_Choice*)o; @@ -117,12 +118,27 @@ Fl_Type *Fl_Menu_Item_Type::make() { Fl_Menu_Item_Type* t = submenuflag ? new Fl_Submenu_Type() : new Fl_Menu_Item_Type(); t->o = new Fl_Button(0,0,100,20); + t->o->type(menuitemtype); t->factory = this; t->add(p); if (!reading_file) t->label(submenuflag ? "submenu" : "item"); return t; } +Fl_Type *Fl_Checkbox_Menu_Item_Type::make() { + menuitemtype = FL_MENU_TOGGLE; + Fl_Type* t = Fl_Menu_Item_Type::make(); + menuitemtype = 0; + return t; +} + +Fl_Type *Fl_Radio_Menu_Item_Type::make() { + menuitemtype = FL_MENU_RADIO; + Fl_Type* t = Fl_Menu_Item_Type::make(); + menuitemtype = 0; + return t; +} + Fl_Type *Fl_Submenu_Type::make() { submenuflag = 1; Fl_Type* t = Fl_Menu_Item_Type::make(); @@ -131,6 +147,8 @@ Fl_Type *Fl_Submenu_Type::make() { } Fl_Menu_Item_Type Fl_Menu_Item_type; +Fl_Checkbox_Menu_Item_Type Fl_Checkbox_Menu_Item_type; +Fl_Radio_Menu_Item_Type Fl_Radio_Menu_Item_type; Fl_Submenu_Type Fl_Submenu_type; //////////////////////////////////////////////////////////////// @@ -424,7 +442,7 @@ void Fl_Menu_Type::build_menu() { } m->shortcut(((Fl_Button*)(i->o))->shortcut()); m->callback(0,(void*)i); - m->flags = i->flags(); + m->flags = i->flags() | i->o->type(); m->labelfont(i->o->labelfont()); m->labelsize(i->o->labelsize()); m->labelcolor(i->o->labelcolor()); diff --git a/fluid/Fl_Type.h b/fluid/Fl_Type.h index 45b881ee3..6794bef37 100644 --- a/fluid/Fl_Type.h +++ b/fluid/Fl_Type.h @@ -690,6 +690,16 @@ public: int pixmapID() { return 16; } }; +class Fl_Radio_Menu_Item_Type : public Fl_Menu_Item_Type { +public: + Fl_Type* make(); +}; + +class Fl_Checkbox_Menu_Item_Type : public Fl_Menu_Item_Type { +public: + Fl_Type* make(); +}; + class Fl_Submenu_Type : public Fl_Menu_Item_Type { public: Fl_Menu_Item* subtypes() {return 0;} @@ -707,6 +717,7 @@ public: }; + #include class Fl_Menu_Type : public Fl_Widget_Type { int textstuff(int w, Fl_Font& f, int& s, Fl_Color& c) { diff --git a/fluid/factory.cxx b/fluid/factory.cxx index 2ce3065cc..92395ac20 100644 --- a/fluid/factory.cxx +++ b/fluid/factory.cxx @@ -926,6 +926,8 @@ extern class Fl_Choice_Type Fl_Choice_type; extern class Fl_Menu_Bar_Type Fl_Menu_Bar_type; extern class Fl_Menu_Button_Type Fl_Menu_Button_type; extern class Fl_Menu_Item_Type Fl_Menu_Item_type; +extern class Fl_Checkbox_Menu_Item_Type Fl_Checkbox_Menu_Item_type; +extern class Fl_Radio_Menu_Item_Type Fl_Radio_Menu_Item_type; extern class Fl_Submenu_Type Fl_Submenu_type; extern class Fl_Wizard_Type Fl_Wizard_type; @@ -1029,6 +1031,8 @@ Fl_Menu_Item New_Menu[] = { {0,0,cb,(void*)&Fl_Input_Choice_type}, {0,0,cb, (void*)&Fl_Submenu_type}, {0,0,cb, (void*)&Fl_Menu_Item_type}, + {"Checkbox Menu Item",0,cb, (void*)&Fl_Checkbox_Menu_Item_type}, + {"Radio Menu Item",0,cb, (void*)&Fl_Radio_Menu_Item_type}, {0}, {"Browsers",0,0,0,FL_SUBMENU}, {0,0,cb,(void*)&Fl_Browser_type}, -- cgit v1.2.3