📄 gtklist.c
字号:
if (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (list)) gtk_list_end_drag_selection (list); if (list->selection_mode == GTK_SELECTION_EXTENDED && list->anchor >= 0) gtk_list_end_selection (list); container = GTK_CONTAINER (list); switch (list->selection_mode) { case GTK_SELECTION_BROWSE: if (container->focus_child) { gtk_list_select_child (list, container->focus_child); return; } break; case GTK_SELECTION_EXTENDED: g_list_free (list->undo_selection); g_list_free (list->undo_unselection); list->undo_selection = NULL; list->undo_unselection = NULL; if (list->children && GTK_WIDGET_STATE (list->children->data) != GTK_STATE_SELECTED) gtk_list_fake_toggle_row (list, GTK_WIDGET (list->children->data)); list->anchor_state = GTK_STATE_SELECTED; list->anchor = 0; list->drag_pos = 0; list->undo_focus_child = container->focus_child; gtk_list_update_extended_selection (list, g_list_length(list->children)); gtk_list_end_selection (list); return; case GTK_SELECTION_MULTIPLE: for (work = list->children; work; work = work->next) { if (GTK_WIDGET_STATE (work->data) == GTK_STATE_NORMAL) gtk_list_select_child (list, GTK_WIDGET (work->data)); } return; default: break; }}voidgtk_list_unselect_all (GtkList *list){ GtkContainer *container; GtkWidget *item; GList *work; g_return_if_fail (list != NULL); g_return_if_fail (GTK_IS_LIST (list)); if (!list->children) return; if (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (list)) gtk_list_end_drag_selection (list); if (list->selection_mode == GTK_SELECTION_EXTENDED && list->anchor >= 0) gtk_list_end_selection (list); container = GTK_CONTAINER (list); switch (list->selection_mode) { case GTK_SELECTION_BROWSE: if (container->focus_child) { gtk_list_select_child (list, container->focus_child); return; } break; case GTK_SELECTION_EXTENDED: gtk_list_reset_extended_selection (list); break; default: break; } work = list->selection; while (work) { item = work->data; work = work->next; gtk_list_unselect_child (list, item); }}voidgtk_list_extend_selection (GtkList *list, GtkScrollType scroll_type, gfloat position, gboolean auto_start_selection){ GtkContainer *container; g_return_if_fail (list != NULL); g_return_if_fail (GTK_IS_LIST (list)); if ((gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (list)) || list->selection_mode != GTK_SELECTION_EXTENDED) return; container = GTK_CONTAINER (list); if (auto_start_selection) { gint focus_row; focus_row = g_list_index (list->children, container->focus_child); gtk_list_set_anchor (list, list->add_mode, focus_row, container->focus_child); } else if (list->anchor < 0) return; gtk_list_move_focus_child (list, scroll_type, position); gtk_list_update_extended_selection (list, g_list_index (list->children, container->focus_child));}voidgtk_list_end_drag_selection (GtkList *list){ g_return_if_fail (list != NULL); g_return_if_fail (GTK_IS_LIST (list)); list->drag_selection = FALSE; if (GTK_WIDGET_HAS_GRAB (list)) { gtk_grab_remove (GTK_WIDGET (list)); if (gdk_pointer_is_grabbed()) gdk_pointer_ungrab (GDK_CURRENT_TIME); } if (list->htimer) { gtk_timeout_remove (list->htimer); list->htimer = 0; } if (list->vtimer) { gtk_timeout_remove (list->vtimer); list->vtimer = 0; }}voidgtk_list_start_selection (GtkList *list){ GtkContainer *container; gint focus_row; g_return_if_fail (list != NULL); g_return_if_fail (GTK_IS_LIST (list)); if (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (list)) return; container = GTK_CONTAINER (list); if ((focus_row = g_list_index (list->selection, container->focus_child)) >= 0) gtk_list_set_anchor (list, list->add_mode, focus_row, container->focus_child);}voidgtk_list_end_selection (GtkList *list){ gint i; gint e; gboolean top_down; GList *work; GtkWidget *item; gint item_index; g_return_if_fail (list != NULL); g_return_if_fail (GTK_IS_LIST (list)); if ((gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (list)) || list->anchor < 0) return; i = MIN (list->anchor, list->drag_pos); e = MAX (list->anchor, list->drag_pos); top_down = (list->anchor < list->drag_pos); list->anchor = -1; list->drag_pos = -1; if (list->undo_selection) { work = list->selection; list->selection = list->undo_selection; list->undo_selection = work; work = list->selection; while (work) { item = work->data; work = work->next; item_index = g_list_index (list->children, item); if (item_index < i || item_index > e) { gtk_widget_set_state (item, GTK_STATE_SELECTED); gtk_list_unselect_child (list, item); list->undo_selection = g_list_prepend (list->undo_selection, item); } } } if (top_down) { for (work = g_list_nth (list->children, i); i <= e; i++, work = work->next) { item = work->data; if (g_list_find (list->selection, item)) { if (item->state == GTK_STATE_NORMAL) { gtk_widget_set_state (item, GTK_STATE_SELECTED); gtk_list_unselect_child (list, item); list->undo_selection = g_list_prepend (list->undo_selection, item); } } else if (item->state == GTK_STATE_SELECTED) { gtk_widget_set_state (item, GTK_STATE_NORMAL); list->undo_unselection = g_list_prepend (list->undo_unselection, item); } } } else { for (work = g_list_nth (list->children, e); i <= e; e--, work = work->prev) { item = work->data; if (g_list_find (list->selection, item)) { if (item->state == GTK_STATE_NORMAL) { gtk_widget_set_state (item, GTK_STATE_SELECTED); gtk_list_unselect_child (list, item); list->undo_selection = g_list_prepend (list->undo_selection, item); } } else if (item->state == GTK_STATE_SELECTED) { gtk_widget_set_state (item, GTK_STATE_NORMAL); list->undo_unselection = g_list_prepend (list->undo_unselection, item); } } } for (work = g_list_reverse (list->undo_unselection); work; work = work->next) gtk_list_select_child (list, GTK_WIDGET (work->data));}voidgtk_list_toggle_row (GtkList *list, GtkWidget *item){ g_return_if_fail (list != NULL); g_return_if_fail (GTK_IS_LIST (list)); g_return_if_fail (item != NULL); g_return_if_fail (GTK_IS_LIST_ITEM (item)); switch (list->selection_mode) { case GTK_SELECTION_EXTENDED: case GTK_SELECTION_MULTIPLE: case GTK_SELECTION_SINGLE: if (item->state == GTK_STATE_SELECTED) { gtk_list_unselect_child (list, item); return; } case GTK_SELECTION_BROWSE: gtk_list_select_child (list, item); break; }}voidgtk_list_toggle_focus_row (GtkList *list){ GtkContainer *container; gint focus_row; g_return_if_fail (list != 0); g_return_if_fail (GTK_IS_LIST (list)); container = GTK_CONTAINER (list); if ((gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (list)) || !container->focus_child) return; switch (list->selection_mode) { case GTK_SELECTION_SINGLE: case GTK_SELECTION_MULTIPLE: gtk_list_toggle_row (list, container->focus_child); break; case GTK_SELECTION_EXTENDED: if ((focus_row = g_list_index (list->children, container->focus_child)) < 0) return; g_list_free (list->undo_selection); g_list_free (list->undo_unselection); list->undo_selection = NULL; list->undo_unselection = NULL; list->anchor = focus_row; list->drag_pos = focus_row; list->undo_focus_child = container->focus_child; if (list->add_mode) gtk_list_fake_toggle_row (list, container->focus_child); else gtk_list_fake_unselect_all (list, container->focus_child); gtk_list_end_selection (list); break; default: break; }}voidgtk_list_toggle_add_mode (GtkList *list){ GtkContainer *container; g_return_if_fail (list != 0); g_return_if_fail (GTK_IS_LIST (list)); if ((gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (list)) || list->selection_mode != GTK_SELECTION_EXTENDED) return; container = GTK_CONTAINER (list); if (list->add_mode) { list->add_mode = FALSE; list->anchor_state = GTK_STATE_SELECTED; } else list->add_mode = TRUE; if (container->focus_child) gtk_widget_queue_draw (container->focus_child);}voidgtk_list_undo_selection (GtkList *list){ GList *work; g_return_if_fail (list != NULL); g_return_if_fail (GTK_IS_LIST (list)); if (list->selection_mode != GTK_SELECTION_EXTENDED || (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (list))) return; if (list->anchor >= 0) gtk_list_end_selection (list); if (!(list->undo_selection || list->undo_unselection)) { gtk_list_unselect_all (list); return; } for (work = list->undo_selection; work; work = work->next) gtk_list_select_child (list, GTK_WIDGET (work->data)); for (work = list->undo_unselection; work; work = work->next) gtk_list_unselect_child (list, GTK_WIDGET (work->data)); if (list->undo_focus_child) { GtkContainer *container; container = GTK_CONTAINER (list); if (container->focus_child && GTK_WIDGET_HAS_FOCUS (container->focus_child)) gtk_widget_grab_focus (list->undo_focus_child); else gtk_container_set_focus_child (container, list->undo_focus_child); } list->undo_focus_child = NULL; g_list_free (list->undo_selection); g_list_free (list->undo_unselection); list->undo_selection = NULL; list->undo_unselection = NULL;}/* Private GtkList Selection Methods : * * gtk_real_list_select_child * gtk_real_list_unselect_child */static voidgtk_real_list_select_child (GtkList *list, GtkWidget *child){ g_return_if_fail (list != NULL); g_return_if_fail (GTK_IS_LIST (list)); g_return_if_fail (child != NULL); g_return_if_fail (GTK_IS_LIST_ITEM (child)); switch (child->state) { case GTK_STATE_SELECTED: case GTK_STATE_INSENSITIVE: break; default: gtk_list_item_select (GTK_LIST_ITEM (child)); break; }}static voidgtk_real_list_unselect_child (GtkList *list, GtkWidget *child){ g_return_if_fail (list != NULL); g_return_if_fail (GTK_IS_LIST (list)); g_return_if_fail (child != NULL); g_return_if_fail (GTK_IS_LIST_ITEM (child)); if (child->state == GTK_STATE_SELECTED) gtk_list_item_deselect (GTK_LIST_ITEM (child));}/* Private GtkList Selection Functions : * * gtk_list_set_anchor * gtk_list_fake_unselect_all * gtk_list_fake_toggle_row * gtk_list_update_extended_selection * gtk_list_reset_extended_selection */static voidgtk_list_set_anchor (GtkList *list, gboolean add_mode, gint anchor, GtkWidget *undo_focus_child){ GList *work; g_return_if_fail (list != NULL); g_return_if_fail (GTK_IS_LIST (list)); if (list->selection_mode != GTK_SELECTION_EXTENDED || list->anchor >= 0) return; g_list_free (list->undo_selection); g_list_free (list->undo_unselection); list->undo_selection = NULL; list->undo_unselection = NULL; if ((work = g_list_nth (list->children, anchor))) { if (add_mode) gtk_list_fake_toggle_row (list, GTK_WIDGET (work->data)); else { gtk_list_fake_unselect_all (list, GTK_WIDGET (work->data)); list->anchor_state = GTK_STATE_SELECTED; } } list->anchor = anchor; list->drag_pos = anchor; list->undo_focus_child = undo_focus_child;}static voidgtk_list_fake_unselect_all (GtkList *list, GtkWidget *item){ GList *work; if (item && item->state == GTK_STATE_NORMAL) gtk_widget_set_state (item, GTK_STATE_SELECTED); list->undo_selection = list->selection; list->selection = NULL; for (work = list->undo_selection; work; work = work->next) if (work->data != item) gtk_widget_set_state (GTK_WIDGET (work->data), GTK_STATE_NORMAL);}static voidgtk_list_fake_toggle_row (GtkList *list, GtkWidget *item){ if (!item) return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -