📄 gemtreeview.c.svn-base
字号:
gtk_widget_grab_focus(view->search_entry); new_event = gdk_event_copy ((GdkEvent *) event); ((GdkEventKey *) new_event)->window = view->search_entry->window; gtk_widget_event (view->search_entry, new_event); ret = GDK_FILTER_REMOVE; } } return ret; }static gbooleangem_tree_view_key_press_event_cb (GtkWidget *widget, GdkEventKey *event, GemTreeView *view){// GemTreeView *view = GEM_TREE_VIEW(widget); if (event->keyval == GDK_Up) { GtkTreeView * tree = NULL; GtkTreeModel * model = NULL; tree = (GtkTreeView *)view->treeview; model = gtk_tree_view_get_model(tree); if (tree && model) { GtkTreePath * path = NULL; gtk_tree_view_get_cursor(GTK_TREE_VIEW(tree), &path, NULL); // g_print("%s(): Up curr = %s tree = 0x%08x \n", __FUNCTION__, gtk_tree_path_to_string(path),GTK_TREE_VIEW(tree)); if (path) { GtkTreePath * p; gint count; count = gtk_tree_model_iter_n_children(model, NULL); p = gtk_tree_path_copy(path); gtk_tree_path_prev(path); g_print("%s(): Up prev = %s\n", __FUNCTION__, gtk_tree_path_to_string(path)); if (!gtk_tree_path_compare(path, p)) { path = gtk_tree_path_new_from_indices(count - 1, -1); } gtk_tree_path_free(p); gtk_tree_view_set_cursor(GTK_TREE_VIEW(tree), path, NULL, FALSE); gtk_tree_path_free(path); } // g_object_unref(model); return TRUE; } } else if (event->keyval == GDK_Down) { GtkTreeView * tree = NULL; GtkTreeModel * model = NULL; tree = (GtkTreeView *)view->treeview; model = gtk_tree_view_get_model(tree); if (tree && model) { GtkTreePath * path = NULL; gtk_tree_view_get_cursor(GTK_TREE_VIEW(tree), &path, NULL); // g_print("%s(): Down curr = %s\n", __FUNCTION__, gtk_tree_path_to_string(path)); if (path) { GtkTreePath * p; gint count; count = gtk_tree_model_iter_n_children(model, NULL); p = gtk_tree_path_new_from_indices(count, -1); gtk_tree_path_next(path);// g_print("%s(): Down next = %s\n", __FUNCTION__, gtk_tree_path_to_string(path)); if (!gtk_tree_path_compare(path, p)) { path = gtk_tree_path_new_first(); } gtk_tree_path_free(p); } else { path = gtk_tree_path_new_first(); } gtk_tree_view_set_cursor(GTK_TREE_VIEW(tree), path, NULL, FALSE);// g_object_unref(model); return TRUE; } } else if (event->keyval == GDK_Left || event->keyval == GDK_Right) { GdkEvent *new_event; new_event = gdk_event_copy ((GdkEvent *) event); ((GdkEventKey *) new_event)->window = GTK_WIDGET(view)->window; gtk_widget_event(GTK_WIDGET(view), new_event); return TRUE; } else if (event->keyval != GDK_Return && event->keyval != GDK_space) { if (!GTK_WIDGET_HAS_FOCUS(view->search_entry)) { GdkEvent *new_event; gtk_widget_grab_focus(view->search_entry); new_event = gdk_event_copy ((GdkEvent *) event); ((GdkEventKey *) new_event)->window = view->search_entry->window; gtk_widget_event (view->search_entry, new_event); return TRUE; } } return FALSE; }static gboolean gem_tree_view_focus_in_event_cb (GtkWidget *widget, GdkEventFocus *event, gpointer user_data){ GemTreeView * view = (GemTreeView *)widget; gtk_widget_grab_focus(view->treeview); return FALSE;}static void gem_tree_view_show_cb(GtkWidget *widget, gpointer user_data){ if(!searchentry_visible) { GtkWidget *search_box = NULL; search_box = gem_tree_view_get_search_box(GEM_TREE_VIEW(widget)); gtk_widget_hide (search_box); }}static voidgem_tree_view_init (GemTreeView *view){ GtkWidget * scroll_window = NULL; GtkWidget * vbox = NULL; view->search_entry = gtk_entry_new(); g_signal_connect_after(G_OBJECT(view->search_entry), "key_press_event", G_CALLBACK(gem_tree_view_entry_key_press_event_cb), view); g_signal_connect(G_OBJECT(view->search_entry), "changed", G_CALLBACK(gem_tree_view_entry_changed_cb), (gpointer)view); // view->treeview = gtk_tree_view_new(); view->treeview = gem_internal_tree_view_new(); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view->treeview), FALSE);// g_signal_connect(G_OBJECT(view->treeview),// "key-press-event",// G_CALLBACK(gem_tree_view_key_press_event_cb),// (gpointer)view); // g_signal_connect(G_OBJECT(view->treeview),// "key-press-event",// G_CALLBACK(GEM_TREE_VIEW(view)->key_press),// (gpointer)view);/* gdk_window_add_filter(NULL, (GdkFilterFunc)gem_tree_view_key_press_snooper, (gpointer)view); */ scroll_window = gtk_auto_scrolled_window_new(); gtk_auto_scrolled_window_add(GTK_AUTO_SCROLLED_WINDOW(scroll_window), view->treeview); vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), scroll_window, TRUE, TRUE, 0); if (TRUE) { GtkWidget *hbox = NULL; GtkWidget *search_icon = NULL; GtkWidget *entry = NULL; entry = gtk_entry_new(); hbox = gtk_hbox_new(FALSE, 0); view->search_box = hbox; search_icon = gtk_image_new(); if (TRUE) { gchar * picpath = NULL; picpath = g_build_filename(gem_env_get_resource_path(), "pixmaps", "search.png", NULL); if (gem_resource_load_pic(picpath, GEM_PIC_NORMAL) == TRUE) { GdkPixbuf * pixbuf = NULL; pixbuf = gem_resource_find_pic(picpath, GEM_PIC_NORMAL); gtk_image_set_from_pixbuf(GTK_IMAGE(search_icon), pixbuf); } g_free(picpath); } gtk_box_pack_start(GTK_BOX(hbox), search_icon, FALSE, FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), view->search_entry, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); } if (TRUE) { GtkWidget * eventbox = NULL; eventbox = gtk_event_box_new(); GTK_WIDGET_SET_FLAGS(eventbox, GTK_CAN_FOCUS); gtk_widget_set_events(eventbox, GDK_ALL_EVENTS_MASK); gtk_event_box_set_above_child(GTK_EVENT_BOX(eventbox), FALSE); gtk_event_box_set_visible_window(GTK_EVENT_BOX(eventbox), FALSE); gtk_container_add(GTK_CONTAINER(eventbox), vbox); gtk_container_add(GTK_CONTAINER(view), eventbox); } GTK_WIDGET_SET_FLAGS(view, GTK_CAN_FOCUS); g_signal_connect(G_OBJECT(view), "focus-in-event", G_CALLBACK(gem_tree_view_focus_in_event_cb), NULL); view->search_column = 0; g_signal_connect(G_OBJECT(view), "show", G_CALLBACK(gem_tree_view_show_cb), NULL); return;}GtkWidget*gem_tree_view_new (void){ return g_object_new(GEM_TYPE_TREE_VIEW, NULL);}GtkTreeModel * gem_tree_view_get_model (GemTreeView * view){ return gtk_tree_view_get_model(GTK_TREE_VIEW(view->treeview));}voidgem_tree_view_set_model (GemTreeView *view, GtkTreeModel *model){ gtk_tree_view_set_model(GTK_TREE_VIEW(view->treeview), model);// g_object_ref(model); g_print("%s(): ref = %d\n", __FUNCTION__, (G_OBJECT(model)->ref_count)); return;}GtkWidget * gem_tree_view_get_view (GemTreeView * view){/* if (view->treeview) { g_object_ref(view->treeview); }*/ return view->treeview;}GtkWidget * gem_tree_view_get_search_box (GemTreeView * view){ return view->search_box;}void gem_tree_view_set_search_column(GemTreeView *view, guint colum_id, GtkSortType type, GtkTreeIterCompareFunc sort_func){ g_return_val_if_fail(colum_id, -1); view->search_column = colum_id; if (TRUE) { GtkTreeModel * model = NULL; model = gtk_tree_view_get_model(GTK_TREE_VIEW(view->treeview)); if (model) { GtkTreeSortable *sortable = NULL; sortable = GTK_TREE_SORTABLE(model); gtk_tree_sortable_set_sort_column_id(sortable, view->search_column, type); if (sort_func) { gtk_tree_sortable_set_sort_func(sortable, view->search_column, sort_func, (gpointer)view, NULL); } else { gtk_tree_sortable_set_sort_func(sortable, view->search_column, gem_tree_view_sort_func, (gpointer)view, NULL); } // g_object_unref(model); } } return;}guintgem_tree_view_get_search_column (GemTreeView *view){ return view->search_column;}voidgem_tree_view_searchentry_visible(gboolean visible){ searchentry_visible = visible;}/*vi:ts=2:nowrap:ai:expandtab */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -