📄 abooklistview.c
字号:
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); 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) { 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; } }#if 0 if (!event->state && event->string && (isalpha (event->string[0]) || isalnum (event->string[0]))) { 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; } }#endif return FALSE;}static gbooleanabook_listview_focus_in_event_cb (GtkWidget *widget, GdkEventFocus *event, gpointer user_data){ ABookListView *view = (ABookListView *) widget; gtk_widget_grab_focus (view->treeview);// abook_listview_update(view); return FALSE;}static gintabook_listview_sort_func (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data){ gint ret = 0; gchar *name1 = NULL; gchar *name2 = NULL; gint type1; gint type2; gint storage; gtk_tree_model_get (model, a, COL_NAME, &name1, -1); gtk_tree_model_get (model, b, COL_NAME, &name2, -1); gtk_tree_model_get (model, a, COL_STORAGE, &storage, -1); if (storage == STORAGE_NET) { gtk_tree_model_get (model, a, COL_TYPE, &type1, -1); gtk_tree_model_get (model, b, COL_TYPE, &type2, -1); //refer to g_utf8_collate if (type1 > type2) { return -1; } else if (type1 < type2) { return 1; } } if (name1 == NULL && name2 == NULL) { ret = 0; } else if (name1 == NULL || name2 == NULL) { ret = (name1 == NULL) ? -1 : 1; } else { ret = g_utf8_collate (name1, name2); } g_free (name1); g_free (name2); return ret;}static voidabook_listview_init (ABookListView *view){ GtkTreeViewColumn *col; GtkCellRenderer *renderer; GtkWidget *vbox = NULL; view->scroll_window = gtk_auto_scrolled_window_new (); gtk_widget_show (view->scroll_window); view->search_entry = gtk_entry_new (); g_signal_connect_after (G_OBJECT (view->search_entry), "key_press_event", G_CALLBACK (abook_listview_entry_key_press_event_cb), view); g_signal_connect (G_OBJECT (view->search_entry), "changed", G_CALLBACK (abook_listview_entry_changed_cb), (gpointer) view); gtk_widget_show (view->search_entry); view->liststore = gtk_list_store_new (NUM_COLS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_INT, G_TYPE_INT); view->treeview = gtk_tree_view_new (); gtk_widget_show (view->treeview);// gtk_widget_set_size_request(view->treeview, 240, 320);#if 0 /* column status */ col = gtk_tree_view_column_new (); gtk_tree_view_column_set_title (col, "Status"); gtk_tree_view_append_column (GTK_TREE_VIEW (view->treeview), col); renderer = gtk_cell_renderer_text_new (); gtk_cell_renderer_set_fixed_size (renderer, 30, -1); g_object_set (G_OBJECT (renderer), "ypad", 5, NULL); gtk_tree_view_column_pack_start (col, renderer, TRUE); gtk_tree_view_column_add_attribute (col, renderer, "text", COL_STATUS);#endif /* column name */ col = gtk_tree_view_column_new (); gtk_tree_view_column_set_title (col, "Name"); gtk_tree_view_append_column (GTK_TREE_VIEW (view->treeview), col); renderer = gtk_cell_renderer_text_new (); gtk_cell_renderer_set_fixed_size (renderer, 130, -1); g_object_set (G_OBJECT (renderer), "ypad", 5, NULL); gtk_tree_view_column_pack_start (col, renderer, TRUE); gtk_tree_view_column_add_attribute (col, renderer, "text", COL_NAME); /* column pic */ col = gtk_tree_view_column_new (); gtk_tree_view_column_set_title (col, "Picutre"); gtk_tree_view_append_column (GTK_TREE_VIEW (view->treeview), col); renderer = gtk_cell_renderer_pixbuf_new (); gtk_cell_renderer_set_fixed_size (renderer, 32, 32);// g_object_set(G_OBJECT(renderer), "ypad", 5, NULL); gtk_tree_view_column_pack_start (col, renderer, TRUE); gtk_tree_view_column_add_attribute (col, renderer, "pixbuf", COL_PIC); gtk_tree_view_set_model (GTK_TREE_VIEW (view->treeview), GTK_TREE_MODEL (view->liststore)); g_object_unref (view->liststore); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (view->treeview), FALSE); g_signal_connect (G_OBJECT (view->treeview), "key-press-event", G_CALLBACK (abook_listview_treeview_key_press_event_cb), (gpointer) view); if (TRUE) { GtkTreeSortable *sortable = NULL; sortable = GTK_TREE_SORTABLE (view->liststore); gtk_tree_sortable_set_sort_func (sortable, LV_SORTID_NAME, abook_listview_sort_func, NULL, NULL); gtk_tree_sortable_set_sort_column_id (sortable, LV_SORTID_NAME, GTK_SORT_ASCENDING); }// GTK_WIDGET_UNSET_FLAGS(view->treeview, GTK_CAN_FOCUS); g_signal_connect (G_OBJECT (view->treeview), "row-activated", G_CALLBACK (abook_listview_row_activated), (gpointer) view); gtk_auto_scrolled_window_add (GTK_AUTO_SCROLLED_WINDOW (view->scroll_window), view->treeview); vbox = gtk_vbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), view->scroll_window, TRUE, TRUE, 0); if (TRUE) { GtkWidget *hbox = NULL; GtkWidget *search_icon = NULL; hbox = gtk_hbox_new (FALSE, 0); if (TRUE) { gchar *picpath = NULL; picpath = g_build_filename (abook_env_get_picpath (), "search.png", NULL); search_icon = gtk_image_new_from_file (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 (abook_listview_focus_in_event_cb), NULL); view->row_activated_cb = NULL; return;}GtkWidget *abook_listview_new (void){ return g_object_new (ABOOK_TYPE_LISTVIEW, NULL);}GtkListStore *abook_listview_get_model (ABookListView *view){ if (view->liststore) { g_object_ref (view->liststore); } return view->liststore;}GtkWidget *abook_listview_get_view (ABookListView *view){ if (view->liststore) { g_object_ref (view->treeview); } return view->treeview;}voidabook_listview_set_row_function (ABookListView *view, ABookListViewRowCallback cb_func){ view->row_activated_cb = cb_func; return;}voidabook_listview_update (ABookListView *view){ GtkTreePath *path = NULL;// g_print("%s() entering\n", __FUNCTION__); path = gtk_tree_path_new_first (); gtk_tree_view_set_cursor (GTK_TREE_VIEW (view->treeview), path, NULL, TRUE); gtk_tree_path_free (path);// g_print("%s() leaving\n", __FUNCTION__); return;}/* vi:ts=2:nowrap:ai:expandtab*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -