📄 gtklist.c
字号:
if (GTK_LIST (container)->last_focus_child) gtk_container_set_focus_child (container, GTK_LIST (container)->last_focus_child); if (GTK_CONTAINER_CLASS (parent_class)->focus) return_val = GTK_CONTAINER_CLASS (parent_class)->focus (container, direction); } if (!return_val) { GtkList *list; list = GTK_LIST (container); if (list->selection_mode == GTK_SELECTION_EXTENDED && list->anchor >= 0) gtk_list_end_selection (list); if (container->focus_child) list->last_focus_child = container->focus_child; } return return_val;}/* Public GtkList Methods : * * gtk_list_insert_items * gtk_list_append_items * gtk_list_prepend_items * gtk_list_remove_items * gtk_list_remove_items_no_unref * gtk_list_clear_items * * gtk_list_child_position */voidgtk_list_insert_items (GtkList *list, GList *items, gint position){ GtkWidget *widget; GList *tmp_list; GList *last; gint nchildren; g_return_if_fail (list != NULL); g_return_if_fail (GTK_IS_LIST (list)); if (!items) return; gtk_list_end_drag_selection (list); if (list->selection_mode == GTK_SELECTION_EXTENDED && list->anchor >= 0) gtk_list_end_selection (list); tmp_list = items; while (tmp_list) { widget = tmp_list->data; tmp_list = tmp_list->next; gtk_widget_set_parent (widget, GTK_WIDGET (list)); gtk_signal_connect (GTK_OBJECT (widget), "drag_begin", GTK_SIGNAL_FUNC (gtk_list_signal_drag_begin), list); gtk_signal_connect (GTK_OBJECT (widget), "toggle_focus_row", GTK_SIGNAL_FUNC (gtk_list_signal_toggle_focus_row), list); gtk_signal_connect (GTK_OBJECT (widget), "select_all", GTK_SIGNAL_FUNC (gtk_list_signal_select_all), list); gtk_signal_connect (GTK_OBJECT (widget), "unselect_all", GTK_SIGNAL_FUNC (gtk_list_signal_unselect_all), list); gtk_signal_connect (GTK_OBJECT (widget), "undo_selection", GTK_SIGNAL_FUNC (gtk_list_signal_undo_selection), list); gtk_signal_connect (GTK_OBJECT (widget), "start_selection", GTK_SIGNAL_FUNC (gtk_list_signal_start_selection), list); gtk_signal_connect (GTK_OBJECT (widget), "end_selection", GTK_SIGNAL_FUNC (gtk_list_signal_end_selection), list); gtk_signal_connect (GTK_OBJECT (widget), "extend_selection", GTK_SIGNAL_FUNC (gtk_list_signal_extend_selection), list); gtk_signal_connect (GTK_OBJECT (widget), "scroll_horizontal", GTK_SIGNAL_FUNC (gtk_list_signal_scroll_horizontal), list); gtk_signal_connect (GTK_OBJECT (widget), "scroll_vertical", GTK_SIGNAL_FUNC (gtk_list_signal_scroll_vertical), list); gtk_signal_connect (GTK_OBJECT (widget), "toggle_add_mode", GTK_SIGNAL_FUNC (gtk_list_signal_toggle_add_mode), list); gtk_signal_connect (GTK_OBJECT (widget), "select", GTK_SIGNAL_FUNC (gtk_list_signal_item_select), list); gtk_signal_connect (GTK_OBJECT (widget), "deselect", GTK_SIGNAL_FUNC (gtk_list_signal_item_deselect), list); gtk_signal_connect (GTK_OBJECT (widget), "toggle", GTK_SIGNAL_FUNC (gtk_list_signal_item_toggle), list); if (GTK_WIDGET_REALIZED (widget->parent)) gtk_widget_realize (widget); if (GTK_WIDGET_VISIBLE (widget->parent) && GTK_WIDGET_VISIBLE (widget)) { if (GTK_WIDGET_MAPPED (widget->parent)) gtk_widget_map (widget); gtk_widget_queue_resize (widget); } } nchildren = g_list_length (list->children); if ((position < 0) || (position > nchildren)) position = nchildren; if (position == nchildren) { if (list->children) { tmp_list = g_list_last (list->children); tmp_list->next = items; items->prev = tmp_list; } else { list->children = items; } } else { tmp_list = g_list_nth (list->children, position); last = g_list_last (items); if (tmp_list->prev) tmp_list->prev->next = items; last->next = tmp_list; items->prev = tmp_list->prev; tmp_list->prev = last; if (tmp_list == list->children) list->children = items; } if (list->children && !list->selection && (list->selection_mode == GTK_SELECTION_BROWSE)) { widget = list->children->data; gtk_list_select_child (list, widget); }}voidgtk_list_append_items (GtkList *list, GList *items){ g_return_if_fail (list != NULL); g_return_if_fail (GTK_IS_LIST (list)); gtk_list_insert_items (list, items, -1);}voidgtk_list_prepend_items (GtkList *list, GList *items){ g_return_if_fail (list != NULL); g_return_if_fail (GTK_IS_LIST (list)); gtk_list_insert_items (list, items, 0);}voidgtk_list_remove_items (GtkList *list, GList *items){ gtk_list_remove_items_internal (list, items, FALSE);}voidgtk_list_remove_items_no_unref (GtkList *list, GList *items){ gtk_list_remove_items_internal (list, items, TRUE);}voidgtk_list_clear_items (GtkList *list, gint start, gint end){ GtkContainer *container; GtkWidget *widget; GtkWidget *new_focus_child = NULL; GList *start_list; GList *end_list; GList *tmp_list; guint nchildren; gboolean grab_focus = FALSE; g_return_if_fail (list != NULL); g_return_if_fail (GTK_IS_LIST (list)); nchildren = g_list_length (list->children); if (nchildren == 0) return; if ((end < 0) || (end > nchildren)) end = nchildren; if (start >= end) return; container = GTK_CONTAINER (list); gtk_list_end_drag_selection (list); if (list->selection_mode == GTK_SELECTION_EXTENDED) { if (list->anchor >= 0) gtk_list_end_selection (list); gtk_list_reset_extended_selection (list); } start_list = g_list_nth (list->children, start); end_list = g_list_nth (list->children, end); if (start_list->prev) start_list->prev->next = end_list; if (end_list && end_list->prev) end_list->prev->next = NULL; if (end_list) end_list->prev = start_list->prev; if (start_list == list->children) list->children = end_list; if (container->focus_child) { if (g_list_find (start_list, container->focus_child)) { if (start_list->prev) new_focus_child = start_list->prev->data; else if (list->children) new_focus_child = list->children->prev->data; if (GTK_WIDGET_HAS_FOCUS (container->focus_child)) grab_focus = TRUE; } } tmp_list = start_list; while (tmp_list) { widget = tmp_list->data; tmp_list = tmp_list->next; if (widget->state == GTK_STATE_SELECTED) gtk_list_unselect_child (list, widget); if (widget == list->undo_focus_child) list->undo_focus_child = NULL; if (widget == list->last_focus_child) list->last_focus_child = NULL; gtk_signal_disconnect_by_data (GTK_OBJECT (widget), (gpointer) list); gtk_widget_unparent (widget); } g_list_free (start_list); if (new_focus_child) { if (grab_focus) gtk_widget_grab_focus (new_focus_child); else if (container->focus_child) gtk_container_set_focus_child (container, new_focus_child); if ((list->selection_mode == GTK_SELECTION_BROWSE || list->selection_mode == GTK_SELECTION_EXTENDED) && !list->selection) { list->last_focus_child = new_focus_child; gtk_list_select_child (list, new_focus_child); } } if (GTK_WIDGET_VISIBLE (list)) gtk_widget_queue_resize (GTK_WIDGET (list));}gintgtk_list_child_position (GtkList *list, GtkWidget *child){ GList *children; gint pos; g_return_val_if_fail (list != NULL, -1); g_return_val_if_fail (GTK_IS_LIST (list), -1); g_return_val_if_fail (child != NULL, -1); pos = 0; children = list->children; while (children) { if (child == GTK_WIDGET (children->data)) return pos; pos += 1; children = children->next; } return -1;}/* Private GtkList Insert/Remove Item Functions: * * gtk_list_remove_items_internal */static voidgtk_list_remove_items_internal (GtkList *list, GList *items, gboolean no_unref){ GtkWidget *widget; GtkWidget *new_focus_child; GtkWidget *old_focus_child; GtkContainer *container; GList *tmp_list; GList *work; gboolean grab_focus = FALSE; g_return_if_fail (list != NULL); g_return_if_fail (GTK_IS_LIST (list)); if (!items) return; container = GTK_CONTAINER (list); gtk_list_end_drag_selection (list); if (list->selection_mode == GTK_SELECTION_EXTENDED) { if (list->anchor >= 0) gtk_list_end_selection (list); gtk_list_reset_extended_selection (list); } tmp_list = items; while (tmp_list) { widget = tmp_list->data; tmp_list = tmp_list->next; if (widget->state == GTK_STATE_SELECTED) gtk_list_unselect_child (list, widget); } if (container->focus_child) { old_focus_child = new_focus_child = container->focus_child; if (GTK_WIDGET_HAS_FOCUS (container->focus_child)) grab_focus = TRUE; } else old_focus_child = new_focus_child = list->last_focus_child; tmp_list = items; while (tmp_list) { widget = tmp_list->data; tmp_list = tmp_list->next; if (no_unref) gtk_widget_ref (widget); if (widget == new_focus_child) { work = g_list_find (list->children, widget); if (work) { if (work->next) new_focus_child = work->next->data; else if (list->children != work && work->prev) new_focus_child = work->prev->data; else new_focus_child = NULL; } } if (widget == list->undo_focus_child) list->undo_focus_child = NULL; if (widget == list->last_focus_child) list->last_focus_child = NULL; gtk_signal_disconnect_by_data (GTK_OBJECT (widget), (gpointer) list); list->children = g_list_remove (list->children, widget); gtk_widget_unparent (widget); } if (new_focus_child && new_focus_child != old_focus_child) { if (grab_focus) gtk_widget_grab_focus (new_focus_child); else if (container->focus_child) gtk_container_set_focus_child (container, new_focus_child); if (list->selection_mode == GTK_SELECTION_BROWSE && !list->selection) { list->last_focus_child = new_focus_child; gtk_list_select_child (list, new_focus_child); } } if (GTK_WIDGET_VISIBLE (list)) gtk_widget_queue_resize (GTK_WIDGET (list));}/* Public GtkList Selection Methods : * * gtk_list_set_selection_mode * gtk_list_select_item * gtk_list_unselect_item * gtk_list_select_child * gtk_list_unselect_child * gtk_list_select_all * gtk_list_unselect_all * gtk_list_extend_selection * gtk_list_end_drag_selection * gtk_list_start_selection * gtk_list_end_selection * gtk_list_toggle_row * gtk_list_toggle_focus_row * gtk_list_toggle_add_mode * gtk_list_undo_selection */voidgtk_list_set_selection_mode (GtkList *list, GtkSelectionMode mode){ g_return_if_fail (list != NULL); g_return_if_fail (GTK_IS_LIST (list)); if (list->selection_mode == mode) return; list->selection_mode = mode; switch (mode) { case GTK_SELECTION_SINGLE: case GTK_SELECTION_BROWSE: gtk_list_unselect_all (list); break; default: break; }}voidgtk_list_select_item (GtkList *list, gint item){ GList *tmp_list; g_return_if_fail (list != NULL); g_return_if_fail (GTK_IS_LIST (list)); tmp_list = g_list_nth (list->children, item); if (tmp_list) gtk_list_select_child (list, GTK_WIDGET (tmp_list->data));}voidgtk_list_unselect_item (GtkList *list, gint item){ GList *tmp_list; g_return_if_fail (list != NULL); g_return_if_fail (GTK_IS_LIST (list)); tmp_list = g_list_nth (list->children, item); if (tmp_list) gtk_list_unselect_child (list, GTK_WIDGET (tmp_list->data));}voidgtk_list_select_child (GtkList *list, GtkWidget *child){ gtk_signal_emit (GTK_OBJECT (list), list_signals[SELECT_CHILD], child);}voidgtk_list_unselect_child (GtkList *list, GtkWidget *child){ gtk_signal_emit (GTK_OBJECT (list), list_signals[UNSELECT_CHILD], child);}voidgtk_list_select_all (GtkList *list){ GtkContainer *container; GList *work; g_return_if_fail (list != NULL); g_return_if_fail (GTK_IS_LIST (list)); if (!list->children) return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -