Mercurial > dwindows
comparison gtk4/dw.c @ 2288:d0bb8f99ac45
GTK4: Implement menu separators.
author | bsmith@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Thu, 04 Feb 2021 05:41:41 +0000 |
parents | 680212c356e3 |
children | 26a76f94f8d8 |
comparison
equal
deleted
inserted
replaced
2287:680212c356e3 | 2288:d0bb8f99ac45 |
---|---|
2175 * resource file. | 2175 * resource file. |
2176 */ | 2176 */ |
2177 HMENUI dw_menu_new(unsigned long id) | 2177 HMENUI dw_menu_new(unsigned long id) |
2178 { | 2178 { |
2179 GMenu *menu = g_menu_new(); | 2179 GMenu *menu = g_menu_new(); |
2180 /* Create the initial section and add it to the menu */ | |
2181 GMenu *section = g_menu_new(); | |
2182 GMenuItem *item = g_menu_item_new_section(NULL, G_MENU_MODEL(section)); | |
2183 g_menu_append_item(menu, item); | |
2180 HMENUI tmp = gtk_popover_menu_new_from_model_full(G_MENU_MODEL(menu), GTK_POPOVER_MENU_NESTED); | 2184 HMENUI tmp = gtk_popover_menu_new_from_model_full(G_MENU_MODEL(menu), GTK_POPOVER_MENU_NESTED); |
2181 | 2185 |
2182 g_object_set_data(G_OBJECT(tmp), "_dw_id", GINT_TO_POINTER(id)); | 2186 g_object_set_data(G_OBJECT(tmp), "_dw_id", GINT_TO_POINTER(id)); |
2187 g_object_set_data(G_OBJECT(tmp), "_dw_section", (gpointer)section); | |
2183 return tmp; | 2188 return tmp; |
2184 } | 2189 } |
2185 | 2190 |
2186 /* | 2191 /* |
2187 * Create a menubar on a window. | 2192 * Create a menubar on a window. |
2196 GtkWidget *box; | 2201 GtkWidget *box; |
2197 | 2202 |
2198 if(GTK_IS_WINDOW(location) && | 2203 if(GTK_IS_WINDOW(location) && |
2199 (box = GTK_WIDGET(g_object_get_data(G_OBJECT(location), "_dw_grid")))) | 2204 (box = GTK_WIDGET(g_object_get_data(G_OBJECT(location), "_dw_grid")))) |
2200 { | 2205 { |
2201 GMenu *menu = g_menu_new(); | |
2202 /* If there is an existing menu bar, remove it */ | 2206 /* If there is an existing menu bar, remove it */ |
2203 GtkWidget *oldmenu = GTK_WIDGET(g_object_get_data(G_OBJECT(location), "_dw_menubar")); | 2207 GtkWidget *oldmenu = GTK_WIDGET(g_object_get_data(G_OBJECT(location), "_dw_menubar")); |
2208 GMenu *menu = g_menu_new(); | |
2209 /* Create the initial section and add it to the menu */ | |
2210 GMenu *section = g_menu_new(); | |
2211 GMenuItem *item = g_menu_item_new_section(NULL, G_MENU_MODEL(section)); | |
2212 g_menu_append_item(menu, item); | |
2204 | 2213 |
2205 if(oldmenu && GTK_IS_WIDGET(oldmenu)) | 2214 if(oldmenu && GTK_IS_WIDGET(oldmenu)) |
2206 gtk_grid_remove(GTK_GRID(box), tmp); | 2215 gtk_grid_remove(GTK_GRID(box), tmp); |
2207 | 2216 |
2208 /* Create a new menu bar */ | 2217 /* Create a new menu bar */ |
2209 tmp = gtk_popover_menu_bar_new_from_model(G_MENU_MODEL(menu)); | 2218 tmp = gtk_popover_menu_bar_new_from_model(G_MENU_MODEL(menu)); |
2210 gtk_widget_show(tmp); | 2219 gtk_widget_show(tmp); |
2211 /* Save pointers to each other */ | 2220 /* Save pointers to each other */ |
2212 g_object_set_data(G_OBJECT(location), "_dw_menubar", (gpointer)tmp); | 2221 g_object_set_data(G_OBJECT(location), "_dw_menubar", (gpointer)tmp); |
2213 g_object_set_data(G_OBJECT(tmp), "_dw_window", (gpointer)location); | 2222 g_object_set_data(G_OBJECT(tmp), "_dw_window", (gpointer)location); |
2223 g_object_set_data(G_OBJECT(tmp), "_dw_section", (gpointer)section); | |
2214 gtk_grid_attach(GTK_GRID(box), tmp, 0, 0, 1, 1); | 2224 gtk_grid_attach(GTK_GRID(box), tmp, 0, 0, 1, 1); |
2215 } | 2225 } |
2216 return tmp; | 2226 return tmp; |
2217 } | 2227 } |
2218 | 2228 |
2285 int submenucount; | 2295 int submenucount; |
2286 | 2296 |
2287 if(!menu) | 2297 if(!menu) |
2288 return 0; | 2298 return 0; |
2289 | 2299 |
2290 if(GTK_IS_POPOVER_MENU_BAR(menu)) | 2300 /* By default we add to the menu's current section */ |
2291 menumodel = gtk_popover_menu_bar_get_menu_model(GTK_POPOVER_MENU_BAR(menu)); | 2301 menumodel = g_object_get_data(G_OBJECT(menu), "_dw_section"); |
2292 else | |
2293 menumodel = gtk_popover_menu_get_menu_model(GTK_POPOVER_MENU(menu)); | |
2294 _dw_removetilde(temptitle, title); | 2302 _dw_removetilde(temptitle, title); |
2295 submenucount = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menu), "_dw_submenucount")); | 2303 submenucount = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menu), "_dw_submenucount")); |
2296 | 2304 |
2305 /* To add a separator we create a new section and add it */ | |
2297 if (strlen(temptitle) == 0) | 2306 if (strlen(temptitle) == 0) |
2298 tmphandle = g_menu_item_new_section(NULL, NULL); | 2307 { |
2308 GMenu *section = g_menu_new(); | |
2309 | |
2310 /* If we are creating a new section, add it to the core menu... not the section */ | |
2311 if(GTK_IS_POPOVER_MENU_BAR(menu)) | |
2312 menumodel = gtk_popover_menu_bar_get_menu_model(GTK_POPOVER_MENU_BAR(menu)); | |
2313 else | |
2314 menumodel = gtk_popover_menu_get_menu_model(GTK_POPOVER_MENU(menu)); | |
2315 | |
2316 tmphandle = g_menu_item_new_section(NULL, G_MENU_MODEL(section)); | |
2317 g_object_set_data(G_OBJECT(menu), "_dw_section", (gpointer)section); | |
2318 } | |
2299 else | 2319 else |
2300 { | 2320 { |
2301 char tempbuf[101] = {0}; | 2321 char tempbuf[101] = {0}; |
2302 | 2322 |
2303 if(submenu) | 2323 if(submenu) |
2323 action = g_simple_action_new(tempbuf, NULL); | 2343 action = g_simple_action_new(tempbuf, NULL); |
2324 g_object_ref(G_OBJECT(action)); | 2344 g_object_ref(G_OBJECT(action)); |
2325 tmphandle=g_menu_item_new(temptitle, tempbuf); | 2345 tmphandle=g_menu_item_new(temptitle, tempbuf); |
2326 snprintf(numbuf, 24, "%lu", id); | 2346 snprintf(numbuf, 24, "%lu", id); |
2327 g_object_set_data(G_OBJECT(menu), numbuf, (gpointer)tmphandle); | 2347 g_object_set_data(G_OBJECT(menu), numbuf, (gpointer)tmphandle); |
2328 g_object_set_data(G_OBJECT(menu), "_dw_action", (gpointer)action); | 2348 g_object_set_data(G_OBJECT(tmphandle), "_dw_action", (gpointer)action); |
2329 } | 2349 } |
2330 } | 2350 } |
2331 | 2351 |
2332 if(end) | 2352 if(end) |
2333 g_menu_append_item(G_MENU(menumodel), tmphandle); | 2353 g_menu_append_item(G_MENU(menumodel), tmphandle); |