ui/motif/Grid.c

changeset 921
c2b318b93062
parent 913
3012ec57d84a
equal deleted inserted replaced
920:10a783120051 921:c2b318b93062
58 gridColumnSpacing, 58 gridColumnSpacing,
59 gridColumnSpacing, 59 gridColumnSpacing,
60 XmRDimension, 60 XmRDimension,
61 sizeof (Dimension), 61 sizeof (Dimension),
62 XtOffsetOf( GridRec, 62 XtOffsetOf( GridRec,
63 mywidget.columnspacing), 63 grid.columnspacing),
64 XmRImmediate, 64 XmRImmediate,
65 (XtPointer) 0 65 (XtPointer) 0
66 }, 66 },
67 { 67 {
68 gridRowSpacing, 68 gridRowSpacing,
69 gridRowSpacing, 69 gridRowSpacing,
70 XmRDimension, 70 XmRDimension,
71 sizeof (Dimension), 71 sizeof (Dimension),
72 XtOffsetOf( GridRec, 72 XtOffsetOf( GridRec,
73 mywidget.rowspacing), 73 grid.rowspacing),
74 XmRImmediate, 74 XmRImmediate,
75 (XtPointer) 0 75 (XtPointer) 0
76 }, 76 },
77 { 77 {
78 gridPaddingLeft, 78 gridPaddingLeft,
79 gridPaddingLeft, 79 gridPaddingLeft,
80 XmRDimension, 80 XmRDimension,
81 sizeof (Dimension), 81 sizeof (Dimension),
82 XtOffsetOf( GridRec, 82 XtOffsetOf( GridRec,
83 mywidget.padding_left), 83 grid.padding_left),
84 XmRImmediate, 84 XmRImmediate,
85 (XtPointer) 0 85 (XtPointer) 0
86 }, 86 },
87 { 87 {
88 gridPaddingRight, 88 gridPaddingRight,
89 gridPaddingRight, 89 gridPaddingRight,
90 XmRDimension, 90 XmRDimension,
91 sizeof (Dimension), 91 sizeof (Dimension),
92 XtOffsetOf( GridRec, 92 XtOffsetOf( GridRec,
93 mywidget.padding_right), 93 grid.padding_right),
94 XmRImmediate, 94 XmRImmediate,
95 (XtPointer) 0 95 (XtPointer) 0
96 }, 96 },
97 { 97 {
98 gridPaddingTop, 98 gridPaddingTop,
99 gridPaddingTop, 99 gridPaddingTop,
100 XmRDimension, 100 XmRDimension,
101 sizeof (Dimension), 101 sizeof (Dimension),
102 XtOffsetOf( GridRec, 102 XtOffsetOf( GridRec,
103 mywidget.padding_top), 103 grid.padding_top),
104 XmRImmediate, 104 XmRImmediate,
105 (XtPointer) 0 105 (XtPointer) 0
106 }, 106 },
107 { 107 {
108 gridPaddingBottom, 108 gridPaddingBottom,
109 gridPaddingBottom, 109 gridPaddingBottom,
110 XmRDimension, 110 XmRDimension,
111 sizeof (Dimension), 111 sizeof (Dimension),
112 XtOffsetOf( GridRec, 112 XtOffsetOf( GridRec,
113 mywidget.padding_bottom), 113 grid.padding_bottom),
114 XmRImmediate, 114 XmRImmediate,
115 (XtPointer) 0 115 (XtPointer) 0
116 } 116 }
117 }; 117 };
118 118
333 333
334 } 334 }
335 void grid_initialize(Widget request, Widget new, ArgList args, Cardinal num_args) { 335 void grid_initialize(Widget request, Widget new, ArgList args, Cardinal num_args) {
336 Grid mn = (Grid)new; 336 Grid mn = (Grid)new;
337 337
338 mn->mywidget.max_col = 0; 338 mn->grid.max_col = 0;
339 mn->mywidget.max_row = 0; 339 mn->grid.max_row = 0;
340 340
341 } 341 }
342 void grid_realize(Widget w,XtValueMask *valueMask,XSetWindowAttributes *attributes) { 342 void grid_realize(Widget w,XtValueMask *valueMask,XSetWindowAttributes *attributes) {
343 Grid grid = (Grid)w; 343 Grid grid = (Grid)w;
344 XtMakeResizeRequest(w, 400, 400, NULL, NULL); 344 XtMakeResizeRequest(w, 400, 400, NULL, NULL);
392 grid_place_children((Grid)XtParent(widget)); 392 grid_place_children((Grid)XtParent(widget));
393 return XtGeometryYes; 393 return XtGeometryYes;
394 } 394 }
395 395
396 void GridChangeManaged(Widget widget) { 396 void GridChangeManaged(Widget widget) {
397 397 grid_place_children((Grid)widget);
398 } 398 }
399 399
400 Boolean ConstraintSetValues(Widget old, Widget request, Widget neww, ArgList args, Cardinal *num_args) { 400 Boolean ConstraintSetValues(Widget old, Widget request, Widget neww, ArgList args, Cardinal *num_args) {
401 GridConstraintRec *constraints = neww->core.constraints; 401 GridConstraintRec *constraints = neww->core.constraints;
402 Grid grid = (Grid)XtParent(neww); 402 Grid grid = (Grid)XtParent(neww);
403 if(constraints->grid.x > grid->mywidget.max_col) { 403 if(constraints->grid.x > grid->grid.max_col) {
404 grid->mywidget.max_col = constraints->grid.x; 404 grid->grid.max_col = constraints->grid.x;
405 } 405 }
406 if(constraints->grid.y > grid->mywidget.max_row) { 406 if(constraints->grid.y > grid->grid.max_row) {
407 grid->mywidget.max_row = constraints->grid.y; 407 grid->grid.max_row = constraints->grid.y;
408 } 408 }
409 } 409 }
410 410
411 411
412 void grid_constraint_init( 412 void grid_constraint_init(
417 ) 417 )
418 { 418 {
419 GridConstraintRec *constraints = neww->core.constraints; 419 GridConstraintRec *constraints = neww->core.constraints;
420 420
421 Grid grid = (Grid)XtParent(neww); 421 Grid grid = (Grid)XtParent(neww);
422 if(constraints->grid.x > grid->mywidget.max_col) { 422 if(constraints->grid.x > grid->grid.max_col) {
423 grid->mywidget.max_col = constraints->grid.x; 423 grid->grid.max_col = constraints->grid.x;
424 } 424 }
425 if(constraints->grid.y > grid->mywidget.max_row) { 425 if(constraints->grid.y > grid->grid.max_row) {
426 grid->mywidget.max_row = constraints->grid.y; 426 grid->grid.max_row = constraints->grid.y;
427 } 427 }
428 constraints->grid.pref_width = neww->core.width; 428 constraints->grid.pref_width = neww->core.width;
429 constraints->grid.pref_height = neww->core.height; 429 constraints->grid.pref_height = neww->core.height;
430 } 430 }
431 431
432 void grid_place_children(Grid w) { 432 void grid_place_children(Grid w) {
433 int ncols = w->mywidget.max_col+1; 433 if(!XtIsRealized((Widget)w)) {
434 int nrows = w->mywidget.max_row+1; 434 return;
435 }
436
437 int ncols = w->grid.max_col+1;
438 int nrows = w->grid.max_row+1;
435 GridDef *cols = calloc(ncols, sizeof(GridDef)); 439 GridDef *cols = calloc(ncols, sizeof(GridDef));
436 GridDef *rows = calloc(nrows, sizeof(GridDef)); 440 GridDef *rows = calloc(nrows, sizeof(GridDef));
437 int num_cols_expanding = 0; 441 int num_cols_expanding = 0;
438 int num_rows_expanding = 0; 442 int num_rows_expanding = 0;
439 int req_width = w->mywidget.padding_left + w->mywidget.padding_right; 443 int req_width = w->grid.padding_left + w->grid.padding_right;
440 int req_height = w->mywidget.padding_top + w->mywidget.padding_bottom; 444 int req_height = w->grid.padding_top + w->grid.padding_bottom;
441 int width = w->core.width; 445 int width = w->core.width;
442 int height = w->core.height; 446 int height = w->core.height;
443 447
444 //printf("container width: %d\n", (int)w->core.width); 448 //printf("container width: %d\n", (int)w->core.width);
445 449
460 if(constraints->grid.pref_width < constraints->grid.min_width) { 464 if(constraints->grid.pref_width < constraints->grid.min_width) {
461 constraints->grid.pref_width = constraints->grid.min_width; 465 constraints->grid.pref_width = constraints->grid.min_width;
462 } 466 }
463 int elm_width = constraints->grid.pref_width + constraints->grid.margin_left + constraints->grid.margin_right; 467 int elm_width = constraints->grid.pref_width + constraints->grid.margin_left + constraints->grid.margin_right;
464 int elm_height = constraints->grid.pref_height + constraints->grid.margin_top + constraints->grid.margin_bottom; 468 int elm_height = constraints->grid.pref_height + constraints->grid.margin_top + constraints->grid.margin_bottom;
469 if(!XtIsManaged(child)) {
470 elm_width = 0;
471 elm_height = 0;
472 }
465 473
466 if(constraints->grid.colspan > span_max || constraints->grid.rowspan > span_max) { 474 if(constraints->grid.colspan > span_max || constraints->grid.rowspan > span_max) {
467 continue; 475 continue;
468 } 476 }
469 477
562 num_rows_expanding++; 570 num_rows_expanding++;
563 } 571 }
564 req_height += rows[i].size; 572 req_height += rows[i].size;
565 } 573 }
566 574
575 int total_colspacing = 0;
576 int total_rowspacing = 0;
577 for(int i=0;i+1<ncols;i++) {
578 if(cols[i].size > 0) {
579 total_colspacing += w->grid.columnspacing;
580 }
581 }
582 for(int i=0;i+1<nrows;i++) {
583 if(rows[i].size > 0) {
584 total_rowspacing += w->grid.rowspacing;
585 }
586 }
587
567 if(req_width > 0 && req_height > 0) { 588 if(req_width > 0 && req_height > 0) {
568 // add col/row spacing 589 // add col/row spacing
569 req_width += (ncols-1)*w->mywidget.columnspacing; 590 req_width += total_colspacing; //(ncols-1)*w->grid.columnspacing;
570 req_height += (nrows-1)*w->mywidget.rowspacing; 591 req_height += total_rowspacing; //(nrows-1)*w->grid.rowspacing;
571 592
572 Widget parent = w->core.parent; 593 Widget parent = w->core.parent;
573 Dimension rwidth = req_width; 594 Dimension rwidth = req_width;
574 Dimension rheight = req_height; 595 Dimension rheight = req_height;
575 if(rwidth < w->core.width) { 596 if(rwidth < w->core.width) {
577 } 598 }
578 if(rheight < w->core.height) { 599 if(rheight < w->core.height) {
579 //rheight = w->core.height; 600 //rheight = w->core.height;
580 } 601 }
581 602
582 if(!w->mywidget.sizerequest) { 603 if(!w->grid.sizerequest) {
583 Dimension actual_width, actual_height; 604 Dimension actual_width, actual_height;
584 w->mywidget.sizerequest = TRUE; 605 w->grid.sizerequest = TRUE;
585 606
586 //printf("sizerequest: %d x %d\n", (int)req_width, (int)req_height); 607 //printf("sizerequest: %d x %d\n", (int)req_width, (int)req_height);
587 608
588 //XtWidgetGeometry request; 609 //XtWidgetGeometry request;
589 //request.width = req_width; 610 //request.width = req_width;
590 //request.request_mode = CWWidth; 611 //request.request_mode = CWWidth;
591 //XtWidgetGeometry reply; 612 //XtWidgetGeometry reply;
592 //XtGeometryResult result = XtMakeGeometryRequest((Widget)w, &request, &reply); 613 //XtGeometryResult result = XtMakeGeometryRequest((Widget)w, &request, &reply);
593 614
594 XtMakeResizeRequest((Widget)w, req_width, req_height, &actual_width, &actual_height); 615 XtMakeResizeRequest((Widget)w, req_width, req_height, &actual_width, &actual_height);
595 w->mywidget.sizerequest = FALSE; 616 w->grid.sizerequest = FALSE;
596 //printf("size request: %d %d\n", (int)actual_width, (int)actual_height); 617 //printf("size request: %d %d\n", (int)actual_width, (int)actual_height);
597 } 618 }
598 619
599 620
600 621
606 int hexpand2 = 0; 627 int hexpand2 = 0;
607 if(width_diff > 0 && num_cols_expanding > 0) { 628 if(width_diff > 0 && num_cols_expanding > 0) {
608 hexpand = width_diff / num_cols_expanding; 629 hexpand = width_diff / num_cols_expanding;
609 hexpand2 = width_diff-hexpand*num_cols_expanding; 630 hexpand2 = width_diff-hexpand*num_cols_expanding;
610 } 631 }
611 int x = w->mywidget.padding_left; 632 int x = w->grid.padding_left;
612 for(int i=0;i<ncols;i++) { 633 for(int i=0;i<ncols;i++) {
613 cols[i].pos = x; 634 cols[i].pos = x;
614 if(cols[i].expand) { 635 if(cols[i].expand) {
615 cols[i].size += hexpand + hexpand2; 636 cols[i].size += hexpand + hexpand2;
616 } 637 }
617 x += cols[i].size + w->mywidget.columnspacing; 638 if(cols[i].size > 0) {
639 x += cols[i].size + w->grid.columnspacing;
640 }
618 641
619 hexpand2 = 0; 642 hexpand2 = 0;
620 } 643 }
621 644
622 int vexpand = 0; 645 int vexpand = 0;
624 int vexpand2 = 0; 647 int vexpand2 = 0;
625 if(height_diff > 0 && num_rows_expanding > 0) { 648 if(height_diff > 0 && num_rows_expanding > 0) {
626 vexpand = height_diff / num_rows_expanding; 649 vexpand = height_diff / num_rows_expanding;
627 vexpand2 = height_diff-vexpand*num_rows_expanding; 650 vexpand2 = height_diff-vexpand*num_rows_expanding;
628 } 651 }
629 int y = w->mywidget.padding_bottom; 652 int y = w->grid.padding_bottom;
630 for(int i=0;i<nrows;i++) { 653 for(int i=0;i<nrows;i++) {
631 rows[i].pos = y; 654 rows[i].pos = y;
632 if(rows[i].expand) { 655 if(rows[i].expand) {
633 rows[i].size += vexpand + vexpand2; 656 rows[i].size += vexpand + vexpand2;
634 } 657 }
635 y += rows[i].size += w->mywidget.rowspacing; 658 if(rows[i].size > 0) {
659 y += rows[i].size += w->grid.rowspacing;
660 }
636 661
637 vexpand2 = 0; 662 vexpand2 = 0;
638 } 663 }
639 664
640 for(int i=0;i<w->composite.num_children;i++) { 665 for(int i=0;i<w->composite.num_children;i++) {
649 if(constraints->grid.hfill) { 674 if(constraints->grid.hfill) {
650 if(constraints->grid.colspan > 1) { 675 if(constraints->grid.colspan > 1) {
651 Dimension cwidth = 0; 676 Dimension cwidth = 0;
652 for(int j=0;j<constraints->grid.colspan;j++) { 677 for(int j=0;j<constraints->grid.colspan;j++) {
653 if(constraints->grid.x+j < ncols) { 678 if(constraints->grid.x+j < ncols) {
654 cwidth += cols[constraints->grid.x+j].size + (j > 0 ? w->mywidget.columnspacing : 0); 679 cwidth += cols[constraints->grid.x+j].size + (j > 0 ? w->grid.columnspacing : 0);
655 } 680 }
656 } 681 }
657 width = cwidth; 682 width = cwidth;
658 } else { 683 } else {
659 width = c.size - w->mywidget.columnspacing - constraints->grid.margin_left - constraints->grid.margin_right; 684 width = c.size - w->grid.columnspacing - constraints->grid.margin_left - constraints->grid.margin_right;
660 } 685 }
661 } 686 }
662 if(constraints->grid.vfill) { 687 if(constraints->grid.vfill) {
663 if(constraints->grid.rowspan > 1) { 688 if(constraints->grid.rowspan > 1) {
664 Dimension cheight = 0; 689 Dimension cheight = 0;
665 for(int j=0;j<constraints->grid.rowspan;j++) { 690 for(int j=0;j<constraints->grid.rowspan;j++) {
666 if(constraints->grid.y+j < nrows) { 691 if(constraints->grid.y+j < nrows) {
667 cheight += rows[constraints->grid.y+j].size + (j > 0 ? w->mywidget.rowspacing : 0); 692 cheight += rows[constraints->grid.y+j].size + (j > 0 ? w->grid.rowspacing : 0);
668 } 693 }
669 } 694 }
670 height = cheight; 695 height = cheight;
671 } else { 696 } else {
672 height = r.size - w->mywidget.rowspacing - constraints->grid.margin_top - constraints->grid.margin_bottom; 697 height = r.size - w->grid.rowspacing - constraints->grid.margin_top - constraints->grid.margin_bottom;
673 } 698 }
674 } 699 }
675 700
676 if(width > 0 && height > 0) { 701 if(width > 0 && height > 0) {
677 XtConfigureWidget(child, x, y, width, height, child->core.border_width); 702 XtConfigureWidget(child, x, y, width, height, child->core.border_width);

mercurial