[gtksourceview] completion: use new GtkTreeColumn for placeholder text and align to it.



commit 5555e6cdfcdf792881e32ce67ec96144cc4230ec
Author: Christian Hergert <christian hergert me>
Date:   Wed Aug 28 15:12:40 2013 -0700

    completion: use new GtkTreeColumn for placeholder text and align to it.
    
    The little bit of magic is the horizontal_separator and focus_padding
    values which were determined by reading the layout code of gtktreeview.
    If the column was the "expander-column", it would be a bit more complex
    but we don't have those thankfully.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=706465

 gtksourceview/gtksourcecompletion.c     |   58 ++++++++++++++++++++++++++++++-
 gtksourceview/gtksourcecompletion.ui    |    7 +++-
 gtksourceview/gtksourcecompletioninfo.c |   13 +++++++
 gtksourceview/gtksourcecompletioninfo.h |    4 ++
 4 files changed, 79 insertions(+), 3 deletions(-)
---
diff --git a/gtksourceview/gtksourcecompletion.c b/gtksourceview/gtksourcecompletion.c
index b06ba3f..75ced9b 100644
--- a/gtksourceview/gtksourcecompletion.c
+++ b/gtksourceview/gtksourcecompletion.c
@@ -60,6 +60,9 @@
  * displayed in a #GtkSourceCompletionInfo window, which appears when
  * the "Details" button is clicked.
  *
+ * The #GtkSourceCompletionInfo window for proposals will try to align the
+ * proposal text with the #GtkSourceView<!-- -->'s cursor.
+ *
  * A #GtkSourceCompletionInfo window can also be used to display
  * calltips. When no proposals are available, it can be useful to
  * display extra information like a function's prototype (number of
@@ -572,6 +575,52 @@ gtk_source_completion_hide_default (GtkSourceCompletion *completion)
 }
 
 static void
