ui/gtk/graphics.c

changeset 848
5a4b72489111
parent 801
e096c441e874
child 854
9291921f21c5
--- a/ui/gtk/graphics.c	Tue Oct 14 10:41:21 2025 +0200
+++ b/ui/gtk/graphics.c	Tue Oct 14 12:48:55 2025 +0200
@@ -33,22 +33,83 @@
 #include "container.h"
 #include "../common/object.h"
 
-UIWIDGET ui_drawingarea(UiObject *obj, ui_drawfunc f, void *userdata) {
-    GtkWidget *widget = gtk_drawing_area_new();
+#if GTK_CHECK_VERSION(3, 0, 0)
+#include "draw_cairo.h"
+#endif
+
+static void destroy_drawingarea(GtkWidget *widget, UiDrawingArea *drawingarea) {
+    free(drawingarea);
+}
+
+static void drawingarea_draw(UiDrawingArea *drawingarea, cairo_t *cr, int width, int height) {
+    UiEvent event;
+    event.obj = drawingarea->obj;
+    event.window = event.obj->window;
+    event.document = event.obj->ctx->document;
+    event.eventdata = NULL;
+    event.eventdatatype = 0;
+    event.intval = 0;
+    event.set = 0;
+    
     
-    if(f) {
-        UiDrawEvent *event = malloc(sizeof(UiDrawEvent));
-        event->obj = obj;
-        event->callback = f;
-        event->userdata = userdata;
-        ui_connect_draw_handler(widget, event);
-    }
+}
+
+#if GTK_CHECK_VERSION(4, 0, 0)
+static void drawfunc(
+        GtkDrawingArea *area,
+        cairo_t *cr,
+        int width,
+        int  height,
+        gpointer userdata)
+{
+    ui_drawingarea_draw(userdata, cr, width, height);
+}
+#elif GTK_CHECK_VERSION(3, 0, 0)
+gboolean draw_callback(GtkWidget *widget, cairo_t *cr, UiDrawingArea *drawingarea) {
+    int width = gtk_widget_get_allocated_width(widget);
+    int height = gtk_widget_get_allocated_height(widget);
+    ui_drawingarea_draw(drawingarea, cr, width, height);
+    return FALSE;
+}
+#endif
+
+UIWIDGET ui_drawingarea_create(UiObject *obj, UiDrawingAreaArgs *args) {
+    GtkWidget *widget = gtk_drawing_area_new();
+    ui_set_name_and_style(widget, args->name, args->style_class);
+    
+    gtk_drawing_area_set_content_width(GTK_DRAWING_AREA(widget), args->width > 0 ? args->width : 100);
+    gtk_drawing_area_set_content_height(GTK_DRAWING_AREA(widget), args->height > 0 ? args->height : 100);
     
     UiContainerPrivate *ct = (UiContainerPrivate*)obj->container_end;
-    //UiLayout layout = UI_ARGS2LAYOUT(args);
-    UiLayout layout = {0};
+    UiLayout layout = UI_ARGS2LAYOUT(args);
     ct->add(ct, widget, &layout);
     
+    UiDrawingArea *drawingarea = malloc(sizeof(UiDrawingArea));
+    drawingarea->obj = obj;
+    drawingarea->widget = widget;
+    drawingarea->draw = args->draw;
+    drawingarea->drawdata = args->drawdata;
+    drawingarea->onclick = args->onclick;
+    drawingarea->onclickdata = args->onclickdata;
+    drawingarea->onmotion = args->onmotion;
+    drawingarea->onmotiondata = args->onmotiondata;
+    
+#if GTK_CHECK_VERSION(4, 0, 0)
+    gtk_drawing_area_set_draw_func(GTK_DRAWING_AREA(widget), drawfunc, drawingarea, NULL);
+#elif GTK_CHECK_VERSION(3, 0, 0)
+    g_signal_connect(
+            widget,
+            "draw",
+            G_CALLBACK(draw_callback),
+            NULL);
+#endif
+    
+    g_signal_connect(
+                widget,
+                "destroy",
+                G_CALLBACK(destroy_drawingarea),
+                drawingarea);
+    
     return widget;
 }
 
@@ -144,7 +205,7 @@
     pango_layout_set_text(layout->layout, str, len);
 }
 
-void ui_text_setfont(UiTextLayout *layout, char *font, int size) {
+void ui_text_setfont(UiTextLayout *layout, const char *font, int size) {
     PangoFontDescription *fontDesc;
     fontDesc = pango_font_description_from_string(font);
     pango_font_description_set_size(fontDesc, size * PANGO_SCALE);

mercurial