diff options
author | corvid <corvid@lavabit.com> | 2011-01-29 02:41:26 +0000 |
---|---|---|
committer | corvid <corvid@lavabit.com> | 2011-01-29 02:41:26 +0000 |
commit | 8d9b931926b1803d9e7bc46384a3e3db2fe5bdb6 (patch) | |
tree | 2ded7d8ee592438f7b808c187871cd595c9efdde /dw | |
parent | 42312bc3da35a224552aeab7b6fb3cf9aae71660 (diff) |
our own menuItem array for OptionMenu
Diffstat (limited to 'dw')
-rw-r--r-- | dw/fltkui.cc | 52 | ||||
-rw-r--r-- | dw/fltkui.hh | 4 |
2 files changed, 46 insertions, 10 deletions
diff --git a/dw/fltkui.cc b/dw/fltkui.cc index bbc85e16..d7f525c1 100644 --- a/dw/fltkui.cc +++ b/dw/fltkui.cc @@ -879,11 +879,25 @@ template <class I> int FltkSelectionResource<I>::getMaxStringWidth () FltkOptionMenuResource::FltkOptionMenuResource (FltkPlatform *platform): FltkSelectionResource <dw::core::ui::OptionMenuResource> (platform) { + /* Fl_Menu_ does not like multiple menu items with the same label, and + * insert() treats some characters specially unless escaped, so let's + * do our own menu handling. + */ + itemsAllocated = 0x10; + menu = new Fl_Menu_Item[itemsAllocated]; + memset(menu, 0, itemsAllocated * sizeof(Fl_Menu_Item)); + itemsUsed = 1; // menu[0].text == NULL, which is an end-of-menu marker. + init (platform); } FltkOptionMenuResource::~FltkOptionMenuResource () { + for (int i = 0; i < itemsUsed; i++) { + if (menu[i].text) + free((char *) menu[i].text); + } + delete menu; } @@ -894,18 +908,13 @@ Fl_Widget *FltkOptionMenuResource::createNewWidget (core::Allocation new Fl_Choice (allocation->x, allocation->y, allocation->width, allocation->ascent + allocation->descent); -// choice->clear_flag (SHORTCUT_LABEL); - choice->callback(widgetCallback,this); + choice->menu(menu); return choice; } void FltkOptionMenuResource::widgetCallback (Fl_Widget *widget, void *data) { -#if 0 - ((FltkOptionMenuResource *) data)->selection = - (long) (((Fl_Menu *) widget)->item()->user_data()); -#endif } void FltkOptionMenuResource::sizeRequest (core::Requisition *requisition) @@ -932,14 +941,39 @@ void FltkOptionMenuResource::sizeRequest (core::Requisition *requisition) #endif } +void FltkOptionMenuResource::enlargeMenu () +{ + Fl_Menu_Item *newMenu; + + itemsAllocated += 0x10; + newMenu = new Fl_Menu_Item[itemsAllocated]; + memcpy(newMenu, menu, itemsUsed * sizeof(Fl_Menu_Item)); + memset(newMenu + itemsUsed, 0, 0x10 * sizeof(Fl_Menu_Item)); + delete menu; + menu = newMenu; + ((Fl_Choice *)widget)->menu(menu); +} + void FltkOptionMenuResource::addItem (const char *str, bool enabled, bool selected) { - int flags = enabled ? 0 : FL_MENU_INACTIVE; - int index = ((Fl_Choice *)widget)->add(str, 0, 0, 0, flags); + Fl_Menu_Item *item; + + if (itemsUsed == itemsAllocated) + enlargeMenu(); + item = menu + itemsUsed - 1; + item->text = strdup(str); + + if (enabled == false) + item->flags = FL_MENU_INACTIVE; + + // TODO: verify that an array index is exactly what value() wants, + // even when there are submenus. if (selected) - ((Fl_Choice *)widget)->value(index); + ((Fl_Choice *)widget)->value(item); + + itemsUsed++; queueResize (true); } diff --git a/dw/fltkui.hh b/dw/fltkui.hh index 4d26bbd4..e6480790 100644 --- a/dw/fltkui.hh +++ b/dw/fltkui.hh @@ -487,7 +487,9 @@ protected: int getNumberOfItems(); private: static void widgetCallback (Fl_Widget *widget, void *data); - + void enlargeMenu(); + Fl_Menu_Item *menu; + int itemsAllocated, itemsUsed; public: FltkOptionMenuResource (FltkPlatform *platform); ~FltkOptionMenuResource (); |