summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2015-06-14 22:55:24 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2015-06-14 22:55:24 (GMT)
commitc987ca944052019957d3f31d69c679ed5ad994f2 (patch)
tree44f9c7a7f94925814ebebce50388935c83b34e88
parentc1b22ec0aa497a212ef897f3f8fffedf07cd45a6 (diff)
Been able to move the caret when scrolling to a given address.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@541 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
-rw-r--r--ChangeLog16
-rw-r--r--src/glibext/gcodebuffer.c35
-rw-r--r--src/glibext/gcodebuffer.h3
-rw-r--r--src/gtkext/gtkbufferview.c5
-rw-r--r--src/gtkext/gtkgraphview.c48
-rw-r--r--src/gtkext/gtkviewpanel-int.h4
-rw-r--r--src/gtkext/gtkviewpanel.c7
-rw-r--r--src/gtkext/gtkviewpanel.h4
8 files changed, 119 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index c64203f..7574a78 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+15-06-15 Cyrille Bagard <nocbos@gmail.com>
+
+ * src/glibext/gcodebuffer.c:
+ * src/glibext/gcodebuffer.h:
+ Compute and provide the width before the header column.
+
+ * src/gtkext/gtkbufferview.c:
+ * src/gtkext/gtkgraphview.c:
+ Register _gtk_*_view_move_caret_to() as a class function.
+ Get more accurate when computing new caret abscissa locations.
+
+ * src/gtkext/gtkviewpanel.c:
+ * src/gtkext/gtkviewpanel.h:
+ * src/gtkext/gtkviewpanel-int.h:
+ Be able to move the caret when scrolling to a given address.
+
15-06-14 Cyrille Bagard <nocbos@gmail.com>
* src/arch/arm/v7/opdefs/pop_A88131.d:
diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c
index 9b13875..a27b202 100644
--- a/src/glibext/gcodebuffer.c
+++ b/src/glibext/gcodebuffer.c
@@ -1313,6 +1313,41 @@ gint g_buffer_view_get_width(GBufferView *view, const bool *display)
}
+/******************************************************************************
+* *
+* Paramètres : view = visualisation à consulter. *
+* display = règles d'affichage des colonnes modulables. *
+* *
+* Description : Fournit la largeur requise pour dépasser les marges gauches. *
+* *
+* Retour : Dimension calculée. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+gint g_buffer_view_get_margin(GBufferView *view, const bool *display)
+{
+ gint result; /* Taille à retourner */
+ BufferLineColumn i; /* Boucle de parcours */
+
+ if (!WIDTHS_CACHED(view))
+ g_buffer_view_compute_required_widths(view, display);
+
+ result = view->left_text;
+
+ for (i = 0; i < BLC_DISPLAY; i++)
+ {
+ if (!display[i]) continue;
+
+ result += view->max_widths[i] + COL_MARGIN;
+
+ }
+
+ return result;
+
+}
+
/******************************************************************************
* *
diff --git a/src/glibext/gcodebuffer.h b/src/glibext/gcodebuffer.h
index 52c74ed..5cde79c 100644
--- a/src/glibext/gcodebuffer.h
+++ b/src/glibext/gcodebuffer.h
@@ -128,6 +128,9 @@ gint g_buffer_view_get_line_height(GBufferView *);
/* Fournit la largeur requise par une visualisation. */
gint g_buffer_view_get_width(GBufferView *, const bool *);
+/* Fournit la largeur requise pour dépasser les marges gauches. */
+gint g_buffer_view_get_margin(GBufferView *, const bool *);
+
/* Fournit la hauteur requise par une visualisation. */
gint g_buffer_view_get_height(const GBufferView *);
diff --git a/src/gtkext/gtkbufferview.c b/src/gtkext/gtkbufferview.c
index 7f62963..2884383 100644
--- a/src/gtkext/gtkbufferview.c
+++ b/src/gtkext/gtkbufferview.c
@@ -147,6 +147,7 @@ static void gtk_buffer_view_class_init(GtkBufferViewClass *class)
panel_class->adjust = (adjust_scroll_value_fc)gtk_buffer_view_adjust_scroll_value;
panel_class->get_coordinates = (get_addr_coordinates_fc)gtk_buffer_view_get_address_coordinates;
panel_class->get_position = (get_view_position_fc)gtk_buffer_view_get_position;
+ panel_class->move_caret_to = (move_caret_to_fc)_gtk_buffer_view_move_caret_to;
panel_class->cache_glance = (cache_glance_fc)gtk_buffer_view_cache_glance;
g_signal_new("caret-moved",
@@ -478,7 +479,7 @@ static gboolean gtk_buffer_view_key_press(GtkWidget *widget, GdkEventKey *event)
if (addr != NULL)
{
gtk_buffer_view_relocate_caret(view, &area, addr);
- gtk_view_panel_scroll_to_address(pview, addr, SPT_RAW);
+ _gtk_view_panel_scroll_to_address(pview, addr, SPT_RAW, false);
}
else
g_signal_emit_by_name(view, "reach-limit", dir);
@@ -754,6 +755,8 @@ static bool gtk_buffer_view_get_address_coordinates(const GtkBufferView *view, c
if (result)
{
+ *x += g_buffer_view_get_margin(view->buffer_view, GTK_VIEW_PANEL(view)->display);
+
height = gtk_widget_get_allocated_height(GTK_WIDGET(view));
switch (tweak)
diff --git a/src/gtkext/gtkgraphview.c b/src/gtkext/gtkgraphview.c
index 1b18c64..ac78981 100644
--- a/src/gtkext/gtkgraphview.c
+++ b/src/gtkext/gtkgraphview.c
@@ -86,6 +86,9 @@ static void gtk_graph_view_define_main_address(GtkGraphView *, const vmpa2t *);
/* Indique la position d'affichage d'une adresse donnée. */
static bool gtk_graph_view_get_address_coordinates(const GtkGraphView *, const vmpa2t *addr, gint *x, gint *y, ScrollPositionTweak tweak);
+/* Déplace le curseur à un emplacement défini. */
+static bool gtk_graph_view_move_caret_to(GtkGraphView *, gint, gint);
+
/* Place en cache un rendu destiné à l'aperçu graphique rapide. */
static void gtk_graph_view_cache_glance(GtkGraphView *, cairo_t *, const GtkAllocation *, double);
@@ -129,6 +132,7 @@ static void gtk_graph_view_class_init(GtkGraphViewClass *class)
panel_class->adjust = (adjust_scroll_value_fc)gtk_graph_view_adjust_scroll_value;
panel_class->define = (define_address_fc)gtk_graph_view_define_main_address;
panel_class->get_coordinates = (get_addr_coordinates_fc)gtk_graph_view_get_address_coordinates;
+ panel_class->move_caret_to = (move_caret_to_fc)gtk_graph_view_move_caret_to;
panel_class->cache_glance = (cache_glance_fc)gtk_graph_view_cache_glance;
}
@@ -401,6 +405,50 @@ static bool gtk_graph_view_get_address_coordinates(const GtkGraphView *view, con
/******************************************************************************
* *
+* Paramètres : view = composant GTK à manipuler. *
+* x = abscisse proposée pour le nouvel emplacement. *
+* y = ordonnée proposée pour le nouvel emplacement. *
+* *
+* Description : Déplace le curseur à un emplacement défini. *
+* *
+* Retour : true si un traitement a été effectué, false sinon. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static bool gtk_graph_view_move_caret_to(GtkGraphView *view, gint x, gint y)
+{
+ bool result; /* Bilan à retourner */
+ size_t i; /* Boucle de parcours */
+ GtkViewPanel *pview; /* Autre vision d'enfance */
+ gint sub_x; /* Abscisse relative à l'enfant*/
+ gint sub_y; /* Ordonnée relative à l'enfant*/
+
+ result = false;
+
+ for (i = 0; i < view->children_count; i++)
+ {
+ if (x < view->allocs[i].x || x >= (view->allocs[i].x + view->allocs[i].width)) continue;
+ if (y < view->allocs[i].y || y >= (view->allocs[i].y + view->allocs[i].height)) continue;
+
+ pview = GTK_VIEW_PANEL(view->children[i]);
+
+ sub_x = x - view->allocs[i].x;
+ sub_y = y - view->allocs[i].y;
+
+ result = GTK_VIEW_PANEL_GET_CLASS(pview)->move_caret_to(pview, sub_x, sub_y);
+ break;
+
+ }
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : view = composant GTK à manipuler. *
* cairo = assistant pour la création de rendus. *
* area = taille de la surface réduite à disposition. *
diff --git a/src/gtkext/gtkviewpanel-int.h b/src/gtkext/gtkviewpanel-int.h
index e51dbac..5fbcd76 100644
--- a/src/gtkext/gtkviewpanel-int.h
+++ b/src/gtkext/gtkviewpanel-int.h
@@ -57,6 +57,9 @@ typedef bool (* get_addr_coordinates_fc) (const GtkViewPanel *, const vmpa2t *,
/* Fournit des éléments liés à la position courante dans la vue. */
typedef bool (* get_view_position_fc) (const GtkViewPanel *, GBufferLine **, GBufferSegment **);
+/* Déplace le curseur à un emplacement défini. */
+typedef bool (* move_caret_to_fc) (GtkViewPanel *, gint, gint);
+
/* Place en cache un rendu destiné à l'aperçu graphique rapide. */
typedef void (* cache_glance_fc) (GtkViewPanel *, cairo_t *, const GtkAllocation *, double);
@@ -95,6 +98,7 @@ struct _GtkViewPanelClass
define_address_fc define; /* Centrage sur une partie */
get_addr_coordinates_fc get_coordinates;/* Conversion adresse <-> pos. */
get_view_position_fc get_position; /* Indications sur la position */
+ move_caret_to_fc move_caret_to; /* Déplacement du curseur */
cache_glance_fc cache_glance; /* Cache de la mignature */
};
diff --git a/src/gtkext/gtkviewpanel.c b/src/gtkext/gtkviewpanel.c
index 4241538..091482b 100644
--- a/src/gtkext/gtkviewpanel.c
+++ b/src/gtkext/gtkviewpanel.c
@@ -800,6 +800,7 @@ GLoadedBinary *gtk_view_panel_get_binary(const GtkViewPanel *panel)
* Paramètres : panel = composant GTK à manipuler. *
* addr = adresse à présenter à l'écran. *
* tweak = adaptation finale à effectuer. *
+* move = doit-on déplacer le curseur à l'adresse indiquée ? *
* *
* Description : S'assure qu'une adresse donnée est visible à l'écran. *
* *
@@ -809,7 +810,7 @@ GLoadedBinary *gtk_view_panel_get_binary(const GtkViewPanel *panel)
* *
******************************************************************************/
-void gtk_view_panel_scroll_to_address(GtkViewPanel *panel, const vmpa2t *addr, ScrollPositionTweak tweak)
+void _gtk_view_panel_scroll_to_address(GtkViewPanel *panel, const vmpa2t *addr, ScrollPositionTweak tweak, bool move)
{
GtkWidget *parent; /* Support parent à valider */
gint x; /* Abscisse à garantir */
@@ -874,6 +875,10 @@ void gtk_view_panel_scroll_to_address(GtkViewPanel *panel, const vmpa2t *addr, S
else if ((y + step_inc) > (value + page_size))
gtk_adjustment_set_value(adj, y + step_inc - page_size);
+ /* Déplacement du curseur */
+
+ if (move && GTK_VIEW_PANEL_GET_CLASS(panel)->get_coordinates(panel, addr, &x, &y, SPT_RAW))
+ GTK_VIEW_PANEL_GET_CLASS(panel)->move_caret_to(panel, x, y);
}
diff --git a/src/gtkext/gtkviewpanel.h b/src/gtkext/gtkviewpanel.h
index 038e860..24f0640 100644
--- a/src/gtkext/gtkviewpanel.h
+++ b/src/gtkext/gtkviewpanel.h
@@ -79,7 +79,9 @@ typedef enum _ScrollPositionTweak
} ScrollPositionTweak;
/* S'assure qu'une adresse donnée est visible à l'écran. */
-void gtk_view_panel_scroll_to_address(GtkViewPanel *, const vmpa2t *, ScrollPositionTweak);
+void _gtk_view_panel_scroll_to_address(GtkViewPanel *, const vmpa2t *, ScrollPositionTweak, bool);
+
+#define gtk_view_panel_scroll_to_address(p, a, t) _gtk_view_panel_scroll_to_address(p, a, t, true)
/* Fournit des éléments liés à la position courante dans la vue. */
bool gtk_view_panel_get_position(const GtkViewPanel *, GBufferLine **, GBufferSegment **);