+gtk_source_completion_proposals_size_allocate (GtkSourceCompletion *completion,
+                                              GtkAllocation       *allocation,
+                                              GtkWidget           *widget)
+{
+       GtkTreeViewColumn *column;
+       gint cell_offset = 0;
+       gint column_offset;
+       gint focus_padding;
+       gint horizontal_separator;
+       gint x_offset = 0;
+
+       if (!gtk_widget_get_realized (GTK_WIDGET (completion->priv->tree_view_proposals)))
+       {
+               return;
+       }
+
+       gtk_widget_style_get (GTK_WIDGET (completion->priv->tree_view_proposals),
+                             "focus-padding", &focus_padding,
+                             "horizontal-separator", &horizontal_separator,
+                             NULL);
+
+       column = gtk_tree_view_get_column (completion->priv->tree_view_proposals, 1);
+       column_offset = gtk_tree_view_column_get_x_offset (column);
+       gtk_tree_view_column_cell_get_position (column,
+                                               completion->priv->cell_renderer_proposal,
+                                               &cell_offset,
+                                               NULL);
+
+       x_offset = column_offset + cell_offset + horizontal_separator + focus_padding;
+
+       gtk_tree_view_convert_bin_window_to_widget_coords (completion->priv->tree_view_proposals,
+                                                          x_offset,
+                                                          0,
+                                                          &x_offset,
+                                                          NULL);
+       gtk_widget_translate_coordinates (GTK_WIDGET (completion->priv->tree_view_proposals),
+                                         GTK_WIDGET (completion->priv->main_window),
+                                         x_offset,
+                                         0,
+                                         &x_offset,
+                                         NULL);
+
+       _gtk_source_completion_info_set_xoffset (completion->priv->main_window, -x_offset);
+}
+
+static void
 gtk_source_completion_activate_proposal (GtkSourceCompletion *completion)
 {
        GtkSourceCompletionProvider *provider = NULL;
@@ -2178,6 +2227,11 @@ init_tree_view (GtkSourceCompletion *completion,
                                  G_CALLBACK (gtk_source_completion_activate_proposal),
                                  completion);
 
+       g_signal_connect_swapped (completion->priv->tree_view_proposals,
+                                 "size-allocate",
+                                 G_CALLBACK (gtk_source_completion_proposals_size_allocate),
+                                 completion);
+
        /* Selection */
 
        selection = gtk_tree_view_get_selection (completion->priv->tree_view_proposals);
@@ -2196,7 +2250,7 @@ init_tree_view (GtkSourceCompletion *completion,
 
        cell_renderer = GTK_CELL_RENDERER (gtk_builder_get_object (builder, "cell_renderer_icon"));
 
-       column = GTK_TREE_VIEW_COLUMN (gtk_builder_get_object (builder, "tree_view_column_proposal"));
+       column = GTK_TREE_VIEW_COLUMN (gtk_builder_get_object (builder, "tree_view_column_icon"));
 
        gtk_tree_view_column_set_attributes (column, cell_renderer,
                                             "pixbuf", GTK_SOURCE_COMPLETION_MODEL_COLUMN_ICON,
@@ -2221,6 +2275,8 @@ init_tree_view (GtkSourceCompletion *completion,
        cell_renderer = GTK_CELL_RENDERER (gtk_builder_get_object (builder, "cell_renderer_proposal"));
        completion->priv->cell_renderer_proposal = cell_renderer;
 
+       column = GTK_TREE_VIEW_COLUMN (gtk_builder_get_object (builder, "tree_view_column_proposal"));
+
        gtk_tree_view_column_set_attributes (column, cell_renderer,
                                             "markup", GTK_SOURCE_COMPLETION_MODEL_COLUMN_MARKUP,
                                             "cell-background-set", 
GTK_SOURCE_COMPLETION_MODEL_COLUMN_IS_HEADER,
diff --git a/gtksourceview/gtksourcecompletion.ui b/gtksourceview/gtksourcecompletion.ui
index 5a8f70e..45f7688 100644
--- a/gtksourceview/gtksourcecompletion.ui
+++ b/gtksourceview/gtksourcecompletion.ui
@@ -55,11 +55,14 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
                 <property name="show_expanders">False</property>
                 <property name="expand">True</property>
                 <child>
-                  <object class="GtkTreeViewColumn" id="tree_view_column_proposal">
-                    <property name="expand">True</property>
+                  <object class="GtkTreeViewColumn" id="tree_view_column_icon">
                     <child>
                       <object class="GtkCellRendererPixbuf" id="cell_renderer_icon"/>
                     </child>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkTreeViewColumn" id="tree_view_column_proposal">
                     <child>
                       <object class="GtkCellRendererText" id="cell_renderer_proposal"/>
                     </child>
diff --git a/gtksourceview/gtksourcecompletioninfo.c b/gtksourceview/gtksourcecompletioninfo.c
index 49e1747..3e95624 100644
--- a/gtksourceview/gtksourcecompletioninfo.c
+++ b/gtksourceview/gtksourcecompletioninfo.c
@@ -65,6 +65,8 @@ struct _GtkSourceCompletionInfoPrivate
 
        GtkWidget *attached_to;
        gulong focus_out_event_handler;
+
+       gint xoffset;
 };
 
 /* Signals */
@@ -327,6 +329,15 @@ gtk_source_completion_info_class_init (GtkSourceCompletionInfoClass *klass)
                              0);
 }
 
+void
+_gtk_source_completion_info_set_xoffset (GtkSourceCompletionInfo *window,
+                                        gint                     xoffset)
+{
+       g_return_if_fail (GTK_SOURCE_IS_COMPLETION_INFO (window));
+
+       window->priv->xoffset = xoffset;
+}
+
 /* Move to iter */
 
 static void
@@ -478,6 +489,8 @@ move_to_iter (GtkSourceCompletionInfo *window,
                overlapup = TRUE;
        }
 
+       x += window->priv->xoffset;
+
        /* Make sure that text is still readable */
        move_overlap (&y, h, oy, cy, height, overlapup);
 
diff --git a/gtksourceview/gtksourcecompletioninfo.h b/gtksourceview/gtksourcecompletioninfo.h
index ee0963b..6604685 100644
--- a/gtksourceview/gtksourcecompletioninfo.h
+++ b/gtksourceview/gtksourcecompletioninfo.h
@@ -62,6 +62,10 @@ void          gtk_source_completion_info_move_to_iter        (GtkSourceCompletionInfo 
*info,
                                                                 GtkTextView             *view,
                                                                 GtkTextIter             *iter);
 
+G_GNUC_INTERNAL
+void            _gtk_source_completion_info_set_xoffset        (GtkSourceCompletionInfo *info,
+                                                                gint                     xoffset);
+
 G_DEPRECATED_FOR (gtk_container_add)
 void            gtk_source_completion_info_set_widget          (GtkSourceCompletionInfo *info,
                                                                 GtkWidget               *widget);


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