[v3 linux] menuItem.setBitmap support

This commit is contained in:
Travis McLane 2023-10-26 16:55:32 -05:00
commit afbc09f1e7
2 changed files with 89 additions and 13 deletions

View file

@ -375,16 +375,61 @@ func menuItemChecked(widget pointer) bool {
return false
}
func menuItemNew(label string) pointer {
cLabel := C.CString(label)
defer C.free(unsafe.Pointer(cLabel))
return pointer(C.gtk_menu_item_new_with_label(cLabel))
func menuItemNew(label string, bitmap []byte) pointer {
return menuItemAddProperties(C.gtk_menu_item_new(), label, bitmap)
}
func menuCheckItemNew(label string) pointer {
func menuItemAddProperties(menuItem *C.GtkWidget, label string, bitmap []byte) pointer {
/*
// FIXME: Support accelerator configuration
activate := C.CString("activate")
defer C.free(unsafe.Pointer(activate))
accelGroup := C.gtk_accel_group_new()
C.gtk_widget_add_accelerator(menuItem, activate, accelGroup,
C.GDK_KEY_m, C.GDK_CONTROL_MASK, C.GTK_ACCEL_VISIBLE)
*/
cLabel := C.CString(label)
defer C.free(unsafe.Pointer(cLabel))
return pointer(C.gtk_check_menu_item_new_with_label(cLabel))
lbl := unsafe.Pointer(C.gtk_accel_label_new(cLabel))
C.gtk_label_set_use_underline((*C.GtkLabel)(lbl), 1)
C.gtk_label_set_xalign((*C.GtkLabel)(lbl), 0.0)
C.gtk_accel_label_set_accel_widget(
(*C.GtkAccelLabel)(lbl),
(*C.GtkWidget)(unsafe.Pointer(menuItem)))
box := C.gtk_box_new(C.GTK_ORIENTATION_HORIZONTAL, 6)
if img, err := pngToImage(bitmap); err == nil {
gbytes := C.g_bytes_new_static(C.gconstpointer(unsafe.Pointer(&img.Pix[0])),
C.ulong(len(img.Pix)))
defer C.g_bytes_unref(gbytes)
pixBuf := C.gdk_pixbuf_new_from_bytes(
gbytes,
C.GDK_COLORSPACE_RGB,
1, // has_alpha
8,
C.int(img.Bounds().Dx()),
C.int(img.Bounds().Dy()),
C.int(img.Stride),
)
image := C.gtk_image_new_from_pixbuf(pixBuf)
C.gtk_widget_set_visible((*C.GtkWidget)(image), C.gboolean(1))
C.gtk_container_add(
(*C.GtkContainer)(unsafe.Pointer(box)),
(*C.GtkWidget)(unsafe.Pointer(image)))
}
C.gtk_box_pack_end(
(*C.GtkBox)(unsafe.Pointer(box)),
(*C.GtkWidget)(lbl), 1, 1, 0)
C.gtk_container_add(
(*C.GtkContainer)(unsafe.Pointer(menuItem)),
(*C.GtkWidget)(unsafe.Pointer(box)))
C.gtk_widget_show_all(menuItem)
return pointer(menuItem)
}
func menuCheckItemNew(label string, bitmap []byte) pointer {
return menuItemAddProperties(C.gtk_check_menu_item_new(), label, bitmap)
}
func menuItemSetChecked(widget pointer, checked bool) {
@ -415,11 +460,42 @@ func menuItemSetLabel(widget pointer, label string) {
C.free(unsafe.Pointer(value))
}
/*
GtkWidget *box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
GtkWidget *icon = gtk_image_new_from_icon_name ("folder-music-symbolic", GTK_ICON_SIZE_MENU);
GtkWidget *label = gtk_label_new ("Music");
GtkWidget *menu_item = gtk_menu_item_new ();
gtk_container_add (GTK_CONTAINER (box), icon);
gtk_container_add (GTK_CONTAINER (box), label);
gtk_container_add (GTK_CONTAINER (menu_item), box);
gtk_widget_show_all (menu_item);
*/
func menuItemSetBitmap(widget pointer, data []byte) {
image := C.gdk_pixbuf_new_from_inline(C.int(len(data)), (*C.guchar)(unsafe.Pointer(&data[0])), C.FALSE, nil)
imageWidget := C.gtk_image_new_from_pixbuf(image)
C.gtk_image_set_pixel_size((*C.GtkImage)(imageWidget), 16)
C.gtk_menu_item_set_image((*C.GtkMenuItem)(widget), imageWidget)
parent := C.gtk_widget_get_parent((*C.GtkWidget)(widget))
fmt.Println("parent", parent)
//parent := C.gtk_widget_get_parent((*C.GtkWidget)widget)
if img, err := pngToImage(data); err == nil {
gbytes := C.g_bytes_new_static(
C.gconstpointer(unsafe.Pointer(&img.Pix[0])),
C.ulong(len(img.Pix)))
defer C.g_bytes_unref(gbytes)
pixBuf := C.gdk_pixbuf_new_from_bytes(
gbytes,
C.GDK_COLORSPACE_RGB,
1, // has_alpha
8,
C.int(img.Bounds().Dx()),
C.int(img.Bounds().Dy()),
C.int(img.Stride),
)
image := C.gtk_image_new_from_pixbuf(pixBuf)
fmt.Println("image", image)
// C.gtk_menu_item_set_image((*C.GtkMenuItem)(widget), image)
}
}
func menuItemSetToolTip(widget pointer, tooltip string) {

View file

@ -96,16 +96,16 @@ func newMenuItemImpl(item *MenuItem) *linuxMenuItem {
}
switch item.itemType {
case text:
result.native = menuItemNew(item.label)
result.native = menuItemNew(item.label, item.bitmap)
case checkbox:
result.native = menuCheckItemNew(item.label)
result.native = menuCheckItemNew(item.label, item.bitmap)
result.setChecked(item.checked)
if item.accelerator != nil {
result.setAccelerator(item.accelerator)
}
case submenu:
result.native = menuItemNew(item.label)
result.native = menuItemNew(item.label, item.bitmap)
default:
panic(fmt.Sprintf("Unknown menu type: %v", item.itemType))