aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcorvid <corvid@lavabit.com>2011-05-14 06:43:17 +0000
committercorvid <corvid@lavabit.com>2011-05-14 06:43:17 +0000
commit4e348a6c67e15bb5c0feea1279272431abb3f0db (patch)
tree5ebb93780476883703e6d2f19a3b0b9046efe80e
parent442dcb263a068e685bfa65255172ae4c3747c4bd (diff)
forms menu/list selection
-rw-r--r--dw/fltkui.cc21
-rw-r--r--dw/fltkui.hh1
2 files changed, 14 insertions, 8 deletions
diff --git a/dw/fltkui.cc b/dw/fltkui.cc
index a7da10d9..f79dea80 100644
--- a/dw/fltkui.cc
+++ b/dw/fltkui.cc
@@ -875,6 +875,7 @@ FltkOptionMenuResource::FltkOptionMenuResource (FltkPlatform *platform):
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.
+ visibleItems = 0;
init (platform);
}
@@ -986,12 +987,11 @@ void FltkOptionMenuResource::addItem (const char *str,
Fl_Menu_Item *item = newItem();
item->text = strdup(str);
+ item->argument(visibleItems++);
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(item);
@@ -1003,6 +1003,7 @@ void FltkOptionMenuResource::pushGroup (const char *name, bool enabled)
Fl_Menu_Item *item = newItem();
item->text = strdup(name);
+ item->argument(visibleItems++);
if (enabled == false)
item->flags = FL_MENU_INACTIVE;
@@ -1021,7 +1022,7 @@ void FltkOptionMenuResource::popGroup ()
bool FltkOptionMenuResource::isSelected (int index)
{
- return index == ((Fl_Choice *)widget)->value();
+ return index == (int) ((Fl_Choice *)widget)->mvalue()->user_data();
}
int FltkOptionMenuResource::getNumberOfItems()
@@ -1096,9 +1097,11 @@ void *FltkListResource::newItem (const char *str, bool enabled)
Fl_Tree *tree = (Fl_Tree *) widget;
Fl_Tree_Item *parent = (Fl_Tree_Item *)currParent;
Fl_Tree_Item *item = tree->add(parent, str);
+ int index = itemsSelected.size();
enabled &= parent->is_active();
item->activate(enabled);
+ item->user_data((void *)index);
itemsSelected.increase ();
return item;
@@ -1109,19 +1112,21 @@ void FltkListResource::addItem (const char *str, bool enabled, bool selected)
Fl_Tree *tree = (Fl_Tree *) widget;
Fl_Tree_Item *item = (Fl_Tree_Item *) newItem(str, enabled);
- itemsSelected.set (itemsSelected.size() - 1, selected);
-
if (selected) {
- if (mode == SELECTION_MULTIPLE)
+ if (mode == SELECTION_MULTIPLE) {
item->select(selected);
- else
- tree->select_only(item, 0);
+ itemsSelected.set (itemsSelected.size() - 1, selected);
+ } else {
+ const bool do_callback = true;
+ tree->select_only(item, do_callback);
+ }
}
queueResize (true);
}
void FltkListResource::pushGroup (const char *name, bool enabled)
{
+ /* TODO: make it impossible to select a group */
currParent = (Fl_Tree_Item *) newItem(name, enabled);
queueResize (true);
}
diff --git a/dw/fltkui.hh b/dw/fltkui.hh
index 0a9d6242..7b9d6d71 100644
--- a/dw/fltkui.hh
+++ b/dw/fltkui.hh
@@ -465,6 +465,7 @@ private:
Fl_Menu_Item *newItem();
Fl_Menu_Item *menu;
int itemsAllocated, itemsUsed;
+ int visibleItems; /* not counting the invisible ones that close a group */
public:
FltkOptionMenuResource (FltkPlatform *platform);
~FltkOptionMenuResource ();