[gnome-builder/wip/gtk4-port] libide/sourceview: override highlight-current-line



commit e71f3ec82dfbcb25629240db28d4e545134dd4cd
Author: Christian Hergert <chergert redhat com>
Date:   Mon May 2 13:09:55 2022 -0700

    libide/sourceview: override highlight-current-line
    
    This brings back our override we had before which allows us to not show
    highlights when we have the document open in multiple places to avoid
    confusion on where focus is.

 src/libide/sourceview/ide-source-view-private.h |  3 +
 src/libide/sourceview/ide-source-view.c         | 87 ++++++++++++++++++++++++-
 src/libide/sourceview/ide-source-view.h         |  5 ++
 3 files changed, 94 insertions(+), 1 deletion(-)
---
diff --git a/src/libide/sourceview/ide-source-view-private.h b/src/libide/sourceview/ide-source-view-private.h
index f88ea6974..affcf07b7 100644
--- a/src/libide/sourceview/ide-source-view-private.h
+++ b/src/libide/sourceview/ide-source-view-private.h
@@ -61,6 +61,9 @@ struct _IdeSourceView
    */
   IdeExtensionSetAdapter *completion_providers;
   IdeExtensionSetAdapter *hover_providers;
+
+  /* Bitfield values go here */
+  guint highlight_current_line : 1;
 };
 
 
