139 lines
4.2 KiB
C
139 lines
4.2 KiB
C
#include <assert.h>
|
|
#include "cairo-window.h"
|
|
#include "cairo-image.h"
|
|
/*
|
|
enum
|
|
{
|
|
NO_PROP,
|
|
BOX_MODE,
|
|
N_PROPERTIES
|
|
};
|
|
static GParamSpec *g_prop[N_PROPERTIES] = {0};
|
|
*/
|
|
struct _DiyaCairoWindow
|
|
{
|
|
DiyaCairoWidget parent_object;
|
|
DiyaCairoWidget * root;
|
|
|
|
gpointer background;
|
|
};
|
|
|
|
G_DEFINE_FINAL_TYPE(DiyaCairoWindow, diya_cairo_window, DIYA_TYPE_CAIRO_WIDGET)
|
|
|
|
static void diya_cairo_window_dispose(GObject * object)
|
|
{
|
|
g_debug("diya_cairo_window_dispose: %s", diya_object_to_string(object));
|
|
DiyaCairoWindow * window = DIYA_CAIRO_WINDOW(object);
|
|
if(window->root)
|
|
{
|
|
g_object_unref(window->root);
|
|
}
|
|
if(window->background)
|
|
{
|
|
g_object_unref(window->background);
|
|
}
|
|
G_OBJECT_CLASS(diya_cairo_window_parent_class)->dispose(object);
|
|
}
|
|
|
|
static void diya_cairo_window_init(DiyaCairoWindow * window)
|
|
{
|
|
window->root = NULL;
|
|
window->background = NULL;
|
|
}
|
|
|
|
static gboolean cairo_window_draw(gpointer object, cairo_t * cairo)
|
|
{
|
|
DiyaCairoWindow * window = DIYA_CAIRO_WINDOW(object);
|
|
DIYA_CAIRO_WIDGET_CLASS(diya_cairo_window_parent_class)->draw(object, cairo);
|
|
if(window->background)
|
|
{
|
|
g_warning("drawing background");
|
|
assert(DIYA_IS_CAIRO_IMAGE(window->background));
|
|
DIYA_CAIRO_WIDGET_GET_CLASS(DIYA_CAIRO_WIDGET(window->background))->draw(window->background, cairo);
|
|
}
|
|
if(window->root)
|
|
{
|
|
DIYA_CAIRO_WIDGET_GET_CLASS(DIYA_CAIRO_WIDGET(window->root))->draw(window->root, cairo);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
static void cairo_window_update(gpointer object)
|
|
{
|
|
g_warning("Updating cairo window");
|
|
DiyaCairoWindow * self = DIYA_CAIRO_WINDOW(object);
|
|
DIYA_CAIRO_WIDGET_CLASS(diya_cairo_window_parent_class)->update(object);
|
|
if(self->background)
|
|
{
|
|
g_warning("Updating cairo image");
|
|
assert(DIYA_IS_CAIRO_IMAGE(self->background));
|
|
DIYA_CAIRO_WIDGET_GET_CLASS(DIYA_CAIRO_WIDGET(self->background))->update(self->background);
|
|
}
|
|
if(self->root)
|
|
{
|
|
g_warning("Updating root");
|
|
DIYA_CAIRO_WIDGET_GET_CLASS(DIYA_CAIRO_WIDGET(self->root))->update(self->root);
|
|
}
|
|
}
|
|
|
|
static void diya_cairo_window_class_init(DiyaCairoWindowClass* class)
|
|
{
|
|
GObjectClass *gobject_class = G_OBJECT_CLASS(class);
|
|
DiyaCairoWidgetClass *wclass = DIYA_CAIRO_WIDGET_CLASS(class);
|
|
wclass->draw = cairo_window_draw;
|
|
wclass->update = cairo_window_update;
|
|
// wclass->alloc_space = cairo_window_allocate_space;
|
|
DIYA_CAIRO_WIDGET_SET_NAME(class, "DiyaCairoWindow");
|
|
gobject_class->dispose = diya_cairo_window_dispose;
|
|
}
|
|
|
|
void diya_cairo_window_set_root(gpointer object, gpointer root)
|
|
{
|
|
assert(DIYA_IS_CAIRO_WINDOW(object));
|
|
assert(DIYA_IS_CAIRO_WIDGET(root));
|
|
DiyaCairoWindow * window = DIYA_CAIRO_WINDOW(object);
|
|
window->root = DIYA_CAIRO_WIDGET(root);
|
|
diya_rect_t extent = diya_cairo_widget_get_extent(window);
|
|
g_object_set(root,
|
|
"parent", window,
|
|
"default-extent", &extent,
|
|
"vspace", DIYA_CAIRO_WIDGET_FILL_EXTEND,
|
|
"hspace", DIYA_CAIRO_WIDGET_FILL_EXTEND,
|
|
NULL
|
|
);
|
|
}
|
|
|
|
void diya_cairo_window_render(gpointer object, cairo_surface_t * surface)
|
|
{
|
|
assert(DIYA_IS_CAIRO_WINDOW(object));
|
|
DiyaCairoWidget * widget = DIYA_CAIRO_WIDGET(object);
|
|
cairo_t *cr = cairo_create(surface);
|
|
DIYA_CAIRO_WIDGET_GET_CLASS(widget)->draw(object,cr);
|
|
cairo_destroy(cr);
|
|
}
|
|
|
|
void diya_cairo_window_update(gpointer object)
|
|
{
|
|
assert(DIYA_IS_CAIRO_WINDOW(object));
|
|
g_warning("update and damaged widget");
|
|
DiyaCairoWidget * widget = DIYA_CAIRO_WIDGET(object);
|
|
assert(DIYA_IS_CAIRO_WIDGET(widget));
|
|
DIYA_CAIRO_WIDGET_GET_CLASS(widget)->update(object);
|
|
}
|
|
|
|
void diya_cairo_window_set_background_image(gpointer object, const char* path, gboolean scale_to_fit)
|
|
{
|
|
assert(DIYA_IS_CAIRO_WINDOW(object));
|
|
DiyaCairoWindow * self = DIYA_CAIRO_WINDOW(object);
|
|
|
|
self->background = g_object_new(DIYA_TYPE_CAIRO_IMAGE,
|
|
"file",path, "parent", object,
|
|
"scale-to-fit", scale_to_fit,
|
|
"hspace", DIYA_CAIRO_WIDGET_FILL_EXTEND,
|
|
"vspace", DIYA_CAIRO_WIDGET_FILL_EXTEND,
|
|
"halign", DIYA_CAIRO_WIDGET_ALIGN_START,
|
|
"valign", DIYA_CAIRO_WIDGET_ALIGN_START,
|
|
NULL);
|
|
|
|
|
|
} |