* gnoemoe/mcp/gm-mcp-userlist-view.c: keep userlist at the current

scroll position at all times (fixes #3)
This commit is contained in:
Jesse van den Kieboom 2006-09-30 14:20:20 +00:00
parent a8dadeb408
commit e2ca0ebd2c
1 changed files with 67 additions and 1 deletions

View File

@ -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);
}