diff options
Diffstat (limited to 'src/gtkext/gtkbufferdisplay.c')
-rw-r--r-- | src/gtkext/gtkbufferdisplay.c | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/src/gtkext/gtkbufferdisplay.c b/src/gtkext/gtkbufferdisplay.c index 1b452f1..5ad808f 100644 --- a/src/gtkext/gtkbufferdisplay.c +++ b/src/gtkext/gtkbufferdisplay.c @@ -108,6 +108,20 @@ static void gtk_buffer_display_draw_caret(GtkBufferDisplay *, cairo_t *); +/* ------------------------- INCLUSION D'UNE BARRE D'OUTILS ------------------------- */ + + +/* Place correctement la barre d'outils pour bloc. */ +static void gtk_buffer_display_move_block_bar(GtkBufferDisplay *); + +/* Accompagne le début du survol d'un élément de barre d'outils. */ +static gboolean on_block_bar_enter_notify(GtkWidget *, GdkEventCrossing *, GtkBufferDisplay *); + +/* Accompagne la fin du survol d'un élément de barre d'outils. */ +static gboolean on_block_bar_leave_notify(GtkWidget *, GdkEventCrossing *, GtkBufferDisplay *); + + + /* ---------------------------------------------------------------------------------- */ /* INTERACTION DIRECTE AVEC GTK */ /* ---------------------------------------------------------------------------------- */ @@ -223,6 +237,9 @@ static void gtk_buffer_display_dispose(GtkBufferDisplay *display) g_clear_object(&display->cursor); + g_clear_object(&display->builder); + g_clear_object(&display->bar); + G_OBJECT_CLASS(gtk_buffer_display_parent_class)->dispose(G_OBJECT(display)); } @@ -466,6 +483,10 @@ static gboolean gtk_buffer_display_draw(GtkWidget *widget, cairo_t *cr) cairo_restore(cr); + /* Dessin des composants contenus */ + + GTK_WIDGET_CLASS(gtk_buffer_display_parent_class)->draw(widget, cr); + return FALSE; } @@ -565,10 +586,22 @@ static gboolean gtk_buffer_display_key_press(GtkWidget *widget, GdkEventKey *eve static void gtk_buffer_display_compute_requested_size(GtkBufferDisplay *display, gint *width, gint *height) { + gint extra; /* Eventuel supplément largeur */ + if (width != NULL) { if (display->view != NULL) + { *width = g_buffer_view_get_width(display->view, GTK_DISPLAY_PANEL(display)->options); + + if (display->bar != NULL) + { + gtk_widget_get_preferred_width(display->bar, NULL, &extra); + *width += extra; + } + + } + else *width = 0; } @@ -1183,3 +1216,126 @@ static void gtk_buffer_display_draw_caret(GtkBufferDisplay *display, cairo_t *cr } } + + + +/* ---------------------------------------------------------------------------------- */ +/* INCLUSION D'UNE BARRE D'OUTILS */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : display = panneau d'affichage concerné. * +* * +* Description : Ajoute une nouvelle barre d'outils pour bloc au composant. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void gtk_buffer_display_add_block_bar(GtkBufferDisplay *display) +{ + GtkWidget *bar; /* Barre d'outils à intégrer */ + + assert(display->builder == NULL); + + display->builder = gtk_builder_new_from_resource("/org/chrysalide/gtkext/blockbar.ui"); + + bar = GTK_WIDGET(gtk_builder_get_object(display->builder, "blockbar")); + + display->bar = bar; + g_object_ref(G_OBJECT(bar)); + + g_object_ref(G_OBJECT(bar)); + gtk_widget_unparent(bar); + + gtk_fixed_put(GTK_FIXED(display), bar, 0, 0); + + gtk_builder_add_callback_symbols(display->builder, + "on_block_bar_enter_notify", G_CALLBACK(on_block_bar_enter_notify), + "on_block_bar_leave_notify", G_CALLBACK(on_block_bar_leave_notify), + NULL); + + gtk_builder_connect_signals(display->builder, display); + + gtk_buffer_display_move_block_bar(display); + +} + + +/****************************************************************************** +* * +* Paramètres : display = panneau d'affichage concerné. * +* * +* Description : Place correctement la barre d'outils pour bloc. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void gtk_buffer_display_move_block_bar(GtkBufferDisplay *display) +{ + GtkWidget *bar; /* Barre d'outils courante */ + gint width; /* Largeur requise à vide */ + + bar = display->bar; + display->bar = NULL; + + gtk_buffer_display_compute_requested_size(display, &width, NULL); + + display->bar = bar; + + gtk_fixed_move(GTK_FIXED(display), bar, width, (int)BORDER_CORNER_RADIUS / 2); + +} + + +/****************************************************************************** +* * +* Paramètres : widget = composant graphique concerné par l'opération. * +* event = informations liées à l'événement. * +* display = panneau d'affichage impliqué par l'action. * +* * +* Description : Accompagne le début du survol d'un élément de barre d'outils.* +* * +* Retour : FALSE pour poursuivre la propagation de l'événement. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static gboolean on_block_bar_enter_notify(GtkWidget *widget, GdkEventCrossing *event, GtkBufferDisplay *display) +{ + gtk_widget_set_opacity(widget, 1.0); + + return FALSE; + +} + + +/****************************************************************************** +* * +* Paramètres : widget = composant graphique concerné par l'opération. * +* event = informations liées à l'événement. * +* display = panneau d'affichage impliqué par l'action. * +* * +* Description : Accompagne la fin du survol d'un élément de barre d'outils. * +* * +* Retour : FALSE pour poursuivre la propagation de l'événement. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static gboolean on_block_bar_leave_notify(GtkWidget *widget, GdkEventCrossing *event, GtkBufferDisplay *display) +{ + gtk_widget_set_opacity(widget, 0.6); + + return FALSE; + +} |