88 |
} |
} |
89 |
|
|
90 |
char *josm_icon_name_adjust(char *name) { |
char *josm_icon_name_adjust(char *name) { |
91 |
|
if(!name) return NULL; |
92 |
|
|
93 |
/* the icon loader uses names without extension */ |
/* the icon loader uses names without extension */ |
94 |
if(!strcasecmp(name+strlen(name)-4, ".png")) |
if(!strcasecmp(name+strlen(name)-4, ".png")) |
95 |
name[strlen(name)-4] = 0; |
name[strlen(name)-4] = 0; |
108 |
return name; |
return name; |
109 |
} |
} |
110 |
|
|
111 |
|
static int josm_type_bit(char *type) { |
112 |
|
struct { int bit; char *str; } types[] = { |
113 |
|
{ PRESETS_TYPE_WAY, "way" }, |
114 |
|
{ PRESETS_TYPE_NODE, "node" }, |
115 |
|
{ PRESETS_TYPE_RELATION, "relation" }, |
116 |
|
{ PRESETS_TYPE_CLOSEDWAY, "closedway" }, |
117 |
|
{ 0, NULL }}; |
118 |
|
|
119 |
|
int i; |
120 |
|
for(i=0;types[i].bit;i++) { |
121 |
|
if(strcasecmp(types[i].str, type) == 0) |
122 |
|
return types[i].bit; |
123 |
|
} |
124 |
|
|
125 |
|
printf("WARNING: unexpected type %s\n", type); |
126 |
|
return 0; |
127 |
|
} |
128 |
|
|
129 |
|
/* parse a comma seperated list of types and set their bits */ |
130 |
|
static int josm_type_parse(char *type) { |
131 |
|
int type_mask = 0; |
132 |
|
|
133 |
|
if(!type) return PRESETS_TYPE_ALL; |
134 |
|
|
135 |
|
while(strchr(type, ',')) { |
136 |
|
*strchr(type, ',') = 0; |
137 |
|
|
138 |
|
type_mask |= josm_type_bit(type); |
139 |
|
type = type + strlen(type) + 1; |
140 |
|
} |
141 |
|
|
142 |
|
type_mask |= josm_type_bit(type); |
143 |
|
return type_mask; |
144 |
|
} |
145 |
|
|
146 |
/* parse children of a given node for into *widget */ |
/* parse children of a given node for into *widget */ |
147 |
static presets_widget_t **parse_widgets(xmlNode *a_node, |
static presets_widget_t **parse_widgets(xmlNode *a_node, |
148 |
presets_item_t *item, |
presets_item_t *item, |
262 |
/* ------ parse items own properties ------ */ |
/* ------ parse items own properties ------ */ |
263 |
item->name = (char*)xmlGetProp(a_node, BAD_CAST "name"); |
item->name = (char*)xmlGetProp(a_node, BAD_CAST "name"); |
264 |
|
|
265 |
if((item->icon = (char*)xmlGetProp(a_node, BAD_CAST "icon"))) |
item->icon = |
266 |
item->icon = josm_icon_name_adjust(item->icon); |
josm_icon_name_adjust((char*)xmlGetProp(a_node, BAD_CAST "icon")); |
267 |
|
|
268 |
|
item->type = |
269 |
|
josm_type_parse((char*)xmlGetProp(a_node, BAD_CAST "type")); |
270 |
|
|
271 |
presets_widget_t **widget = &item->widget; |
presets_widget_t **widget = &item->widget; |
272 |
parse_widgets(a_node, item, widget); |
parse_widgets(a_node, item, widget); |
282 |
/* ------ parse groups own properties ------ */ |
/* ------ parse groups own properties ------ */ |
283 |
group->name = (char*)xmlGetProp(a_node, BAD_CAST "name"); |
group->name = (char*)xmlGetProp(a_node, BAD_CAST "name"); |
284 |
|
|
285 |
if((group->icon = (char*)xmlGetProp(a_node, BAD_CAST "icon"))) |
group->icon = |
286 |
group->icon = josm_icon_name_adjust(group->icon); |
josm_icon_name_adjust((char*)xmlGetProp(a_node, BAD_CAST "icon")); |
287 |
|
|
288 |
|
/* TODO: sum up bits from all subentries so the main entry vanishes */ |
289 |
|
/* if none of the subentries matches (empty subs are not displayed) */ |
290 |
|
group->type = PRESETS_TYPE_ALL; |
291 |
|
|
292 |
presets_item_t **preset = &group->group; |
presets_item_t **preset = &group->group; |
293 |
|
|
745 |
while(item) { |
while(item) { |
746 |
GtkWidget *menu_item; |
GtkWidget *menu_item; |
747 |
|
|
748 |
if(item->name) { |
/* check if this presets entry is appropriate for the current item */ |
749 |
if(!item->icon) |
if(item->type & context->tag_context->presets_type) { |
|
menu_item = gtk_menu_item_new_with_label(item->name); |
|
|
else { |
|
|
menu_item = gtk_image_menu_item_new_with_label(item->name); |
|
|
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), |
|
|
icon_widget_load(&context->appdata->icon, item->icon)); |
|
|
} |
|
750 |
|
|
751 |
if(item->is_group) |
if(item->name) { |
752 |
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), |
if(!item->icon) |
753 |
build_menu(context, item->group)); |
menu_item = gtk_menu_item_new_with_label(item->name); |
754 |
else { |
else { |
755 |
g_object_set_data(G_OBJECT(menu_item), "item", item); |
menu_item = gtk_image_menu_item_new_with_label(item->name); |
756 |
g_signal_connect(menu_item, "activate", |
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), |
757 |
GTK_SIGNAL_FUNC(cb_menu_item), context); |
icon_widget_load(&context->appdata->icon, item->icon)); |
758 |
} |
} |
759 |
} else |
|
760 |
menu_item = gtk_separator_menu_item_new(); |
if(item->is_group) |
761 |
|
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), |
762 |
|
build_menu(context, item->group)); |
763 |
|
else { |
764 |
|
g_object_set_data(G_OBJECT(menu_item), "item", item); |
765 |
|
g_signal_connect(menu_item, "activate", |
766 |
|
GTK_SIGNAL_FUNC(cb_menu_item), context); |
767 |
|
} |
768 |
|
} else |
769 |
|
menu_item = gtk_separator_menu_item_new(); |
770 |
|
|
771 |
|
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); |
772 |
|
} |
773 |
|
|
|
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); |
|
774 |
item = item->next; |
item = item->next; |
775 |
} |
} |
776 |
|
|
804 |
return FALSE; |
return FALSE; |
805 |
} |
} |
806 |
|
|
807 |
GtkWidget *josm_presets_select(appdata_t *appdata, tag_context_t *tag_context) { |
GtkWidget *josm_presets_select(appdata_t *appdata, |
808 |
|
tag_context_t *tag_context) { |
809 |
presets_context_t *context = g_new0(presets_context_t, 1); |
presets_context_t *context = g_new0(presets_context_t, 1); |
810 |
context->appdata = appdata; |
context->appdata = appdata; |
811 |
context->tag_context = tag_context; |
context->tag_context = tag_context; |