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);