Diff of /trunk/src/josm_presets.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 51 by harbaum, Thu Feb 5 20:08:46 2009 UTC revision 52 by harbaum, Fri Feb 6 08:14:09 2009 UTC
# Line 88  static presets_value_t *xmlGetPropValues Line 88  static presets_value_t *xmlGetPropValues
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;
# Line 106  char *josm_icon_name_adjust(char *name) Line 108  char *josm_icon_name_adjust(char *name)
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,
# Line 225  static presets_item_t *parse_item(xmlDoc Line 262  static presets_item_t *parse_item(xmlDoc
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);
# Line 242  static presets_item_t *parse_group(xmlDo Line 282  static presets_item_t *parse_group(xmlDo
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    
# Line 701  static GtkWidget *build_menu(presets_con Line 745  static GtkWidget *build_menu(presets_con
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    
# Line 755  static gint on_button_destroy(GtkWidget Line 804  static gint on_button_destroy(GtkWidget
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;

Legend:
Removed from v.51  
changed lines
  Added in v.52