diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2018-12-20 22:12:28 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2018-12-20 22:12:28 (GMT) |
commit | cffbe4839da452af215f05dfb7cc6c9304c1285e (patch) | |
tree | d2ea78b67592e868ed94ab189722670379cd2b67 /src/gtkext | |
parent | 0f58e137ff493ab38d2a7e6e2d5e5bc85951be3d (diff) |
Kept the current location when switching views.
Diffstat (limited to 'src/gtkext')
-rw-r--r-- | src/gtkext/graph/cluster.c | 25 | ||||
-rw-r--r-- | src/gtkext/graph/cluster.h | 3 | ||||
-rw-r--r-- | src/gtkext/gtkbufferdisplay.c | 56 | ||||
-rw-r--r-- | src/gtkext/gtkbufferdisplay.h | 3 | ||||
-rw-r--r-- | src/gtkext/gtkdisplaypanel.c | 31 | ||||
-rw-r--r-- | src/gtkext/gtkdisplaypanel.h | 4 | ||||
-rw-r--r-- | src/gtkext/gtkgraphdisplay.c | 58 |
7 files changed, 174 insertions, 6 deletions
diff --git a/src/gtkext/graph/cluster.c b/src/gtkext/graph/cluster.c index 9bbfb34..17af9ce 100644 --- a/src/gtkext/graph/cluster.c +++ b/src/gtkext/graph/cluster.c @@ -790,6 +790,31 @@ void g_graph_cluster_compute_needed_alloc(const GGraphCluster *cluster, GtkAlloc /****************************************************************************** * * +* Paramètres : cluster = encapsulation à consulter. * +* * +* Description : Fournit le composant graphique principal du groupe. * +* * +* Retour : Composant graphique principal utilisé. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GtkWidget *g_graph_cluster_get_widget(GGraphCluster *cluster) +{ + GtkWidget *result; + + result = cluster->display; + + g_object_ref(G_OBJECT(result)); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : cluster = encapsulation à traiter. * * display = support de destination finale. * * * diff --git a/src/gtkext/graph/cluster.h b/src/gtkext/graph/cluster.h index fbf2d10..11ce66e 100644 --- a/src/gtkext/graph/cluster.h +++ b/src/gtkext/graph/cluster.h @@ -56,6 +56,9 @@ GGraphCluster *g_graph_cluster_new(GCodeBlock *, segcnt_list *, GLoadedBinary *) /* Détermine l'emplacement requis d'un ensemble de blocs. */ void g_graph_cluster_compute_needed_alloc(const GGraphCluster *, GtkAllocation *); +/* Fournit le composant graphique principal du groupe. */ +GtkWidget *g_graph_cluster_get_widget(GGraphCluster *); + /* Dispose chaque noeud sur la surface de destination donnée. */ void g_graph_cluster_place(GGraphCluster *, GtkGraphDisplay *); diff --git a/src/gtkext/gtkbufferdisplay.c b/src/gtkext/gtkbufferdisplay.c index 1989b1c..a748cf2 100644 --- a/src/gtkext/gtkbufferdisplay.c +++ b/src/gtkext/gtkbufferdisplay.c @@ -212,6 +212,12 @@ static void gtk_buffer_display_init(GtkBufferDisplay *display) static void gtk_buffer_display_dispose(GtkBufferDisplay *display) { + if (display->caret_timer != 0) + { + g_source_remove(display->caret_timer); + display->caret_timer = 0; + } + g_clear_object(&display->view); g_clear_object(&display->cursor); @@ -814,6 +820,56 @@ GBufferView *gtk_buffer_display_get_view(const GtkBufferDisplay *display) /****************************************************************************** * * +* Paramètres : display = composant GTK à consulter. * +* cursor = définition générique d'une localisation à l'écran. * +* * +* Description : Détermine si une position est comprise dans l'affichage. * +* * +* Retour : true si le composant comprend bien la localisation fournie. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool gtk_buffer_display_contains_cursor(const GtkBufferDisplay *display, const GLineCursor *cursor) +{ + bool result; /* Bilan à retourner */ + GLineCursor *start; /* Position initiale du tampon */ + GLineCursor *end; /* Position finale du tampon */ + int status; /* Bilan d'une comparaison */ + + g_buffer_view_get_restrictions(display->view, &start, &end); + + if (start == NULL && end == NULL) + result = NULL; + + else + { + status = g_line_cursor_compare(start, cursor); + + if (status > 0) + result = false; + + else + { + status = g_line_cursor_compare(cursor, end); + + result = (status < 0); + + } + + g_object_unref(G_OBJECT(start)); + g_object_unref(G_OBJECT(end)); + + } + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : display = composant GTK à manipuler. * * x = abscisse proposée pour le nouvel emplacement. * * y = ordonnée proposée pour le nouvel emplacement. * diff --git a/src/gtkext/gtkbufferdisplay.h b/src/gtkext/gtkbufferdisplay.h index dc2e4ff..73fbbde 100644 --- a/src/gtkext/gtkbufferdisplay.h +++ b/src/gtkext/gtkbufferdisplay.h @@ -59,6 +59,9 @@ GBufferView *gtk_buffer_display_get_view(const GtkBufferDisplay *); /* ------------------------------ ANIMATION DU CURSEUR ------------------------------ */ +/* Détermine si une position est comprise dans l'affichage. */ +bool gtk_buffer_display_contains_cursor(const GtkBufferDisplay *, const GLineCursor *); + /* Déplace le curseur à un emplacement en extrémité. */ bool gtk_buffer_display_move_caret_to(GtkBufferDisplay *, bool, gint *); diff --git a/src/gtkext/gtkdisplaypanel.c b/src/gtkext/gtkdisplaypanel.c index 3623ced..93e47e7 100644 --- a/src/gtkext/gtkdisplaypanel.c +++ b/src/gtkext/gtkdisplaypanel.c @@ -887,6 +887,33 @@ const vmpa2t *gtk_display_panel_get_caret_location(const GtkDisplayPanel *panel) /****************************************************************************** * * +* Paramètres : panel = composant GTK à consulter. * +* cursor = emplacement à présenter à l'écran. * +* x = position horizontale au sein du composant. [OUT] * +* y = position verticale au sein du composant. [OUT] * +* tweak = adaptation finale à effectuer. * +* * +* Description : Indique la position d'affichage d'un emplacement donné. * +* * +* Retour : true si l'adresse fait partie du composant, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool gtk_display_panel_get_cursor_coordinates(const GtkDisplayPanel *panel, const GLineCursor *cursor, gint *x, gint *y, ScrollPositionTweak tweak) +{ + bool result; /* Bilan à remonter */ + + result = GTK_DISPLAY_PANEL_GET_CLASS(panel)->get_coordinates(panel, cursor, x, y, tweak); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : panel = composant GTK à consulter. * * * * Description : Fournit l'élément actif lié à la position courante. * @@ -1182,7 +1209,7 @@ static void gtk_display_panel_scroll_to_cursor(GtkDisplayPanel *panel, const GLi GTK_DISPLAY_PANEL_GET_CLASS(panel)->define(panel, addr); */ - if (GTK_DISPLAY_PANEL_GET_CLASS(panel)->get_coordinates(panel, cursor, &x, &y, tweak)) + if (gtk_display_panel_get_cursor_coordinates(panel, cursor, &x, &y, tweak)) { viewport = gtk_widget_get_parent(GTK_WIDGET(panel)); @@ -1216,7 +1243,7 @@ static void gtk_display_panel_scroll_to_cursor(GtkDisplayPanel *panel, const GLi /* Déplacement du curseur */ - if (move && GTK_DISPLAY_PANEL_GET_CLASS(panel)->get_coordinates(panel, cursor, &x, &y, SPT_RAW)) + if (move && gtk_display_panel_get_cursor_coordinates(panel, cursor, &x, &y, SPT_RAW)) GTK_DISPLAY_PANEL_GET_CLASS(panel)->move_caret_to(panel, x, y); } diff --git a/src/gtkext/gtkdisplaypanel.h b/src/gtkext/gtkdisplaypanel.h index 51648df..6baac64 100644 --- a/src/gtkext/gtkdisplaypanel.h +++ b/src/gtkext/gtkdisplaypanel.h @@ -30,6 +30,7 @@ #include "../arch/vmpa.h" +#include "../glibext/gloadedpanel.h" @@ -63,6 +64,9 @@ void gtk_display_panel_set_code_display(GtkDisplayPanel *, bool); /* Indique la position courante du curseur. */ const vmpa2t *gtk_display_panel_get_caret_location(const GtkDisplayPanel *); +/* Indique la position d'affichage d'un emplacement donné. */ +bool gtk_display_panel_get_cursor_coordinates(const GtkDisplayPanel *, const GLineCursor *, gint *, gint *, ScrollPositionTweak); + /* Fournit l'élément actif lié à la position courante. */ GObject *gtk_display_panel_get_active_object(const GtkDisplayPanel *); diff --git a/src/gtkext/gtkgraphdisplay.c b/src/gtkext/gtkgraphdisplay.c index 955f540..6187677 100644 --- a/src/gtkext/gtkgraphdisplay.c +++ b/src/gtkext/gtkgraphdisplay.c @@ -637,6 +637,7 @@ static void gtk_graph_display_define_main_address(GtkGraphDisplay *display, cons gint right; /* Abscisse du coin droit */ gint bottom; /* Ordonnée du coin inférieur */ GtkAllocation allocation; /* Espace alloué au panneau */ + GtkWidget *child; /* Composant sélectionné */ if (display->routine == NULL) need_update = true; @@ -694,6 +695,16 @@ static void gtk_graph_display_define_main_address(GtkGraphDisplay *display, cons gtk_graph_display_update_support_margins(display, &allocation); + /** + * Première sélection... + */ + + child = g_graph_cluster_get_widget(display->cluster); + + gtk_container_set_focus_child(GTK_CONTAINER(display->support), child); + + g_object_unref(G_OBJECT(child)); + ggddma_bad_type: g_object_unref(G_OBJECT(symbol)); @@ -746,9 +757,42 @@ static const vmpa2t *gtk_graph_display_get_caret_location(const GtkGraphDisplay static bool gtk_graph_display_get_cursor_coordinates(const GtkGraphDisplay *display, const GLineCursor *cursor, gint *x, gint *y, ScrollPositionTweak tweak) { - /* TODO */ + bool result; /* Bilan final à retourner */ + GList *children; /* Sous-composants à parcourir */ + GList *iter; /* Boucle de parcours */ + GtkWidget *child; /* Composant embarqué */ + GtkAllocation alloc; /* Emplacement réservé */ + + result = false; + + children = gtk_container_get_children(GTK_CONTAINER(display->support)); - return false; + for (iter = g_list_first(children); iter != NULL; iter = g_list_next(iter)) + { + child = GTK_WIDGET(iter->data); + + if (!GTK_IS_BUFFER_DISPLAY(child)) + continue; + + result = gtk_buffer_display_contains_cursor(GTK_BUFFER_DISPLAY(child), cursor); + + if (result) + { + result = gtk_display_panel_get_cursor_coordinates(GTK_DISPLAY_PANEL(child), cursor, x, y, tweak); + assert(result); + + gtk_widget_get_allocation(child, &alloc); + + *x += alloc.x; + *y += alloc.y; + break; + } + + } + + g_list_free(children); + + return result; } @@ -822,8 +866,14 @@ static bool gtk_graph_display_move_caret_to(GtkGraphDisplay *display, gint x, gi static GLineCursor *gtk_graph_display_get_cursor(const GtkGraphDisplay *display) { GLineCursor *result; /* Contenu à retourner */ + GtkWidget *child; /* Composant sélectionné */ + + child = gtk_container_get_focus_child(GTK_CONTAINER(display->support)); - result = NULL; + if (child != NULL) + result = g_loaded_panel_get_cursor(G_LOADED_PANEL(child)); + else + result = NULL; return result; @@ -1012,7 +1062,7 @@ static void gtk_graph_display_reset(GtkGraphDisplay *display, bool dispose) if (display->highlighted != NULL) { - exit_segment_content_list(display->highlighted); + unref_segment_content_list(display->highlighted); display->highlighted = NULL; } |