diff options
author | Jan-Michael Brummer <jan.brummer@tabos.org> | 2018-12-09 21:58:19 +0100 |
---|---|---|
committer | Jan-Michael Brummer <jan.brummer@tabos.org> | 2018-12-18 18:25:41 +0100 |
commit | 8857fb05038bf25266eb442acb1d1fbf541cc1ea (patch) | |
tree | 8fb66c011b8425624357c1c4edbf32e3d86f6ed3 /src/ephy-history-dialog.c | |
parent | 9c6cff8018828606ad086302dd39ac8ffb48898c (diff) | |
download | epiphany-8857fb05038bf25266eb442acb1d1fbf541cc1ea.tar.gz |
ephy-history-dialog: Change history dialog to be responsive
Diffstat (limited to 'src/ephy-history-dialog.c')
-rw-r--r-- | src/ephy-history-dialog.c | 621 |
1 files changed, 302 insertions, 319 deletions
diff --git a/src/ephy-history-dialog.c b/src/ephy-history-dialog.c index 6c81ecc6b..c3d4e8b2a 100644 --- a/src/ephy-history-dialog.c +++ b/src/ephy-history-dialog.c @@ -3,6 +3,7 @@ * Copyright © 2003, 2004 Marco Pesenti Gritti <mpeseng@tin.it> * Copyright © 2003, 2004 Christian Persch * Copyright © 2012 Igalia S.L + * Copyright © 2018 Jan-Michael Brummer * * This file is part of Epiphany. * @@ -38,29 +39,18 @@ #include <string.h> #include <time.h> -#define NUM_RESULTS_LIMIT -1 -/* 3/5 of gdkframeclockidle.c's FRAME_INTERVAL (16667 microsecs) */ -#define GTK_TREE_VIEW_TIME_MS_PER_IDLE 10 +#define NUM_FETCH_LIMIT 15 struct _EphyHistoryDialog { - GtkDialog parent_instance; + GtkWindow parent_instance; EphySnapshotService *snapshot_service; EphyHistoryService *history_service; GCancellable *cancellable; - GtkWidget *treeview; - GtkTreeSelection *tree_selection; - GtkWidget *liststore; - GtkTreeViewColumn *date_column; - GtkTreeViewColumn *name_column; - GtkTreeViewColumn *location_column; - GtkWidget *date_renderer; - GtkWidget *location_renderer; - GMenuModel *treeview_popup_menu_model; - + GtkWidget *listbox; GtkWidget *forget_all_button; - GtkWidget *forget_button; + GtkWidget *popover_menu; GActionGroup *action_group; @@ -69,13 +59,12 @@ struct _EphyHistoryDialog { char *search_text; - gboolean sort_ascending; - gint sort_column; + gint num_fetch; GtkWidget *confirmation_dialog; }; -G_DEFINE_TYPE (EphyHistoryDialog, ephy_history_dialog, GTK_TYPE_DIALOG) +G_DEFINE_TYPE (EphyHistoryDialog, ephy_history_dialog, GTK_TYPE_WINDOW) enum { PROP_0, @@ -85,47 +74,30 @@ enum { static GParamSpec *obj_properties[LAST_PROP]; -typedef enum { - COLUMN_DATE, - COLUMN_NAME, - COLUMN_LOCATION, - COLUMN_SYNC_ID -} EphyHistoryDialogColumns; +static gboolean add_urls_source (EphyHistoryDialog *self); -static gboolean -add_urls_source (EphyHistoryDialog *self) +static EphyHistoryURL * +get_url_from_row (GtkListBoxRow *row) { - EphyHistoryURL *url; - GTimer *timer; - GList *element; + return ephy_history_url_new (g_object_get_data (G_OBJECT (row), "url"), + g_object_get_data (G_OBJECT (row), "title"), + 0, + 0, + 0); +} - if (self->urls == NULL) { - self->sorter_source = 0; - return G_SOURCE_REMOVE; - } +static void +clear_listbox (GtkWidget *listbox) +{ + GList *children, *iter; - timer = g_timer_new (); - g_timer_start (timer); - - do { - element = self->urls; - url = element->data; - gtk_list_store_insert_with_values (GTK_LIST_STORE (self->liststore), - NULL, G_MAXINT, - COLUMN_DATE, url->last_visit_time, - COLUMN_NAME, url->title, - COLUMN_LOCATION, url->url, - COLUMN_SYNC_ID, url->sync_id, - -1); - self->urls = g_list_remove_link (self->urls, element); - ephy_history_url_free (url); - g_list_free_1 (element); - } while (self->urls && - g_timer_elapsed (timer, NULL) < GTK_TREE_VIEW_TIME_MS_PER_IDLE / 1000.); - - g_timer_destroy (timer); + children = gtk_container_get_children (GTK_CONTAINER (listbox)); - return G_SOURCE_CONTINUE; + for (iter = children; iter != NULL; iter = g_list_next (iter)) { + gtk_widget_destroy (GTK_WIDGET (iter->data)); + } + + g_list_free (children); } static void @@ -135,21 +107,16 @@ on_find_urls_cb (gpointer service, gpointer user_data) { EphyHistoryDialog *self = EPHY_HISTORY_DIALOG (user_data); - GtkTreeViewColumn *column; if (success != TRUE) return; - self->urls = (GList *)result_data; - gtk_tree_view_set_model (GTK_TREE_VIEW (self->treeview), NULL); - gtk_list_store_clear (GTK_LIST_STORE (self->liststore)); - gtk_tree_view_set_model (GTK_TREE_VIEW (self->treeview), GTK_TREE_MODEL (self->liststore)); + self->urls = (GList *)result_data; - column = gtk_tree_view_get_column (GTK_TREE_VIEW (self->treeview), self->sort_column); - gtk_tree_view_column_set_sort_order (column, self->sort_ascending ? GTK_SORT_ASCENDING : GTK_SORT_DESCENDING); - gtk_tree_view_column_set_sort_indicator (column, TRUE); + clear_listbox (self->listbox); + self->num_fetch = NUM_FETCH_LIMIT; self->sorter_source = g_idle_add ((GSourceFunc)add_urls_source, self); } @@ -167,21 +134,22 @@ substrings_filter (EphyHistoryDialog *self) while (*p) { substrings = g_list_prepend (substrings, *p++); } - ; + g_free (tokens); return substrings; } static void -remove_pending_sorter_source (EphyHistoryDialog *self) +remove_pending_sorter_source (EphyHistoryDialog *self, + gboolean free_urls) { if (self->sorter_source != 0) { g_source_remove (self->sorter_source); self->sorter_source = 0; } - if (self->urls != NULL) { + if (free_urls && self->urls != NULL) { g_list_free_full (self->urls, (GDestroyNotify)ephy_history_url_free); self->urls = NULL; } @@ -193,36 +161,195 @@ filter_now (EphyHistoryDialog *self) gint64 from, to; GList *substrings; EphyHistorySortType type; - substrings = substrings_filter (self); from = to = -1; /* all */ - switch (self->sort_column) { - case COLUMN_DATE: - type = self->sort_ascending ? EPHY_HISTORY_SORT_LEAST_RECENTLY_VISITED : EPHY_HISTORY_SORT_MOST_RECENTLY_VISITED; - break; - case COLUMN_NAME: - type = self->sort_ascending ? EPHY_HISTORY_SORT_TITLE_ASCENDING : EPHY_HISTORY_SORT_TITLE_DESCENDING; - break; - case COLUMN_LOCATION: - type = self->sort_ascending ? EPHY_HISTORY_SORT_URL_ASCENDING : EPHY_HISTORY_SORT_URL_DESCENDING; - break; - default: - type = EPHY_HISTORY_SORT_MOST_RECENTLY_VISITED; - } + type = EPHY_HISTORY_SORT_MOST_RECENTLY_VISITED; - remove_pending_sorter_source (self); + remove_pending_sorter_source (self, TRUE); ephy_history_service_find_urls (self->history_service, from, to, - NUM_RESULTS_LIMIT, 0, + -1, 0, substrings, type, self->cancellable, (EphyHistoryJobCallback)on_find_urls_cb, self); } +static GList * +get_selection (EphyHistoryDialog *self) +{ + GList *selected_rows = gtk_list_box_get_selected_rows (GTK_LIST_BOX (self->listbox)); + GList *list = NULL; + GList *tmp; + + for (tmp = selected_rows; tmp != NULL; tmp = tmp->next) { + EphyHistoryURL *url = get_url_from_row (tmp->data); + + if (url == NULL) { + continue; + } + + list = g_list_append (list, url); + } + + return g_list_reverse (list); +} + +static void +on_browse_history_deleted_cb (gpointer service, + gboolean success, + gpointer result_data, + gpointer user_data) +{ + EphyHistoryDialog *self = EPHY_HISTORY_DIALOG (user_data); + + if (success != TRUE) + return; + + filter_now (self); +} + +static void +delete_selected (EphyHistoryDialog *self) +{ + GList *selected; + + selected = get_selection (self); + ephy_history_service_delete_urls (self->history_service, selected, self->cancellable, + (EphyHistoryJobCallback)on_browse_history_deleted_cb, self); + + for (GList *l = selected; l; l = l->next) + ephy_snapshot_service_delete_snapshot_for_url (self->snapshot_service, ((EphyHistoryURL *)l->data)->url); +} + +static void +forget_clicked (GtkButton *button, + gpointer user_data) +{ + EphyHistoryDialog *self = EPHY_HISTORY_DIALOG (user_data); + GtkListBoxRow *row = g_object_get_data (G_OBJECT (button), "row"); + + gtk_list_box_select_row (GTK_LIST_BOX (self->listbox), row); + + delete_selected (self); +} + +static GtkWidget * +create_row (EphyHistoryDialog *self, + EphyHistoryURL *url) +{ + EphyEmbedShell *shell = ephy_embed_shell_get_default (); + GtkWidget *grid; + GtkWidget *title; + GtkWidget *address; + GtkWidget *date; + GtkWidget *row; + GtkWidget *separator; + GtkWidget *button; + PangoAttrList *attrlist; + PangoAttribute *attr; + + /* Row */ + row = gtk_list_box_row_new (); + g_object_set_data (G_OBJECT (row), "title", g_strdup (url->title)); + g_object_set_data (G_OBJECT (row), "url", g_strdup (url->url)); + + /* Grid */ + grid = gtk_grid_new (); + gtk_widget_set_margin_start (grid, 6); + gtk_widget_set_margin_end (grid, 6); + gtk_widget_set_margin_top (grid, 6); + gtk_widget_set_margin_bottom (grid, 6); + gtk_grid_set_column_spacing (GTK_GRID(grid), 12); + gtk_grid_set_row_spacing (GTK_GRID(grid), 6); + gtk_widget_set_tooltip_text (grid, url->url); + + /* Title */ + title = gtk_label_new (url->title); + gtk_label_set_ellipsize (GTK_LABEL(title), PANGO_ELLIPSIZE_END); + gtk_widget_set_hexpand (title, TRUE); + gtk_label_set_xalign (GTK_LABEL(title), 0); + + attrlist = pango_attr_list_new (); + attr = pango_attr_weight_new (PANGO_WEIGHT_SEMIBOLD); + pango_attr_list_insert (attrlist, attr); + gtk_label_set_attributes (GTK_LABEL (title), attrlist); + pango_attr_list_unref (attrlist); + + gtk_grid_attach (GTK_GRID (grid), title, 0, 0, 1, 1); + + /* Address */ + address = gtk_label_new (url->url); + gtk_label_set_ellipsize (GTK_LABEL(address), PANGO_ELLIPSIZE_END); + gtk_label_set_xalign (GTK_LABEL(address), 0); + gtk_widget_set_sensitive (address, FALSE); + + gtk_grid_attach (GTK_GRID (grid), address, 0, 1, 1, 1); + + /* Date */ + date = gtk_label_new (ephy_time_helpers_utf_friendly_time (url->last_visit_time / 1000000)); + gtk_label_set_ellipsize (GTK_LABEL(date), PANGO_ELLIPSIZE_END); + gtk_label_set_xalign (GTK_LABEL (date), 0); + + gtk_grid_attach (GTK_GRID (grid), date, 0, 2, 1, 1); + + /* Separator */ + separator = gtk_separator_new (GTK_ORIENTATION_VERTICAL); + gtk_grid_attach (GTK_GRID (grid), separator, 1, 0, 1, 3); + + /* Button */ + button = gtk_button_new_from_icon_name ("user-trash-symbolic", GTK_ICON_SIZE_BUTTON); + gtk_widget_set_valign (button, GTK_ALIGN_CENTER); + g_object_set_data (G_OBJECT (button), "row", row); + gtk_widget_set_tooltip_text (button, _("Remove the selected pages from history")); + g_signal_connect (button, "clicked", G_CALLBACK (forget_clicked), self); + gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE); + gtk_grid_attach (GTK_GRID (grid), button, 2, 0, 1, 3); + + gtk_widget_set_sensitive (button, ephy_embed_shell_get_mode (shell) != EPHY_EMBED_SHELL_MODE_INCOGNITO); + + gtk_container_add (GTK_CONTAINER (row), grid); + gtk_widget_show_all (row); + + return row; +} + +static gboolean +add_urls_source (EphyHistoryDialog *self) +{ + EphyHistoryURL *url; + GList *element; + GtkWidget *row; + + if (self->urls == NULL || !self->num_fetch) { + self->sorter_source = 0; + gtk_widget_queue_draw (self->listbox); + return G_SOURCE_REMOVE; + } + + element = self->urls; + url = element->data; + + row = create_row (self, url); + gtk_list_box_insert (GTK_LIST_BOX(self->listbox), row, -1); + + self->urls = g_list_remove_link (self->urls, element); + ephy_history_url_free (url); + g_list_free_1 (element); + + self->num_fetch--; + + if (!self->num_fetch) { + self->sorter_source = 0; + return G_SOURCE_REMOVE; + } + + return G_SOURCE_CONTINUE; +} + static void confirmation_dialog_response_cb (GtkWidget *dialog, int response, @@ -298,75 +425,6 @@ get_target_window (EphyHistoryDialog *self) } static void -on_browse_history_deleted_cb (gpointer service, - gboolean success, - gpointer result_data, - gpointer user_data) -{ - EphyHistoryDialog *self = EPHY_HISTORY_DIALOG (user_data); - - if (success != TRUE) - return; - - filter_now (self); -} - -static EphyHistoryURL * -get_url_from_path (GtkTreeModel *model, - GtkTreePath *path) -{ - GtkTreeIter iter; - - EphyHistoryURL *url = ephy_history_url_new (NULL, NULL, 0, 0, 0); - - gtk_tree_model_get_iter (model, &iter, path); - - gtk_tree_model_get (model, &iter, - COLUMN_NAME, &url->title, - COLUMN_LOCATION, &url->url, - COLUMN_SYNC_ID, &url->sync_id, - -1); - return url; -} - -static void -get_selection_foreach (GtkTreeModel *model, - GtkTreePath *path, - GtkTreeIter *iter, - gpointer *data) -{ - EphyHistoryURL *url; - - url = get_url_from_path (model, path); - *data = g_list_prepend (*data, url); -} - -static GList * -get_selection (EphyHistoryDialog *self) -{ - GList *list = NULL; - - gtk_tree_selection_selected_foreach (self->tree_selection, - (GtkTreeSelectionForeachFunc)get_selection_foreach, - &list); - - return g_list_reverse (list); -} - -static void -delete_selected (EphyHistoryDialog *self) -{ - GList *selected; - - selected = get_selection (self); - ephy_history_service_delete_urls (self->history_service, selected, self->cancellable, - (EphyHistoryJobCallback)on_browse_history_deleted_cb, self); - - for (GList *l = selected; l; l = l->next) - ephy_snapshot_service_delete_snapshot_for_url (self->snapshot_service, ((EphyHistoryURL *)l->data)->url); -} - -static void open_selection (GSimpleAction *action, GVariant *parameter, gpointer user_data) @@ -421,9 +479,9 @@ forget (GSimpleAction *action, } static gboolean -on_treeview_key_press_event (GtkWidget *widget, - GdkEventKey *event, - EphyHistoryDialog *self) +on_listbox_key_press_event (GtkWidget *widget, + GdkEventKey *event, + EphyHistoryDialog *self) { if (event->keyval == GDK_KEY_Delete || event->keyval == GDK_KEY_KP_Delete) { delete_selected (self); @@ -445,51 +503,6 @@ update_popup_menu_actions (GActionGroup *action_group, g_simple_action_set_enabled (G_SIMPLE_ACTION (copy_url_action), only_one_selected_item); } -static gboolean -on_treeview_button_press_event (GtkWidget *widget, - GdkEventButton *event, - EphyHistoryDialog *self) -{ - if (event->button == 3) { - int n; - GtkWidget *menu; - - n = gtk_tree_selection_count_selected_rows (self->tree_selection); - if (n <= 0) - return FALSE; - - update_popup_menu_actions (self->action_group, (n == 1)); - - menu = gtk_menu_new_from_model (self->treeview_popup_menu_model); - gtk_menu_attach_to_widget (GTK_MENU (menu), GTK_WIDGET (self), NULL); - gtk_menu_popup_at_pointer (GTK_MENU (menu), (GdkEvent *)event); - return TRUE; - } - - return FALSE; -} - -static void -on_treeview_row_activated (GtkTreeView *view, - GtkTreePath *path, - GtkTreeViewColumn *col, - EphyHistoryDialog *self) -{ - EphyWindow *window; - EphyHistoryURL *url; - EphyEmbed *embed; - - window = EPHY_WINDOW (get_target_window (self)); - url = get_url_from_path (gtk_tree_view_get_model (view), - path); - g_assert (url != NULL); - - embed = ephy_shell_new_tab (ephy_shell_get_default (), - window, NULL, EPHY_NEW_TAB_JUMP); - ephy_web_view_load_url (ephy_embed_get_web_view (embed), url->url); - ephy_history_url_free (url); -} - static void on_search_entry_changed (GtkSearchEntry *entry, EphyHistoryDialog *self) @@ -503,19 +516,6 @@ on_search_entry_changed (GtkSearchEntry *entry, filter_now (self); } -static gboolean -on_search_key_press_event (GtkWidget *widget, - GdkEventKey *event, - EphyHistoryDialog *self) -{ - if (event->keyval == GDK_KEY_Escape) { - g_signal_emit_by_name (self, "close", NULL); - return GDK_EVENT_STOP; - } - - return GDK_EVENT_PROPAGATE; -} - static void update_selection_actions (GActionGroup *action_group, gboolean has_selection) @@ -534,35 +534,61 @@ update_selection_actions (GActionGroup *action_group, } static void -on_treeview_selection_changed (GtkTreeSelection *selection, - EphyHistoryDialog *self) +on_listbox_row_selected (GtkListBox *box, + GtkListBoxRow *row, + EphyHistoryDialog *self) { - update_selection_actions (self->action_group, - gtk_tree_selection_count_selected_rows (selection) > 0); + update_selection_actions (self->action_group, row != NULL); } static void -on_treeview_column_clicked_event (GtkTreeViewColumn *column, - EphyHistoryDialog *self) +on_listbox_row_activated (GtkListBox *box, + GtkListBoxRow *row, + EphyHistoryDialog *self) { - GtkTreeViewColumn *previous_sortby; - gint new_sort_column = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (column), "column")); + EphyWindow *window; + EphyHistoryURL *url; + EphyEmbed *embed; + + window = EPHY_WINDOW (get_target_window (self)); + url = get_url_from_row (row); + g_assert (url != NULL); + + embed = ephy_shell_new_tab (ephy_shell_get_default (), + window, NULL, EPHY_NEW_TAB_JUMP); + ephy_web_view_load_url (ephy_embed_get_web_view (embed), url->url); + ephy_history_url_free (url); +} + +static gboolean +on_listbox_button_press_event (GtkWidget *widget, + GdkEventButton *event, + EphyHistoryDialog *self) +{ + if (event->button == 3) { + GList *rows = gtk_list_box_get_selected_rows ( GTK_LIST_BOX (self->listbox)); + int n; - if (new_sort_column == self->sort_column) { - self->sort_ascending = !(self->sort_ascending); - } else { - previous_sortby = gtk_tree_view_get_column (GTK_TREE_VIEW (self->treeview), self->sort_column); - gtk_tree_view_column_set_sort_indicator (previous_sortby, FALSE); + n = g_list_length (rows); - self->sort_column = new_sort_column; - self->sort_ascending = self->sort_column == COLUMN_DATE ? FALSE : TRUE; + if (n <= 0) { + g_list_free (rows); + + return FALSE; + } + + update_popup_menu_actions (self->action_group, (n == 1)); + + gtk_popover_set_relative_to (GTK_POPOVER (self->popover_menu), GTK_WIDGET (rows->data)); + gtk_popover_popup (GTK_POPOVER (self->popover_menu)); + + return TRUE; } - gtk_tree_view_column_set_sort_order (column, self->sort_ascending ? GTK_SORT_ASCENDING : GTK_SORT_DESCENDING); - gtk_tree_view_column_set_sort_indicator (column, TRUE); - filter_now (self); + return FALSE; } + static gboolean on_urls_visited_cb (EphyHistoryService *service, EphyHistoryDialog *self) @@ -651,12 +677,47 @@ ephy_history_dialog_dispose (GObject *object) self); g_clear_object (&self->history_service); - remove_pending_sorter_source (self); + remove_pending_sorter_source (self, TRUE); G_OBJECT_CLASS (ephy_history_dialog_parent_class)->dispose (object); } static void +box_header_func (GtkListBoxRow *row, + GtkListBoxRow *before, + gpointer user_data) +{ + GtkWidget *current; + + if (!before) { + gtk_list_box_row_set_header (row, NULL); + return; + } + + current = gtk_list_box_row_get_header (row); + if (!current) { + current = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL); + gtk_widget_show (current); + gtk_list_box_row_set_header (row, current); + } +} + +static void +on_edge_reached (GtkScrolledWindow *scrolled, + GtkPositionType pos, + gpointer user_data) +{ + EphyHistoryDialog *self = EPHY_HISTORY_DIALOG (user_data); + + if (pos == GTK_POS_BOTTOM) { + remove_pending_sorter_source (self, FALSE); + + self->num_fetch += NUM_FETCH_LIMIT; + self->sorter_source = g_idle_add ((GSourceFunc)add_urls_source, self); + } +} + +static void ephy_history_dialog_class_init (EphyHistoryDialogClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); @@ -677,70 +738,16 @@ ephy_history_dialog_class_init (EphyHistoryDialogClass *klass) gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/epiphany/gtk/history-dialog.ui"); - gtk_widget_class_bind_template_child (widget_class, EphyHistoryDialog, liststore); - gtk_widget_class_bind_template_child (widget_class, EphyHistoryDialog, treeview); - gtk_widget_class_bind_template_child (widget_class, EphyHistoryDialog, tree_selection); - gtk_widget_class_bind_template_child (widget_class, EphyHistoryDialog, date_column); - gtk_widget_class_bind_template_child (widget_class, EphyHistoryDialog, name_column); - gtk_widget_class_bind_template_child (widget_class, EphyHistoryDialog, location_column); - gtk_widget_class_bind_template_child (widget_class, EphyHistoryDialog, date_renderer); - gtk_widget_class_bind_template_child (widget_class, EphyHistoryDialog, location_renderer); - gtk_widget_class_bind_template_child (widget_class, EphyHistoryDialog, treeview_popup_menu_model); + gtk_widget_class_bind_template_child (widget_class, EphyHistoryDialog, listbox); gtk_widget_class_bind_template_child (widget_class, EphyHistoryDialog, forget_all_button); - gtk_widget_class_bind_template_child (widget_class, EphyHistoryDialog, forget_button); + gtk_widget_class_bind_template_child (widget_class, EphyHistoryDialog, popover_menu); - gtk_widget_class_bind_template_callback (widget_class, on_treeview_row_activated); - gtk_widget_class_bind_template_callback (widget_class, on_treeview_key_press_event); - gtk_widget_class_bind_template_callback (widget_class, on_treeview_button_press_event); - gtk_widget_class_bind_template_callback (widget_class, on_treeview_selection_changed); - gtk_widget_class_bind_template_callback (widget_class, on_treeview_column_clicked_event); + gtk_widget_class_bind_template_callback (widget_class, on_listbox_row_activated); + gtk_widget_class_bind_template_callback (widget_class, on_listbox_row_selected); + gtk_widget_class_bind_template_callback (widget_class, on_listbox_button_press_event); + gtk_widget_class_bind_template_callback (widget_class, on_listbox_key_press_event); gtk_widget_class_bind_template_callback (widget_class, on_search_entry_changed); - gtk_widget_class_bind_template_callback (widget_class, on_search_key_press_event); -} - -static void -convert_date_data_func (GtkTreeViewColumn *column, - GtkCellRenderer *renderer, - GtkTreeModel *model, - GtkTreeIter *iter, - gpointer user_data) -{ - int col_id = GPOINTER_TO_INT (user_data); - gint64 value; - char *friendly; - - gtk_tree_model_get (model, iter, - col_id, - &value, - -1); - - /* Convert back to seconds. */ - friendly = ephy_time_helpers_utf_friendly_time (value / 1000000); - g_object_set (renderer, "text", friendly, NULL); - g_free (friendly); -} - -static void -convert_location_data_func (GtkTreeViewColumn *column, - GtkCellRenderer *renderer, - GtkTreeModel *model, - GtkTreeIter *iter, - gpointer user_data) -{ - int col_id = GPOINTER_TO_INT (user_data); - char *url; - char *decoded_url; - - gtk_tree_model_get (model, iter, - col_id, - &url, - -1); - decoded_url = ephy_uri_decode (url); - - g_object_set (renderer, "text", decoded_url, NULL); - - g_free (url); - g_free (decoded_url); + gtk_widget_class_bind_template_callback (widget_class, on_edge_reached); } GtkWidget * @@ -751,7 +758,6 @@ ephy_history_dialog_new (EphyHistoryService *history_service) g_assert (history_service != NULL); self = g_object_new (EPHY_TYPE_HISTORY_DIALOG, - "use-header-bar", TRUE, "history-service", history_service, NULL); @@ -788,45 +794,22 @@ ephy_history_dialog_init (EphyHistoryDialog *self) self->cancellable = g_cancellable_new (); self->urls = NULL; - self->sort_ascending = FALSE; - self->sort_column = COLUMN_DATE; self->sorter_source = 0; + gtk_list_box_set_header_func (GTK_LIST_BOX (self->listbox), box_header_func, NULL, NULL); ephy_gui_ensure_window_group (GTK_WINDOW (self)); - g_object_set_data (G_OBJECT (self->date_column), - "column", GINT_TO_POINTER (COLUMN_DATE)); - g_object_set_data (G_OBJECT (self->name_column), - "column", GINT_TO_POINTER (COLUMN_NAME)); - g_object_set_data (G_OBJECT (self->location_column), - "column", GINT_TO_POINTER (COLUMN_LOCATION)); - - gtk_tree_view_column_set_cell_data_func (GTK_TREE_VIEW_COLUMN (self->date_column), - GTK_CELL_RENDERER (self->date_renderer), - (GtkTreeCellDataFunc)convert_date_data_func, - GINT_TO_POINTER (COLUMN_DATE), - NULL); - - gtk_tree_view_column_set_cell_data_func (GTK_TREE_VIEW_COLUMN (self->location_column), - GTK_CELL_RENDERER (self->location_renderer), - (GtkTreeCellDataFunc)convert_location_data_func, - GINT_TO_POINTER (COLUMN_LOCATION), - NULL); - self->action_group = create_action_group (self); gtk_widget_insert_action_group (GTK_WIDGET (self), "history", self->action_group); if (ephy_embed_shell_get_mode (shell) == EPHY_EMBED_SHELL_MODE_INCOGNITO) { tooltip = _("It is not possible to modify history when in incognito mode."); gtk_widget_set_tooltip_text (self->forget_all_button, tooltip); - gtk_widget_set_tooltip_text (self->forget_button, tooltip); - - action = g_action_map_lookup_action (G_ACTION_MAP (self->action_group), "forget"); - g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE); action = g_action_map_lookup_action (G_ACTION_MAP (self->action_group), "forget-all"); g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE); - } - update_selection_actions (self->action_group, FALSE); + update_selection_actions (self->action_group, FALSE); + } } + |