gui: allow listbox to be used as menu and as read-only list
Also enable string insertion for list items.
Example how to make a menu item:
<listitem name="Lights on!">
<action>
<action function="setbrightness">255</action>
</action>
</listitem>
If no <data> element and no actions on any items exist, the list is
read only and no item selection is possible.
Change-Id: Ib2668a982df2514484d44faa0396dd17550f39f3
diff --git a/gui/listbox.cpp b/gui/listbox.cpp
index a607699..4c9a68a 100644
--- a/gui/listbox.cpp
+++ b/gui/listbox.cpp
@@ -58,6 +58,8 @@
// Get the currently selected value for the list
DataManager::GetValue(mVariable, currentValue);
}
+ else
+ allowSelection = false; // allows using listbox as a read-only list
// Get the data for the list
child = FindNode(node, "listitem");
@@ -66,15 +68,21 @@
ListData data;
attr = child->first_attribute("name");
- if (!attr) return;
- data.displayName = attr->value();
-
- data.variableValue = child->value();
+ if (!attr)
+ continue;
+ data.displayName = gui_parse_text(attr->value());
+ data.variableValue = gui_parse_text(child->value());
if (child->value() == currentValue) {
data.selected = 1;
} else {
data.selected = 0;
}
+ data.action = NULL;
+ xml_node<>* action = child->first_node("action");
+ if (action) {
+ data.action = new GUIAction(action);
+ allowSelection = true;
+ }
mList.push_back(data);
@@ -157,9 +165,12 @@
mList.at(i).selected = 0;
}
if (item_selected < mList.size()) {
- mList.at(item_selected).selected = 1;
- string str = mList.at(item_selected).variableValue;
+ ListData& data = mList.at(item_selected);
+ data.selected = 1;
+ string str = data.variableValue; // [check] should this set currentValue instead?
DataManager::SetValue(mVariable, str);
+ if (data.action)
+ data.action->doActions();
}
mUpdate = 1;
}
diff --git a/gui/objects.hpp b/gui/objects.hpp
index be1f973..f8569d6 100644
--- a/gui/objects.hpp
+++ b/gui/objects.hpp
@@ -634,6 +634,7 @@
std::string displayName;
std::string variableValue;
unsigned int selected;
+ GUIAction* action;
};
protected: