📄 gtklist.c
字号:
if (item->state == GTK_STATE_NORMAL) { list->anchor_state = GTK_STATE_SELECTED; gtk_widget_set_state (item, GTK_STATE_SELECTED); } else { list->anchor_state = GTK_STATE_NORMAL; gtk_widget_set_state (item, GTK_STATE_NORMAL); }}static voidgtk_list_update_extended_selection (GtkList *list, gint row){ gint i; GList *work; gint s1 = -1; gint s2 = -1; gint e1 = -1; gint e2 = -1; gint length; if (row < 0) row = 0; length = g_list_length (list->children); if (row >= length) row = length - 1; if (list->selection_mode != GTK_SELECTION_EXTENDED || !list->anchor < 0) return; /* extending downwards */ if (row > list->drag_pos && list->anchor <= list->drag_pos) { s2 = list->drag_pos + 1; e2 = row; } /* extending upwards */ else if (row < list->drag_pos && list->anchor >= list->drag_pos) { s2 = row; e2 = list->drag_pos - 1; } else if (row < list->drag_pos && list->anchor < list->drag_pos) { e1 = list->drag_pos; /* row and drag_pos on different sides of anchor : take back the selection between anchor and drag_pos, select between anchor and row */ if (row < list->anchor) { s1 = list->anchor + 1; s2 = row; e2 = list->anchor - 1; } /* take back the selection between anchor and drag_pos */ else s1 = row + 1; } else if (row > list->drag_pos && list->anchor > list->drag_pos) { s1 = list->drag_pos; /* row and drag_pos on different sides of anchor : take back the selection between anchor and drag_pos, select between anchor and row */ if (row > list->anchor) { e1 = list->anchor - 1; s2 = list->anchor + 1; e2 = row; } /* take back the selection between anchor and drag_pos */ else e1 = row - 1; } list->drag_pos = row; /* restore the elements between s1 and e1 */ if (s1 >= 0) { for (i = s1, work = g_list_nth (list->children, i); i <= e1; i++, work = work->next) { if (g_list_find (list->selection, work->data)) gtk_widget_set_state (GTK_WIDGET (work->data), GTK_STATE_SELECTED); else gtk_widget_set_state (GTK_WIDGET (work->data), GTK_STATE_NORMAL); } } /* extend the selection between s2 and e2 */ if (s2 >= 0) { for (i = s2, work = g_list_nth (list->children, i); i <= e2; i++, work = work->next) if (GTK_WIDGET (work->data)->state != list->anchor_state) gtk_widget_set_state (GTK_WIDGET (work->data), list->anchor_state); }}static voidgtk_list_reset_extended_selection (GtkList *list){ g_return_if_fail (list != 0); g_return_if_fail (GTK_IS_LIST (list)); g_list_free (list->undo_selection); g_list_free (list->undo_unselection); list->undo_selection = NULL; list->undo_unselection = NULL; list->anchor = -1; list->drag_pos = -1; list->undo_focus_child = GTK_CONTAINER (list)->focus_child;}/* Public GtkList Scroll Methods : * * gtk_list_scroll_horizontal * gtk_list_scroll_vertical */voidgtk_list_scroll_horizontal (GtkList *list, GtkScrollType scroll_type, gfloat position){ GtkAdjustment *adj; g_return_if_fail (list != 0); g_return_if_fail (GTK_IS_LIST (list)); if (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (list)) return; if (!(adj = gtk_object_get_data_by_id (GTK_OBJECT (list), hadjustment_key_id))) return; switch (scroll_type) { case GTK_SCROLL_STEP_BACKWARD: adj->value = CLAMP (adj->value - adj->step_increment, adj->lower, adj->upper - adj->page_size); break; case GTK_SCROLL_STEP_FORWARD: adj->value = CLAMP (adj->value + adj->step_increment, adj->lower, adj->upper - adj->page_size); break; case GTK_SCROLL_PAGE_BACKWARD: adj->value = CLAMP (adj->value - adj->page_increment, adj->lower, adj->upper - adj->page_size); break; case GTK_SCROLL_PAGE_FORWARD: adj->value = CLAMP (adj->value + adj->page_increment, adj->lower, adj->upper - adj->page_size); break; case GTK_SCROLL_JUMP: adj->value = CLAMP (adj->lower + (adj->upper - adj->lower) * position, adj->lower, adj->upper - adj->page_size); break; default: break; } gtk_adjustment_value_changed (adj);}voidgtk_list_scroll_vertical (GtkList *list, GtkScrollType scroll_type, gfloat position){ 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; if (list->selection_mode == GTK_SELECTION_EXTENDED) { GtkContainer *container; if (list->anchor >= 0) return; container = GTK_CONTAINER (list); list->undo_focus_child = container->focus_child; gtk_list_move_focus_child (list, scroll_type, position); if (container->focus_child != list->undo_focus_child && !list->add_mode) { gtk_list_unselect_all (list); gtk_list_select_child (list, container->focus_child); } } else gtk_list_move_focus_child (list, scroll_type, position);}/* Private GtkList Scroll/Focus Functions : * * gtk_list_move_focus_child * gtk_list_horizontal_timeout * gtk_list_vertical_timeout */static voidgtk_list_move_focus_child (GtkList *list, GtkScrollType scroll_type, gfloat position){ GtkContainer *container; GList *work; GtkWidget *item; GtkAdjustment *adj; gint new_value; g_return_if_fail (list != 0); g_return_if_fail (GTK_IS_LIST (list)); container = GTK_CONTAINER (list); if (container->focus_child) work = g_list_find (list->children, container->focus_child); else work = list->children; if (!work) return; switch (scroll_type) { case GTK_SCROLL_STEP_BACKWARD: work = work->prev; if (work) gtk_widget_grab_focus (GTK_WIDGET (work->data)); break; case GTK_SCROLL_STEP_FORWARD: work = work->next; if (work) gtk_widget_grab_focus (GTK_WIDGET (work->data)); break; case GTK_SCROLL_PAGE_BACKWARD: if (!work->prev) return; item = work->data; adj = gtk_object_get_data_by_id (GTK_OBJECT (list), vadjustment_key_id); if (adj) { gboolean correct = FALSE; new_value = adj->value; if (item->allocation.y <= adj->value) { new_value = MAX (item->allocation.y + item->allocation.height - adj->page_size, adj->lower); correct = TRUE; } if (item->allocation.y > new_value) for (; work; work = work->prev) { item = GTK_WIDGET (work->data); if (item->allocation.y <= new_value && item->allocation.y + item->allocation.height > new_value) break; } else for (; work; work = work->next) { item = GTK_WIDGET (work->data); if (item->allocation.y <= new_value && item->allocation.y + item->allocation.height > new_value) break; } if (correct && work && work->next && item->allocation.y < new_value) item = work->next->data; } else item = list->children->data; gtk_widget_grab_focus (item); break; case GTK_SCROLL_PAGE_FORWARD: if (!work->next) return; item = work->data; adj = gtk_object_get_data_by_id (GTK_OBJECT (list), vadjustment_key_id); if (adj) { gboolean correct = FALSE; new_value = adj->value; if (item->allocation.y + item->allocation.height >= adj->value + adj->page_size) { new_value = item->allocation.y; correct = TRUE; } new_value = MIN (new_value + adj->page_size, adj->upper); if (item->allocation.y > new_value) for (; work; work = work->prev) { item = GTK_WIDGET (work->data); if (item->allocation.y <= new_value && item->allocation.y + item->allocation.height > new_value) break; } else for (; work; work = work->next) { item = GTK_WIDGET (work->data); if (item->allocation.y <= new_value && item->allocation.y + item->allocation.height > new_value) break; } if (correct && work && work->prev && item->allocation.y + item->allocation.height - 1 > new_value) item = work->prev->data; } else item = g_list_last (work)->data; gtk_widget_grab_focus (item); break; case GTK_SCROLL_JUMP: new_value = GTK_WIDGET(list)->allocation.height * CLAMP (position, 0, 1); for (item = NULL, work = list->children; work; work =work->next) { item = GTK_WIDGET (work->data); if (item->allocation.y <= new_value && item->allocation.y + item->allocation.height > new_value) break; } gtk_widget_grab_focus (item); break; default: break; }}static gintgtk_list_horizontal_timeout (GtkWidget *list){ GdkEventMotion event = { 0 }; GDK_THREADS_ENTER (); GTK_LIST (list)->htimer = 0; event.type = GDK_MOTION_NOTIFY; event.send_event = TRUE; gtk_list_motion_notify (list, &event); GDK_THREADS_LEAVE (); return FALSE;}static gintgtk_list_vertical_timeout (GtkWidget *list){ GdkEventMotion event = { 0 }; GDK_THREADS_ENTER (); GTK_LIST (list)->vtimer = 0; event.type = GDK_MOTION_NOTIFY; event.send_event = TRUE; gtk_list_motion_notify (list, &event); GDK_THREADS_LEAVE (); return FALSE;}/* Private GtkListItem Signal Functions : * * gtk_list_signal_toggle_focus_row * gtk_list_signal_select_all * gtk_list_signal_unselect_all * gtk_list_signal_undo_selection * gtk_list_signal_start_selection * gtk_list_signal_end_selection * gtk_list_signal_extend_selection * gtk_list_signal_scroll_horizontal * gtk_list_signal_scroll_vertical * gtk_list_signal_toggle_add_mode * gtk_list_signal_item_select * gtk_list_signal_item_deselect * gtk_list_signal_item_toggle */static voidgtk_list_signal_toggle_focus_row (GtkListItem *list_item, GtkList *list){ g_return_if_fail (list_item != 0); g_return_if_fail (GTK_IS_LIST_ITEM (list_item)); g_return_if_fail (list != NULL); g_return_if_fail (GTK_IS_LIST (list)); gtk_list_toggle_focus_row (list);}static voidgtk_list_signal_select_all (GtkListItem *list_item, GtkList *list){ g_return_if_fail (list_item != 0); g_return_if_fail (GTK_IS_LIST_ITEM (list_item)); g_return_if_fail (list != NULL); g_return_if_fail (GTK_IS_LIST (list)); gtk_list_select_all (list);}static voidgtk_list_signal_unselect_all (GtkListItem *list_item, GtkList *list){ g_return_if_fail (list_item != 0); g_return_if_fail (GTK_IS_LIST_ITEM (list_item)); g_return_if_fail (list != NULL); g_return_if_fail (GTK_IS_LIST (list)); gtk_list_unselect_all (list);}static voidgtk_list_signal_undo_selection (GtkListItem *list_item, GtkList *list){ g_return_if_fail (list_item != 0); g_return_if_fail (GTK_IS_LIST_ITEM (list_item)); g_return_if_fail (list != NULL); g_return_if_fail (GTK_IS_LIST (list)); gtk_list_undo_selection (list);}static voidgtk_list_signal_start_selection (GtkListItem *list_item, GtkList *list){ g_return_if_fail (list_item != 0); g_return_if_fail (GTK_IS_LIST_ITEM (list_item)); g_return_if_fail (list != NULL); g_return_if_fail (GTK_IS_LIST (list)); gtk_list_start_selection (list);}static voidgtk_list_signal_end_selection (GtkListItem *list_item, GtkList *list){ g_return_if_fail (list_item != 0); g_return_if_fail (GTK_IS_LIST_ITEM (list_item)); g_return_if_fail (list != NULL); g_return_if_fail (GTK_IS_LIST (list)); gtk_list_end_selection (list);}static voidgtk_list_signal_extend_selection (GtkListItem *list_item, GtkScrollType scroll_type, gfloat position, gboolean auto_start_selection, GtkList *list){ g_return_if_fail (list_item != 0); g_return_if_fail (GTK_IS_LIST_ITEM (list_item)); g_return_if_fail (list != NULL); g_return_if_fail (GTK_IS_LIST (list)); gtk_list_extend_selection (list, scroll_type, position, auto_start_selection);}static voidgtk_list_signal_scroll_horizontal (GtkListItem *list_item, GtkScrollType scroll_type, gfloat position, GtkList *list){ g_return_if_fail (list_item != 0); g_return_if_fail (GTK_IS_LIST_ITEM (list_item)); g_return_if_fail (list != NULL); g_return_if_fail (GTK_IS_LIST (list)); gtk_list_scroll_horizontal (list, scroll_type, position);}static voidgtk_list_signal_scroll_vertical (GtkListItem *list_item, GtkScrollType scroll_type, gfloat position, GtkList *list){ g_return_if_fail (list_item != 0); g_return_if_fail (GTK_IS_LIST_ITEM (list_item)); g_return_if_fail (list != NULL);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -