diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2009-10-22 22:41:50 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2009-10-22 22:41:50 (GMT) |
commit | 30bc43ca00140bc215d6a1beb81ab5542e68d13b (patch) | |
tree | 205eb23f57545d195e1fcb8141ac80da28409f80 /src/gtkext/gtkgraphview.c | |
parent | b649c2c01ab407958f3b7057153fb02c9c7d0be1 (diff) |
Supported scrolling internally and thus fixed bugs with big binaries.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@132 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/gtkext/gtkgraphview.c')
-rw-r--r-- | src/gtkext/gtkgraphview.c | 183 |
1 files changed, 176 insertions, 7 deletions
diff --git a/src/gtkext/gtkgraphview.c b/src/gtkext/gtkgraphview.c index d62cc33..34e0e80 100644 --- a/src/gtkext/gtkgraphview.c +++ b/src/gtkext/gtkgraphview.c @@ -38,6 +38,9 @@ struct _GtkGraphView { GtkBinView parent; /* A laisser en premier */ + GtkFixed *support; /* Support des vues en bloc */ + + GtkRequisition requisition; /* Espace requis d'affichage */ vmpa_t start; /* Début de la portion vue */ vmpa_t end; /* Fin de la portion affichée */ @@ -68,12 +71,21 @@ static void gtk_graph_view_class_init(GtkGraphViewClass *); /* Initialise une instance d'afficheur de code en graphique. */ static void gtk_graph_view_init(GtkGraphView *); +/* Fournit la taille de composant requise pour un plein rendu. */ +static void gtk_graph_view_size_request(GtkWidget *, GtkRequisition *); + +/* S'adapte à la surface concédée par le composant parent. */ +static void gtk_graph_view_size_allocate(GtkWidget *, GtkAllocation *); + /* Met à jour l'affichage de la vue sous forme graphique. */ -static gboolean gtk_graph_view_expose(GtkGraphView *, GdkEventExpose *); +static gboolean gtk_graph_view_expose(GtkWidget *, GdkEventExpose *, GtkGraphView *); /* Supprime tout contenu de l'afficheur de code en graphique. */ static void gtk_graph_view_reset(GtkGraphView *); +/* Réagit à un défilement quelconque. */ +static void gtk_graph_view_scroll(GtkGraphView *); + /* Définit les lignes du graphique de représentation. */ static void gtk_graph_view_set_rendering_lines(GtkGraphView *, GRenderingLine *, GRenderingLine *); @@ -112,7 +124,8 @@ static void gtk_graph_view_class_init(GtkGraphViewClass *klass) widget_class = (GtkWidgetClass *)klass; - widget_class->expose_event = gtk_graph_view_expose; + widget_class->size_request = gtk_graph_view_size_request; + widget_class->size_allocate = gtk_graph_view_size_allocate; } @@ -132,13 +145,28 @@ static void gtk_graph_view_class_init(GtkGraphViewClass *klass) static void gtk_graph_view_init(GtkGraphView *view) { GtkBinView *binview; /* Instance parente */ + GdkColor white; /* Couleur de fond normale */ binview = GTK_BIN_VIEW(view); + binview->scroll = (scroll_fc)gtk_graph_view_scroll; binview->set_lines = (set_rendering_lines_fc)gtk_graph_view_set_rendering_lines; binview->define_address = (define_main_address_fc)gtk_graph_view_define_main_address; binview->get_coordinates = (get_addr_coordinates_fc)gtk_graph_view_get_address_coordinates; + view->support = GTK_FIXED(gtk_fixed_new()); + gtk_fixed_set_has_window(view->support, TRUE); + + g_signal_connect(G_OBJECT(view->support), "expose-event", + G_CALLBACK(gtk_graph_view_expose), view); + + gtk_widget_show(GTK_WIDGET(view->support)); + + gdk_color_white(gtk_widget_get_colormap(GTK_WIDGET(view->support)), &white); + gtk_widget_modify_bg(GTK_WIDGET(view->support), GTK_STATE_NORMAL, &white); + + gtk_fixed_put(GTK_FIXED(view), GTK_WIDGET(view->support), 0, 0); + view->mutex = g_mutex_new(); view->cond = g_cond_new(); @@ -147,6 +175,98 @@ static void gtk_graph_view_init(GtkGraphView *view) /****************************************************************************** * * +* Paramètres : widget = composant GTK à consulter. * +* requisition = dimensions souhaitées. [OUT] * +* * +* Description : Fournit la taille de composant requise pour un plein rendu. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ +static void gtk_graph_view_size_request(GtkWidget *widget, GtkRequisition *requisition) +{ + gpointer fixed_class; /* Classe parente */ + GtkGraphView *view; /* Autre vision du composant */ + + fixed_class = g_type_class_peek_parent(GTK_GRAPH_VIEW_GET_CLASS(widget)); + + GTK_WIDGET_CLASS(fixed_class)->size_request(GTK_FIXED(widget), requisition); + + view = GTK_GRAPH_VIEW(widget); + + if (view->requisition.width == 0 && view->requisition.height == 0) + view->requisition = *requisition; + +} + + +/****************************************************************************** +* * +* 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_graph_view_size_allocate(GtkWidget *widget, GtkAllocation *allocation) +{ + gpointer fixed_class; /* Classe parente */ + GtkBinView *view; /* Autre version du composant */ + GtkAllocation valloc; /* Surface utilisable */ + gboolean changed; /* Changement de valeur ? */ + + /* Mise à jour GTK */ + + fixed_class = g_type_class_peek_parent(GTK_GRAPH_VIEW_GET_CLASS(widget)); + + GTK_WIDGET_CLASS(fixed_class)->size_allocate(GTK_FIXED(widget), allocation); + + view = GTK_BIN_VIEW(widget); + + gtk_bin_view_compute_allocation(view, &valloc); + + /* Défilement horizontal */ + + view->hadjustment->page_size = valloc.width; + view->hadjustment->step_increment = valloc.width * 0.1; + view->hadjustment->page_increment = valloc.width * 0.9; + + view->hadjustment->upper = MAX(GTK_GRAPH_VIEW(view)->requisition.width, valloc.width); + + gtk_bin_view_reclamp_adjustment(view->hadjustment, &changed); + + gtk_adjustment_changed(view->hadjustment); + + if (changed) + gtk_adjustment_value_changed(view->hadjustment); + + /* Défilement vertical */ + + view->vadjustment->page_size = valloc.height; + view->vadjustment->step_increment = valloc.width * 0.1; + view->vadjustment->page_increment = valloc.width * 0.9; + + view->vadjustment->upper = MAX(GTK_GRAPH_VIEW(view)->requisition.height, valloc.height); + + gtk_bin_view_reclamp_adjustment(view->vadjustment, &changed); + + gtk_adjustment_changed(view->vadjustment); + + if (changed) + gtk_adjustment_value_changed(view->vadjustment); + +} + + +/****************************************************************************** +* * * Paramètres : - * * * * Description : Crée un nouveau composant pour l'affichage en graphique. * @@ -171,8 +291,9 @@ GtkWidget* gtk_graph_view_new(void) /****************************************************************************** * * -* Paramètres : view = composant GTK à redessiner. * -* event = informations liées à l'événement. * +* Paramètres : widget = composant GTK à redessiner. * +* event = informations liées à l'événement. * +* view = support maître à consulter. * * * * Description : Met à jour l'affichage de la vue sous forme graphique. * * * @@ -182,13 +303,13 @@ GtkWidget* gtk_graph_view_new(void) * * ******************************************************************************/ -static gboolean gtk_graph_view_expose(GtkGraphView *view, GdkEventExpose *event) +static gboolean gtk_graph_view_expose(GtkWidget *widget, GdkEventExpose *event, GtkGraphView *view) { size_t i; /* Boucle de parcours */ for (i = 0; i < view->links_count; i++) gtk_link_renderer_draw(view->links[i], - GDK_DRAWABLE(GTK_WIDGET(view)->window), + GDK_DRAWABLE(widget->window), GTK_BIN_VIEW(view)->gc); return FALSE; @@ -212,6 +333,9 @@ static void gtk_graph_view_reset(GtkGraphView *view) { size_t i; /* Boucle de parcours */ + view->requisition.width = 0; + view->requisition.height = 0; + view->start = 0; view->end = 0; @@ -247,6 +371,28 @@ static void gtk_graph_view_reset(GtkGraphView *view) + +/****************************************************************************** +* * +* Paramètres : view = composant GTK à mettre à jour. * +* * +* Description : Réagit à un défilement quelconque. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void gtk_graph_view_scroll(GtkGraphView *view) +{ + gtk_fixed_move(GTK_FIXED(view), GTK_WIDGET(view->support), + -GTK_BIN_VIEW(view)->hadjustment->value, + -GTK_BIN_VIEW(view)->vadjustment->value); + +} + + /****************************************************************************** * * * Paramètres : view = composant GTK à mettre à jour. * @@ -322,7 +468,7 @@ static void gtk_graph_view_define_main_address(GtkGraphView *view, vmpa_t addr) view->childs = gtk_graph_view_load_nodes(view, GTK_BIN_VIEW(view)->binary, first, last); - build_graph_view(GTK_FIXED(view), view->childs, view->childs_count); + build_graph_view(view, view->childs, view->childs_count); break; @@ -507,6 +653,29 @@ static void notify_graph_view(GtkBinView *view, GtkGraphView *parent) /****************************************************************************** * * +* Paramètres : view = composant GTK à mettre à jour. * +* widget = composant GTK à insérer. * +* x = abscisse du point d'insertion. * +* y = ordonnée du point d'insertion. * +* * +* Description : Place une vue sous forme de bloc dans le graphique. * +* * +* Retour : Plutôt que de redéfinir *toutes* les méthodes de * +* GtkContainer, on étend ! * +* * +* Remarques : - * +* * +******************************************************************************/ + +void gtk_graph_view_put(GtkGraphView *view, GtkWidget *widget, gint x, gint y) +{ + gtk_fixed_put(view->support, widget, x, y); + +} + + +/****************************************************************************** +* * * Paramètres : view = composant GTK à mettre à jour. * * links = liens graphiques entre les blocs à intégrer. * * count = quantité de ces liens graphiques. * |