[nautilus/wip/csoriano/rename-popover] f



commit d1929cc3e5efd069cdd53a8b0cff6bef021910ec
Author: Carlos Soriano <csoriano gnome org>
Date:   Sat Aug 15 17:20:21 2015 +0200

    f

 libnautilus-private/nautilus-canvas-container.c |   41 ++++++++++++++
 libnautilus-private/nautilus-canvas-container.h |    1 +
 src/nautilus-canvas-view.c                      |   16 ++++++
 src/nautilus-file-name-dialog.ui                |   66 +++++++++++++++++++++++
 src/nautilus-list-view.c                        |   33 +++++++++++
 src/nautilus-view.c                             |   10 ++++
 src/nautilus-view.h                             |    2 +
 7 files changed, 169 insertions(+), 0 deletions(-)
---
diff --git a/libnautilus-private/nautilus-canvas-container.c b/libnautilus-private/nautilus-canvas-container.c
index a2620dc..d40b77a 100644
--- a/libnautilus-private/nautilus-canvas-container.c
+++ b/libnautilus-private/nautilus-canvas-container.c
@@ -6380,6 +6380,47 @@ nautilus_canvas_container_get_icon_locations (NautilusCanvasContainer *container
        return result;
 }
 
+/* Returns an array of GdkRectangles of the icons. */
+static GArray *
+nautilus_canvas_container_get_icons_bounding_box (NautilusCanvasContainer *container,
+                                                  GList                   *icons)
+{
+        GArray *result;
+        GList *node;
+        int index;
+        int x1, x2, y1, y2;
+
+        result = g_array_new (FALSE, TRUE, sizeof (GdkRectangle));
+        result = g_array_set_size (result, g_list_length (icons));
+
+        for (index = 0, node = icons; node != NULL; index++, node = node->next) {
+               icon_get_bounding_box ((NautilusCanvasIcon *)node->data,
+                                       &x1, &y1, &x2, &y2,
+                                      BOUNDS_USAGE_FOR_ENTIRE_ITEM);
+                g_array_index (result, GdkRectangle, index).x = x1;
+                g_array_index (result, GdkRectangle, index).width = x2 - x1;
+                g_array_index (result, GdkRectangle, index).y = y1;
+                g_array_index (result, GdkRectangle, index).height = y2 - y1;
+        }
+
+        return result;
+}
+
+GArray *
+nautilus_canvas_container_get_selected_icons_bounding_box (NautilusCanvasContainer *container)
+{
+        GArray *result;
+        GList *icons;
+
+        g_return_val_if_fail (NAUTILUS_IS_CANVAS_CONTAINER (container), NULL);
+
+        icons = nautilus_canvas_container_get_selected_icons (container);
+       result = nautilus_canvas_container_get_icons_bounding_box (container, icons);
+       g_list_free (icons);
+
+       return result;
+}
+
 /**
  * nautilus_canvas_container_get_selected_icon_locations:
  * @container: An canvas container widget.
diff --git a/libnautilus-private/nautilus-canvas-container.h b/libnautilus-private/nautilus-canvas-container.h
index 9519b4a..711b3ea 100644
--- a/libnautilus-private/nautilus-canvas-container.h
+++ b/libnautilus-private/nautilus-canvas-container.h
@@ -270,6 +270,7 @@ void                          nautilus_canvas_container_invert_selection                  
          (NautilusCanvasContainer
 void              nautilus_canvas_container_set_selection                 (NautilusCanvasContainer  *view,
                                                                           GList                  *selection);
 GArray    *       nautilus_canvas_container_get_selected_icon_locations   (NautilusCanvasContainer  *view);
+GArray    *       nautilus_canvas_container_get_selected_icons_bounding_box (NautilusCanvasContainer 
*container);
 gboolean          nautilus_canvas_container_has_stretch_handles           (NautilusCanvasContainer  
*container);
 gboolean          nautilus_canvas_container_is_stretched                  (NautilusCanvasContainer  
*container);
 void              nautilus_canvas_container_show_stretch_handles          (NautilusCanvasContainer  
*container);
diff --git a/src/nautilus-canvas-view.c b/src/nautilus-canvas-view.c
index 53e37d9..3c56279 100644
--- a/src/nautilus-canvas-view.c
+++ b/src/nautilus-canvas-view.c
@@ -1172,6 +1172,21 @@ nautilus_canvas_view_reveal_selection (NautilusView *view)
         nautilus_file_list_free (selection);
 }
 
+static GdkRectangle*
+nautilus_canvas_view_compute_rename_popover_relative_to (NautilusView *view)
+{
+        GArray *bounding_boxes;
+        GdkRectangle *bounding_box;
+
+        bounding_boxes = nautilus_canvas_container_get_selected_icons_bounding_box
+                      (get_canvas_container (NAUTILUS_CANVAS_VIEW (view)));
+        bounding_box = &g_array_index (bounding_boxes, GdkRectangle, 0);
+
+        g_array_free (bounding_boxes, FALSE);
+
+        return bounding_box;
+}
+
 static GArray *
 nautilus_canvas_view_get_selected_icon_locations (NautilusView *view)
 {
@@ -1877,6 +1892,7 @@ nautilus_canvas_view_class_init (NautilusCanvasViewClass *klass)
        nautilus_view_class->end_loading = nautilus_canvas_view_end_loading;
        nautilus_view_class->file_changed = nautilus_canvas_view_file_changed;
        nautilus_view_class->get_selected_icon_locations = nautilus_canvas_view_get_selected_icon_locations;
+       nautilus_view_class->compute_rename_popover_relative_to = 
nautilus_canvas_view_compute_rename_popover_relative_to;
        nautilus_view_class->get_selection = nautilus_canvas_view_get_selection;
        nautilus_view_class->get_selection_for_file_transfer = nautilus_canvas_view_get_selection;
        nautilus_view_class->is_empty = nautilus_canvas_view_is_empty;
diff --git a/src/nautilus-file-name-dialog.ui b/src/nautilus-file-name-dialog.ui
index 4e2c4c7..082ac3c 100644
--- a/src/nautilus-file-name-dialog.ui
+++ b/src/nautilus-file-name-dialog.ui
@@ -1,3 +1,69 @@
+  <object class="GtkPopover" id="rename_file_popover">
+    <property name="position">bottom</property>
+    <signal name="closed" handler="rename_file_end"/>
+    <child>
+      <object class="GtkGrid">
+        <property name="visible">True</property>
+        <property name="margin">10</property>
+        <property name="row-spacing">6</property>
+        <property name="column-spacing">6</property>
+        <child>
+          <object class="GtkLabel">
+            <property name="visible">True</property>
+            <property name="label" translatable="yes">Name</property>
+            <property name="halign">start</property>
+            <property name="mnemonic_widget">rename_file_name_entry</property>
+            <attributes>
+              <attribute name="weight" value="bold"/>
+            </attributes>
+          </object>
+          <packing>
+            <property name="width">2</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkEntry" id="rename_file_name_entry">
+            <property name="visible">True</property>
+            <property name="activates-default">True</property>
+            <signal name="notify::text" handler="nautilus_view_file_name_dialog_entry_on_validate" 
swapped="no" />
+            <signal name="activate" handler="nautilus_view_file_name_dialog_entry_on_activate" swapped="no" 
/>
+          </object>
+          <packing>
+            <property name="left-attach">0</property>
+            <property name="top-attach">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkButton" id="rename">
+            <property name="visible">True</property>
+            <property name="sensitive">False</property>
+            <property name="label" translatable="yes">_Rename</property>
+            <property name="use_underline">True</property>
+            <property name="can_default">True</property>
+            <signal name="clicked" handler="rename_file_rename_clicked"/>
+            <style>
+              <class name="suggested-action"/>
+            </style>
+          </object>
+          <packing>
+            <property name="left-attach">1</property>
+            <property name="top-attach">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="error_label">
+            <property name="visible">True</property>
+            <property name="halign">start</property>
+          </object>
+          <packing>
+            <property name="left-attach">0</property>
+            <property name="top-attach">2</property>
+            <property name="width">2</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <requires lib="gtk+" version="3.14"/>
diff --git a/src/nautilus-list-view.c b/src/nautilus-list-view.c
index 20a4882..009e2b7 100644
--- a/src/nautilus-list-view.c
+++ b/src/nautilus-list-view.c
@@ -3240,6 +3240,38 @@ nautilus_list_view_get_id (NautilusView *view)
        return NAUTILUS_LIST_VIEW_ID;
 }
 
+static GdkRectangle*
+nautilus_list_view_compute_rename_popover_relative_to (NautilusView *view)
+{
+        GtkTreeSelection *selection;
+        GtkTreePath *path;
+        GdkRectangle *rect;
+        GtkTreeModel *model;
+        GtkTreeView *tree_view;
+        GList *list;
+        NautilusListView *list_view;
+
+        rect = g_malloc0 (sizeof(GdkRectangle));
+        list_view = NAUTILUS_LIST_VIEW (view);
+        tree_view = list_view->details->tree_view;
+        selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (list_view->details->tree_view));
+        model = GTK_TREE_MODEL (list_view->details->model);
+        list = gtk_tree_selection_get_selected_rows (selection, &model);
+        path = list->data;
+        gtk_tree_view_get_cell_area (tree_view, path, NULL, rect);
+        gtk_tree_view_convert_bin_window_to_widget_coords (tree_view,
+                                                           rect->x, rect->y,
+                                                           &rect->x, &rect->y);
+
+        rect->x = CLAMP (gtk_widget_get_allocated_width (GTK_WIDGET (tree_view)) * 0.5 - 20, 0,
+                         gtk_widget_get_allocated_width (GTK_WIDGET (tree_view)) - 40);
+        rect->width = 40;
+
+        g_list_free_full (list, (GDestroyNotify) gtk_tree_path_free);
+
+        return rect;
+}
+
 static void
 nautilus_list_view_class_init (NautilusListViewClass *class)
 {
@@ -3277,6 +3309,7 @@ nautilus_list_view_class_init (NautilusListViewClass *class)
        nautilus_view_class->get_view_id = nautilus_list_view_get_id;
        nautilus_view_class->get_first_visible_file = nautilus_list_view_get_first_visible_file;
        nautilus_view_class->scroll_to_file = list_view_scroll_to_file;
+       nautilus_view_class->compute_rename_popover_relative_to = 
nautilus_list_view_compute_rename_popover_relative_to;
 }
 
 static void
diff --git a/src/nautilus-view.c b/src/nautilus-view.c
index 073bacc..8e63799 100644
--- a/src/nautilus-view.c
+++ b/src/nautilus-view.c
@@ -1888,6 +1888,12 @@ nautilus_view_rename_dialog_on_response (GtkDialog *dialog,
        gtk_widget_destroy (GTK_WIDGET (dialog));
 }
 
+static GdkRectangle*
+nautilus_view_compute_rename_popover_relative_to (NautilusView *view)
+{
+       return NAUTILUS_VIEW_CLASS (G_OBJECT_GET_CLASS (view))->compute_rename_popover_relative_to (view);
+}
+
 static void
 nautilus_view_rename_dialog_new (NautilusView *view,
                                  NautilusFile *target_file)
@@ -1900,6 +1906,7 @@ nautilus_view_rename_dialog_new (NautilusView *view,
        gint start_offset, end_offset;
        gchar *file_name;
        gchar *title;
+        GdkRectangle *relative_to;
 
        builder = gtk_builder_new_from_resource ("/org/gnome/nautilus/nautilus-file-name-dialog.ui");
        button_ok = GTK_WIDGET (gtk_builder_get_object (builder, "ok_button"));
@@ -1958,6 +1965,9 @@ nautilus_view_rename_dialog_new (NautilusView *view,
         /* Update the ok button status */
         nautilus_view_file_name_dialog_validate_name (dialog_data);
 
+        relative_to = nautilus_view_compute_rename_popover_relative_to (view);
+        g_print ("Position %d %d %d %d\n", relative_to->x, relative_to->y, relative_to->width, 
relative_to->height);
+
        g_object_unref (builder);
 }
 
diff --git a/src/nautilus-view.h b/src/nautilus-view.h
index 93fbc89..3cc87da 100644
--- a/src/nautilus-view.h
+++ b/src/nautilus-view.h
@@ -276,6 +276,8 @@ struct NautilusViewClass {
                                                   const char            *uri);
 
        NautilusWindow * (*get_window)            (NautilusView *view);
+
+        GdkRectangle * (*compute_rename_popover_relative_to) (NautilusView *view);
 };
 
 /* GObject support */


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