Skip to content

Commit

Permalink
gtkplacessidebar: new bookmark row only at first position
Browse files Browse the repository at this point in the history
Following the new mockups, put the new bookmark row always
in the first position, so it's easier to drop an item.

https://bugzilla.gnome.org/show_bug.cgi?id=747793
  • Loading branch information
csoriano1618 committed Jun 16, 2015
1 parent e367c4b commit 4371cc8
Showing 1 changed file with 74 additions and 67 deletions.
141 changes: 74 additions & 67 deletions gtk/gtkplacessidebar.c
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,6 @@ struct _GtkPlacesSidebar {
GtkPlacesOpenFlags open_flags;

DropState drop_state;
gint new_bookmark_index;
guint drag_leave_timeout_id;
gchar *drop_target_uri;
guint switch_location_timer;
Expand Down Expand Up @@ -305,6 +304,7 @@ static void check_unmount_and_eject (GMount *mount,
GDrive *drive,
gboolean *show_unmount,
gboolean *show_eject);
static int bookmarks_get_first_index (GtkPlacesSidebar *sidebar);

/* Identifiers for target types */
enum {
Expand Down Expand Up @@ -1654,8 +1654,11 @@ remove_drop_bookmark_feedback_row (GtkPlacesSidebar *sidebar)
{
gboolean success;
GtkTreeIter iter;
int bookmarks_index;

success = gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (sidebar->store), &iter, NULL, sidebar->new_bookmark_index);
bookmarks_index = bookmarks_get_first_index (sidebar);

success = gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (sidebar->store), &iter, NULL, bookmarks_index);
g_assert (success);
gtk_list_store_remove (sidebar->store, &iter);

Expand All @@ -1664,76 +1667,48 @@ remove_drop_bookmark_feedback_row (GtkPlacesSidebar *sidebar)
}

