Restructure graph view and add background color property
This commit is contained in:
parent
234722df85
commit
998628bb6c
@ -32,6 +32,7 @@ int main(int argc, char **argv)
|
|||||||
{
|
{
|
||||||
GtkWidget *main_window;
|
GtkWidget *main_window;
|
||||||
GtkWidget *graph_view;
|
GtkWidget *graph_view;
|
||||||
|
GdkRGBA color;
|
||||||
|
|
||||||
gtk_init(&argc, &argv);
|
gtk_init(&argc, &argv);
|
||||||
|
|
||||||
@ -41,8 +42,15 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
graph_view = gtk_graph_view_new();
|
graph_view = gtk_graph_view_new();
|
||||||
gtk_container_add(GTK_CONTAINER(main_window), graph_view);
|
gtk_container_add(GTK_CONTAINER(main_window), graph_view);
|
||||||
|
gtk_widget_show(graph_view);
|
||||||
gtk_widget_show_all(main_window);
|
gtk_widget_show_all(main_window);
|
||||||
|
|
||||||
|
color.red = 0.6;
|
||||||
|
color.green = 0.4;
|
||||||
|
color.blue = 0.1;
|
||||||
|
color.alpha = 1.0;
|
||||||
|
gtk_graph_view_set_background_color(GTK_GRAPH_VIEW(graph_view), &color);
|
||||||
|
|
||||||
gtk_main();
|
gtk_main();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -34,7 +34,7 @@ G_BEGIN_DECLS
|
|||||||
|
|
||||||
#define GTK_TYPE_GRAPH_VIEW (gtk_graph_view_get_type())
|
#define GTK_TYPE_GRAPH_VIEW (gtk_graph_view_get_type())
|
||||||
|
|
||||||
G_DECLARE_FINAL_TYPE(GtkGraphView, gtk_graph_view, GTK, GRAPH_VIEW, GtkGLArea)
|
G_DECLARE_FINAL_TYPE(GtkGraphView, gtk_graph_view, GTK, GRAPH_VIEW, GtkBox)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Instanciate new GtkGraphView object
|
* @brief Instanciate new GtkGraphView object
|
||||||
@ -42,6 +42,16 @@ G_DECLARE_FINAL_TYPE(GtkGraphView, gtk_graph_view, GTK, GRAPH_VIEW, GtkGLArea)
|
|||||||
*/
|
*/
|
||||||
GtkWidget *gtk_graph_view_new();
|
GtkWidget *gtk_graph_view_new();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set the background color of the graph view
|
||||||
|
*
|
||||||
|
* This is equivalent to setting the "background-color" property
|
||||||
|
*
|
||||||
|
* @param[in] graph_view GtkGraphView object
|
||||||
|
* @param[in] RGBA background color.
|
||||||
|
*/
|
||||||
|
void gtk_graph_view_set_background_color(GtkGraphView* graph_view, const GdkRGBA *rgba);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __GTK_GRAPH_VIEW_H__ */
|
#endif /* __GTK_GRAPH_VIEW_H__ */
|
||||||
|
@ -18,14 +18,79 @@
|
|||||||
#include <epoxy/gl.h>
|
#include <epoxy/gl.h>
|
||||||
|
|
||||||
struct _GtkGraphView {
|
struct _GtkGraphView {
|
||||||
GtkGLArea parent;
|
GtkBox super;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int i; /**< @note This is just a dummy. Remove! */
|
/**
|
||||||
|
* @brief The gl area displaying the graph view.
|
||||||
|
* @note This variable is not referenced, because the gl_area is tightly bound to the GrapgView widget itself.
|
||||||
|
*/
|
||||||
|
GtkWidget *gl_area;
|
||||||
|
GdkRGBA background_color;
|
||||||
} GtkGraphViewPrivate;
|
} GtkGraphViewPrivate;
|
||||||
|
|
||||||
G_DEFINE_TYPE_WITH_PRIVATE(GtkGraphView, gtk_graph_view, GTK_TYPE_GL_AREA)
|
G_DEFINE_TYPE_WITH_PRIVATE(GtkGraphView, gtk_graph_view, GTK_TYPE_BOX)
|
||||||
|
|
||||||
|
enum {
|
||||||
|
PROP_BG_COLOR = 1,
|
||||||
|
N_PROPERTIES
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Make the gl area the current context and set the clear color
|
||||||
|
* @param[in] gl_area openGL area
|
||||||
|
* @param[in] rgba Clear color
|
||||||
|
*/
|
||||||
|
static void gl_area_set_clear_color(GtkGLArea *gl_area, const GdkRGBA *rgba)
|
||||||
|
{
|
||||||
|
g_return_if_fail(gl_area);
|
||||||
|
g_return_if_fail(rgba != NULL);
|
||||||
|
gtk_gl_area_make_current(gl_area);
|
||||||
|
glClearColor(rgba->red, rgba->green, rgba->blue, rgba->alpha);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean gl_render(GtkGLArea *gl_area, GdkGLContext *context, GtkGraphView *view)
|
||||||
|
{
|
||||||
|
GtkGraphViewPrivate *priv;
|
||||||
|
|
||||||
|
priv = gtk_graph_view_get_instance_private(view);
|
||||||
|
|
||||||
|
gl_area_set_clear_color(gl_area, &priv->background_color);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
glFlush();
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gtk_graph_view_get_property(GObject *obj, guint property_id, GValue *value, GParamSpec *pspec)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void gtk_graph_view_set_property(GObject *obj, guint property_id, const GValue *value, GParamSpec *pspec)
|
||||||
|
{
|
||||||
|
gpointer data_ptr;
|
||||||
|
GtkGraphViewPrivate *priv;
|
||||||
|
|
||||||
|
priv = gtk_graph_view_get_instance_private(GTK_GRAPH_VIEW(obj));
|
||||||
|
|
||||||
|
switch (property_id) {
|
||||||
|
case PROP_BG_COLOR:
|
||||||
|
data_ptr = g_value_get_boxed(value);
|
||||||
|
if (!data_ptr)
|
||||||
|
break;
|
||||||
|
priv->background_color.red = ((GdkRGBA *)data_ptr)->red;
|
||||||
|
priv->background_color.green = ((GdkRGBA *)data_ptr)->green;
|
||||||
|
priv->background_color.blue = ((GdkRGBA *)data_ptr)->blue;
|
||||||
|
priv->background_color.alpha = ((GdkRGBA *)data_ptr)->alpha;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, property_id, pspec);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static GParamSpec *gtk_graph_view_properties[N_PROPERTIES] = {NULL};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Init class structure of GtkGraphView
|
* @brief Init class structure of GtkGraphView
|
||||||
@ -33,9 +98,17 @@ G_DEFINE_TYPE_WITH_PRIVATE(GtkGraphView, gtk_graph_view, GTK_TYPE_GL_AREA)
|
|||||||
*/
|
*/
|
||||||
static void gtk_graph_view_class_init(GtkGraphViewClass *klass)
|
static void gtk_graph_view_class_init(GtkGraphViewClass *klass)
|
||||||
{
|
{
|
||||||
(void)klass;
|
GObjectClass *oclass;
|
||||||
|
|
||||||
return;
|
oclass = G_OBJECT_CLASS(klass);
|
||||||
|
oclass->set_property = gtk_graph_view_set_property;
|
||||||
|
oclass->get_property = gtk_graph_view_get_property;
|
||||||
|
|
||||||
|
gtk_graph_view_properties[PROP_BG_COLOR] =
|
||||||
|
g_param_spec_boxed("background-color", "background color", "Background color of Graph View",
|
||||||
|
GDK_TYPE_RGBA, G_PARAM_READWRITE);
|
||||||
|
|
||||||
|
g_object_class_install_properties(oclass, N_PROPERTIES, gtk_graph_view_properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -47,10 +120,34 @@ static void gtk_graph_view_init(GtkGraphView *obj)
|
|||||||
GtkGraphViewPrivate *priv;
|
GtkGraphViewPrivate *priv;
|
||||||
|
|
||||||
priv = gtk_graph_view_get_instance_private(obj);
|
priv = gtk_graph_view_get_instance_private(obj);
|
||||||
priv->i = 0;
|
|
||||||
|
/* Create new GTK GL_Area as only child of the box */
|
||||||
|
priv->gl_area = gtk_gl_area_new();
|
||||||
|
g_signal_connect(priv->gl_area, "render", G_CALLBACK(gl_render), obj);
|
||||||
|
gtk_container_add(GTK_CONTAINER(obj), priv->gl_area);
|
||||||
|
gtk_box_set_child_packing(GTK_BOX(obj), priv->gl_area, TRUE, TRUE, 0, GTK_PACK_START);
|
||||||
|
gtk_widget_show(priv->gl_area);
|
||||||
|
|
||||||
|
priv->background_color.red = 0.0;
|
||||||
|
priv->background_color.green = 0.0;
|
||||||
|
priv->background_color.blue = 0.0;
|
||||||
|
priv->background_color.alpha = 1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
GtkWidget *gtk_graph_view_new()
|
GtkWidget *gtk_graph_view_new()
|
||||||
{
|
{
|
||||||
return gtk_widget_new(GTK_TYPE_GRAPH_VIEW, NULL);
|
return gtk_widget_new(GTK_TYPE_GRAPH_VIEW, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void gtk_graph_view_set_background_color(GtkGraphView *graph_view, const GdkRGBA *rgba)
|
||||||
|
{
|
||||||
|
GValue color_value = G_VALUE_INIT;
|
||||||
|
|
||||||
|
g_return_if_fail(GTK_IS_GRAPH_VIEW(graph_view));
|
||||||
|
g_return_if_fail(rgba != NULL);
|
||||||
|
|
||||||
|
g_value_init(&color_value, GDK_TYPE_RGBA);
|
||||||
|
g_value_set_boxed(&color_value, rgba);
|
||||||
|
g_object_set_property(G_OBJECT(graph_view), "background-color", &color_value);
|
||||||
|
g_value_unset(&color_value);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user