📄 gtkclist.c
字号:
if (clist->column[column].area.width < clist->column[column].min_width) gtk_clist_set_column_width (clist, column,clist->column[column].min_width);}voidgtk_clist_set_column_max_width (GtkCList *clist, gint column, gint max_width){ g_return_if_fail (clist != NULL); g_return_if_fail (GTK_IS_CLIST (clist)); if (column < 0 || column >= clist->columns) return; if (clist->column[column].max_width == max_width) return; if (clist->column[column].min_width >= 0 && max_width >= 0 && clist->column[column].min_width > max_width) clist->column[column].max_width = clist->column[column].min_width; else clist->column[column].max_width = max_width; if (clist->column[column].area.width > clist->column[column].max_width) gtk_clist_set_column_width (clist, column,clist->column[column].max_width);}/* PRIVATE COLUMN FUNCTIONS * column_auto_resize * real_resize_column * abort_column_resize * size_allocate_title_buttons * size_allocate_columns * list_requisition_width * new_column_width * column_button_create * column_button_clicked * column_title_passive_func */static voidcolumn_auto_resize (GtkCList *clist, GtkCListRow *clist_row, gint column, gint old_width){ /* resize column if needed for auto_resize */ GtkRequisition requisition; if (!clist->column[column].auto_resize || GTK_CLIST_AUTO_RESIZE_BLOCKED(clist)) return; if (clist_row) GTK_CLIST_CLASS_FW (clist)->cell_size_request (clist, clist_row, column, &requisition); else requisition.width = 0; if (requisition.width > clist->column[column].width) gtk_clist_set_column_width (clist, column, requisition.width); else if (requisition.width < old_width && old_width == clist->column[column].width) { GList *list; gint new_width = 0; /* run a "gtk_clist_optimal_column_width" but break, if * the column doesn't shrink */ if (GTK_CLIST_SHOW_TITLES(clist) && clist->column[column].button) new_width = (clist->column[column].button->requisition.width - (CELL_SPACING + (2 * COLUMN_INSET))); else new_width = 0; for (list = clist->row_list; list; list = list->next) { GTK_CLIST_CLASS_FW (clist)->cell_size_request (clist, GTK_CLIST_ROW (list), column, &requisition); new_width = MAX (new_width, requisition.width); if (new_width == clist->column[column].width) break; } if (new_width < clist->column[column].width) gtk_clist_set_column_width (clist, column, MAX (new_width, clist->column[column].min_width)); }}static voidreal_resize_column (GtkCList *clist, gint column, gint width){ g_return_if_fail (clist != NULL); g_return_if_fail (GTK_IS_CLIST (clist)); if (column < 0 || column >= clist->columns) return; if (width < MAX (COLUMN_MIN_WIDTH, clist->column[column].min_width)) width = MAX (COLUMN_MIN_WIDTH, clist->column[column].min_width); if (clist->column[column].max_width >= 0 && width > clist->column[column].max_width) width = clist->column[column].max_width; clist->column[column].width = width; clist->column[column].width_set = TRUE; /* FIXME: this is quite expensive to do if the widget hasn't * been size_allocated yet, and pointless. Should * a flag be kept */ size_allocate_columns (clist, TRUE); size_allocate_title_buttons (clist); CLIST_REFRESH (clist);}static voidabort_column_resize (GtkCList *clist){ g_return_if_fail (clist != NULL); g_return_if_fail (GTK_IS_CLIST (clist)); if (!GTK_CLIST_IN_DRAG(clist)) return; GTK_CLIST_UNSET_FLAG (clist, CLIST_IN_DRAG); gtk_grab_remove (GTK_WIDGET (clist)); gdk_pointer_ungrab (GDK_CURRENT_TIME); clist->drag_pos = -1; if (clist->x_drag >= 0 && clist->x_drag <= clist->clist_window_width - 1) draw_xor_line (clist); if (GTK_CLIST_ADD_MODE(clist)) { gdk_gc_set_line_attributes (clist->xor_gc, 1, GDK_LINE_ON_OFF_DASH, 0,0); gdk_gc_set_dashes (clist->xor_gc, 0, "\4\4", 2); }}static voidsize_allocate_title_buttons (GtkCList *clist){ GtkAllocation button_allocation; gint last_column; gint last_button = 0; gint i; if (!GTK_WIDGET_REALIZED (clist)) return; button_allocation.x = clist->hoffset; button_allocation.y = 0; button_allocation.width = 0; button_allocation.height = clist->column_title_area.height; /* find last visible column */ for (last_column = clist->columns - 1; last_column >= 0; last_column--) if (clist->column[last_column].visible) break; for (i = 0; i < last_column; i++) { if (!clist->column[i].visible) { last_button = i + 1; gdk_window_hide (clist->column[i].window); continue; } button_allocation.width += (clist->column[i].area.width + CELL_SPACING + 2 * COLUMN_INSET); if (!clist->column[i + 1].button) { gdk_window_hide (clist->column[i].window); continue; } gtk_widget_size_allocate (clist->column[last_button].button, &button_allocation); button_allocation.x += button_allocation.width; button_allocation.width = 0; if (clist->column[last_button].resizeable) { gdk_window_show (clist->column[last_button].window); gdk_window_move_resize (clist->column[last_button].window, button_allocation.x - (DRAG_WIDTH / 2), 0, DRAG_WIDTH, clist->column_title_area.height); } else gdk_window_hide (clist->column[last_button].window); last_button = i + 1; } button_allocation.width += (clist->column[last_column].area.width + 2 * (CELL_SPACING + COLUMN_INSET)); gtk_widget_size_allocate (clist->column[last_button].button, &button_allocation); if (clist->column[last_button].resizeable) { button_allocation.x += button_allocation.width; gdk_window_show (clist->column[last_button].window); gdk_window_move_resize (clist->column[last_button].window, button_allocation.x - (DRAG_WIDTH / 2), 0, DRAG_WIDTH, clist->column_title_area.height); } else gdk_window_hide (clist->column[last_button].window);}static voidsize_allocate_columns (GtkCList *clist, gboolean block_resize){ gint xoffset = CELL_SPACING + COLUMN_INSET; gint last_column; gint i; /* find last visible column and calculate correct column width */ for (last_column = clist->columns - 1; last_column >= 0 && !clist->column[last_column].visible; last_column--); if (last_column < 0) return; for (i = 0; i <= last_column; i++) { if (!clist->column[i].visible) continue; clist->column[i].area.x = xoffset; if (clist->column[i].width_set) { if (!block_resize && GTK_CLIST_SHOW_TITLES(clist) && clist->column[i].auto_resize && clist->column[i].button) { gint width; width = (clist->column[i].button->requisition.width - (CELL_SPACING + (2 * COLUMN_INSET))); if (width > clist->column[i].width) gtk_clist_set_column_width (clist, i, width); } clist->column[i].area.width = clist->column[i].width; xoffset += clist->column[i].width + CELL_SPACING + (2* COLUMN_INSET); } else if (GTK_CLIST_SHOW_TITLES(clist) && clist->column[i].button) { clist->column[i].area.width = clist->column[i].button->requisition.width - (CELL_SPACING + (2 * COLUMN_INSET)); xoffset += clist->column[i].button->requisition.width; } } clist->column[last_column].area.width = clist->column[last_column].area.width + MAX (0, clist->clist_window_width + COLUMN_INSET - xoffset);}static gintlist_requisition_width (GtkCList *clist) { gint width = CELL_SPACING; gint i; for (i = clist->columns - 1; i >= 0; i--) { if (!clist->column[i].visible) continue; if (clist->column[i].width_set) width += clist->column[i].width + CELL_SPACING + (2 * COLUMN_INSET); else if (GTK_CLIST_SHOW_TITLES(clist) && clist->column[i].button) width += clist->column[i].button->requisition.width; } return width;}/* this function returns the new width of the column being resized given * the column and x position of the cursor; the x cursor position is passed * in as a pointer and automagicly corrected if it's beyond min/max limits */static gintnew_column_width (GtkCList *clist, gint column, gint *x){ gint xthickness = GTK_WIDGET (clist)->style->klass->xthickness; gint width; gint cx; gint dx; gint last_column; /* first translate the x position from widget->window * to clist->clist_window */ cx = *x - xthickness; for (last_column = clist->columns - 1; last_column >= 0 && !clist->column[last_column].visible; last_column--); /* calculate new column width making sure it doesn't end up * less than the minimum width */ dx = (COLUMN_LEFT_XPIXEL (clist, column) + COLUMN_INSET + (column < last_column) * CELL_SPACING); width = cx - dx; if (width < MAX (COLUMN_MIN_WIDTH, clist->column[column].min_width)) { width = MAX (COLUMN_MIN_WIDTH, clist->column[column].min_width); cx = dx + width; *x = cx + xthickness; } else if (clist->column[column].max_width >= COLUMN_MIN_WIDTH && width > clist->column[column].max_width) { width = clist->column[column].max_width; cx = dx + clist->column[column].max_width; *x = cx + xthickness; } if (cx < 0 || cx > clist->clist_window_width) *x = -1; return width;}static voidcolumn_button_create (GtkCList *clist, gint column){ GtkWidget *button; gtk_widget_push_composite_child (); button = clist->column[column].button = gtk_button_new (); gtk_widget_pop_composite_child (); if (GTK_WIDGET_REALIZED (clist) && clist->title_window) gtk_widget_set_parent_window (clist->column[column].button, clist->title_window); gtk_widget_set_parent (button, GTK_WIDGET (clist)); gtk_signal_connect (GTK_OBJECT (button), "clicked", (GtkSignalFunc) column_button_clicked, (gpointer) clist); gtk_widget_show (button);}static voidcolumn_button_clicked (GtkWidget *widget, gpointer data){ gint i; GtkCList *clist; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_CLIST (data)); clist = GTK_CLIST (data); /* find the column who's button was pressed */ for (i = 0; i < clist->columns; i++) if (clist->column[i].button == widget) break; gtk_signal_emit (GTK_OBJECT (clist), clist_signals[CLICK_COLUMN], i);}static gintcolumn_title_passive_func (GtkWidget *widget, GdkEvent *event, gpointer data){ g_return_val_if_fail (event != NULL, FALSE); switch (event->type) { case GDK_MOTION_NOTIFY: case GDK_BUTTON_PRESS: case GDK_2BUTTON_PRESS: case GDK_3BUTTON_PRESS: case GDK_BUTTON_RELEASE: case GDK_ENTER_NOTIFY: case GDK_LEAVE_NOTIFY: return TRUE; default: break; } return FALSE;}/* PUBLIC CELL FUNCTIONS * gtk_clist_get_cell_type * gtk_clist_set_text * gtk_clist_get_text * gtk_clist_set_pixmap * gtk_clist_get_pixmap * gtk_clist_set_pixtext * gtk_clist_get_pixtext * gtk_clist_set_shift */GtkCellType gtk_clist_get_cell_type (GtkCList *clist, gint row, gint column){ GtkCListRow *clist_row; g_return_val_if_fail (clist != NULL, -1); g_return_val_if_fail (GTK_IS_CLIST (clist), -1); if (row < 0 || row >= clist->rows) return -1; if (column < 0 || column >= clist->columns) return -1; clist_row = (g_list_nth (clist->row_list, row))->data; return clist_row->cell[column].type;}voidgtk_clist_set_text (GtkCList *clist, gint row, gint column, const gchar *text)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -