/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */ /************************************************ rbgtkiconview.c - $Author: ggc $ $Date: 2007/07/13 16:07:31 $ Copyright (C) 2005 Masao Mutoh ************************************************/ #include "global.h" #if GTK_CHECK_VERSION(2,6,0) #define _SELF(s) (GTK_ICON_VIEW(RVAL2GOBJ(s))) static ID id_model; static ID id_select_path; static VALUE iview_initialize(int argc, VALUE *argv, VALUE self) { VALUE model; rb_scan_args(argc, argv, "01", &model); if (NIL_P(model)){ RBGTK_INITIALIZE(self, gtk_icon_view_new()); } else { G_CHILD_SET(self, id_model, model); RBGTK_INITIALIZE(self, gtk_icon_view_new_with_model(GTK_TREE_MODEL(RVAL2GOBJ(model)))); } return Qnil; } /* Defined as Properties void gtk_icon_view_set_model (GtkIconView *icon_view, GtkTreeModel *model); GtkTreeModel* gtk_icon_view_get_model (GtkIconView *icon_view); void gtk_icon_view_set_text_column (GtkIconView *icon_view, gint column); gint gtk_icon_view_get_text_column (GtkIconView *icon_view); void gtk_icon_view_set_markup_column (GtkIconView *icon_view, gint column); gint gtk_icon_view_get_markup_column (GtkIconView *icon_view); void gtk_icon_view_set_pixbuf_column (GtkIconView *icon_view, gint column); gint gtk_icon_view_get_pixbuf_column (GtkIconView *icon_view); */ static VALUE iview_get_path_at_pos(VALUE self, VALUE x, VALUE y) { return GTKTREEPATH2RVAL(gtk_icon_view_get_path_at_pos(_SELF(self), NUM2INT(x), NUM2INT(y))); } static void iview_foreach_func(GtkIconView *iview, GtkTreePath *path, gpointer *func) { rb_funcall((VALUE)func, id_call, 2, GOBJ2RVAL(iview), GTKTREEPATH2RVAL(path)); } static VALUE iview_selected_foreach(VALUE self) { VALUE func = rb_block_proc(); G_RELATIVE(self, func); gtk_icon_view_selected_foreach(_SELF(self), (GtkIconViewForeachFunc)iview_foreach_func, (gpointer)func); return self; } /* Defined as Properties void gtk_icon_view_set_selection_mode (GtkIconView *icon_view, GtkSelectionMode mode); GtkSelectionMode gtk_icon_view_get_selection_mode (GtkIconView *icon_view); void gtk_icon_view_set_orientation (GtkIconView *icon_view, GtkOrientation orientation); GtkOrientation gtk_icon_view_get_orientation (GtkIconView *icon_view); void gtk_icon_view_set_columns (GtkIconView *icon_view, gint columns); gint gtk_icon_view_get_columns (GtkIconView *icon_view); void gtk_icon_view_set_item_width (GtkIconView *icon_view, gint item_width); gint gtk_icon_view_get_item_width (GtkIconView *icon_view); void gtk_icon_view_set_spacing (GtkIconView *icon_view, gint spacing); gint gtk_icon_view_get_spacing (GtkIconView *icon_view); void gtk_icon_view_set_row_spacing (GtkIconView *icon_view, gint row_spacing); gint gtk_icon_view_get_row_spacing (GtkIconView *icon_view); void gtk_icon_view_set_column_spacing (GtkIconView *icon_view, gint column_spacing); gint gtk_icon_view_get_column_spacing (GtkIconView *icon_view); void gtk_icon_view_set_margin (GtkIconView *icon_view, gint margin); gint gtk_icon_view_get_margin (GtkIconView *icon_view); void gtk_icon_view_set_reorderable (GtkIconView *icon_view, gboolean reorderable); gboolean gtk_icon_view_get_reorderable (GtkIconView *icon_view); */ static VALUE iview_select_path(VALUE self, VALUE path) { G_CHILD_SET(self, id_select_path, path); gtk_icon_view_select_path(_SELF(self), RVAL2GTKTREEPATH(path)); return self; } static VALUE iview_unselect_path(VALUE self, VALUE path) { G_CHILD_UNSET(self, id_select_path); gtk_icon_view_unselect_path(_SELF(self), RVAL2GTKTREEPATH(path)); return self; } static VALUE iview_path_is_selected(VALUE self, VALUE path) { return CBOOL2RVAL(gtk_icon_view_path_is_selected(_SELF(self), RVAL2GTKTREEPATH(path))); } static VALUE iview_get_selected_items(VALUE self) { GList* list = gtk_icon_view_get_selected_items(_SELF(self)); VALUE ret = GLIST2ARY2(list, GTK_TYPE_TREE_PATH); g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL); g_list_free(list); return ret; } static VALUE iview_select_all(VALUE self) { gtk_icon_view_select_all(_SELF(self)); return self; } static VALUE iview_unselect_all(VALUE self) { gtk_icon_view_unselect_all(_SELF(self)); return self; } static VALUE iview_item_activated(VALUE self, VALUE path) { gtk_icon_view_item_activated(_SELF(self), RVAL2GTKTREEPATH(path)); return self; } #endif #if GTK_CHECK_VERSION(2,8,0) static VALUE iview_create_drag_icon(VALUE self, VALUE path) { return GOBJ2RVAL(gtk_icon_view_create_drag_icon(_SELF(self), RVAL2GTKTREEPATH(path))); } static VALUE iview_enable_model_drag_dest(VALUE self, VALUE targets, VALUE actions) { gtk_icon_view_enable_model_drag_dest(_SELF(self), rbgtk_get_target_entry(targets), RARRAY_LEN(targets), RVAL2GFLAGS(actions, GDK_TYPE_DRAG_ACTION)); return self; } static VALUE iview_enable_model_drag_source(VALUE self, VALUE flags, VALUE targets, VALUE actions) { gtk_icon_view_enable_model_drag_source(_SELF(self), RVAL2GFLAGS(flags, GDK_TYPE_MODIFIER_TYPE), rbgtk_get_target_entry(targets), RARRAY_LEN(targets), RVAL2GFLAGS(actions, GDK_TYPE_DRAG_ACTION)); return self; } static VALUE iview_cursor(VALUE self) { GtkTreePath* path; GtkCellRenderer* cell; gboolean cursor_set = gtk_icon_view_get_cursor(_SELF(self), &path, &cell); return cursor_set ? rb_assoc_new(GTKTREEPATH2RVAL(path), GOBJ2RVAL(cell)) : Qnil; } static VALUE iview_get_dest_item_at_pos(VALUE self, VALUE drag_x, VALUE drag_y) { GtkTreePath* path; GtkIconViewDropPosition pos; gboolean item_at_pos = gtk_icon_view_get_dest_item_at_pos(_SELF(self), NUM2INT(drag_x), NUM2INT(drag_y), &path, &pos); return item_at_pos ? rb_assoc_new(GTKTREEPATH2RVAL(path), GENUM2RVAL(pos, GTK_TYPE_ICON_VIEW_DROP_POSITION)) : Qnil; } static VALUE iview_drag_dest_item(VALUE self) { GtkTreePath* path; GtkIconViewDropPosition pos; gtk_icon_view_get_drag_dest_item(_SELF(self), &path, &pos); return rb_assoc_new(GTKTREEPATH2RVAL(path), GENUM2RVAL(pos, GTK_TYPE_ICON_VIEW_DROP_POSITION)); } static VALUE iview_get_item_at_pos(VALUE self, VALUE x, VALUE y) { GtkTreePath* path; GtkCellRenderer* cell; gboolean item_at_pos = gtk_icon_view_get_item_at_pos(_SELF(self), NUM2INT(x), NUM2INT(y), &path, &cell); return item_at_pos ? rb_assoc_new(GTKTREEPATH2RVAL(path), GOBJ2RVAL(cell)) : Qnil; } static VALUE iview_visible_range(VALUE self) { GtkTreePath* start_path; GtkTreePath* end_path; gboolean valid_paths = gtk_icon_view_get_visible_range(_SELF(self), &start_path, &end_path); return valid_paths ? rb_assoc_new(GTKTREEPATH2RVAL(start_path), GTKTREEPATH2RVAL(end_path)) : Qnil; } static VALUE iview_scroll_to_path(VALUE self, VALUE path, VALUE use_align, VALUE row_align, VALUE col_align) { gtk_icon_view_scroll_to_path(_SELF(self), RVAL2GTKTREEPATH(path), RVAL2CBOOL(use_align), NUM2DBL(row_align), NUM2DBL(col_align)); return self; } static VALUE iview_set_cursor(VALUE self, VALUE path, VALUE cell, VALUE start_editing) { gtk_icon_view_set_cursor(_SELF(self), RVAL2GTKTREEPATH(path), NIL_P(cell) ? NULL : RVAL2GOBJ(cell), RVAL2CBOOL(start_editing)); return self; } static VALUE iview_set_drag_dest_item(VALUE self, VALUE path, VALUE pos) { gtk_icon_view_set_drag_dest_item(_SELF(self), NIL_P(path) ? NULL : RVAL2GTKTREEPATH(path), RVAL2GENUM(pos, GTK_TYPE_ICON_VIEW_DROP_POSITION)); return self; } static VALUE iview_unset_model_drag_dest(VALUE self) { gtk_icon_view_unset_model_drag_dest(_SELF(self)); return self; } static VALUE iview_unset_model_drag_source(VALUE self) { gtk_icon_view_unset_model_drag_source(_SELF(self)); return self; } #endif void Init_gtk_iconview() { #if GTK_CHECK_VERSION(2,6,0) VALUE iview = G_DEF_CLASS(GTK_TYPE_ICON_VIEW, "IconView", mGtk); id_model = rb_intern("model"); id_select_path = rb_intern("select_path"); rb_define_method(iview, "initialize", iview_initialize, -1); rb_define_method(iview, "get_path_at_pos", iview_get_path_at_pos, 2); rb_define_alias(iview, "get_path", "get_path_at_pos"); rb_define_method(iview, "selected_each", iview_selected_foreach, 0); rb_define_method(iview, "select_path", iview_select_path, 1); rb_define_method(iview, "unselect_path", iview_unselect_path, 1); rb_define_method(iview, "path_is_selected?", iview_path_is_selected, 1); rb_define_method(iview, "selected_items", iview_get_selected_items, 0); rb_define_method(iview, "select_all", iview_select_all, 0); rb_define_method(iview, "unselect_all", iview_unselect_all, 0); rb_define_method(iview, "item_activated", iview_item_activated, 1); #endif #if GTK_CHECK_VERSION(2,8,0) rb_define_method(iview, "create_drag_icon", iview_create_drag_icon, 1); rb_define_method(iview, "enable_model_drag_dest", iview_enable_model_drag_dest, 2); rb_define_method(iview, "enable_model_drag_source", iview_enable_model_drag_source, 3); rb_define_method(iview, "cursor", iview_cursor, 0); rb_define_method(iview, "get_dest_item", iview_get_dest_item_at_pos, 2); rb_define_method(iview, "drag_dest_item", iview_drag_dest_item, 0); rb_define_method(iview, "get_item", iview_get_item_at_pos, 2); rb_define_method(iview, "visible_range", iview_visible_range, 0); rb_define_method(iview, "scroll_to_path", iview_scroll_to_path, 4); rb_define_method(iview, "set_cursor", iview_set_cursor, 3); rb_define_method(iview, "set_drag_dest_item", iview_set_drag_dest_item, 2); rb_define_method(iview, "unset_model_drag_dest", iview_unset_model_drag_dest, 0); rb_define_method(iview, "unset_model_drag_source", iview_unset_model_drag_source, 0); /* GtkIconViewDropPosition */ G_DEF_CLASS(GTK_TYPE_ICON_VIEW_DROP_POSITION, "Type", iview); G_DEF_CONSTANTS(iview, GTK_TYPE_ICON_VIEW_DROP_POSITION, "GTK_ICON_VIEW_"); #endif }