Revision 322 src/gtkutils.c

gtkutils.c (revision 322)
243 243
	return combo;
244 244
}
245 245

  
246
#define CELL_SPACING 1
247
#define ROW_TOP_YPIXEL(clist, row) (((clist)->row_height * (row)) + \
248
				    (((row) + 1) * CELL_SPACING) + \
249
				    (clist)->voffset)
250
#define ROW_FROM_YPIXEL(clist, y) (((y) - (clist)->voffset) / \
251
				   ((clist)->row_height + CELL_SPACING))
252

  
253
void gtkut_ctree_node_move_if_on_the_edge(GtkCTree *ctree, GtkCTreeNode *node)
254
{
255
	GtkCList *clist = GTK_CLIST(ctree);
256
	gint row;
257
	GtkVisibility row_visibility, prev_row_visibility, next_row_visibility;
258

  
259
	g_return_if_fail(ctree != NULL);
260
	g_return_if_fail(node != NULL);
261

  
262
	row = g_list_position(clist->row_list, (GList *)node);
263
	if (row < 0 || row >= clist->rows || clist->row_height == 0) return;
264
	row_visibility = gtk_clist_row_is_visible(clist, row);
265
	prev_row_visibility = gtk_clist_row_is_visible(clist, row - 1);
266
	next_row_visibility = gtk_clist_row_is_visible(clist, row + 1);
267

  
268
	if (row_visibility == GTK_VISIBILITY_NONE) {
269
		gtk_clist_moveto(clist, row, -1, 0.5, 0);
270
		return;
271
	}
272
	if (row_visibility == GTK_VISIBILITY_FULL &&
273
	    prev_row_visibility == GTK_VISIBILITY_FULL &&
274
	    next_row_visibility == GTK_VISIBILITY_FULL)
275
		return;
276
	if (prev_row_visibility != GTK_VISIBILITY_FULL &&
277
	    next_row_visibility != GTK_VISIBILITY_FULL)
278
		return;
279

  
280
	if (prev_row_visibility != GTK_VISIBILITY_FULL) {
281
		gtk_clist_moveto(clist, row, -1, 0.2, 0);
282
		return;
283
	}
284
	if (next_row_visibility != GTK_VISIBILITY_FULL) {
285
		gtk_clist_moveto(clist, row, -1, 0.8, 0);
286
		return;
287
	}
288
}
289

  
290
#undef CELL_SPACING
291
#undef ROW_TOP_YPIXEL
292
#undef ROW_FROM_YPIXEL
293

  
294 246
gint gtkut_ctree_get_nth_from_node(GtkCTree *ctree, GtkCTreeNode *node)
295 247
{
296 248
	g_return_val_if_fail(ctree != NULL, -1);
......
299 251
	return g_list_position(GTK_CLIST(ctree)->row_list, (GList *)node);
300 252
}
301 253

  
302
/* get the next node, including the invisible one */
303
GtkCTreeNode *gtkut_ctree_node_next(GtkCTree *ctree, GtkCTreeNode *node)
304
{
305
	GtkCTreeNode *parent;
306

  
307
	if (!node) return NULL;
308

  
309
	if (GTK_CTREE_ROW(node)->children)
310
		return GTK_CTREE_ROW(node)->children;
311

  
312
	if (GTK_CTREE_ROW(node)->sibling)
313
		return GTK_CTREE_ROW(node)->sibling;
314

  
315
	for (parent = GTK_CTREE_ROW(node)->parent; parent != NULL;
316
	     parent = GTK_CTREE_ROW(parent)->parent) {
317
		if (GTK_CTREE_ROW(parent)->sibling)
318
			return GTK_CTREE_ROW(parent)->sibling;
319
	}
320

  
321
	return NULL;
322
}
323

  
324
/* get the previous node, including the invisible one */
325
GtkCTreeNode *gtkut_ctree_node_prev(GtkCTree *ctree, GtkCTreeNode *node)
326
{
327
	GtkCTreeNode *prev;
328
	GtkCTreeNode *child;
329

  
330
	if (!node) return NULL;
331

  
332
	prev = GTK_CTREE_NODE_PREV(node);
333
	if (prev == GTK_CTREE_ROW(node)->parent)
334
		return prev;
335

  
336
	child = prev;
337
	while (GTK_CTREE_ROW(child)->children != NULL) {
338
		child = GTK_CTREE_ROW(child)->children;
339
		while (GTK_CTREE_ROW(child)->sibling != NULL)
340
			child = GTK_CTREE_ROW(child)->sibling;
341
	}
342

  
343
	return child;
344
}
345

  
346
gboolean gtkut_ctree_node_is_selected(GtkCTree *ctree, GtkCTreeNode *node)
347
{
348
	GtkCList *clist = GTK_CLIST(ctree);
349
	GList *cur;
350

  
351
	for (cur = clist->selection; cur != NULL; cur = cur->next) {
352
		if (node == GTK_CTREE_NODE(cur->data))
353
			return TRUE;
354
	}
355

  
356
	return FALSE;
357
}
358

  
359
GtkCTreeNode *gtkut_ctree_find_collapsed_parent(GtkCTree *ctree,
360
						GtkCTreeNode *node)
361
{
362
	if (!node) return NULL;
363

  
364
	while ((node = GTK_CTREE_ROW(node)->parent) != NULL) {
365
		if (!GTK_CTREE_ROW(node)->expanded)
366
			return node;
367
	}
368

  
369
	return NULL;
370
}
371

  
372
void gtkut_ctree_expand_parent_all(GtkCTree *ctree, GtkCTreeNode *node)
373
{
374
	while ((node = gtkut_ctree_find_collapsed_parent(ctree, node)) != NULL)
375
		gtk_ctree_expand(ctree, node);
376
}
377

  
378 254
void gtkut_ctree_set_focus_row(GtkCTree *ctree, GtkCTreeNode *node)
379 255
{
380 256
	gtkut_clist_set_focus_row(GTK_CLIST(ctree),
......
643 519
	gtk_adjustment_set_value(vadj, value);
644 520
}
645 521

  
522
/* modified version of gtk_tree_view_scroll_to_cell */
523
void gtkut_tree_view_scroll_to_cell(GtkTreeView *treeview, GtkTreePath *path)
524
{
525
	GdkRectangle cell_rect;
526
	GdkRectangle vis_rect;
527
	gint dest_x, dest_y;
528

  
529
	if (!path)
530
		return;
531

  
532
	gtk_tree_view_get_cell_area(treeview, path, NULL, &cell_rect);
533
	gtk_tree_view_widget_to_tree_coords(treeview, cell_rect.x, cell_rect.y,
534
					    NULL, &(cell_rect.y));
535
	gtk_tree_view_get_visible_rect(treeview, &vis_rect);
536

  
537
	dest_x = vis_rect.x;
538
	dest_y = vis_rect.y;
539

  
540
	if (cell_rect.y < vis_rect.y)
541
		dest_y = cell_rect.y;
542
	if (cell_rect.y + cell_rect.height > vis_rect.y + vis_rect.height)
543
		dest_y = cell_rect.y + cell_rect.height - vis_rect.height;
544

  
545
	gtk_tree_view_scroll_to_point(treeview, dest_x, dest_y);
546
}
547

  
646 548
void gtkut_combo_set_items(GtkCombo *combo, const gchar *str1, ...)
647 549
{
648 550
	va_list args;

Also available in: Unified diff