From e2ca0ebd2ce27210e921326e26820048e8efa5c4 Mon Sep 17 00:00:00 2001 From: Jesse van den Kieboom Date: Sat, 30 Sep 2006 14:20:20 +0000 Subject: [PATCH] * gnoemoe/mcp/gm-mcp-userlist-view.c: keep userlist at the current scroll position at all times (fixes #3) --- gnoemoe/mcp/gm-mcp-userlist-view.c | 68 +++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/gnoemoe/mcp/gm-mcp-userlist-view.c b/gnoemoe/mcp/gm-mcp-userlist-view.c index 18d3f2e..18fb1cf 100644 --- a/gnoemoe/mcp/gm-mcp-userlist-view.c +++ b/gnoemoe/mcp/gm-mcp-userlist-view.c @@ -32,6 +32,9 @@ typedef struct _GmMcpUserlistView { gint num_active; GdkColor status_color; + + gdouble scroll_position; + gulong idle_scroll; } GmMcpUserlistView; static void on_gm_mcp_userlist_view_weak_notify(gpointer data, GObject *obj); @@ -79,6 +82,48 @@ static GmUserlistCompareFunc compare_functions[] = { gm_mcp_userlist_view_sort_name }; +static gboolean +gm_mcp_userlist_view_idle_scroll(GmMcpUserlistView *view) { + GtkAdjustment *adj; + + view->idle_scroll = 0; + adj = gtk_scrolled_window_get_vadjustment(view->scrolled_window); + gtk_adjustment_set_value(adj, view->scroll_position); + + return FALSE; +} + +static void +gm_mcp_userlist_view_prepare_scroll(GmMcpUserlistView *view) { + GtkAdjustment *adj; + + if (view->idle_scroll != 0) + return; + + adj = gtk_scrolled_window_get_vadjustment(view->scrolled_window); + + view->scroll_position = gtk_adjustment_get_value(adj); + view->idle_scroll = g_idle_add((GSourceFunc)(gm_mcp_userlist_view_idle_scroll), view); +} + +static void +on_rows_reordered(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, + gpointer arg3, GmMcpUserlistView *view) { + gm_mcp_userlist_view_prepare_scroll(view); +} + +static void +on_row_inserted(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, + GmMcpUserlistView *view) { + gm_mcp_userlist_view_prepare_scroll(view); +} + +static void +on_row_deleted(GtkTreeModel *model, GtkTreePath *path, + GmMcpUserlistView *view) { + gm_mcp_userlist_view_prepare_scroll(view); +} + GtkTreeModel * gm_mcp_userlist_view_model_create(GmMcpUserlistView *view) { GtkListStore *store = gtk_list_store_new(GM_USERLIST_N_COLUMNS, @@ -89,6 +134,16 @@ gm_mcp_userlist_view_model_create(GmMcpUserlistView *view) { view->store = store; view->model = model; + + g_signal_connect(model, "row-inserted", + G_CALLBACK(on_row_inserted), + view); + g_signal_connect(model, "row-deleted", + G_CALLBACK(on_row_deleted), + view); + g_signal_connect(model, "rows-reordered", + G_CALLBACK(on_rows_reordered), + view); return model; } @@ -211,6 +266,15 @@ gm_mcp_userlist_view_create_label(GmMcpUserlistView *view) { return view->label; } +static void +on_adj_changed(GtkAdjustment *adj, GmMcpUserlistView *view) { + if (view->idle_scroll != 0 && gtk_adjustment_get_value(adj) != view->scroll_position) { + gtk_adjustment_set_value(adj, view->scroll_position); + g_source_remove(view->idle_scroll); + view->idle_scroll = 0; + } +} + GtkWidget * gm_mcp_userlist_view_create_userlist(GmMcpUserlistView *view) { GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL); @@ -224,6 +288,9 @@ gm_mcp_userlist_view_create_userlist(GmMcpUserlistView *view) { gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window), GTK_SHADOW_IN); + GtkAdjustment *adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scrolled_window)); + g_signal_connect(adj, "changed", G_CALLBACK(on_adj_changed), view); + gtk_widget_set_size_request(scrolled_window, 150, -1); gtk_widget_set_size_request(tree_view, 150, -1); @@ -592,7 +659,6 @@ on_gm_mcp_userlist_view_player_removed(GmMcpPackage *package, gint id, } gm_mcp_userlist_view_update_label(view); - gtk_list_store_remove(view->store, &iter); }