1 #ifndef RADIAL_MENU_MODEL_ITEM_HPP 2 #define RADIAL_MENU_MODEL_ITEM_HPP 17 typedef std::shared_ptr< Item >
ItemPtr;
24 class Item :
public std::enable_shared_from_this< Item > {
40 std::string
path(
const char separator =
'.')
const {
41 const ItemConstPtr p(
parent());
42 return p ? (p->path() + separator +
name_) :
name_;
53 ItemConstPtr
root()
const {
54 const ItemConstPtr p(
parent());
55 return p ? p->root() : shared_from_this();
63 const ItemConstPtr p(
parent());
70 const ItemConstPtr p(
parent());
71 return p ? p->children_.size() : 1;
75 const ItemConstPtr p(
parent());
76 return p ? p->children_ : std::vector< ItemConstPtr >(1, shared_from_this());
80 const ItemConstPtr p(
parent());
81 if (p && sid >= 0 && sid < p->
children_.size()) {
82 return p->children_[sid];
83 }
else if (!p && sid == 0) {
84 return shared_from_this();
91 const ItemConstPtr p(
parent());
93 for (
const ItemConstPtr &
s : p->children_) {
99 return shared_from_this();
103 const ItemConstPtr p(
parent());
104 return p ? p->depth() + 1 : 0;
113 ItemConstPtr
child(
const int cid)
const {
118 for (
const ItemConstPtr &c :
children_) {
130 static bool appendItems(
const XmlElement &elm, std::vector< ItemConstPtr > *
const items,
131 const ItemPtr &parent_item =
ItemPtr(),
const int default_row = 0) {
133 if (elm.
name() !=
"item") {
140 const ItemPtr item(
new Item());
141 item->item_id_ = items->size();
142 items->push_back(item);
146 const int row(elm.
attribute(
"row", default_row));
147 if (row < 0 || row >= parent_item->children_.size()) {
148 ROS_ERROR_STREAM(
"Item::itemsFromDescription(): '" << row <<
"' is out of row range");
151 if (parent_item->children_[row]) {
152 ROS_ERROR_STREAM(
"Item::itemsFromDescription(): Multiple items in the row '" << row
156 parent_item->children_[row] = item;
157 item->parent_ = parent_item;
162 ROS_ERROR(
"Item::itemsFromDescription(): No attribute 'name'");
167 const std::string display(elm.
attribute< std::string >(
"display",
"name"));
168 if (display ==
"name") {
170 }
else if (display ==
"alttxt") {
173 ROS_ERROR(
"Item::itemsFromDescription(): No attribute 'alttxt'");
176 }
else if (display ==
"image") {
179 ROS_ERROR(
"Item::itemsFromDescription(): No attribute 'imgurl'");
183 ROS_ERROR_STREAM(
"Item::itemsFromDescription(): Unknown display type '" << display
191 ROS_ERROR_STREAM(
"Item::itemsFromDescription(): Invalid row size '" << rows <<
"'");
194 item->children_.resize(rows);
197 const std::vector< XmlElementConstPtr > child_elms(elm.
childElements());
198 for (std::size_t i = 0; i < child_elms.size(); ++i) {
199 if (!appendItems(*child_elms[i], items, item, i)) {
211 return std::vector< ItemConstPtr >();
215 std::vector< ItemConstPtr > items;
216 if (!Internal::appendItems(*elm, &items)) {
217 return std::vector< ItemConstPtr >();
#define ROS_ERROR_STREAM(args)