diff --git a/src/libide/sourceview/ide-source-view.c b/src/libide/sourceview/ide-source-view.c
index 3f0ea1932..29b5e12b9 100644
--- a/src/libide/sourceview/ide-source-view.c
+++ b/src/libide/sourceview/ide-source-view.c
@@ -35,7 +35,10 @@ enum {
   PROP_FONT_SCALE,
   PROP_LINE_HEIGHT,
   PROP_ZOOM_LEVEL,
-  N_PROPS
+  N_PROPS,
+
+  /* Property Overrides */
+  PROP_HIGHLIGHT_CURRENT_LINE,
 };
 
 enum {
@@ -433,6 +436,35 @@ ide_source_view_menu_popup_action (GtkWidget  *widget,
   IDE_EXIT;
 }
 
+static void
+ide_source_view_focus_enter_cb (IdeSourceView           *self,
+                                GtkEventControllerFocus *focus)
+{
+  IDE_ENTRY;
+
+  g_assert (IDE_IS_SOURCE_VIEW (self));
+  g_assert (GTK_IS_EVENT_CONTROLLER_FOCUS (focus));
+
+  if (self->highlight_current_line)
+    gtk_source_view_set_highlight_current_line (GTK_SOURCE_VIEW (self), TRUE);
+
+  IDE_EXIT;
+}
+
+static void
+ide_source_view_focus_leave_cb (IdeSourceView           *self,
+                                GtkEventControllerFocus *focus)
+{
+  IDE_ENTRY;
+
+  g_assert (IDE_IS_SOURCE_VIEW (self));
+  g_assert (GTK_IS_EVENT_CONTROLLER_FOCUS (focus));
+
+  gtk_source_view_set_highlight_current_line (GTK_SOURCE_VIEW (self), FALSE);
+
+  IDE_EXIT;
+}
+
 static void
 ide_source_view_size_allocate (GtkWidget *widget,
                                int        width,
@@ -499,6 +531,10 @@ ide_source_view_get_property (GObject    *object,
       g_value_set_int (value, self->font_scale);
       break;
 
+    case PROP_HIGHLIGHT_CURRENT_LINE:
+      g_value_set_boolean (value, ide_source_view_get_highlight_current_line (self));
+      break;
+
     case PROP_LINE_HEIGHT:
       g_value_set_double (value, self->line_height);
       break;
@@ -531,6 +567,10 @@ ide_source_view_set_property (GObject      *object,
       g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_ZOOM_LEVEL]);
       break;
 
+    case PROP_HIGHLIGHT_CURRENT_LINE:
+      ide_source_view_set_highlight_current_line (self, g_value_get_boolean (value));
+      break;
+
     case PROP_LINE_HEIGHT:
       if (self->line_height != g_value_get_double (value))
         {
@@ -559,6 +599,10 @@ ide_source_view_class_init (IdeSourceViewClass *klass)
   widget_class->root = ide_source_view_root;
   widget_class->size_allocate = ide_source_view_size_allocate;
 
+  g_object_class_override_property (object_class,
+                                    PROP_HIGHLIGHT_CURRENT_LINE,
+                                    "highlight-current-line");
+
   properties [PROP_LINE_HEIGHT] =
     g_param_spec_double ("line-height",
                          "Line height",
@@ -616,6 +660,7 @@ ide_source_view_init (IdeSourceView *self)
 {
   GtkStyleContext *style_context;
   GtkEventController *click;
+  GtkEventController *focus;
 
   g_signal_connect (self,
                     "notify::buffer",
@@ -640,6 +685,18 @@ ide_source_view_init (IdeSourceView *self)
                             self);
   gtk_widget_add_controller (GTK_WIDGET (self), click);
 
+  /* Setup focus tracking */
+  focus = gtk_event_controller_focus_new ();
+  g_signal_connect_swapped (focus,
+                            "enter",
+                            G_CALLBACK (ide_source_view_focus_enter_cb),
+                            self);
+  g_signal_connect_swapped (focus,
+                            "leave",
+                            G_CALLBACK (ide_source_view_focus_leave_cb),
+                            self);
+  gtk_widget_add_controller (GTK_WIDGET (self), focus);
+
   /* This is sort of a layer vioaltion, but it's helpful for us to
    * get the system font name and manage it invisibly.
    */
@@ -931,3 +988,31 @@ ide_source_view_jump_to_iter (IdeSourceView     *self,
   gtk_adjustment_set_value (hadj, xvalue);
   gtk_adjustment_set_value (vadj, yvalue + top_margin);
 }
+
+gboolean
+ide_source_view_get_highlight_current_line (IdeSourceView *self)
+{
+  g_return_val_if_fail (IDE_IS_SOURCE_VIEW (self), FALSE);
+
+  return self->highlight_current_line;
+}
+
+void
+ide_source_view_set_highlight_current_line (IdeSourceView *self,
+                                            gboolean       highlight_current_line)
+{
+  g_return_if_fail (IDE_IS_SOURCE_VIEW (self));
+
+  highlight_current_line = !!highlight_current_line;
+
+  if (highlight_current_line != self->highlight_current_line)
+    {
+      self->highlight_current_line = highlight_current_line;
+
+      if (gtk_widget_has_focus (GTK_WIDGET (self)))
+        gtk_source_view_set_highlight_current_line (GTK_SOURCE_VIEW (self),
+                                                    highlight_current_line);
+      else
+        g_object_notify (G_OBJECT (self), "highlight-current-line");
+    }
+}
diff --git a/src/libide/sourceview/ide-source-view.h b/src/libide/sourceview/ide-source-view.h
index a540cb8c3..e243614d4 100644
--- a/src/libide/sourceview/ide-source-view.h
+++ b/src/libide/sourceview/ide-source-view.h
@@ -46,6 +46,11 @@ void                        ide_source_view_get_visual_position (IdeSourceView
                                                                  guint                     *line,
                                                                  guint                     *line_column);
 IDE_AVAILABLE_IN_ALL
+gboolean                    ide_source_view_get_highlight_current_line (IdeSourceView *self);
+IDE_AVAILABLE_IN_ALL
+void                        ide_source_view_set_highlight_current_line (IdeSourceView *self,
+                                                                        gboolean highlight_current_line);
+IDE_AVAILABLE_IN_ALL
 double                      ide_source_view_get_zoom_level      (IdeSourceView             *self);
 IDE_AVAILABLE_IN_ALL
 void                        ide_source_view_set_font_desc       (IdeSourceView             *self,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]