diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2016-10-17 21:04:33 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2016-10-17 21:04:33 (GMT) |
commit | ef174ce487411fceffd5d5098b51e66b65bb93b8 (patch) | |
tree | d5a4c6dca30da1ad2593b271a18a5aae67bfbc4d /src/gtkext/gtkviewpanel.c | |
parent | 570ae6b84ad1a17835da538ec3be9cf200cd1ebc (diff) |
Produced nicer graphic node rendering with shadows.
Diffstat (limited to 'src/gtkext/gtkviewpanel.c')
-rw-r--r-- | src/gtkext/gtkviewpanel.c | 152 |
1 files changed, 104 insertions, 48 deletions
diff --git a/src/gtkext/gtkviewpanel.c b/src/gtkext/gtkviewpanel.c index 4d5a57e..8672bb9 100644 --- a/src/gtkext/gtkviewpanel.c +++ b/src/gtkext/gtkviewpanel.c @@ -24,9 +24,15 @@ #include "gtkviewpanel.h" +#include <math.h> + + #include "gtkviewpanel-int.h" +/* Amplitude de l'arrondi pour les coins */ +#define BORDER_CORNER_RADIUS 10.0 + /* Procède à l'initialisation de l'afficheur générique. */ static void gtk_view_panel_class_init(GtkViewPanelClass *); @@ -49,9 +55,6 @@ static void gtk_view_panel_realize(GtkWidget *); /* S'adapte à la surface concédée par le composant parent. */ static void gtk_view_panel_size_allocate(GtkWidget *, GtkAllocation *); -/* Met à jour l'affichage du composant d'affichage. */ -static gboolean gtk_view_panel_draw(GtkWidget *, cairo_t *); - /* Fournit la hauteur idéale pour le composant d'affichage. */ static void gtk_view_panel_get_preferred_height(GtkWidget *, gint *, gint *); @@ -120,7 +123,6 @@ static void gtk_view_panel_class_init(GtkViewPanelClass *class) widget_class->destroy = gtk_view_panel_destroy; widget_class->realize = gtk_view_panel_realize; widget_class->size_allocate = gtk_view_panel_size_allocate; - widget_class->draw = gtk_view_panel_draw; widget_class->get_preferred_height = gtk_view_panel_get_preferred_height; widget_class->get_preferred_width = gtk_view_panel_get_preferred_width; @@ -356,50 +358,6 @@ static void gtk_view_panel_size_allocate(GtkWidget *widget, GtkAllocation *alloc /****************************************************************************** * * -* Paramètres : widget = composant GTK à redessiner. * -* cr = contexte graphique associé à l'événement. * -* * -* Description : Met à jour l'affichage du composant d'affichage. * -* * -* Retour : FALSE pour poursuivre la propagation de l'événement. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static gboolean gtk_view_panel_draw(GtkWidget *widget, cairo_t *cr) -{ - GtkViewPanel *panel; /* Autre version du composant */ - GtkRequisition req; /* Taille allouée à l'élément */ - GtkStyleContext *context; /* Contexte du thème actuel */ - - GTK_WIDGET_CLASS(gtk_view_panel_parent_class)->draw(widget, cr); - - panel = GTK_VIEW_PANEL(widget); - - if (panel->show_border) - { - gtk_widget_get_preferred_size(widget, NULL, &req); - - context = gtk_widget_get_style_context(widget); - - gtk_style_context_save(context); - - gtk_style_context_add_class(context, GTK_STYLE_CLASS_FRAME); - - gtk_render_frame(context, cr, 0, 0, req.width, req.height); - - gtk_style_context_restore(context); - - } - - return FALSE; - -} - - -/****************************************************************************** -* * * Paramètres : widget = composant GTK à examiner. * * minimum = hauteur minimale à préciser ou NULL. [OUT] * * natural = hauteur idéale à préciser ou NULL. [OUT] * @@ -730,6 +688,104 @@ void gtk_view_panel_show_border(GtkViewPanel *panel, bool show) /****************************************************************************** * * +* Paramètres : panel = composant GTK à venir consulter. * +* cr = contexte graphique associé à l'événement. * +* offset = décallage éventuel à appliquer. * +* * +* Description : Définit un chemin décrivant la bordure autour du panneau. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void gtk_view_panel_define_border_path(GtkViewPanel *panel, cairo_t *cr, gint off_x, gint off_y) +{ + GtkRequisition req; /* Taille allouée à l'élément */ + double degrees; /* Conversion en degrés */ + + gtk_widget_get_preferred_size(GTK_WIDGET(panel), NULL, &req); + + degrees = M_PI / 180.0; + + cairo_new_sub_path(cr); + + cairo_arc(cr, + off_x + req.width - BORDER_CORNER_RADIUS - 0.5, + off_y + BORDER_CORNER_RADIUS + 0.5, + BORDER_CORNER_RADIUS, -90 * degrees, 0 * degrees); + + cairo_arc(cr, + off_x + req.width - BORDER_CORNER_RADIUS - 0.5, + off_y + req.height - BORDER_CORNER_RADIUS - 0.5, + BORDER_CORNER_RADIUS, 0 * degrees, 90 * degrees); + + cairo_arc(cr, + off_x + BORDER_CORNER_RADIUS + 0.5, + off_y + req.height - BORDER_CORNER_RADIUS - 0.5, + BORDER_CORNER_RADIUS, 90 * degrees, 180 * degrees); + + cairo_arc(cr, + off_x + BORDER_CORNER_RADIUS + 0.5, + off_y + BORDER_CORNER_RADIUS + 0.5, + BORDER_CORNER_RADIUS, 180 * degrees, 270 * degrees); + + cairo_close_path(cr); + +} + + +/****************************************************************************** +* * +* Paramètres : panel = composant GTK à venir consulter. * +* cr = contexte graphique associé à l'événement. * +* * +* Description : Dessine si besoin est une bordure autour du composant. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void gtk_view_panel_draw_border(GtkViewPanel *panel, cairo_t *cr) +{ + GtkWidget *widget; /* Autre version du composant */ + GtkRequisition req; /* Taille allouée à l'élément */ + GtkStyleContext *context; /* Contexte du thème actuel */ + GdkRGBA color; /* Couleur de thème récupérée */ + + if (panel->show_border) + { + widget = GTK_WIDGET(panel); + + gtk_widget_get_preferred_size(widget, NULL, &req); + + context = gtk_widget_get_style_context(widget); + + gtk_style_context_save(context); + + gtk_style_context_add_class(context, GTK_STYLE_CLASS_FRAME); + + gtk_style_context_get_border_color(context, GTK_STATE_FLAG_ACTIVE, &color); + + cairo_set_source_rgba(cr, color.red, color.green, color.blue, color.alpha); + + cairo_set_line_width(cr, 1.0); + + gtk_view_panel_define_border_path(panel, cr, 0, 0); + cairo_stroke(cr); + + gtk_style_context_restore(context); + + } + +} + + +/****************************************************************************** +* * * Paramètres : panel = composant GTK à mettre à jour. * * binary = binaire associé à intégrer. * * view = aspect du binaire à présenter. * |