From 2416aaefd4e073a13a465416c4e72c3f54b4da5d Mon Sep 17 00:00:00 2001 From: Thomas Leonard Date: Fri, 20 Dec 2002 13:43:39 +0000 Subject: [PATCH] r2219: Removed warning message from --new. It can be useful for a session manager... Draw iconified windows with a background, so they don't get confused with other icons (suggested by Joakim Andreasson). Bugfix: Stupid bug stopped iconified windows from being removed and could cause a crash! --- ROX-Filer/Help/Changes | 8 ++ ROX-Filer/Help/TODO | 2 - ROX-Filer/src/collection.c | 13 --- ROX-Filer/src/filer.c | 23 +++++ ROX-Filer/src/filer.h | 1 + ROX-Filer/src/main.c | 2 - ROX-Filer/src/pinboard.c | 17 +--- ROX-Filer/src/pinboard.h | 3 - ROX-Filer/src/tasklist.c | 48 +--------- ROX-Filer/src/view_details.c | 219 ++++++++++++++++++++++++++++--------------- 10 files changed, 182 insertions(+), 154 deletions(-) diff --git a/ROX-Filer/Help/Changes b/ROX-Filer/Help/Changes index 74f5d201..5b079ed7 100644 --- a/ROX-Filer/Help/Changes +++ b/ROX-Filer/Help/Changes @@ -2,6 +2,14 @@ A RISC OS-like filer for X by Thomas Leonard +20-Dec-2002 +~~~~~~~~~~~ +Removed warning message from --new. It can be useful for a session manager... +Draw iconified windows with a background, so they don't get confused with other +icons (suggested by Joakim Andreasson). +Bugfix: Stupid bug stopped iconified windows from being removed and could + cause a crash! + 17-Dec-2002 ~~~~~~~~~~~ The 'Directories always come first' option now only applies to name sorts. diff --git a/ROX-Filer/Help/TODO b/ROX-Filer/Help/TODO index 50873592..ec2fbe7b 100644 --- a/ROX-Filer/Help/TODO +++ b/ROX-Filer/Help/TODO @@ -46,8 +46,6 @@ Dragging over the panel should do the raise thing. Auto-unmount when last directory is closed? -Iconfied windows should have a button-type style (Joakim Andreasson). - Active icons in iconified windows (Christian V. J. Brüssow). Allow changing the pinboard style without having to drag the image back in diff --git a/ROX-Filer/src/collection.c b/ROX-Filer/src/collection.c index d54517a5..68f725ce 100644 --- a/ROX-Filer/src/collection.c +++ b/ROX-Filer/src/collection.c @@ -797,19 +797,6 @@ static gint collection_key_press(GtkWidget *widget, GdkEventKey *event) collection_move_cursor(collection, last - first + 1, 0); break; } - case GDK_Escape: - collection_set_cursor_item(collection, -1); - collection_clear_selection(collection); - return FALSE; /* Pass it on */ - case ' ': - if (item >=0 && item < collection->number_of_items) - { - collection_toggle_item(collection, item); - if (item < collection->number_of_items - 1) - collection_set_cursor_item(collection, - item + 1); - } - break; default: return FALSE; } diff --git a/ROX-Filer/src/filer.c b/ROX-Filer/src/filer.c index 1626b36d..400551af 100644 --- a/ROX-Filer/src/filer.c +++ b/ROX-Filer/src/filer.c @@ -835,6 +835,24 @@ static gboolean popup_menu(GtkWidget *widget, FilerWindow *filer_window) return TRUE; } +void filer_window_toggle_cursor_item_selected(FilerWindow *filer_window) +{ + ViewIface *view = filer_window->view; + ViewIter iter; + + view_get_iter(view, &iter, VIEW_ITER_FROM_CURSOR); + if (!iter.next(&iter)) + return; /* No cursor */ + + if (view_get_selected(view, &iter)) + view_set_selected(view, &iter, FALSE); + else + view_set_selected(view, &iter, TRUE); + + if (iter.next(&iter)) + view_cursor_to_iter(view, &iter); +} + /* Handle keys that can't be bound with the menu */ static gint key_press_event(GtkWidget *widget, GdkEventKey *event, @@ -863,6 +881,8 @@ static gint key_press_event(GtkWidget *widget, { case GDK_Escape: filer_target_mode(filer_window, NULL, NULL, NULL); + view_cursor_to_iter(filer_window->view, NULL); + view_clear_selection(filer_window->view); return FALSE; case GDK_Return: return_pressed(filer_window, event); @@ -887,6 +907,9 @@ static gint key_press_event(GtkWidget *widget, (GdkEvent *) event, &iter); break; } + case ' ': + filer_window_toggle_cursor_item_selected(filer_window); + break; default: if (key >= GDK_0 && key <= GDK_9) group[0] = key - GDK_0 + '0'; diff --git a/ROX-Filer/src/filer.h b/ROX-Filer/src/filer.h index 90ee8668..119ab559 100644 --- a/ROX-Filer/src/filer.h +++ b/ROX-Filer/src/filer.h @@ -135,5 +135,6 @@ gboolean filer_window_delete(GtkWidget *window, GdkEvent *unused, FilerWindow *filer_window); void filer_set_view_type(FilerWindow *filer_window, ViewType type); +void filer_window_toggle_cursor_item_selected(FilerWindow *filer_window); #endif /* _FILER_H */ diff --git a/ROX-Filer/src/main.c b/ROX-Filer/src/main.c index 2e0dd5d6..dc03ecdc 100644 --- a/ROX-Filer/src/main.c +++ b/ROX-Filer/src/main.c @@ -305,8 +305,6 @@ int main(int argc, char **argv) { case 'n': new_copy = TRUE; - g_printerr("ROX-Filer: Running in debug mode " - "(--new option used)\n"); break; case 'o': info_message(_("The -o argument is no longer " diff --git a/ROX-Filer/src/pinboard.c b/ROX-Filer/src/pinboard.c index 85a3adbd..bf109fcf 100644 --- a/ROX-Filer/src/pinboard.c +++ b/ROX-Filer/src/pinboard.c @@ -117,9 +117,9 @@ struct _PinIcon { static PinIcon *current_wink_icon = NULL; static gint wink_timeout; -/* Used for the text colours (only) in the icons (and tasklist windows) */ -GdkColor pin_text_fg_col, pin_text_bg_col; -PangoFontDescription *pinboard_font = NULL; /* NULL => Gtk default */ +/* Used for the text colours (only) in the icons */ +static GdkColor pin_text_fg_col, pin_text_bg_col; +PangoFontDescription *pinboard_font = NULL; /* NULL => Gtk default */ static GdkColor pin_text_shadow_col; @@ -139,9 +139,7 @@ static Option o_pinboard_fg_colour, o_pinboard_bg_colour; static Option o_pinboard_tasklist, o_forward_buttons_13; static Option o_iconify_start, o_iconify_dir; static Option o_label_font, o_pinboard_shadow_colour; - -/* tasklist.c needs it */ -Option o_pinboard_shadow_labels; +static Option o_pinboard_shadow_labels; /* Static prototypes */ static GType pin_icon_get_type(void); @@ -356,13 +354,6 @@ GdkWindow *pinboard_get_window(void) return NULL; } -GdkGC *pinboard_get_shadow_gc(void) -{ - g_return_val_if_fail(current_pinboard != NULL, NULL); - - return current_pinboard->shadow_gc; -} - const char *pinboard_get_name(void) { g_return_val_if_fail(current_pinboard != NULL, NULL); diff --git a/ROX-Filer/src/pinboard.h b/ROX-Filer/src/pinboard.h index ce68cb8a..6e6f635f 100644 --- a/ROX-Filer/src/pinboard.h +++ b/ROX-Filer/src/pinboard.h @@ -12,9 +12,7 @@ extern Pinboard *current_pinboard; extern Icon *pinboard_drag_in_progress; -extern GdkColor pin_text_fg_col, pin_text_bg_col; extern PangoFontDescription *pinboard_font; -extern Option o_pinboard_shadow_labels; typedef enum { BACKDROP_NONE, @@ -31,7 +29,6 @@ const gchar *pinboard_get_name(void); void pinboard_set_backdrop(void); void pinboard_set_backdrop_app(const gchar *app); GdkWindow *pinboard_get_window(void); -GdkGC *pinboard_get_shadow_gc(void); void pinboard_add_widget(GtkWidget *widget); #endif /* _PINBOARD_H */ diff --git a/ROX-Filer/src/tasklist.c b/ROX-Filer/src/tasklist.c index 482fef49..63ef045e 100644 --- a/ROX-Filer/src/tasklist.c +++ b/ROX-Filer/src/tasklist.c @@ -90,9 +90,6 @@ static guint xid_hash(XID *xid); static gboolean xid_equal(XID *a, XID *b); static void state_changed(IconWindow *win); static void show_icon(IconWindow *win); -static gboolean draw_label_shadow(GtkWidget *widget, - GdkEventExpose *event, - gpointer data); static void icon_win_free(IconWindow *win); static void update_style(gpointer key, gpointer data, gpointer user_data); static void update_supported(void); @@ -771,8 +768,6 @@ static void show_icon(IconWindow *win) FALSE, TRUE, 0); g_object_unref(pixbuf); - gtk_button_set_relief(GTK_BUTTON(win->widget), GTK_RELIEF_NONE); - win->label = wrapped_label_new(win->text, 180); update_style(NULL, win, NULL); @@ -786,55 +781,20 @@ static void show_icon(IconWindow *win) G_CALLBACK(icon_motion_notify), win); g_signal_connect(win->widget, "released", G_CALLBACK(button_released), win); - g_signal_connect(win->label, "expose_event", - G_CALLBACK(draw_label_shadow), win); gtk_widget_show_all(vbox); /* So the size comes out right */ pinboard_add_widget(win->widget); gtk_widget_show(win->widget); } -static gboolean draw_label_shadow(GtkWidget *widget, GdkEventExpose *event, - gpointer data) -{ - WrappedLabel *wrap = WRAPPED_LABEL(widget); - IconWindow *win = (IconWindow *) data; - GdkGC *gc; - - /* Should we return silently? It seems that this can happen... */ - g_return_val_if_fail(win->widget != NULL, FALSE); - - gc = pinboard_get_shadow_gc(); - - if (o_pinboard_shadow_labels.int_value && gc - && GTK_WIDGET_STATE(win->widget) == GTK_STATE_NORMAL) - { - gint x = widget->allocation.x - wrap->x_off; - gint y = widget->allocation.y - wrap->y_off; - - gdk_gc_set_clip_origin(gc, - widget->allocation.x, widget->allocation.y); - gdk_gc_set_clip_rectangle(gc, &widget->allocation); - - gdk_draw_layout(widget->window, gc, x + 1, y + 1, wrap->layout); - - if (o_pinboard_shadow_labels.int_value < 2) - return FALSE; - - gdk_draw_layout(widget->window, gc, x + 2, y + 2, wrap->layout); - } - - return FALSE; -} - /* A window has been destroyed/expanded -- remove its icon */ static void hide_icon(IconWindow *win) { g_return_if_fail(win->widget != NULL); + gtk_widget_destroy(win->widget); win->widget = NULL; win->label = NULL; - gtk_widget_destroy(win->widget); } static void state_changed(IconWindow *win) @@ -872,13 +832,7 @@ static void update_style(gpointer key, gpointer data, gpointer user_data) IconWindow *win = (IconWindow *) data; if (win->widget) - { - gtk_widget_modify_fg(win->label, - GTK_STATE_NORMAL, &pin_text_fg_col); - gtk_widget_modify_bg(win->label, - GTK_STATE_NORMAL, &pin_text_bg_col); widget_modify_font(win->label, pinboard_font); - } } /* Find out what the new window manager can do... */ diff --git a/ROX-Filer/src/view_details.c b/ROX-Filer/src/view_details.c index 780792da..cb9edc1b 100644 --- a/ROX-Filer/src/view_details.c +++ b/ROX-Filer/src/view_details.c @@ -24,6 +24,7 @@ #include "config.h" #include +#include #include "global.h" @@ -52,7 +53,8 @@ #define COL_ITEM 7 #define COL_COLOUR 8 #define COL_ICON 9 -#define N_COLUMNS 10 +#define COL_BG_COLOUR 10 +#define N_COLUMNS 11 static gpointer parent_class = NULL; @@ -66,6 +68,7 @@ struct _ViewItem { DirItem *item; GdkPixbuf *image; int old_pos; /* Used while sorting */ + gboolean selected; }; typedef struct _ViewDetails ViewDetails; @@ -142,6 +145,8 @@ static void details_set_default_sort_func(GtkTreeSortable *sortable, GtkDestroyNotify destroy); static gboolean details_has_default_sort_func(GtkTreeSortable *sortable); static void view_details_sortable_init(GtkTreeSortableIface *iface); +static void set_selected(ViewDetails *view_details, int i, gboolean selected); +static gboolean get_selected(ViewDetails *view_details, int i); /**************************************************************** @@ -226,7 +231,7 @@ static GType details_get_column_type(GtkTreeModel *tree_model, gint index) { g_return_val_if_fail(index < N_COLUMNS && index >= 0, G_TYPE_INVALID); - if (index == COL_COLOUR) + if (index == COL_COLOUR || index == COL_BG_COLOUR) return GDK_TYPE_COLOR; else if (index == COL_ITEM) return G_TYPE_POINTER; @@ -271,8 +276,10 @@ static void details_get_value(GtkTreeModel *tree_model, GValue *value) { ViewDetails *view_details = (ViewDetails *) tree_model; + GtkStyle *style = ((GtkWidget *) tree_model)->style; gint i; GPtrArray *items = view_details->items; + ViewItem *view_item; DirItem *item; mode_t m; @@ -280,7 +287,8 @@ static void details_get_value(GtkTreeModel *tree_model, i = GPOINTER_TO_INT(iter->user_data); g_return_if_fail(i >= 0 && i < items->len); - item = ((ViewItem *) items->pdata[i])->item; + view_item = (ViewItem *) items->pdata[i]; + item = view_item->item; /* g_print("[ get %d ]\n", column); */ @@ -329,6 +337,12 @@ static void details_get_value(GtkTreeModel *tree_model, g_value_init(value, GDK_TYPE_COLOR); g_value_set_boxed(value, type_get_colour(item, NULL)); break; + case COL_BG_COLOUR: + g_value_init(value, GDK_TYPE_COLOR); + g_value_set_boxed(value, view_item->selected + ? &style->base[GTK_STATE_SELECTED] + : &style->base[GTK_STATE_NORMAL]); + break; case COL_OWNER: g_value_init(value, G_TYPE_STRING); g_value_set_string(value, user_name(item->uid)); @@ -566,21 +580,9 @@ static gboolean details_has_default_sort_func(GtkTreeSortable *sortable) static gboolean is_selected(ViewDetails *view_details, int i) { - GtkTreeIter iter; - GtkTreeSelection *selection; - - selection = gtk_tree_view_get_selection((GtkTreeView *) view_details); - - iter.user_data = GINT_TO_POINTER(i); - return gtk_tree_selection_iter_is_selected(selection, &iter); -} - -static void toggle_selected(GtkTreeSelection *selection, GtkTreeIter *iter) -{ - if (gtk_tree_selection_iter_is_selected(selection, iter)) - gtk_tree_selection_unselect_iter(selection, iter); - else - gtk_tree_selection_select_iter(selection, iter); + ViewIter iter; + iter.i = i; + return view_details_get_selected((ViewIface *) view_details, &iter); } static void perform_action(ViewDetails *view_details, GdkEventButton *event) @@ -593,14 +595,12 @@ static void perform_action(ViewDetails *view_details, GdkEventButton *event) GtkTreePath *path = NULL; GtkTreeIter iter; GtkTreeModel *model; - GtkTreeSelection *selection; gboolean press = event->type == GDK_BUTTON_PRESS; int i = -1; ViewIter viter; OpenFlags flags = 0; model = gtk_tree_view_get_model(tree); - selection = gtk_tree_view_get_selection(tree); if (gtk_tree_view_get_path_at_pos(tree, event->x, event->y, &path, NULL, NULL, NULL)) @@ -637,10 +637,11 @@ static void perform_action(ViewDetails *view_details, GdkEventButton *event) switch (action) { case ACT_CLEAR_SELECTION: - gtk_tree_selection_unselect_all(selection); + view_details_clear_selection(view); break; case ACT_TOGGLE_SELECTED: - toggle_selected(selection, &iter); + set_selected(view_details, i, + !get_selected(view_details, i)); break; case ACT_SELECT_EXCL: view_details_select_only(view, &viter); @@ -675,7 +676,8 @@ static void perform_action(ViewDetails *view_details, GdkEventButton *event) dnd_motion_start(MOTION_READY_FOR_DND); break; case ACT_PRIME_AND_TOGGLE: - toggle_selected(selection, &iter); + set_selected(view_details, i, + !get_selected(view_details, i)); dnd_motion_start(MOTION_READY_FOR_DND); break; case ACT_PRIME_FOR_DND: @@ -690,13 +692,13 @@ static void perform_action(ViewDetails *view_details, GdkEventButton *event) } break; case ACT_LASSO_CLEAR: - gtk_tree_selection_unselect_all(selection); + view_details_clear_selection(view); /* (no break) */ -#if 0 case ACT_LASSO_MODIFY: +#if 0 collection_lasso_box(collection, event->x, event->y); - break; #endif + break; case ACT_RESIZE: filer_window_autosize(filer_window); break; @@ -724,6 +726,20 @@ static gboolean view_details_button_release(GtkWidget *widget, return TRUE; } +static gint view_details_key_press_event(GtkWidget *widget, GdkEventKey *event) +{ + if (event->keyval == ' ') + { + ViewDetails *view_details = (ViewDetails *) widget; + FilerWindow *filer_window = view_details->filer_window; + + filer_window_toggle_cursor_item_selected(filer_window); + return TRUE; + } + + return GTK_WIDGET_CLASS(parent_class)->key_press_event(widget, event); +} + static void view_details_destroy(GtkObject *view_details) { VIEW_DETAILS(view_details)->filer_window = NULL; @@ -751,6 +767,7 @@ static void view_details_class_init(gpointer gclass, gpointer data) widget->button_press_event = view_details_button_press; widget->button_release_event = view_details_button_release; + widget->key_press_event = view_details_key_press_event; } static void view_details_init(GTypeInstance *object, gpointer gclass) @@ -766,7 +783,7 @@ static void view_details_init(GTypeInstance *object, gpointer gclass) view_details->cursor_base = -1; selection = gtk_tree_view_get_selection(treeview); - gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); + gtk_tree_selection_set_mode(selection, GTK_SELECTION_NONE); /* Sorting */ view_details->sort_column_id = -1; @@ -783,48 +800,72 @@ static void view_details_init(GTypeInstance *object, gpointer gclass) "pixbuf", COL_ICON, NULL); gtk_tree_view_append_column(treeview, column); - /* The rest are text... */ - cell = gtk_cell_renderer_text_new(); - /* Name */ + cell = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Name"), cell, "text", COL_LEAF, - "foreground-gdk", COL_COLOUR, NULL); + "foreground-gdk", COL_COLOUR, + "background-gdk", COL_BG_COLOUR, + NULL); gtk_tree_view_append_column(treeview, column); gtk_tree_view_column_set_sort_column_id(column, COL_LEAF); /* Type */ + cell = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Type"), cell, - "text", COL_TYPE, NULL); + "text", COL_TYPE, + "foreground-gdk", COL_COLOUR, + "background-gdk", COL_BG_COLOUR, + NULL); gtk_tree_view_append_column(treeview, column); gtk_tree_view_column_set_sort_column_id(column, COL_TYPE); /* Perm */ + cell = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Permissions"), - cell, "text", COL_PERM, NULL); + cell, "text", COL_PERM, + "foreground-gdk", COL_COLOUR, + "background-gdk", COL_BG_COLOUR, + NULL); gtk_tree_view_append_column(treeview, column); /* Owner */ + cell = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Owner"), cell, - "text", COL_OWNER, NULL); + "text", COL_OWNER, + "foreground-gdk", COL_COLOUR, + "background-gdk", COL_BG_COLOUR, + NULL); gtk_tree_view_append_column(treeview, column); gtk_tree_view_column_set_sort_column_id(column, COL_OWNER); /* Group */ + cell = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Group"), cell, - "text", COL_GROUP, NULL); + "text", COL_GROUP, + "foreground-gdk", COL_COLOUR, + "background-gdk", COL_BG_COLOUR, + NULL); gtk_tree_view_append_column(treeview, column); gtk_tree_view_column_set_sort_column_id(column, COL_GROUP); /* Size */ + cell = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Size"), cell, - "text", COL_SIZE, NULL); + "text", COL_SIZE, + "foreground-gdk", COL_COLOUR, + "background-gdk", COL_BG_COLOUR, + NULL); gtk_tree_view_append_column(treeview, column); gtk_tree_view_column_set_sort_column_id(column, COL_SIZE); /* MTime */ + cell = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("M-Time"), cell, - "text", COL_MTIME, NULL); + "text", COL_MTIME, + "foreground-gdk", COL_COLOUR, + "background-gdk", COL_BG_COLOUR, + NULL); gtk_tree_view_append_column(treeview, column); gtk_tree_view_column_set_sort_column_id(column, COL_MTIME); @@ -956,6 +997,7 @@ static void view_details_add_items(ViewIface *view, GPtrArray *new_items) vitem = g_new(ViewItem, 1); vitem->item = item; vitem->image = NULL; + vitem->selected = FALSE; g_ptr_array_add(items, vitem); @@ -1103,20 +1145,28 @@ static void view_details_clear(ViewIface *view) static void view_details_select_all(ViewIface *view) { - GtkTreeSelection *selection; - - selection = gtk_tree_view_get_selection((GtkTreeView *) view); + int i; + int n = ((ViewDetails *) view)->items->len; - gtk_tree_selection_select_all(selection); + for (i = 0; i < n; i++) + { + ViewIter iter; + iter.i = i; + view_details_set_selected(view, &iter, TRUE); + } } static void view_details_clear_selection(ViewIface *view) { - GtkTreeSelection *selection; - - selection = gtk_tree_view_get_selection((GtkTreeView *) view); + int i; + int n = ((ViewDetails *) view)->items->len; - gtk_tree_selection_unselect_all(selection); + for (i = 0; i < n; i++) + { + ViewIter iter; + iter.i = i; + view_details_set_selected(view, &iter, FALSE); + } } static int view_details_count_items(ViewIface *view) @@ -1126,21 +1176,18 @@ static int view_details_count_items(ViewIface *view) return view_details->items->len; } -static void inc(GtkTreeModel *model, GtkTreePath *path, - GtkTreeIter *iter, gpointer data) -{ - (*((int *) data))++; -} - static int view_details_count_selected(ViewIface *view) { - GtkTreeView *tree = (GtkTreeView *) view; - GtkTreeSelection *selection; + ViewDetails *view_details = (ViewDetails *) view; + int n = view_details->items->len; + ViewItem **items = (ViewItem **) view_details->items->pdata; int count = 0; + int i; - selection = gtk_tree_view_get_selection(tree); + for (i = 0; i < n; i++) + if (items[i]->selected) + count++; - gtk_tree_selection_selected_foreach(selection, inc, &count); return count; } @@ -1149,7 +1196,7 @@ static void view_details_show_cursor(ViewIface *view) } static void view_details_get_iter(ViewIface *view, - ViewIter *iter, IterFlags flags) + ViewIter *iter, IterFlags flags) { make_iter((ViewDetails *) view, iter, flags); } @@ -1172,41 +1219,65 @@ static void view_details_cursor_to_iter(ViewIface *view, ViewIter *iter) gtk_tree_path_free(path); } +static void set_selected(ViewDetails *view_details, int i, gboolean selected) +{ + GtkTreeModel *model = (GtkTreeModel *) view_details; + GtkTreeIter t_iter; + GtkTreePath *path; + GPtrArray *items = view_details->items; + ViewItem *view_item; + + g_return_if_fail(i >= 0 && i < items->len); + view_item = (ViewItem *) items->pdata[i]; + + if (view_item->selected == selected) + return; + + view_item->selected = selected; + + path = gtk_tree_path_new(); + gtk_tree_path_append_index(path, i); + t_iter.user_data = GINT_TO_POINTER(i); + gtk_tree_model_row_changed(model, path, &t_iter); + gtk_tree_path_free(path); +} + static void view_details_set_selected(ViewIface *view, ViewIter *iter, gboolean selected) { - GtkTreeView *tree = (GtkTreeView *) view; - GtkTreeSelection *selection; - GtkTreeIter t_iter; + set_selected((ViewDetails *) view, iter->i, selected); +} - selection = gtk_tree_view_get_selection(tree); +static gboolean get_selected(ViewDetails *view_details, int i) +{ + GPtrArray *items = view_details->items; - t_iter.user_data = GINT_TO_POINTER(iter->i); - if (selected) - gtk_tree_selection_select_iter(selection, &t_iter); - else - gtk_tree_selection_unselect_iter(selection, &t_iter); + g_return_val_if_fail(i >= 0 && i < items->len, FALSE); + + return ((ViewItem *) items->pdata[i])->selected; } static gboolean view_details_get_selected(ViewIface *view, ViewIter *iter) { - return FALSE; + return get_selected((ViewDetails *) view, iter->i); } static void view_details_select_only(ViewIface *view, ViewIter *iter) { - GtkTreePath *path; - GtkTreeSelection *selection; + ViewDetails *view_details = (ViewDetails *) view; + int i = iter->i; + int n = view_details->items->len; - selection = gtk_tree_view_get_selection((GtkTreeView *) view); + set_selected(view_details, i, TRUE); - path = gtk_tree_path_new(); - gtk_tree_path_append_index(path, iter->i); + while (n > 0) + { + n--; - gtk_tree_selection_unselect_all(selection); - gtk_tree_selection_select_path(selection, path); - gtk_tree_path_free(path); + if (n != i) + set_selected(view_details, n, FALSE); + } } static void view_details_set_frozen(ViewIface *view, gboolean frozen) -- 2.11.4.GIT