From 4bb1831158320d8fe3543153482f523c4fe7a82d Mon Sep 17 00:00:00 2001 From: Alan Fitton Date: Thu, 24 Nov 2011 08:39:15 +0000 Subject: hopefully fix the infrequent crash when changing filter if first+other items selected, by swapping the sorted model and filtered model in their chaining order. I think the events on the filtered model weren't being propogated to the sorted model when the selection changes. --- src/trg-main-window.c | 26 ++-- src/trg-peers-tree-view.c | 2 +- src/trg-torrent-tree-view.c | 3 +- src/trg-tree-view.c | 315 +++++++++++++++++--------------------------- src/trg-tree-view.h | 4 +- 5 files changed, 139 insertions(+), 211 deletions(-) diff --git a/src/trg-main-window.c b/src/trg-main-window.c index f7fa2e6..9788763 100644 --- a/src/trg-main-window.c +++ b/src/trg-main-window.c @@ -349,10 +349,10 @@ static void destroy_window(GtkWidget * w, gpointer data G_GNUC_UNUSED) { trg_prefs_set_int(prefs, TRG_PREFS_KEY_STATES_PANED_POS, gtk_paned_get_position(GTK_PANED(priv->hpaned)), TRG_PREFS_GLOBAL); - trg_tree_view_persist(TRG_TREE_VIEW(priv->peersTreeView)); - trg_tree_view_persist(TRG_TREE_VIEW(priv->filesTreeView)); - trg_tree_view_persist(TRG_TREE_VIEW(priv->torrentTreeView)); - trg_tree_view_persist(TRG_TREE_VIEW(priv->trackersTreeView)); + trg_tree_view_persist(TRG_TREE_VIEW(priv->peersTreeView), FALSE); + trg_tree_view_persist(TRG_TREE_VIEW(priv->filesTreeView), FALSE); + trg_tree_view_persist(TRG_TREE_VIEW(priv->torrentTreeView), TRUE); + trg_tree_view_persist(TRG_TREE_VIEW(priv->trackersTreeView), FALSE); trg_prefs_save(prefs); gtk_main_quit(); @@ -649,9 +649,9 @@ static gint confirm_action_dialog(GtkWindow * win, firstNode = g_list_first(list); gtk_tree_model_get_iter(GTK_TREE_MODEL - (priv->sortedTorrentModel), &firstIter, firstNode->data); + (priv->filteredTorrentModel), &firstIter, firstNode->data); gtk_tree_model_get(GTK_TREE_MODEL - (priv->sortedTorrentModel), &firstIter, TORRENT_COLUMN_NAME, + (priv->filteredTorrentModel), &firstIter, TORRENT_COLUMN_NAME, &name, -1); g_list_foreach(list, (GFunc) gtk_tree_path_free, NULL); g_list_free(list); @@ -1134,9 +1134,9 @@ static gboolean torrent_selection_changed(GtkTreeSelection * selection, if (firstNode) { GtkTreeIter iter; - if (gtk_tree_model_get_iter(priv->sortedTorrentModel, &iter, + if (gtk_tree_model_get_iter(priv->filteredTorrentModel, &iter, (GtkTreePath *) firstNode->data)) { - gtk_tree_model_get(priv->sortedTorrentModel, &iter, + gtk_tree_model_get(priv->filteredTorrentModel, &iter, TORRENT_COLUMN_ID, &id, -1); } } @@ -1981,17 +1981,17 @@ static GObject *trg_main_window_constructor(GType type, g_signal_connect(priv->torrentModel, "torrent-addremove", G_CALLBACK(on_torrent_addremove), self); + priv->sortedTorrentModel = gtk_tree_model_sort_new_with_model( + GTK_TREE_MODEL(priv->torrentModel)); + priv->filteredTorrentModel = gtk_tree_model_filter_new( - GTK_TREE_MODEL(priv->torrentModel), NULL); + GTK_TREE_MODEL(priv->sortedTorrentModel), NULL); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER (priv->filteredTorrentModel), trg_torrent_tree_view_visible_func, self, NULL); - priv->sortedTorrentModel = gtk_tree_model_sort_new_with_model( - priv->filteredTorrentModel); - priv->torrentTreeView = trg_main_window_torrent_tree_view_new(self, - priv->sortedTorrentModel); + priv->filteredTorrentModel); g_signal_connect(priv->torrentTreeView, "key-press-event", G_CALLBACK(torrent_tv_key_press_event), self); g_signal_connect(priv->torrentTreeView, "popup-menu", diff --git a/src/trg-peers-tree-view.c b/src/trg-peers-tree-view.c index 0a3d48a..7ad0304 100644 --- a/src/trg-peers-tree-view.c +++ b/src/trg-peers-tree-view.c @@ -77,7 +77,7 @@ TrgPeersTreeView *trg_peers_tree_view_new(TrgPrefs *prefs, TrgPeersModel * model GObject *obj = g_object_new(TRG_TYPE_PEERS_TREE_VIEW, NULL); trg_tree_view_set_prefs(TRG_TREE_VIEW(obj), prefs); gtk_tree_view_set_model(GTK_TREE_VIEW(obj), GTK_TREE_MODEL(model)); - trg_tree_view_restore_sort(TRG_TREE_VIEW(obj)); + trg_tree_view_restore_sort(TRG_TREE_VIEW(obj), FALSE); trg_tree_view_setup_columns(TRG_TREE_VIEW(obj)); return TRG_PEERS_TREE_VIEW(obj); diff --git a/src/trg-torrent-tree-view.c b/src/trg-torrent-tree-view.c index 895b386..c03b664 100644 --- a/src/trg-torrent-tree-view.c +++ b/src/trg-torrent-tree-view.c @@ -167,7 +167,8 @@ TrgTorrentTreeView *trg_torrent_tree_view_new(TrgPrefs *prefs, GtkTreeModel * mo trg_tree_view_set_prefs(TRG_TREE_VIEW(obj), prefs); gtk_tree_view_set_model(GTK_TREE_VIEW(obj), model); trg_tree_view_setup_columns(TRG_TREE_VIEW(obj)); - trg_tree_view_restore_sort(TRG_TREE_VIEW(obj)); + + trg_tree_view_restore_sort(TRG_TREE_VIEW(obj), TRUE); return TRG_TORRENT_TREE_VIEW(obj); } diff --git a/src/trg-tree-view.c b/src/trg-tree-view.c index 7ee83a5..069464f 100644 --- a/src/trg-tree-view.c +++ b/src/trg-tree-view.c @@ -33,8 +33,7 @@ #include "trg-cell-renderer-numgteqthan.h" enum { - PROP_0, - PROP_PREFS + PROP_0, PROP_PREFS }; G_DEFINE_TYPE(TrgTreeView, trg_tree_view, GTK_TYPE_TREE_VIEW) @@ -47,16 +46,15 @@ struct _TrgTreeViewPrivate { TrgPrefs *prefs; }; -gboolean trg_tree_view_is_column_showing(TrgTreeView *tv, gint index) -{ +gboolean trg_tree_view_is_column_showing(TrgTreeView *tv, gint index) { TrgTreeViewPrivate *priv = TRG_TREE_VIEW_GET_PRIVATE(tv); GList *li; - for (li = priv->columns; li; li = g_list_next(li)) - { - trg_column_description *cd = (trg_column_description*)li->data; + for (li = priv->columns; li; li = g_list_next(li)) { + trg_column_description *cd = (trg_column_description*) li->data; if (cd->model_column == index) { - if (cd->flags & TRG_COLUMN_SHOWING) + if (cd->flags & TRG_COLUMN_SHOWING + ) return TRUE; else break; @@ -66,17 +64,13 @@ gboolean trg_tree_view_is_column_showing(TrgTreeView *tv, gint index) return FALSE; } -static void -trg_tree_view_get_property(GObject * object, guint property_id, - GValue * value, GParamSpec * pspec) -{ +static void trg_tree_view_get_property(GObject * object, guint property_id, + GValue * value, GParamSpec * pspec) { G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); } -static void -trg_tree_view_set_property(GObject * object, guint property_id, - const GValue * value, GParamSpec * pspec) -{ +static void trg_tree_view_set_property(GObject * object, guint property_id, + const GValue * value, GParamSpec * pspec) { TrgTreeViewPrivate *priv = TRG_TREE_VIEW_GET_PRIVATE(object); switch (property_id) { case PROP_PREFS: @@ -84,26 +78,20 @@ trg_tree_view_set_property(GObject * object, guint property_id, break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); + break; } } static GObject *trg_tree_view_constructor(GType type, - guint - n_construct_properties, - GObjectConstructParam - * construct_params) -{ + guint n_construct_properties, GObjectConstructParam * construct_params) { GObject *obj = G_OBJECT_CLASS - (trg_tree_view_parent_class)->constructor(type, - n_construct_properties, - construct_params); - //TrgTreeViewPrivate *priv = TRG_TREE_VIEW_GET_PRIVATE(obj); + (trg_tree_view_parent_class)->constructor(type, + n_construct_properties, construct_params); return obj; } -static JsonObject* trg_prefs_get_tree_view_props(TrgTreeView *tv) -{ +static JsonObject* trg_prefs_get_tree_view_props(TrgTreeView *tv) { TrgTreeViewPrivate *priv = TRG_TREE_VIEW_GET_PRIVATE(tv); JsonObject *root = trg_prefs_get_root(priv->prefs); const gchar *className = G_OBJECT_TYPE_NAME(tv); @@ -128,16 +116,11 @@ static JsonObject* trg_prefs_get_tree_view_props(TrgTreeView *tv) } static void trg_tree_view_add_column_after(TrgTreeView * tv, - trg_column_description * desc, - gint64 width, - GtkTreeViewColumn * after_col); - -trg_column_description *trg_tree_view_reg_column(TrgTreeView * tv, - gint type, - gint model_column, - gchar * header, - gchar * id, gint flags) -{ + trg_column_description * desc, gint64 width, + GtkTreeViewColumn * after_col); + +trg_column_description *trg_tree_view_reg_column(TrgTreeView * tv, gint type, + gint model_column, gchar * header, gchar * id, gint flags) { TrgTreeViewPrivate *priv = TRG_TREE_VIEW_GET_PRIVATE(tv); trg_column_description *desc = g_new0(trg_column_description, 1); @@ -153,8 +136,7 @@ trg_column_description *trg_tree_view_reg_column(TrgTreeView * tv, } static trg_column_description *trg_tree_view_find_column(TrgTreeView * tv, - const gchar * id) -{ + const gchar * id) { TrgTreeViewPrivate *priv = TRG_TREE_VIEW_GET_PRIVATE(tv); GList *li; trg_column_description *desc; @@ -168,37 +150,29 @@ static trg_column_description *trg_tree_view_find_column(TrgTreeView * tv, return NULL; } -static void trg_tree_view_hide_column(GtkWidget * w, - GtkTreeViewColumn * col) -{ - trg_column_description *desc = - g_object_get_data(G_OBJECT(col), "column-desc"); +static void trg_tree_view_hide_column(GtkWidget * w, GtkTreeViewColumn * col) { + trg_column_description *desc = g_object_get_data(G_OBJECT(col), + "column-desc"); GtkWidget *tv = gtk_tree_view_column_get_tree_view(col); desc->flags &= ~TRG_COLUMN_SHOWING; gtk_tree_view_remove_column(GTK_TREE_VIEW(tv), col); } static void trg_tree_view_add_column(TrgTreeView * tv, - trg_column_description * desc, - gint64 width) -{ + trg_column_description * desc, gint64 width) { trg_tree_view_add_column_after(tv, desc, width, NULL); } static void trg_tree_view_user_add_column_cb(GtkWidget * w, - trg_column_description * desc) -{ + trg_column_description * desc) { GtkTreeViewColumn *col = g_object_get_data(G_OBJECT(w), "parent-col"); - TrgTreeView *tv = - TRG_TREE_VIEW(gtk_tree_view_column_get_tree_view(col)); + TrgTreeView *tv = TRG_TREE_VIEW(gtk_tree_view_column_get_tree_view(col)); trg_tree_view_add_column_after(tv, desc, -1, col); } -static void -view_popup_menu(GtkButton * button, GdkEventButton * event, - GtkTreeViewColumn * column) -{ +static void view_popup_menu(GtkButton * button, GdkEventButton * event, + GtkTreeViewColumn * column) { GtkWidget *tv = gtk_tree_view_column_get_tree_view(column); TrgTreeViewPrivate *priv = TRG_TREE_VIEW_GET_PRIVATE(tv); GtkWidget *menu, *menuitem; @@ -211,9 +185,8 @@ view_popup_menu(GtkButton * button, GdkEventButton * event, menuitem = gtk_check_menu_item_new_with_label(desc->header); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE); g_signal_connect(menuitem, "activate", - G_CALLBACK(trg_tree_view_hide_column), column); - gtk_widget_set_sensitive(menuitem, - !(desc->flags & TRG_COLUMN_UNREMOVABLE)); + G_CALLBACK(trg_tree_view_hide_column), column); + gtk_widget_set_sensitive(menuitem, !(desc->flags & TRG_COLUMN_UNREMOVABLE)); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); for (li = priv->columns; li; li = g_list_next(li)) { @@ -222,22 +195,19 @@ view_popup_menu(GtkButton * button, GdkEventButton * event, menuitem = gtk_check_menu_item_new_with_label(desc->header); g_object_set_data(G_OBJECT(menuitem), "parent-col", column); g_signal_connect(menuitem, "activate", - G_CALLBACK(trg_tree_view_user_add_column_cb), - desc); + G_CALLBACK(trg_tree_view_user_add_column_cb), desc); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); } } gtk_widget_show_all(menu); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, - (event != NULL) ? event->button : 0, - gdk_event_get_time((GdkEvent *) event)); -} + (event != NULL) ? event->button : 0, + gdk_event_get_time((GdkEvent *) event)); + } -static gboolean -col_onButtonPressed(GtkButton * button, GdkEventButton * event, - GtkTreeViewColumn * col) -{ +static gboolean col_onButtonPressed(GtkButton * button, GdkEventButton * event, + GtkTreeViewColumn * col) { if (event->type == GDK_BUTTON_PRESS && event->button == 3) { view_popup_menu(button, event, col); return TRUE; @@ -246,96 +216,68 @@ col_onButtonPressed(GtkButton * button, GdkEventButton * event, return FALSE; } -static GtkTreeViewColumn *trg_tree_view_icontext_column_new(trg_column_description *desc, - gchar *renderer_property) -{ +static GtkTreeViewColumn *trg_tree_view_icontext_column_new( + trg_column_description *desc, gchar *renderer_property) { GtkTreeViewColumn *column = gtk_tree_view_column_new(); GtkCellRenderer *renderer = gtk_cell_renderer_pixbuf_new(); gtk_tree_view_column_set_title(column, desc->header); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_attributes(column, renderer, renderer_property, - desc->model_column_icon, NULL); + desc->model_column_icon, NULL); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_attributes(column, renderer, "text", - desc->model_column, NULL); + desc->model_column, NULL); return column; } static void trg_tree_view_add_column_after(TrgTreeView * tv, - trg_column_description * desc, - gint64 width, - GtkTreeViewColumn * after_col) -{ + trg_column_description * desc, gint64 width, + GtkTreeViewColumn * after_col) { GtkCellRenderer *renderer; GtkTreeViewColumn *column = NULL; switch (desc->type) { case TRG_COLTYPE_TEXT: renderer = - desc->customRenderer ? desc->customRenderer : - gtk_cell_renderer_text_new(); - column = - gtk_tree_view_column_new_with_attributes(desc->header, - renderer, "text", - desc->model_column, - NULL); + desc->customRenderer ? desc->customRenderer : + gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes(desc->header, + renderer, "text", desc->model_column, NULL); break; case TRG_COLTYPE_SPEED: renderer = trg_cell_renderer_speed_new(); - column = - gtk_tree_view_column_new_with_attributes(desc->header, - renderer, - "speed-value", - desc->model_column, - NULL); + column = gtk_tree_view_column_new_with_attributes(desc->header, + renderer, "speed-value", desc->model_column, NULL); break; case TRG_COLTYPE_EPOCH: renderer = trg_cell_renderer_epoch_new(); - column = - gtk_tree_view_column_new_with_attributes(desc->header, - renderer, - "epoch-value", - desc->model_column, - NULL); + column = gtk_tree_view_column_new_with_attributes(desc->header, + renderer, "epoch-value", desc->model_column, NULL); break; case TRG_COLTYPE_ETA: renderer = trg_cell_renderer_eta_new(); - column = - gtk_tree_view_column_new_with_attributes(desc->header, - renderer, "eta-value", - desc->model_column, - NULL); + column = gtk_tree_view_column_new_with_attributes(desc->header, + renderer, "eta-value", desc->model_column, NULL); break; case TRG_COLTYPE_SIZE: renderer = trg_cell_renderer_size_new(); - column = - gtk_tree_view_column_new_with_attributes(desc->header, - renderer, - "size-value", - desc->model_column, - NULL); + column = gtk_tree_view_column_new_with_attributes(desc->header, + renderer, "size-value", desc->model_column, NULL); break; case TRG_COLTYPE_PROG: renderer = gtk_cell_renderer_progress_new(); - column = - gtk_tree_view_column_new_with_attributes(desc->header, - renderer, "value", - desc->model_column, - NULL); + column = gtk_tree_view_column_new_with_attributes(desc->header, + renderer, "value", desc->model_column, NULL); break; case TRG_COLTYPE_RATIO: renderer = trg_cell_renderer_ratio_new(); - column = - gtk_tree_view_column_new_with_attributes(desc->header, - renderer, - "ratio-value", - desc->model_column, - NULL); + column = gtk_tree_view_column_new_with_attributes(desc->header, + renderer, "ratio-value", desc->model_column, NULL); break; case TRG_COLTYPE_ICON: column = gtk_tree_view_column_new(); @@ -344,7 +286,7 @@ static void trg_tree_view_add_column_after(TrgTreeView * tv, gtk_tree_view_column_set_title(column, desc->header); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_attributes(column, renderer, "stock-id", - desc->model_column, NULL); + desc->model_column, NULL); break; case TRG_COLTYPE_STOCKICONTEXT: column = trg_tree_view_icontext_column_new(desc, "stock-id"); @@ -354,30 +296,18 @@ static void trg_tree_view_add_column_after(TrgTreeView * tv, break; case TRG_COLTYPE_PRIO: renderer = trg_cell_renderer_priority_new(); - column = - gtk_tree_view_column_new_with_attributes(desc->header, - renderer, - "priority-value", - desc->model_column, - NULL); + column = gtk_tree_view_column_new_with_attributes(desc->header, + renderer, "priority-value", desc->model_column, NULL); break; case TRG_COLTYPE_NUMGTZERO: renderer = trg_cell_renderer_numgteqthan_new(1); - column = - gtk_tree_view_column_new_with_attributes(desc->header, - renderer, - "value", - desc->model_column, - NULL); + column = gtk_tree_view_column_new_with_attributes(desc->header, + renderer, "value", desc->model_column, NULL); break; case TRG_COLTYPE_NUMGTEQZERO: renderer = trg_cell_renderer_numgteqthan_new(0); - column = - gtk_tree_view_column_new_with_attributes(desc->header, - renderer, - "value", - desc->model_column, - NULL); + column = gtk_tree_view_column_new_with_attributes(desc->header, + renderer, "value", desc->model_column, NULL); break; } @@ -387,12 +317,10 @@ static void trg_tree_view_add_column_after(TrgTreeView * tv, gtk_tree_view_column_set_sort_column_id(column, desc->model_column); if (width < 0 && desc->defaultWidth > 0) { - gtk_tree_view_column_set_sizing(column, - GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_fixed_width(column, desc->defaultWidth); } else if (width > 0) { - gtk_tree_view_column_set_sizing(column, - GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_fixed_width(column, width); } @@ -401,15 +329,14 @@ static void trg_tree_view_add_column_after(TrgTreeView * tv, gtk_tree_view_append_column(GTK_TREE_VIEW(tv), column); if (after_col) - gtk_tree_view_move_column_after(GTK_TREE_VIEW(tv), column, - after_col); + gtk_tree_view_move_column_after(GTK_TREE_VIEW(tv), column, after_col); #if GTK_CHECK_VERSION( 3,0,0 ) g_signal_connect(gtk_tree_view_column_get_button(column), "button-press-event", - G_CALLBACK(col_onButtonPressed), column); + G_CALLBACK(col_onButtonPressed), column); #else g_signal_connect(column->button, "button-press-event", - G_CALLBACK(col_onButtonPressed), column); + G_CALLBACK(col_onButtonPressed), column); #endif if (desc->out) @@ -418,8 +345,7 @@ static void trg_tree_view_add_column_after(TrgTreeView * tv, desc->flags |= TRG_COLUMN_SHOWING; } -void trg_tree_view_persist(TrgTreeView * tv) -{ +void trg_tree_view_persist(TrgTreeView * tv, gboolean parentIsSortable) { JsonObject *props = trg_prefs_get_tree_view_props(tv); GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(tv)); GList *cols = gtk_tree_view_get_columns(GTK_TREE_VIEW(tv)); @@ -443,8 +369,8 @@ void trg_tree_view_persist(TrgTreeView * tv) for (li = cols; li; li = g_list_next(li)) { GtkTreeViewColumn *col = (GtkTreeViewColumn *) li->data; - trg_column_description *desc = - g_object_get_data(G_OBJECT(li->data), "column-desc"); + trg_column_description *desc = g_object_get_data(G_OBJECT(li->data), + "column-desc"); json_array_add_string_element(columns, desc->id); json_array_add_int_element(widths, gtk_tree_view_column_get_width(col)); @@ -452,7 +378,10 @@ void trg_tree_view_persist(TrgTreeView * tv) g_list_free(cols); - gtk_tree_sortable_get_sort_column_id(GTK_TREE_SORTABLE(model), &sort_column_id, &sort_type); + gtk_tree_sortable_get_sort_column_id( + GTK_TREE_SORTABLE(parentIsSortable ? gtk_tree_model_filter_get_model( + GTK_TREE_MODEL_FILTER(model)) : + model), &sort_column_id, &sort_type); if (json_object_has_member(props, TRG_PREFS_KEY_TV_SORT_COL)) json_object_remove_member(props, TRG_PREFS_KEY_TV_SORT_COL); @@ -460,39 +389,41 @@ void trg_tree_view_persist(TrgTreeView * tv) if (json_object_has_member(props, TRG_PREFS_KEY_TV_SORT_TYPE)) json_object_remove_member(props, TRG_PREFS_KEY_TV_SORT_TYPE); - json_object_set_int_member(props, TRG_PREFS_KEY_TV_SORT_COL, (gint64)sort_column_id); - json_object_set_int_member(props, TRG_PREFS_KEY_TV_SORT_TYPE, (gint64)sort_type); + json_object_set_int_member(props, TRG_PREFS_KEY_TV_SORT_COL, + (gint64) sort_column_id); + json_object_set_int_member(props, TRG_PREFS_KEY_TV_SORT_TYPE, + (gint64) sort_type); } -void trg_tree_view_restore_sort(TrgTreeView * tv) -{ +void trg_tree_view_restore_sort(TrgTreeView * tv, gboolean parentIsSortable) { JsonObject *props = trg_prefs_get_tree_view_props(tv); GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(tv)); - if (json_object_has_member(props, TRG_PREFS_KEY_TV_SORT_COL) && - json_object_has_member(props, TRG_PREFS_KEY_TV_SORT_TYPE)) { - gint64 sort_col = json_object_get_int_member(props, TRG_PREFS_KEY_TV_SORT_COL); - gint64 sort_type = json_object_get_int_member(props, TRG_PREFS_KEY_TV_SORT_TYPE); - gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(model), - sort_col, - (GtkSortType)sort_type); + if (json_object_has_member(props, TRG_PREFS_KEY_TV_SORT_COL) + && json_object_has_member(props, TRG_PREFS_KEY_TV_SORT_TYPE)) { + gint64 sort_col = json_object_get_int_member(props, + TRG_PREFS_KEY_TV_SORT_COL); + gint64 sort_type = json_object_get_int_member(props, + TRG_PREFS_KEY_TV_SORT_TYPE); + gtk_tree_sortable_set_sort_column_id( + GTK_TREE_SORTABLE(parentIsSortable ? gtk_tree_model_filter_get_model( + GTK_TREE_MODEL_FILTER(model)) : + model), sort_col, (GtkSortType) sort_type); } } -void trg_tree_view_set_prefs(TrgTreeView *tv, TrgPrefs *prefs) -{ +void trg_tree_view_set_prefs(TrgTreeView *tv, TrgPrefs *prefs) { TrgTreeViewPrivate *priv = TRG_TREE_VIEW_GET_PRIVATE(tv); priv->prefs = prefs; } -void trg_tree_view_setup_columns(TrgTreeView * tv) -{ +void trg_tree_view_setup_columns(TrgTreeView * tv) { TrgTreeViewPrivate *priv = TRG_TREE_VIEW_GET_PRIVATE(tv); JsonObject *props = trg_prefs_get_tree_view_props(tv); - if (!json_object_has_member(props, TRG_PREFS_KEY_TV_COLUMNS) || - !json_object_has_member(props, TRG_PREFS_KEY_TV_WIDTHS)) { + if (!json_object_has_member(props, TRG_PREFS_KEY_TV_COLUMNS) + || !json_object_has_member(props, TRG_PREFS_KEY_TV_WIDTHS)) { GList *li; for (li = priv->columns; li; li = g_list_next(li)) { trg_column_description *desc = (trg_column_description *) li->data; @@ -502,17 +433,19 @@ void trg_tree_view_setup_columns(TrgTreeView * tv) return; } - GList *columns = json_array_get_elements(json_object_get_array_member(props, TRG_PREFS_KEY_TV_COLUMNS)); - GList *widths = json_array_get_elements(json_object_get_array_member(props, TRG_PREFS_KEY_TV_WIDTHS)); + GList *columns = json_array_get_elements( + json_object_get_array_member(props, TRG_PREFS_KEY_TV_COLUMNS)); + GList *widths = json_array_get_elements( + json_object_get_array_member(props, TRG_PREFS_KEY_TV_WIDTHS)); GList *wli = widths; GList *cli = columns; for (; cli; cli = g_list_next(cli)) { - trg_column_description *desc = - trg_tree_view_find_column(tv, json_node_get_string((JsonNode*)cli->data)); + trg_column_description *desc = trg_tree_view_find_column(tv, + json_node_get_string((JsonNode*) cli->data)); if (desc) { - gint64 width = json_node_get_int((JsonNode*)wli->data); + gint64 width = json_node_get_int((JsonNode*) wli->data); trg_tree_view_add_column(tv, desc, width); } wli = g_list_next(wli); @@ -522,8 +455,7 @@ void trg_tree_view_setup_columns(TrgTreeView * tv) g_list_free(widths); } -GList *trg_tree_view_get_selected_refs_list(GtkTreeView * tv) -{ +GList *trg_tree_view_get_selected_refs_list(GtkTreeView * tv) { GtkTreeModel *model = gtk_tree_view_get_model(tv); GtkTreeSelection *selection = gtk_tree_view_get_selection(tv); GList *li, *selectionList; @@ -541,9 +473,7 @@ GList *trg_tree_view_get_selected_refs_list(GtkTreeView * tv) return refList; } -static void -trg_tree_view_class_init(TrgTreeViewClass * klass) -{ +static void trg_tree_view_class_init(TrgTreeViewClass * klass) { GObjectClass *object_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass, sizeof(TrgTreeViewPrivate)); @@ -552,32 +482,29 @@ trg_tree_view_class_init(TrgTreeViewClass * klass) object_class->set_property = trg_tree_view_set_property; object_class->constructor = trg_tree_view_constructor; - g_object_class_install_property(object_class, - PROP_PREFS, - g_param_spec_object - ("prefs", "Trg Prefs", - "Trg Prefs", - TRG_TYPE_PREFS, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_NAME | - G_PARAM_STATIC_NICK | - G_PARAM_STATIC_BLURB)); + g_object_class_install_property( + object_class, + PROP_PREFS, + g_param_spec_object( + "prefs", + "Trg Prefs", + "Trg Prefs", + TRG_TYPE_PREFS, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY + | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK + | G_PARAM_STATIC_BLURB)); } -static void trg_tree_view_init(TrgTreeView * tv) -{ +static void trg_tree_view_init(TrgTreeView * tv) { gtk_tree_view_set_rubber_banding(GTK_TREE_VIEW(tv), TRUE); gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(tv), TRUE); gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(tv), TRUE); - gtk_tree_selection_set_mode(gtk_tree_view_get_selection - (GTK_TREE_VIEW(tv)), - GTK_SELECTION_MULTIPLE); + gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(tv)), + GTK_SELECTION_MULTIPLE); gtk_widget_set_sensitive(GTK_WIDGET(tv), FALSE); } -GtkWidget *trg_tree_view_new(void) -{ +GtkWidget *trg_tree_view_new(void) { return GTK_WIDGET(g_object_new(TRG_TYPE_TREE_VIEW, NULL)); } diff --git a/src/trg-tree-view.h b/src/trg-tree-view.h index 8040262..d82ad54 100644 --- a/src/trg-tree-view.h +++ b/src/trg-tree-view.h @@ -90,8 +90,8 @@ trg_column_description *trg_tree_view_reg_column(TrgTreeView * tv, gchar * id, gint flags); void trg_tree_view_setup_columns(TrgTreeView * tv); void trg_tree_view_set_prefs(TrgTreeView *tv, TrgPrefs *prefs); -void trg_tree_view_persist(TrgTreeView * tv); -void trg_tree_view_restore_sort(TrgTreeView * tv); +void trg_tree_view_persist(TrgTreeView * tv, gboolean parentIsSortable); +void trg_tree_view_restore_sort(TrgTreeView * tv, gboolean parentIsSortable); gboolean trg_tree_view_is_column_showing(TrgTreeView *tv, gint index); #endif /* _TRG_TREE_VIEW_H_ */ -- cgit v1.2.3