static void
start_drop_feedback (GtkPlacesSidebar *sidebar,
GtkTreePath *path,
GtkTreeViewDropPosition pos,
gboolean drop_as_bookmarks)
show_new_bookmark_row (GtkPlacesSidebar *sidebar,
GtkTreePath *path)
{
if (drop_as_bookmarks)
{
gint new_bookmark_index;
GtkTreePath *new_path;
gboolean need_feedback_row;

new_bookmark_index = gtk_tree_path_get_indices (path)[0];
if (pos == GTK_TREE_VIEW_DROP_AFTER)
new_bookmark_index++;

if (sidebar->drop_state == DROP_STATE_NORMAL)
need_feedback_row = TRUE;
else
{
/* Feedback row already exists; remove it if its position needs to change */
if (sidebar->new_bookmark_index == new_bookmark_index)
need_feedback_row = FALSE;
else
{
if (sidebar->new_bookmark_index < new_bookmark_index)
new_bookmark_index--; /* since the removal of the old feedback row pushed items one position up */
GtkTreeIter iter;
int bookmarks_index;
gint drop_target_index;
GtkTreePath *new_bookmark_path;

remove_drop_bookmark_feedback_row (sidebar);
need_feedback_row = TRUE;
}
}
bookmarks_index = bookmarks_get_first_index (sidebar);

if (need_feedback_row)
{
GtkTreeIter iter;
GtkTreeIter iter_prev;
GtkTreePath *path_prev;
gint new_bookmark_col_index = 0;
SectionType section_type = SECTION_BOOKMARKS;

/* Use column index of previous bookmark to calculate index for "new bookmark" */
path_prev = gtk_tree_path_new_from_indices (sidebar->new_bookmark_index - 1, -1);
if (gtk_tree_model_get_iter (GTK_TREE_MODEL (sidebar->store), &iter_prev, path_prev))
gtk_tree_model_get (GTK_TREE_MODEL (sidebar->store), &iter_prev,
PLACES_SIDEBAR_COLUMN_SECTION_TYPE, &section_type,
PLACES_SIDEBAR_COLUMN_INDEX, &new_bookmark_col_index, -1);

if (section_type != SECTION_BOOKMARKS)
new_bookmark_col_index = 0;
else
new_bookmark_col_index++;

sidebar->new_bookmark_index = new_bookmark_index;
gtk_list_store_insert_with_values (sidebar->store, &iter, sidebar->new_bookmark_index,
PLACES_SIDEBAR_COLUMN_ROW_TYPE, PLACES_DROP_FEEDBACK,
PLACES_SIDEBAR_COLUMN_SECTION_TYPE, SECTION_BOOKMARKS,
PLACES_SIDEBAR_COLUMN_NAME, _("New bookmark"),
PLACES_SIDEBAR_COLUMN_INDEX, new_bookmark_col_index,
PLACES_SIDEBAR_COLUMN_NO_EJECT, TRUE,
-1);

gtk_tree_path_free (path_prev);
}
/* Add the row if it doesn't exists yet */
if (sidebar->drop_state == DROP_STATE_NORMAL)
{
gtk_list_store_insert_with_values (sidebar->store, &iter, bookmarks_index,
PLACES_SIDEBAR_COLUMN_ROW_TYPE, PLACES_DROP_FEEDBACK,
PLACES_SIDEBAR_COLUMN_SECTION_TYPE, SECTION_BOOKMARKS,
PLACES_SIDEBAR_COLUMN_NAME, _("New bookmark"),
PLACES_SIDEBAR_COLUMN_INDEX, bookmarks_index,
PLACES_SIDEBAR_COLUMN_NO_EJECT, TRUE,
-1);
}

new_path = gtk_tree_path_new_from_indices (sidebar->new_bookmark_index, -1);
gtk_tree_view_set_drag_dest_row (sidebar->tree_view, new_path, GTK_TREE_VIEW_DROP_INTO_OR_BEFORE);
gtk_tree_path_free (new_path);
sidebar->drop_state = DROP_STATE_NEW_BOOKMARK_ARMED;

sidebar->drop_state = DROP_STATE_NEW_BOOKMARK_ARMED;
/* Highlight the new bookmark row */
drop_target_index = gtk_tree_path_get_indices (path)[0];
if (drop_target_index == bookmarks_index)
{
new_bookmark_path = gtk_tree_path_new_from_indices (bookmarks_index, -1);
gtk_tree_view_set_drag_dest_row (sidebar->tree_view, new_bookmark_path, GTK_TREE_VIEW_DROP_INTO_OR_AFTER);
gtk_tree_path_free (new_bookmark_path);
}
}

static void
start_drop_feedback (GtkPlacesSidebar *sidebar,
GtkTreePath *path,
GtkTreeViewDropPosition pos,
gboolean drop_as_bookmarks)
{
if (drop_as_bookmarks)
show_new_bookmark_row (sidebar, path);
else
gtk_tree_view_set_drag_dest_row (sidebar->tree_view, path, pos);
}
Expand Down Expand Up @@ -3886,6 +3861,39 @@ tree_selection_func (GtkTreeSelection *selection,
return TRUE;
}

static int
bookmarks_get_first_index (GtkPlacesSidebar *sidebar)
{
GtkTreeIter iter;

g_return_val_if_fail (GTK_IS_PLACES_SIDEBAR (sidebar), -1);

if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (sidebar->store), &iter))
{
int bookmarks_heading_index = 0;

do
{
PlaceType place_type;
SectionType section_type;

gtk_tree_model_get (GTK_TREE_MODEL (sidebar->store), &iter,
PLACES_SIDEBAR_COLUMN_ROW_TYPE, &place_type,
PLACES_SIDEBAR_COLUMN_SECTION_TYPE, &section_type,
-1);
if (place_type == PLACES_HEADING && section_type == SECTION_BOOKMARKS)
return ++bookmarks_heading_index;

bookmarks_heading_index++;
}
while (gtk_tree_model_iter_next (GTK_TREE_MODEL (sidebar->store), &iter));
}

g_warning ("Index of bookmarks not calculable. No bookmarks heading");

return -1;
}

static void
icon_cell_renderer_func (GtkTreeViewColumn *column,
GtkCellRenderer *cell,
Expand Down Expand Up @@ -4283,7 +4291,6 @@ gtk_places_sidebar_init (GtkPlacesSidebar *sidebar)
sidebar);

sidebar->drop_state = DROP_STATE_NORMAL;
sidebar->new_bookmark_index = -1;

/* Don't bother trying to trace this across hierarchy changes... */
sidebar->gtk_settings = gtk_settings_get_default ();
Expand Down

0 comments on commit 4371cc8

Please sign in to comment.