diff options
author | Ole Loots <ole@monochrom.net> | 2013-11-23 17:18:09 +0100 |
---|---|---|
committer | Ole Loots <ole@monochrom.net> | 2013-11-23 17:18:09 +0100 |
commit | 65ebba7b5152af154f0b8806a5ae4cf2fb68d2f8 (patch) | |
tree | 0c1b0501abaac5929c6e29ec3e7c9b9d14ffbba3 /atari | |
parent | 1ebe82139e376464c15a8f52b1b841339245e638 (diff) | |
download | netsurf-65ebba7b5152af154f0b8806a5ae4cf2fb68d2f8.tar.gz netsurf-65ebba7b5152af154f0b8806a5ae4cf2fb68d2f8.tar.bz2 |
Generate language popup from language file
Diffstat (limited to 'atari')
-rw-r--r-- | atari/gemtk/gemtk.h | 2 | ||||
-rw-r--r-- | atari/gemtk/objc.c | 15 | ||||
-rw-r--r-- | atari/settings.c | 112 |
3 files changed, 79 insertions, 50 deletions
diff --git a/atari/gemtk/gemtk.h b/atari/gemtk/gemtk.h index d5b553a1e..ba463a3c3 100644 --- a/atari/gemtk/gemtk.h +++ b/atari/gemtk/gemtk.h @@ -281,6 +281,6 @@ void gemtk_obj_mouse_sprite(OBJECT *tree, int index); OBJECT *gemtk_obj_tree_copy(OBJECT *tree); OBJECT * gemtk_obj_create_popup_tree(const char **items, int nitems, char * selected, bool horizontal, - int max_width); + int max_width, int max_height); void gemtk_obj_destroy_popup_tree(OBJECT * popup); #endif // GEMTK_H_INCLUDED diff --git a/atari/gemtk/objc.c b/atari/gemtk/objc.c index 3c13f553c..20838478f 100644 --- a/atari/gemtk/objc.c +++ b/atari/gemtk/objc.c @@ -372,7 +372,7 @@ OBJECT *gemtk_obj_tree_copy(OBJECT *tree) OBJECT * gemtk_obj_create_popup_tree(const char **items, int nitems, char * selected, bool horizontal, - int max_width) + int max_width, int max_height) { OBJECT * popup = NULL; int box_width = 0; @@ -394,14 +394,16 @@ OBJECT * gemtk_obj_create_popup_tree(const char **items, int nitems, int len = strlen(items[i]); if (horizontal && (max_width<1)) { - box_width += len * char_width; + box_width += (len * char_width)+4; } else if (!horizontal){ /* Detect max width, used for vertical rendering: */ if(len*char_width > box_width){ box_width = (len+2) * char_width; } - box_height += item_height; + //if (max_height < 1) { + box_height += item_height; + //} } } @@ -412,6 +414,10 @@ OBJECT * gemtk_obj_create_popup_tree(const char **items, int nitems, if (horizontal) { box_height = item_height; } + else if(max_height > 0){ + // TODO: validate max_height, shrink values larger than screen height + //box_height = max_height; + } /* printf("popup height: %d, popup width: %d\n", box_height, box_width); @@ -453,8 +459,7 @@ OBJECT * gemtk_obj_create_popup_tree(const char **items, int nitems, flags |= OF_LASTOB; } - item_width = (horizontal) ? ((int)strlen(items[i])*char_width) : box_width; - + item_width = (horizontal) ? ((int)strlen(items[i])*char_width)+2 : box_width; /* printf("addin popup item \"%s\" (w: %d, h: %d, flags: %x) at %d/%d\n", items[i], item_width, item_height, flags, diff --git a/atari/settings.c b/atari/settings.c index d0601cae8..94445c108 100644 --- a/atari/settings.c +++ b/atari/settings.c @@ -35,6 +35,8 @@ static unsigned int tmp_option_max_fetchers_per_host; static unsigned int tmp_option_max_cached_fetch_handles; static colour tmp_option_atari_toolbar_bg; +static int num_locales = 0; +static char **locales = NULL; static short h_aes_win = 0; static short edit_obj = -1; static short any_obj = -1; @@ -126,6 +128,50 @@ static void toggle_objects(void) FORMEVENT(SETTINGS_BT_SEL_FONT_RENDERER); } +static char **read_locales() +{ + char buf[PATH_MAX]; + char tmp_locale[16]; + char **locales = NULL; + + FILE * fp_locales = NULL; + + atari_find_resource(buf, "languages", "./res/languages"); + + fp_locales = fopen(buf, "r"); + + if (fp_locales == NULL) { + warn_user("Failed to load locales: %s",buf); + return(NULL); + } else { + LOG(("Reading locales from: %s...", buf)); + } + + /* Count items: */ + num_locales = 0; + while (fgets(tmp_locale, 16, fp_locales) != NULL) { + num_locales++; + } + + locales = malloc(sizeof(char*)*num_locales); + + rewind(fp_locales); + int i = 0; + while (fgets(tmp_locale, 16, fp_locales) != NULL) { + int len = strlen(tmp_locale); + tmp_locale[len-1] = 0; + len--; + locales[i] = malloc(len+1); + // do not copy the last \n + snprintf(locales[i], 16, "%s", tmp_locale); + i++; + } + + fclose(fp_locales); + + return(locales); +} + static void save_settings(void) { @@ -276,11 +322,6 @@ static void form_event(int index, int external) char * tmp; MENU pop_menu, me_data; - /* - Just a small collection of locales, each country has at least one - ATARI-clone user! :) - */ - int num_locales = 15; short x, y; int choice, i; @@ -333,36 +374,19 @@ static void form_event(int index, int external) case SETTINGS_BT_SEL_FONT_RENDERER: if( external ) { objc_offset(dlgtree, SETTINGS_BT_SEL_FONT_RENDERER, &x, &y); + tmp = gemtk_obj_get_text(dlgtree, SETTINGS_BT_SEL_FONT_RENDERER); // point mn_tree tree to font renderer popup: pop_menu.mn_tree = gemtk_obj_create_popup_tree(font_engines, - NOF_ELEMENTS(font_engines), NULL, false,-1); + NOF_ELEMENTS(font_engines), tmp, false, + -1, -1); assert(pop_menu.mn_tree != NULL); pop_menu.mn_menu = 0; - pop_menu.mn_item = 1; // POP_FONT_RENDERER_INTERNAL; + pop_menu.mn_item = 1; pop_menu.mn_scroll = SCROLL_NO; pop_menu.mn_keystate = 0; - - /* Get font renderer value currently displayed in the dialog: */ - tmp = gemtk_obj_get_text(dlgtree, SETTINGS_BT_SEL_FONT_RENDERER); - - // find the selected menu item and uncheck others: - for(i=pop_menu.mn_item; i<=(short)NOF_ELEMENTS(font_engines); i++) { - /* Get string of menu item: */ - get_string(pop_menu.mn_tree, i, spare); - - /* Compare menu item text with the text currently displayed in GUI: */ - if (strcasecmp(&spare[2], tmp)) { - menu_icheck(pop_menu.mn_tree, i, 0); - } else { - /* set menu item selected: */ - menu_icheck(pop_menu.mn_tree, i, 1); - } - set_string(pop_menu.mn_tree, i, spare); - } - /* Show the popup: */ menu_popup(&pop_menu, x, y, &me_data); choice = me_data.mn_item; @@ -389,33 +413,33 @@ static void form_event(int index, int external) case SETTINGS_BT_SEL_LOCALE: objc_offset(dlgtree, SETTINGS_BT_SEL_LOCALE, &x, &y); - // point mn_tree tree to states popup: - pop_menu.mn_tree = gemtk_obj_get_tree(POP_LANGUAGE); - pop_menu.mn_menu = 0; - pop_menu.mn_item = POP_LANGUAGE_CS; - pop_menu.mn_scroll = SCROLL_NO; - pop_menu.mn_keystate = 0; + if(num_locales < 1 || locales == NULL){ + locales = read_locales(); + } - // find the selected menu item and uncheck others: - for(i=pop_menu.mn_item; i<=num_locales; i++) { - get_string(pop_menu.mn_tree, i, spare); + if (num_locales < 1 || locales == NULL) { + // point mn_tree tree to states popup: + num_locales = 15; + pop_menu.mn_tree = gemtk_obj_get_tree(POP_LANGUAGE); + pop_menu.mn_item = POP_LANGUAGE_CS; + } else { + // point mn_tree tree to dynamic list: tmp = gemtk_obj_get_text(dlgtree, SETTINGS_BT_SEL_LOCALE); - if (strcasecmp(&spare[2], tmp)) { - menu_icheck(pop_menu.mn_tree, i, 0); - } else { - menu_icheck(pop_menu.mn_tree, i, 1); - } - set_string(pop_menu.mn_tree, i, spare); + pop_menu.mn_tree = gemtk_obj_create_popup_tree((const char**)locales, + num_locales, tmp, false, + -1, 100); + + pop_menu.mn_item = 0; } + pop_menu.mn_menu = 0; + pop_menu.mn_scroll = SCROLL_YES; + pop_menu.mn_keystate = 0; menu_popup(&pop_menu, x, y, &me_data); choice = me_data.mn_item; if( choice > 0 && choice <= num_locales ) { get_string(pop_menu.mn_tree, choice, spare); - for(i=2; i<(int)strlen(spare); i++) { - spare[i]= (char)tolower(spare[i]); - } set_text(SETTINGS_BT_SEL_LOCALE, (char*)&spare[2], 5); } |