summaryrefslogtreecommitdiff
path: root/src/gtkext/gtkbufferview.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2014-09-10 21:02:04 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2014-09-10 21:02:04 (GMT)
commitbe1f2f147e8ce15f20ec4de439088714ffa50e8a (patch)
treeeab8ad76fa6f39781568fae13fb7967cdedbd45a /src/gtkext/gtkbufferview.c
parentc03635088f26a18cdbd42c2528f00b9ccd8591d9 (diff)
Fixed and improved the rendering of view panels.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@401 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/gtkext/gtkbufferview.c')
-rw-r--r--src/gtkext/gtkbufferview.c227
1 files changed, 64 insertions, 163 deletions
diff --git a/src/gtkext/gtkbufferview.c b/src/gtkext/gtkbufferview.c
index 032fcf9..8e1a9c7 100644
--- a/src/gtkext/gtkbufferview.c
+++ b/src/gtkext/gtkbufferview.c
@@ -46,21 +46,15 @@ static gboolean gtk_buffer_view_focus(GtkWidget *, GtkDirectionType);
/* Assure la gestion des clics de souris sur le composant. */
static gboolean gtk_buffer_view_button_press(GtkWidget *, GdkEventButton *);
-/* Fournit la hauteur de composant requise pour un plein rendu. */
-static void gtk_buffer_view_get_preferred_height(GtkWidget *, gint *, gint *);
-
-/* Fournit la largeur de composant requise pour un plein rendu. */
-static void gtk_buffer_view_get_preferred_width(GtkWidget *, gint *, gint *);
-
-/* S'adapte à la surface concédée par le composant parent. */
-static void gtk_buffer_view_size_allocate(GtkWidget *, GtkAllocation *);
-
/* Met à jour l'affichage de la visualisation de code buffer. */
static gboolean gtk_buffer_view_draw(GtkWidget *, cairo_t *);
/* Prend en compte une frappe de touche sur le composant. */
static gboolean gtk_buffer_view_key_press(GtkWidget *, GdkEventKey *);
+/* Indique les dimensions de travail du composant d'affichage. */
+static void gtk_buffer_view_compute_requested_size(GtkBufferView *, gint *, gint *);
+
/* Indique la position d'affichage d'une adresse donnée. */
static bool gtk_buffer_view_get_address_coordinates(const GtkBufferView *, const vmpa2t *, gint *, gint *);
@@ -104,17 +98,18 @@ G_DEFINE_TYPE(GtkBufferView, gtk_buffer_view, GTK_TYPE_VIEW_PANEL)
static void gtk_buffer_view_class_init(GtkBufferViewClass *class)
{
GtkWidgetClass *widget_class; /* Classe version Widget */
+ GtkViewPanelClass *panel_class; /* Classe parente */
widget_class = GTK_WIDGET_CLASS(class);
+ panel_class = GTK_VIEW_PANEL_CLASS(class);
widget_class->focus = gtk_buffer_view_focus;
widget_class->button_press_event = gtk_buffer_view_button_press;
- widget_class->get_preferred_height = gtk_buffer_view_get_preferred_height;
- widget_class->get_preferred_width = gtk_buffer_view_get_preferred_width;
- widget_class->size_allocate = gtk_buffer_view_size_allocate;
widget_class->draw = gtk_buffer_view_draw;
widget_class->key_press_event = gtk_buffer_view_key_press;
+ panel_class->compute_size = (compute_requested_size)gtk_buffer_view_compute_requested_size;
+
g_signal_new("caret-moved",
GTK_TYPE_BUFFER_VIEW,
G_SIGNAL_RUN_LAST,
@@ -325,145 +320,6 @@ void gtk_buffer_view_compute_real_coord(GtkBufferView *view, gint *x, gint *y)
/******************************************************************************
* *
-* Paramètres : widget = composant GTK à consulter. *
-* minimal = taille minimale. [OUT] *
-* natural = taille idéale. [OUT] *
-* *
-* Description : Fournit la hauteur de composant requise pour un plein rendu. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void gtk_buffer_view_get_preferred_height(GtkWidget *widget, gint *minimal, gint *natural)
-{
- GtkBufferView *view; /* Autre version du composant */
-
- view = GTK_BUFFER_VIEW(widget);
-
- if (view->buffer_view != NULL)
- *minimal = g_buffer_view_get_height(view->buffer_view);
- else
- *minimal = 0;
-
- *natural = *minimal;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : widget = composant GTK à consulter. *
-* minimal = taille minimale. [OUT] *
-* natural = taille idéale. [OUT] *
-* *
-* Description : Fournit la largeur de composant requise pour un plein rendu. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void gtk_buffer_view_get_preferred_width(GtkWidget *widget, gint *minimal, gint *natural)
-{
- GtkBufferView *view; /* Autre version du composant */
-
- view = GTK_BUFFER_VIEW(widget);
-
- if (view->buffer_view != NULL)
- *minimal = g_buffer_view_get_width(view->buffer_view,
- *GTK_VIEW_PANEL(view)->display_phys,
- *GTK_VIEW_PANEL(view)->display_addr,
- *GTK_VIEW_PANEL(view)->display_code);
- else
- *minimal = 0;
-
- *natural = *minimal;
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : view = composant GTK à mettre à jour. *
-* allocation = étendue accordée à la vue. *
-* *
-* Description : S'adapte à la surface concédée par le composant parent. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void gtk_buffer_view_size_allocate(GtkWidget *widget, GtkAllocation *allocation)
-{
- GtkViewPanel *panel; /* Autre version du composant */
- GtkBufferView *view; /* Encore une autre version */
- gint width; /* Largeur de l'objet actuelle */
- gint height; /* Hauteur de l'objet actuelle */
- GtkAllocation valloc; /* Surface utilisable */
- gboolean changed; /* Changement de valeur ? */
-
- /* Mise à jour GTK */
-
- gtk_widget_set_allocation(widget, allocation);
-
- if (gtk_widget_get_realized(widget))
- gdk_window_move_resize(gtk_widget_get_window(widget),
- allocation->x, allocation->y,
- allocation->width, allocation->height);
-
- panel = GTK_VIEW_PANEL(widget);
-
- if (panel->hadjustment == NULL || panel->vadjustment == NULL)
- return;
-
- view = GTK_BUFFER_VIEW(widget);
-
- width = g_buffer_view_get_width(view->buffer_view, *panel->display_phys, *panel->display_addr, *panel->display_code);
- height = g_buffer_view_get_height(view->buffer_view);
-
- gtk_view_panel_compute_allocation(panel, &valloc);
-
- /* Défilement horizontal */
-
- gtk_adjustment_set_page_size(panel->hadjustment, valloc.width);
- gtk_adjustment_set_step_increment(panel->hadjustment, valloc.width * 0.1);
- gtk_adjustment_set_page_increment(panel->hadjustment, valloc.width * 0.9);
-
- gtk_adjustment_set_upper(panel->hadjustment, MAX(width, valloc.width));
-
- gtk_view_panel_reclamp_adjustment(panel->hadjustment, &changed);
-
- gtk_adjustment_changed(panel->hadjustment);
-
- if (changed)
- gtk_adjustment_value_changed(panel->hadjustment);
-
- /* Défilement vertical */
-
- gtk_adjustment_set_page_size(panel->vadjustment, valloc.height);
- gtk_adjustment_set_step_increment(panel->vadjustment, view->line_height);
- gtk_adjustment_set_page_increment(panel->vadjustment, view->line_height * 10.0);
-
- gtk_adjustment_set_upper(panel->vadjustment, MAX(height, valloc.height));
-
- gtk_view_panel_reclamp_adjustment(panel->vadjustment, &changed);
-
- gtk_adjustment_changed(panel->vadjustment);
-
- if (changed)
- gtk_adjustment_value_changed(panel->vadjustment);
-
-}
-
-
-/******************************************************************************
-* *
* Paramètres : widget = composant GTK à redessiner. *
* cr = contexte graphique associé à l'événement. *
* *
@@ -479,38 +335,38 @@ static gboolean gtk_buffer_view_draw(GtkWidget *widget, cairo_t *cr)
{
GtkBufferView *view; /* Autre version du composant */
GtkViewPanel *pview; /* Autre version du composant */
+ GdkWindow *window; /* Fenêtre à redessiner */
cairo_region_t *region; /* Région visible à redessiner */
cairo_rectangle_int_t area; /* Surface correspondante */
+ GtkStyleContext *context; /* Contexte du thème actuel */
gint fake_x; /* Abscisse virtuelle */
gint fake_y; /* Ordonnée virtuelle */
- GtkStyleContext *context; /* Contexte du thème actuel */
- GdkRGBA color; /* Couleur du curseur */
view = GTK_BUFFER_VIEW(widget);
widget = GTK_WIDGET(view);
pview = GTK_VIEW_PANEL(widget);
- region = gdk_window_get_visible_region(gtk_widget_get_window(widget));
+ window = gtk_widget_get_window(widget);
+
+ cairo_save(cr);
+ gtk_cairo_transform_to_window(cr, widget, window);
+
+ region = gdk_window_get_clip_region(window);
cairo_region_get_extents(region, &area);
cairo_region_destroy(region);
- fake_x = 0;
- fake_y = 0;
- gtk_buffer_view_compute_fake_coord(view, &fake_x, &fake_y);
-
/* Dessin de la marge gauche */
context = gtk_widget_get_style_context(widget);
gtk_style_context_save(context);
+
gtk_style_context_add_class(context, GTK_STYLE_CLASS_TROUGH);
- gtk_style_context_get_color(context, GTK_STATE_FLAG_BACKDROP | GTK_STATE_FLAG_DIR_LTR, &color);
- gtk_style_context_restore(context);
- cairo_set_source_rgb(cr, color.red, color.green, color.blue);
+ gtk_render_background (context, cr, 0, area.y, view->left_margin, 300000);
+ gtk_render_frame (context, cr, 0, area.y - 10, view->left_margin, area.height + 20);
- cairo_rectangle(cr, fake_x, area.y, view->left_margin, area.y + area.height);
- cairo_fill(cr);
+ gtk_style_context_restore(context);
/* Eventuelle bordure globale */
@@ -519,9 +375,18 @@ static gboolean gtk_buffer_view_draw(GtkWidget *widget, cairo_t *cr)
/* Impression du désassemblage */
if (view->buffer_view != NULL)
+ {
+ fake_x = 0;
+ fake_y = 0;
+ gtk_buffer_view_compute_fake_coord(view, &fake_x, &fake_y);
+
g_buffer_view_draw(view->buffer_view, cr, fake_x, fake_y, &area,
*pview->display_phys, *pview->display_addr, *pview->display_code);
+ }
+
+ cairo_restore(cr);
+
return TRUE;
}
@@ -574,6 +439,42 @@ static gboolean gtk_buffer_view_key_press(GtkWidget *widget, GdkEventKey *event)
}
+
+
+
+/******************************************************************************
+* *
+* Paramètres : view = composant GTK à consulter. *
+* width = largeur requise à renseigner ou NULL. [OUT] *
+* height = hauteur requise à renseigner ou NULL. [OUT] *
+* *
+* Description : Indique les dimensions de travail du composant d'affichage. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void gtk_buffer_view_compute_requested_size(GtkBufferView *view, gint *width, gint *height)
+{
+ if (width != NULL && view->buffer_view != NULL)
+ *width = g_buffer_view_get_width(view->buffer_view,
+ *GTK_VIEW_PANEL(view)->display_phys,
+ *GTK_VIEW_PANEL(view)->display_addr,
+ *GTK_VIEW_PANEL(view)->display_code);
+
+ if (height != NULL && view->buffer_view != NULL)
+ *height = g_buffer_view_get_height(view->buffer_view);
+
+}
+
+
+
+
+
+
+
/******************************************************************************
* *
* Paramètres : view = composant GTK à consulter. *