void style_change(appdata_t *appdata, const char *name) { char *new_style = NULL, *fname = NULL; file_chain_t *chain = file_scan(".style"); while(chain) { file_chain_t *next = chain->next; style_t *style = style_parse(appdata, chain->name, NULL, TRUE); if(new_style == NULL && strcmp(style->name, name) == 0) { new_style = style_basename(chain->name); fname = chain->name; chain->name = NULL; } style_free(style); g_free(chain->name); g_free(chain); chain = next; } /* check if style has really been changed */ if(appdata->settings->style && !strcmp(appdata->settings->style, new_style)) { g_free(new_style); g_free(fname); return; } style_t *nstyle = style_load_fname(appdata, fname); if (nstyle == NULL) { errorf(GTK_WIDGET(appdata->window), _("Error loading style %s"), fname); g_free(new_style); g_free(fname); return; } g_free(fname); g_free(appdata->settings->style); appdata->settings->style = new_style; map_clear(appdata, MAP_LAYER_OBJECTS_ONLY); /* let gtk clean up first */ while(gtk_events_pending()) { putchar('.'); gtk_main_iteration(); } style_free(appdata->map->style); appdata->map->style = nstyle; /* canvas background may have changed */ canvas_set_background(appdata->map->canvas, appdata->map->style->background.color); map_paint(appdata); }
GtkWidget *style_select_widget(appdata_t *appdata) { file_chain_t *chain = file_scan(".style"); /* there must be at least one style, otherwise */ /* the program wouldn't be running */ g_assert(chain); GtkWidget *cbox = combo_box_new(_("Style")); /* fill combo box with presets */ int cnt = 0, match = -1; while(chain) { file_chain_t *next = chain->next; printf(" file: %s\n", chain->name); style_t *style = style_parse(appdata, chain->name, NULL, TRUE); printf(" name: %s\n", style->name); combo_box_append_text(cbox, style->name); char *basename = style_basename(chain->name); if(strcmp(basename, appdata->settings->style) == 0) match = cnt; g_free(basename); style_free(style); cnt++; g_free(chain->name); g_free(chain); chain = next; } if(match >= 0) combo_box_set_active(cbox, match); return cbox; }
inline void operator()(const std::pair<std::string, std::string> &pair) { gtk_list_store_insert_with_values(store, nullptr, -1, 0, pair.first.c_str(), 1, pair.second.c_str(), -1); if(match < 0 && style_basename(pair.second) == currentstyle) match = cnt; cnt++; }