📄 gtktree.c
字号:
g_return_if_fail (GTK_IS_TREE (object)); tree = GTK_TREE (object); children = tree->children; while (children) { child = children->data; children = children->next; gtk_widget_ref (child); gtk_widget_unparent (child); gtk_widget_destroy (child); gtk_widget_unref (child); } g_list_free (tree->children); tree->children = NULL; if (tree->root_tree == tree) { GList *node; for (node = tree->selection; node; node = node->next) gtk_widget_unref ((GtkWidget *)node->data); g_list_free (tree->selection); tree->selection = NULL; } if (GTK_OBJECT_CLASS (parent_class)->destroy) (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);}static voidgtk_tree_draw (GtkWidget *widget, GdkRectangle *area){ GtkTree *tree; GtkWidget *subtree; GtkWidget *child; GdkRectangle child_area; GList *children; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_TREE (widget)); g_return_if_fail (area != NULL); if (GTK_WIDGET_DRAWABLE (widget)) { tree = GTK_TREE (widget); children = tree->children; while (children) { child = children->data; children = children->next; if (gtk_widget_intersect (child, area, &child_area)) gtk_widget_draw (child, &child_area); if((subtree = GTK_TREE_ITEM(child)->subtree) && GTK_WIDGET_VISIBLE(subtree) && gtk_widget_intersect (subtree, area, &child_area)) gtk_widget_draw (subtree, &child_area); } } }static gintgtk_tree_expose (GtkWidget *widget, GdkEventExpose *event){ GtkTree *tree; GtkWidget *child; GdkEventExpose child_event; GList *children; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_TREE (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); if (GTK_WIDGET_DRAWABLE (widget)) { tree = GTK_TREE (widget); child_event = *event; children = tree->children; while (children) { child = children->data; children = children->next; if (GTK_WIDGET_NO_WINDOW (child) && gtk_widget_intersect (child, &event->area, &child_event.area)) gtk_widget_event (child, (GdkEvent*) &child_event); } } return FALSE;}static voidgtk_tree_forall (GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data){ GtkTree *tree; GtkWidget *child; GList *children; g_return_if_fail (container != NULL); g_return_if_fail (GTK_IS_TREE (container)); g_return_if_fail (callback != NULL); tree = GTK_TREE (container); children = tree->children; while (children) { child = children->data; children = children->next; (* callback) (child, callback_data); }}static voidgtk_tree_map (GtkWidget *widget){ GtkTree *tree; GtkWidget *child; GList *children; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_TREE (widget)); GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED); tree = GTK_TREE (widget); if(GTK_IS_TREE(widget->parent)) { /* set root tree for this tree */ tree->root_tree = GTK_TREE(widget->parent)->root_tree; tree->level = GTK_TREE(GTK_WIDGET(tree)->parent)->level+1; tree->indent_value = GTK_TREE(GTK_WIDGET(tree)->parent)->indent_value; tree->current_indent = GTK_TREE(GTK_WIDGET(tree)->parent)->current_indent + tree->indent_value; tree->view_mode = GTK_TREE(GTK_WIDGET(tree)->parent)->view_mode; tree->view_line = GTK_TREE(GTK_WIDGET(tree)->parent)->view_line; } else tree->root_tree = tree; children = tree->children; while (children) { child = children->data; children = children->next; if (GTK_WIDGET_VISIBLE (child) && !GTK_WIDGET_MAPPED (child)) gtk_widget_map (child); if (GTK_TREE_ITEM (child)->subtree) { child = GTK_WIDGET (GTK_TREE_ITEM (child)->subtree); if (GTK_WIDGET_VISIBLE (child) && !GTK_WIDGET_MAPPED (child)) gtk_widget_map (child); } } gdk_window_show (widget->window);}static gintgtk_tree_motion_notify (GtkWidget *widget, GdkEventMotion *event){ g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_TREE (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); #ifdef TREE_DEBUG g_message("gtk_tree_motion_notify\n");#endif /* TREE_DEBUG */ return FALSE;}static voidgtk_tree_realize (GtkWidget *widget){ GdkWindowAttr attributes; gint attributes_mask; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_TREE (widget)); GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); attributes.window_type = GDK_WINDOW_CHILD; attributes.x = widget->allocation.x; attributes.y = widget->allocation.y; attributes.width = widget->allocation.width; attributes.height = widget->allocation.height; attributes.wclass = GDK_INPUT_OUTPUT; attributes.visual = gtk_widget_get_visual (widget); attributes.colormap = gtk_widget_get_colormap (widget); attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK; attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask); gdk_window_set_user_data (widget->window, widget); widget->style = gtk_style_attach (widget->style, widget->window); gdk_window_set_background (widget->window, &widget->style->base[GTK_STATE_NORMAL]);}voidgtk_tree_remove_item (GtkTree *container, GtkWidget *widget){ GList *item_list; g_return_if_fail (container != NULL); g_return_if_fail (GTK_IS_TREE (container)); g_return_if_fail (widget != NULL); g_return_if_fail (container == GTK_TREE (widget->parent)); item_list = g_list_append (NULL, widget); gtk_tree_remove_items (GTK_TREE (container), item_list); g_list_free (item_list);}/* used by gtk_tree_remove_items to make the function independant of order in list of items to remove. Sort item bu depth in tree */static gint gtk_tree_sort_item_by_depth(GtkWidget* a, GtkWidget* b){ if((GTK_TREE(a->parent)->level) < (GTK_TREE(b->parent)->level)) return 1; if((GTK_TREE(a->parent)->level) > (GTK_TREE(b->parent)->level)) return -1; return 0;}voidgtk_tree_remove_items (GtkTree *tree, GList *items){ GtkWidget *widget; GList *selected_widgets; GList *tmp_list; GList *sorted_list; GtkTree *real_tree; GtkTree *root_tree; g_return_if_fail (tree != NULL); g_return_if_fail (GTK_IS_TREE (tree)); #ifdef TREE_DEBUG g_message("+ gtk_tree_remove_items [ tree %#x items list %#x ]\n", (int)tree, (int)items);#endif /* TREE_DEBUG */ /* We may not yet be mapped, so we actively have to find our * root tree */ if (tree->root_tree) root_tree = tree->root_tree; else { GtkWidget *tmp = GTK_WIDGET (tree); while (tmp->parent && GTK_IS_TREE (tmp->parent)) tmp = tmp->parent; root_tree = GTK_TREE (tmp); } tmp_list = items; selected_widgets = NULL; sorted_list = NULL; widget = NULL; #ifdef TREE_DEBUG g_message("* sort list by depth\n");#endif /* TREE_DEBUG */ while (tmp_list) { #ifdef TREE_DEBUG g_message ("* item [%#x] depth [%d]\n", (int)tmp_list->data, (int)GTK_TREE(GTK_WIDGET(tmp_list->data)->parent)->level);#endif /* TREE_DEBUG */ sorted_list = g_list_insert_sorted(sorted_list, tmp_list->data, (GCompareFunc)gtk_tree_sort_item_by_depth); tmp_list = g_list_next(tmp_list); } #ifdef TREE_DEBUG /* print sorted list */ g_message("* sorted list result\n"); tmp_list = sorted_list; while(tmp_list) { g_message("* item [%#x] depth [%d]\n", (int)tmp_list->data, (int)GTK_TREE(GTK_WIDGET(tmp_list->data)->parent)->level); tmp_list = g_list_next(tmp_list); }#endif /* TREE_DEBUG */ #ifdef TREE_DEBUG g_message("* scan sorted list\n");#endif /* TREE_DEBUG */ tmp_list = sorted_list; while (tmp_list) { widget = tmp_list->data; tmp_list = tmp_list->next; #ifdef TREE_DEBUG g_message("* item [%#x] subtree [%#x]\n", (int)widget, (int)GTK_TREE_ITEM_SUBTREE(widget));#endif /* TREE_DEBUG */ /* get real owner of this widget */ real_tree = GTK_TREE(widget->parent);#ifdef TREE_DEBUG g_message("* subtree having this widget [%#x]\n", (int)real_tree);#endif /* TREE_DEBUG */ if (widget->state == GTK_STATE_SELECTED) { selected_widgets = g_list_prepend (selected_widgets, widget);#ifdef TREE_DEBUG g_message("* selected widget - adding it in selected list [%#x]\n", (int)selected_widgets);#endif /* TREE_DEBUG */ } /* remove this item from its real parent */#ifdef TREE_DEBUG g_message("* remove widget from its owner tree\n");#endif /* TREE_DEBUG */ real_tree->children = g_list_remove (real_tree->children, widget); /* remove subtree associate at this item if it exist */ if(GTK_TREE_ITEM(widget)->subtree) {#ifdef TREE_DEBUG g_message("* remove subtree associate at this item [%#x]\n", (int) GTK_TREE_ITEM(widget)->subtree);#endif /* TREE_DEBUG */ if (GTK_WIDGET_MAPPED (GTK_TREE_ITEM(widget)->subtree)) gtk_widget_unmap (GTK_TREE_ITEM(widget)->subtree); gtk_widget_unparent (GTK_TREE_ITEM(widget)->subtree); GTK_TREE_ITEM(widget)->subtree = NULL; } /* really remove widget for this item */#ifdef TREE_DEBUG g_message("* unmap and unparent widget [%#x]\n", (int)widget);#endif /* TREE_DEBUG */ if (GTK_WIDGET_MAPPED (widget)) gtk_widget_unmap (widget); gtk_widget_unparent (widget); /* delete subtree if there is no children in it */ if(real_tree->children == NULL && real_tree != root_tree) {#ifdef TREE_DEBUG g_message("* owner tree don't have children ... destroy it\n");#endif /* TREE_DEBUG */ gtk_tree_item_remove_subtree(GTK_TREE_ITEM(real_tree->tree_owner)); } #ifdef TREE_DEBUG g_message("* next item in list\n");#endif /* TREE_DEBUG */ } if (selected_widgets) {#ifdef TREE_DEBUG g_message("* scan selected item list\n");#endif /* TREE_DEBUG */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -