From 33b8644ec2c13d697b323c0e8cbcbc1962e2fb64 Mon Sep 17 00:00:00 2001 From: Chris Young Date: Thu, 15 Aug 2013 20:10:55 +0100 Subject: Another attempt at creating image menus --- amiga/gui.h | 1 + amiga/menu.c | 35 +++++++++++++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/amiga/gui.h b/amiga/gui.h index 36b7d4d84..3e0f2ab0e 100755 --- a/amiga/gui.h +++ b/amiga/gui.h @@ -158,6 +158,7 @@ BOOL ami_gadget_hit(Object *obj, int x, int y); void ami_gui_history(struct gui_window_2 *gwin, bool back); void ami_gui_hotlist_toolbar_update_all(void); void ami_gui_tabs_toggle_all(void); +bool ami_locate_resource(char *fullpath, const char *file); struct TextFont *origrpfont; struct MinList *window_list; diff --git a/amiga/menu.c b/amiga/menu.c index bfd010d58..fa1c38892 100644 --- a/amiga/menu.c +++ b/amiga/menu.c @@ -143,7 +143,7 @@ void ami_free_menulabs(struct gui_window_2 *gwin) } static void ami_menu_alloc_item(struct gui_window_2 *gwin, int num, UBYTE type, - const char *label, char key, struct bitmap *bm, void *func, void *hookdata) + const char *label, char key, char *icon, void *func, void *hookdata) { gwin->menutype[num] = type; @@ -159,6 +159,31 @@ static void ami_menu_alloc_item(struct gui_window_2 *gwin, int num, UBYTE type, } } + if((GadToolsBase->lib_Version > 53) || + ((GadToolsBase->lib_Version == 53) && (GadToolsBase->lib_Revision >= 6))) { + /* GadTools 53.6+ only. For now we will only create the menu + using label.image if there's a bitmap associated with the item. */ + if((icon != NULL) && (gwin->menulab[num] != NM_BARLABEL)) { + char menu_icon[100]; + struct DrawInfo *dri = GetScreenDrawInfo(scrn); + if(ami_locate_resource(&menu_icon, icon) == true) { + gwin->menuobj[num] = LabelObject, + LABEL_DrawInfo, dri, + LABEL_DisposeImage, TRUE, + LABEL_Image, BitMapObject, + BITMAP_Screen, scrn, + BITMAP_SourceFile, menu_icon, + BITMAP_Masking, TRUE, + BitMapEnd, + LABEL_Text, gwin->menulab[num], + LabelEnd; + + if(gwin->menuobj[num]) gwin->menutype[num] |= MENU_IMAGE; + } + FreeScreenDrawInfo(scrn, dri); + } + } + if(key) gwin->menukey[num] = key; if(func) gwin->menu_hook[num].h_Entry = (HOOKFUNC)func; if(hookdata) gwin->menu_hook[num].h_Data = hookdata; @@ -432,6 +457,7 @@ void ami_menu_scan_2(struct tree *tree, struct node *root, WORD *gen, struct node_element *element=NULL; struct node *node; UBYTE menu_type; + char *icon; *gen = *gen + 1; @@ -444,8 +470,13 @@ void ami_menu_scan_2(struct tree *tree, struct node *root, WORD *gen, if(*gen == 1) menu_type = NM_ITEM; if(*gen == 2) menu_type = NM_SUB; + if(tree_node_is_folder(node) == true) + icon = "icons/directory.png"; + else + icon = "icons/content.png"; + ami_menu_alloc_item(gwin, *item, menu_type, tree_url_node_get_title(node), - 0, tree_url_node_get_icon(node), + 0, icon, ami_menu_item_hotlist_entries, (void *)tree_url_node_get_url(node)); if(tree_node_is_folder(node) && (!tree_node_get_child(node))) gwin->menu[*item].nm_Flags = NM_ITEMDISABLED; -- cgit v1.2.3 From acdf478d3f0a7957c1b6a7c30df71e402a9b5fbb Mon Sep 17 00:00:00 2001 From: Chris Young Date: Fri, 16 Aug 2013 00:07:20 +0100 Subject: Sub-menu arrows --- amiga/menu.c | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/amiga/menu.c b/amiga/menu.c index fa1c38892..b04540d34 100644 --- a/amiga/menu.c +++ b/amiga/menu.c @@ -68,6 +68,8 @@ BOOL menualreadyinit; const char * const netsurf_version; const char * const verdate; +#define SUB_MENU_ARROW '\n' + ULONG ami_menu_scan(struct tree *tree, struct gui_window_2 *gwin); void ami_menu_scan_2(struct tree *tree, struct node *root, WORD *gen, int *item, struct gui_window_2 *gwin); @@ -145,8 +147,14 @@ void ami_free_menulabs(struct gui_window_2 *gwin) static void ami_menu_alloc_item(struct gui_window_2 *gwin, int num, UBYTE type, const char *label, char key, char *icon, void *func, void *hookdata) { + bool has_submenu = false; gwin->menutype[num] = type; + if(key == SUB_MENU_ARROW) { + has_submenu = true; + key = '\0'; + } + if((label == NM_BARLABEL) || (strcmp(label, "--") == 0)) { gwin->menulab[num] = NM_BARLABEL; } else { @@ -165,8 +173,16 @@ static void ami_menu_alloc_item(struct gui_window_2 *gwin, int num, UBYTE type, using label.image if there's a bitmap associated with the item. */ if((icon != NULL) && (gwin->menulab[num] != NM_BARLABEL)) { char menu_icon[100]; + Object *submenuarrow = NULL; struct DrawInfo *dri = GetScreenDrawInfo(scrn); - if(ami_locate_resource(&menu_icon, icon) == true) { + if(ami_locate_resource(menu_icon, icon) == true) { + if(has_submenu == true) { + submenuarrow = NewObject(NULL, "sysiclass", + SYSIA_Which, MENUSUB, + SYSIA_DrawInfo, dri, + TAG_DONE); + } + gwin->menuobj[num] = LabelObject, LABEL_DrawInfo, dri, LABEL_DisposeImage, TRUE, @@ -176,6 +192,8 @@ static void ami_menu_alloc_item(struct gui_window_2 *gwin, int num, UBYTE type, BITMAP_Masking, TRUE, BitMapEnd, LABEL_Text, gwin->menulab[num], + LABEL_DisposeImage, TRUE, + LABEL_Image, submenuarrow, LabelEnd; if(gwin->menuobj[num]) gwin->menutype[num] |= MENU_IMAGE; @@ -458,6 +476,7 @@ void ami_menu_scan_2(struct tree *tree, struct node *root, WORD *gen, struct node *node; UBYTE menu_type; char *icon; + char key; *gen = *gen + 1; @@ -470,14 +489,16 @@ void ami_menu_scan_2(struct tree *tree, struct node *root, WORD *gen, if(*gen == 1) menu_type = NM_ITEM; if(*gen == 2) menu_type = NM_SUB; - if(tree_node_is_folder(node) == true) + if(tree_node_is_folder(node) == true) { icon = "icons/directory.png"; - else + key = SUB_MENU_ARROW; + } else { icon = "icons/content.png"; - + key = '\0'; + } + ami_menu_alloc_item(gwin, *item, menu_type, tree_url_node_get_title(node), - 0, icon, - ami_menu_item_hotlist_entries, (void *)tree_url_node_get_url(node)); + key, icon, ami_menu_item_hotlist_entries, (void *)tree_url_node_get_url(node)); if(tree_node_is_folder(node) && (!tree_node_get_child(node))) gwin->menu[*item].nm_Flags = NM_ITEMDISABLED; -- cgit v1.2.3 From 4a70c212151e71ec4e240da4c116ee1d07ac794e Mon Sep 17 00:00:00 2001 From: Chris Young Date: Sun, 18 Aug 2013 15:15:12 +0100 Subject: Construct the menu in a new function, which also does basic layouting of any image menus. --- amiga/gui.h | 1 + amiga/menu.c | 140 +++++++++++++++++++++++++++++++++++++---------------------- 2 files changed, 90 insertions(+), 51 deletions(-) diff --git a/amiga/gui.h b/amiga/gui.h index 3e0f2ab0e..b1acf3df3 100755 --- a/amiga/gui.h +++ b/amiga/gui.h @@ -101,6 +101,7 @@ struct gui_window_2 { char *menulab[AMI_MENU_AREXX_MAX + 1]; Object *menuobj[AMI_MENU_AREXX_MAX + 1]; char menukey[AMI_MENU_AREXX_MAX + 1]; + char *menuicon[AMI_MENU_AREXX_MAX + 1]; struct Hook menu_hook[AMI_MENU_AREXX_MAX + 1]; UBYTE *menutype; struct NewMenu *menu; diff --git a/amiga/menu.c b/amiga/menu.c index b04540d34..75825057d 100644 --- a/amiga/menu.c +++ b/amiga/menu.c @@ -147,14 +147,10 @@ void ami_free_menulabs(struct gui_window_2 *gwin) static void ami_menu_alloc_item(struct gui_window_2 *gwin, int num, UBYTE type, const char *label, char key, char *icon, void *func, void *hookdata) { + char menu_icon[1024]; bool has_submenu = false; gwin->menutype[num] = type; - if(key == SUB_MENU_ARROW) { - has_submenu = true; - key = '\0'; - } - if((label == NM_BARLABEL) || (strcmp(label, "--") == 0)) { gwin->menulab[num] = NM_BARLABEL; } else { @@ -166,45 +162,16 @@ static void ami_menu_alloc_item(struct gui_window_2 *gwin, int num, UBYTE type, gwin->menulab[num] = ami_utf8_easy(messages_get(label)); } } - - if((GadToolsBase->lib_Version > 53) || - ((GadToolsBase->lib_Version == 53) && (GadToolsBase->lib_Revision >= 6))) { - /* GadTools 53.6+ only. For now we will only create the menu - using label.image if there's a bitmap associated with the item. */ - if((icon != NULL) && (gwin->menulab[num] != NM_BARLABEL)) { - char menu_icon[100]; - Object *submenuarrow = NULL; - struct DrawInfo *dri = GetScreenDrawInfo(scrn); - if(ami_locate_resource(menu_icon, icon) == true) { - if(has_submenu == true) { - submenuarrow = NewObject(NULL, "sysiclass", - SYSIA_Which, MENUSUB, - SYSIA_DrawInfo, dri, - TAG_DONE); - } - - gwin->menuobj[num] = LabelObject, - LABEL_DrawInfo, dri, - LABEL_DisposeImage, TRUE, - LABEL_Image, BitMapObject, - BITMAP_Screen, scrn, - BITMAP_SourceFile, menu_icon, - BITMAP_Masking, TRUE, - BitMapEnd, - LABEL_Text, gwin->menulab[num], - LABEL_DisposeImage, TRUE, - LABEL_Image, submenuarrow, - LabelEnd; - - if(gwin->menuobj[num]) gwin->menutype[num] |= MENU_IMAGE; - } - FreeScreenDrawInfo(scrn, dri); - } - } + gwin->menuicon[num] = NULL; if(key) gwin->menukey[num] = key; if(func) gwin->menu_hook[num].h_Entry = (HOOKFUNC)func; if(hookdata) gwin->menu_hook[num].h_Data = hookdata; + + if(icon) { + if(ami_locate_resource(menu_icon, icon) == true) + gwin->menuicon[num] = (char *)strdup(menu_icon); + } } void ami_init_menulabs(struct gui_window_2 *gwin) @@ -341,18 +308,71 @@ void ami_menu_refresh(struct gui_window_2 *gwin) TAG_DONE); } -struct NewMenu *ami_create_menu(struct gui_window_2 *gwin) +struct gui_window_2 *ami_menu_layout(struct gui_window_2 *gwin) { - int i; - - gwin->menu = AllocVec(sizeof(struct NewMenu) * (AMI_MENU_AREXX_MAX + 1), MEMF_CLEAR); - ami_init_menulabs(gwin); - ami_menu_scan(ami_tree_get_tree(hotlist_window), gwin); - ami_menu_arexx_scan(gwin); + int i, j; + int txtlen = 0; + struct RastPort *rp = &scrn->RastPort; + struct DrawInfo *dri = GetScreenDrawInfo(scrn); - for(i=0;i<=AMI_MENU_AREXX_MAX;i++) + for(i=0; i <= AMI_MENU_AREXX_MAX; i++) { + if(gwin->menutype[i] == NM_TITLE) { + j = i + 1; + txtlen = 0; + do { + if(gwin->menulab[j] != NM_BARLABEL) { + if(gwin->menutype[j] == NM_ITEM) { + if((TextLength(rp, gwin->menulab[j], strlen(gwin->menulab[j])) + + TextLength(rp, &gwin->menukey[j], 1)) > txtlen) { + txtlen = TextLength(rp, gwin->menulab[j], strlen(gwin->menulab[j])) + + TextLength(rp, &gwin->menukey[j], 1); + /**TODO: take account of the size of AMIGAKEY and other imagery too + */ + } + } + } + j++; + } while((gwin->menutype[j] != NM_TITLE) && (gwin->menutype[j] != 0)); + } + + if((GadToolsBase->lib_Version > 53) || + ((GadToolsBase->lib_Version == 53) && (GadToolsBase->lib_Revision >= 6))) { + /* GadTools 53.6+ only. For now we will only create the menu + using label.image if there's a bitmap associated with the item. */ + if((gwin->menuicon[i] != NULL) && (gwin->menulab[i] != NM_BARLABEL)) { + Object *submenuarrow = NULL; + + if((gwin->menutype[i] == NM_ITEM) && (gwin->menutype[i+1] == NM_SUB)) { + submenuarrow = NewObject(NULL, "sysiclass", + IA_Left, txtlen - TextLength(rp, gwin->menulab[i], strlen(gwin->menulab[i])), + SYSIA_Which, MENUSUB, + SYSIA_DrawInfo, dri, + TAG_DONE); + } + + /**TODO: Checkmark/MX images and keyboard shortcuts + */ + + gwin->menuobj[i] = LabelObject, + LABEL_DrawInfo, dri, + LABEL_DisposeImage, TRUE, + LABEL_Image, BitMapObject, + BITMAP_Screen, scrn, + BITMAP_SourceFile, gwin->menuicon[i], + BITMAP_Masking, TRUE, + BitMapEnd, + LABEL_Text, gwin->menulab[i], + LABEL_DisposeImage, TRUE, + LABEL_Image, submenuarrow, + LabelEnd; + + if(gwin->menuobj[i]) gwin->menutype[i] |= MENU_IMAGE; + } + } + gwin->menu[i].nm_Type = gwin->menutype[i]; + if(gwin->menuobj[i]) gwin->menu[i].nm_Label = (void *)gwin->menuobj[i]; else @@ -361,7 +381,27 @@ struct NewMenu *ami_create_menu(struct gui_window_2 *gwin) if(gwin->menukey[i]) gwin->menu[i].nm_CommKey = &gwin->menukey[i]; gwin->menu[i].nm_Flags = 0; if(gwin->menu_hook[i].h_Entry) gwin->menu[i].nm_UserData = &gwin->menu_hook[i]; + + if(gwin->menuicon[i]) { + free(gwin->menuicon[i]); + gwin->menuicon[i] = NULL; + } } + + FreeScreenDrawInfo(scrn, dri); + + return gwin; +} + +struct NewMenu *ami_create_menu(struct gui_window_2 *gwin) +{ + int i; + + gwin->menu = AllocVec(sizeof(struct NewMenu) * (AMI_MENU_AREXX_MAX + 1), MEMF_CLEAR); + ami_init_menulabs(gwin); + ami_menu_scan(ami_tree_get_tree(hotlist_window), gwin); + ami_menu_arexx_scan(gwin); + gwin = ami_menu_layout(gwin); #if defined(WITH_JS) || defined(WITH_MOZJS) gwin->menu[M_JS].nm_Flags = CHECKIT | MENUTOGGLE; @@ -491,14 +531,12 @@ void ami_menu_scan_2(struct tree *tree, struct node *root, WORD *gen, if(tree_node_is_folder(node) == true) { icon = "icons/directory.png"; - key = SUB_MENU_ARROW; } else { icon = "icons/content.png"; - key = '\0'; } ami_menu_alloc_item(gwin, *item, menu_type, tree_url_node_get_title(node), - key, icon, ami_menu_item_hotlist_entries, (void *)tree_url_node_get_url(node)); + 0, icon, ami_menu_item_hotlist_entries, (void *)tree_url_node_get_url(node)); if(tree_node_is_folder(node) && (!tree_node_get_child(node))) gwin->menu[*item].nm_Flags = NM_ITEMDISABLED; -- cgit v1.2.3 From 1238afdfc8c1773a97fbfd364cc5eeaa1a20ae4a Mon Sep 17 00:00:00 2001 From: Chris Young Date: Sun, 18 Aug 2013 15:20:39 +0100 Subject: Remove unused --- amiga/menu.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/amiga/menu.c b/amiga/menu.c index 75825057d..1ce3389d9 100644 --- a/amiga/menu.c +++ b/amiga/menu.c @@ -68,8 +68,6 @@ BOOL menualreadyinit; const char * const netsurf_version; const char * const verdate; -#define SUB_MENU_ARROW '\n' - ULONG ami_menu_scan(struct tree *tree, struct gui_window_2 *gwin); void ami_menu_scan_2(struct tree *tree, struct node *root, WORD *gen, int *item, struct gui_window_2 *gwin); @@ -148,7 +146,7 @@ static void ami_menu_alloc_item(struct gui_window_2 *gwin, int num, UBYTE type, const char *label, char key, char *icon, void *func, void *hookdata) { char menu_icon[1024]; - bool has_submenu = false; + gwin->menutype[num] = type; if((label == NM_BARLABEL) || (strcmp(label, "--") == 0)) { -- cgit v1.2.3