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