Skip to main content

The TreeDiagram Class Reference

Class representing the tree layout for the built-in class diagram. More...

Declaration

class TreeDiagram { ... }

Public Member Typedefs Index

usingPtr = std::unique_ptr< DiagramRow >
usingVec = std::vector< Ptr >
usingiterator = typename Vec::iterator

Public Constructors Index

TreeDiagram (const ClassDef *root, bool doBases)

Public Member Functions Index

voidcomputeLayout ()
uint32_tcomputeRows ()
voidmoveChildren (DiagramItem *root, int dx)
voidcomputeExtremes (uint32_t *labelWidth, uint32_t *xpos)
voiddrawBoxes (TextStream &t, Image *image, bool doBase, bool bitmap, uint32_t baseRows, uint32_t superRows, uint32_t cellWidth, uint32_t cellHeight, QCString relPath="", bool generateMap=TRUE)
voiddrawConnectors (TextStream &t, Image *image, bool doBase, bool bitmap, uint32_t baseRows, uint32_t superRows, uint32_t cellWidth, uint32_t cellheight)
DiagramRow *row (int index)
uint32_tnumRows () const
DiagramRow *addRow (uint32_t l)
iteratorbegin ()
iteratorend ()

Private Member Functions Index

boollayoutTree (DiagramItem *root, uint32_t row)

Private Member Attributes Index

Vecm_rows

Description

Class representing the tree layout for the built-in class diagram.

Definition at line 103 of file diagram.cpp.

Public Member Typedefs

iterator

using TreeDiagram::iterator = typename Vec::iterator

Definition at line 108 of file diagram.cpp.

108 using iterator = typename Vec::iterator;

Ptr

using TreeDiagram::Ptr = std::unique_ptr<DiagramRow>

Definition at line 106 of file diagram.cpp.

106 using Ptr = std::unique_ptr<DiagramRow>;

Vec

using TreeDiagram::Vec = std::vector<Ptr>

Definition at line 107 of file diagram.cpp.

107 using Vec = std::vector<Ptr>;

Public Constructors

TreeDiagram()

TreeDiagram::TreeDiagram (const ClassDef * root, bool doBases)

Definition at line 109 of file diagram.cpp.

398TreeDiagram::TreeDiagram(const ClassDef *root,bool doBases)
399{
400 auto row = std::make_unique<DiagramRow>(this,0);
401 DiagramRow *row_ptr = row.get();
402 m_rows.push_back(std::move(row));
403 row_ptr->insertClass(nullptr,root,doBases,Protection::Public,Specifier::Normal,QCString());
404}

References DiagramRow::insertClass, m_rows and row.

Public Member Functions

addRow()

DiagramRow * TreeDiagram::addRow (uint32_t l)
inline

Definition at line 126 of file diagram.cpp.

126 DiagramRow *addRow(uint32_t l)
127 { m_rows.push_back(std::make_unique<DiagramRow>(this,l)); return m_rows.back().get(); }

Reference m_rows.

begin()

iterator TreeDiagram::begin ()
inline

Definition at line 128 of file diagram.cpp.

128 iterator begin() { return m_rows.begin(); }

Reference m_rows.

computeExtremes()

void TreeDiagram::computeExtremes (uint32_t * labelWidth, uint32_t * xpos)

Definition at line 113 of file diagram.cpp.

539void TreeDiagram::computeExtremes(uint32_t *maxLabelLen,uint32_t *maxXPos)
540{
541 uint32_t ml=0,mx=0;
542 for (const auto &dr : m_rows) // for each row
543 {
544 bool done=FALSE;
545 for (const auto &di : *dr) // for each item in a row
546 {
547 if (di->isInList()) done=TRUE;
548 if (maxXPos) mx=std::max(mx,di->xPos());
549 if (maxLabelLen) ml=std::max(ml,Image::stringLength(di->label()));
550 }
551 if (done) break;
552 }
553 if (maxLabelLen) *maxLabelLen=ml;
554 if (maxXPos) *maxXPos=mx;
555}

References FALSE, m_rows, Image::stringLength and TRUE.

computeLayout()

void TreeDiagram::computeLayout ()

Definition at line 110 of file diagram.cpp.

459{
460 auto it = m_rows.begin();
461 while (it!=m_rows.end() && (*it)->numItems()<maxTreeWidth) ++it;
462 if (it!=m_rows.end())
463 {
464 const auto &row = *it;
465 //printf("computeLayout() list row at %d\n",row->number());
466 DiagramItem *opi=nullptr;
467 int delta=0;
468 bool first=TRUE;
469 for (const auto &di : *row)
470 {
471 DiagramItem *pi=di->parentItem();
472 if (pi==opi && !first) { delta-=gridWidth; }
473 first = pi!=opi;
474 opi=pi;
475 di->move(delta,0); // collapse all items in the same
476 // list (except the first)
477 di->putInList();
478 }
479 }
480
481 // re-organize the diagram items
482 DiagramItem *root=m_rows.front()->item(0);
483 while (layoutTree(root,0)) { }
484
485 // move first items of the lists
486 if (it!=m_rows.end())
487 {
488 const auto &row = *it;
489 auto rit = row->begin();
490 while (rit!=row->end())
491 {
492 DiagramItem *pi=(*rit)->parentItem();
493 if (pi->numChildren()>1)
494 {
495 (*rit)->move(gridWidth,0);
496 while (rit!=row->end() && (*rit)->parentItem()==pi)
497 {
498 ++rit;
499 }
500 }
501 else
502 {
503 ++rit;
504 }
505 }
506 }
507}

References gridWidth, layoutTree, m_rows, maxTreeWidth, DiagramItem::move, DiagramItem::numChildren, DiagramItem::parentItem, row and TRUE.

computeRows()

uint32_t TreeDiagram::computeRows ()

Definition at line 111 of file diagram.cpp.

510{
511 //printf("TreeDiagram::computeRows()=%d\n",count());
512 uint32_t count=0;
513 auto it = m_rows.begin();
514 while (it!=m_rows.end() && !(*it)->item(0)->isInList())
515 {
516 ++it;
517 ++count;
518 }
519
520 //printf("count=%d row=%p\n",count,row);
521 if (it!=m_rows.end())
522 {
523 const auto &row = *it;
524 uint32_t maxListLen=0;
525 uint32_t curListLen=0;
526 DiagramItem *opi=nullptr;
527 for (const auto &di : *row) // for each item in a row
528 {
529 if (di->parentItem()!=opi) curListLen=1; else curListLen++;
530 if (curListLen>maxListLen) maxListLen=curListLen;
531 opi=di->parentItem();
532 }
533 //printf("maxListLen=%d\n",maxListLen);
534 count+=maxListLen;
535 }
536 return count;
537}

References m_rows, DiagramItem::parentItem and row.

drawBoxes()

void TreeDiagram::drawBoxes (TextStream & t, Image * image, bool doBase, bool bitmap, uint32_t baseRows, uint32_t superRows, uint32_t cellWidth, uint32_t cellHeight, QCString relPath="", bool generateMap=TRUE)

Definition at line 114 of file diagram.cpp.

593 bool doBase,bool bitmap,
594 uint32_t baseRows,uint32_t superRows,
595 uint32_t cellWidth,uint32_t cellHeight,
596 QCString relPath,
597 bool generateMap)
598{
599 auto it = m_rows.begin();
600 if (it!=m_rows.end() && !doBase) ++it;
601 bool firstRow = doBase;
602 bool done=FALSE;
603 float superRowsF = static_cast<float>(superRows);
604 for (;it!=m_rows.end() && !done;++it) // for each row
605 {
606 const auto &dr = *it;
607 uint32_t x=0,y=0;
608 float xf=0.0f,yf=0.0f;
609 DiagramItem *firstDi = dr->item(0);
610 if (firstDi->isInList()) // put boxes in a list
611 {
612 DiagramItem *opi=nullptr;
614 while (!dit.atEnd())
615 {
616 DiagramItem *di = (*dit).get();
617 if (di->parentItem()==opi)
618 {
619 if (bitmap)
620 {
621 if (doBase) y -= cellHeight+labelVertSpacing;
622 else y += cellHeight+labelVertSpacing;
623 }
624 else
625 {
626 if (doBase) yf += 1.0f;
627 else yf -= 1.0f;
628 }
629 }
630 else
631 {
632 if (bitmap)
633 {
634 x = di->xPos()*(cellWidth+labelHorSpacing)/gridWidth;
635 if (doBase)
636 {
637 y = image->height()-
638 superRows*cellHeight-
639 (superRows-1)*labelVertSpacing-
640 di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
641 }
642 else
643 {
644 y = (baseRows-1)*(cellHeight+labelVertSpacing)+
645 di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
646 }
647 }
648 else
649 {
650 xf = di->xfPos()/gridWidth;
651 if (doBase)
652 {
653 yf = di->yfPos()/gridHeight+superRowsF-1.0f;
654 }
655 else
656 {
657 yf = superRowsF-1.0f-di->yfPos()/gridHeight;
658 }
659 }
660 }
661 opi=di->parentItem();
662
663 if (bitmap)
664 {
665 bool hasDocs=di->getClassDef()->isLinkable();
666 writeBitmapBox(di,image,x,y,cellWidth,cellHeight,firstRow,
667 hasDocs,di->numChildren()>0);
668 if (!firstRow && generateMap)
669 writeMapArea(t,di->getClassDef(),relPath,x,y,cellWidth,cellHeight);
670 }
671 else
672 {
673 writeVectorBox(t,di,xf,yf,di->numChildren()>0);
674 }
675
676 ++dit;
677 }
678 done=TRUE;
679 }
680 else // draw a tree of boxes
681 {
682 for (const auto &di : *dr)
683 {
684 if (bitmap)
685 {
686 x = di->xPos()*(cellWidth+labelHorSpacing)/gridWidth;
687 if (doBase)
688 {
689 y = image->height()-
690 superRows*cellHeight-
691 (superRows-1)*labelVertSpacing-
692 di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
693 }
694 else
695 {
696 y = (baseRows-1)*(cellHeight+labelVertSpacing)+
697 di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
698 }
699 bool hasDocs=di->getClassDef()->isLinkable();
700 writeBitmapBox(di.get(),image,x,y,cellWidth,cellHeight,firstRow,hasDocs);
701 if (!firstRow && generateMap)
702 writeMapArea(t,di->getClassDef(),relPath,x,y,cellWidth,cellHeight);
703 }
704 else
705 {
706 xf=di->xfPos()/gridWidth;
707 if (doBase)
708 {
709 yf = di->yfPos()/gridHeight+superRowsF-1.0f;
710 }
711 else
712 {
713 yf = superRowsF-1.0f-di->yfPos()/gridHeight;
714 }
715 writeVectorBox(t,di.get(),xf,yf);
716 }
717 }
718 }
719 firstRow=FALSE;
720 }
721}

References DualDirIterator< C, I >::atEnd, FALSE, DiagramItem::getClassDef, gridHeight, gridWidth, Image::height, DiagramItem::isInList, Definition::isLinkable, labelHorSpacing, labelVertSpacing, m_rows, DiagramItem::numChildren, DiagramItem::parentItem, TRUE, writeBitmapBox, writeMapArea, writeVectorBox, DiagramItem::xfPos, DiagramItem::xPos, DiagramItem::yfPos and DiagramItem::yPos.

drawConnectors()

void TreeDiagram::drawConnectors (TextStream & t, Image * image, bool doBase, bool bitmap, uint32_t baseRows, uint32_t superRows, uint32_t cellWidth, uint32_t cellheight)

Definition at line 120 of file diagram.cpp.

724 bool doBase,bool bitmap,
725 uint32_t baseRows,uint32_t superRows,
726 uint32_t cellWidth,uint32_t cellHeight)
727{
728 bool done=FALSE;
729 auto it = m_rows.begin();
730 float superRowsF = static_cast<float>(superRows);
731 for (;it!=m_rows.end() && !done;++it) // for each row
732 {
733 const auto &dr = *it;
734 DiagramItem *rootDi = dr->item(0);
735 if (rootDi->isInList()) // row consists of list connectors
736 {
737 uint32_t x=0,y=0,ys=0;
738 float xf=0.0f,yf=0.0f,ysf=0.0f;
739 auto rit = dr->begin();
740 while (rit!=dr->end())
741 {
742 DiagramItem *di=(*rit).get();
743 DiagramItem *pi=di->parentItem();
745 DiagramItem *last=dil.back();
746 if (di==last) // single child
747 {
748 if (bitmap) // draw pixels
749 {
750 x = di->xPos()*(cellWidth+labelHorSpacing)/gridWidth + cellWidth/2;
751 if (doBase) // base classes
752 {
753 y = image->height()-
754 (superRows-1)*(cellHeight+labelVertSpacing)-
755 di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
756 image->drawVertArrow(x,y,y+labelVertSpacing/2,
758 protToMask(di->protection()));
759 }
760 else // super classes
761 {
762 y = (baseRows-1)*(cellHeight+labelVertSpacing)-
764 di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
765 image->drawVertLine(x,y,y+labelVertSpacing/2,
767 protToMask(di->protection()));
768 }
769 }
770 else // draw vectors
771 {
772 t << protToString(di->protection()) << "\n";
773 if (doBase)
774 {
775 t << "1 " << (di->xfPos()/gridWidth) << " "
776 << (di->yfPos()/gridHeight+superRowsF-1.0f) << " in\n";
777 }
778 else
779 {
780 t << "0 " << (di->xfPos()/gridWidth) << " "
781 << (superRowsF-0.25f-di->yfPos()/gridHeight)
782 << " in\n";
783 }
784 }
785 }
786 else // multiple children, put them in a vertical list
787 {
788 if (bitmap)
789 {
790 x = di->parentItem()->xPos()*
791 (cellWidth+labelHorSpacing)/gridWidth+cellWidth/2;
792 if (doBase) // base classes
793 {
794 ys = image->height()-
795 (superRows-1)*(cellHeight+labelVertSpacing)-
796 di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
797 y = ys - cellHeight/2;
798 }
799 else // super classes
800 {
801 ys = (baseRows-1)*(cellHeight+labelVertSpacing)+
802 di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
803 y = ys + cellHeight/2;
804 }
805 }
806 else
807 {
808 xf = di->parentItem()->xfPos()/gridWidth;
809 if (doBase)
810 {
811 ysf = di->yfPos()/gridHeight+superRowsF-1.0f;
812 yf = ysf + 0.5f;
813 }
814 else
815 {
816 ysf = superRowsF-0.25f-di->yfPos()/gridHeight;
817 yf = ysf - 0.25f;
818 }
819 }
820 while (di!=last) // more children to add
821 {
822 if (bitmap)
823 {
824 if (doBase) // base classes
825 {
826 image->drawHorzArrow(y,x,x+cellWidth/2+labelHorSpacing,
828 protToMask(di->protection()));
829 y -= cellHeight+labelVertSpacing;
830 }
831 else // super classes
832 {
833 image->drawHorzLine(y,x,x+cellWidth/2+labelHorSpacing,
835 protToMask(di->protection()));
836 y += cellHeight+labelVertSpacing;
837 }
838 }
839 else
840 {
841 t << protToString(di->protection()) << "\n";
842 if (doBase)
843 {
844 t << "1 " << xf << " " << yf << " hedge\n";
845 yf += 1.0f;
846 }
847 else
848 {
849 t << "0 " << xf << " " << yf << " hedge\n";
850 yf -= 1.0f;
851 }
852 }
853 ++rit;
854 if (rit!=dr->end()) di = (*rit).get(); else di=nullptr;
855 }
856 // add last horizontal line and a vertical connection line
857 if (bitmap)
858 {
859 if (doBase) // base classes
860 {
861 image->drawHorzArrow(y,x,x+cellWidth/2+labelHorSpacing,
863 protToMask(di->protection()));
864 image->drawVertLine(x,y,ys+labelVertSpacing/2,
867 }
868 else // super classes
869 {
870 image->drawHorzLine(y,x,x+cellWidth/2+labelHorSpacing,
872 protToMask(di->protection()));
873 image->drawVertLine(x,ys-labelVertSpacing/2,y,
876 }
877 }
878 else
879 {
880 t << protToString(di->protection()) << "\n";
881 if (doBase)
882 {
883 t << "1 " << xf << " " << yf << " hedge\n";
884 }
885 else
886 {
887 t << "0 " << xf << " " << yf << " hedge\n";
888 }
889 t << protToString(getMinProtectionLevel(dil)) << "\n";
890 if (doBase)
891 {
892 t << xf << " " << ysf << " " << yf << " vedge\n";
893 }
894 else
895 {
896 t << xf << " " << (ysf + 0.25f) << " " << yf << " vedge\n";
897 }
898 }
899 }
900 if (rit!=dr->end()) ++rit;
901 }
902 done=TRUE; // the tree is drawn now
903 }
904 else // normal tree connector
905 {
906 for (const auto &di : *dr)
907 {
908 uint32_t x=0,y=0;
909 DiagramItemList dil = di->getChildren();
910 DiagramItem *parent = di->parentItem();
911 if (parent) // item has a parent -> connect to it
912 {
913 if (bitmap) // draw pixels
914 {
915 x = di->xPos()*(cellWidth+labelHorSpacing)/gridWidth + cellWidth/2;
916 if (doBase) // base classes
917 {
918 y = image->height()-
919 (superRows-1)*(cellHeight+labelVertSpacing)-
920 di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
921 /* write input line */
922 image->drawVertArrow(x,y,y+labelVertSpacing/2,
923 protToColor(di->protection()),
924 protToMask(di->protection()));
925 }
926 else // super classes
927 {
928 y = (baseRows-1)*(cellHeight+labelVertSpacing)-
930 di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
931 /* write output line */
932 image->drawVertLine(x,y,y+labelVertSpacing/2,
933 protToColor(di->protection()),
934 protToMask(di->protection()));
935 }
936 }
937 else // draw pixels
938 {
939 t << protToString(di->protection()) << "\n";
940 if (doBase)
941 {
942 t << "1 " << di->xfPos()/gridWidth << " "
943 << (di->yfPos()/gridHeight+superRowsF-1.0f) << " in\n";
944 }
945 else
946 {
947 t << "0 " << di->xfPos()/gridWidth << " "
948 << (superRowsF-0.25f-di->yfPos()/gridHeight)
949 << " in\n";
950 }
951 }
952 }
953 if (!dil.empty())
954 {
956 uint32_t mask=protToMask(p);
957 uint8_t col=protToColor(p);
958 if (bitmap)
959 {
960 x = di->xPos()*(cellWidth+labelHorSpacing)/gridWidth + cellWidth/2;
961 if (doBase) // base classes
962 {
963 y = image->height()-
964 (superRows-1)*(cellHeight+labelVertSpacing)-
965 cellHeight-labelVertSpacing/2-
966 di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
967 image->drawVertLine(x,y,y+labelVertSpacing/2-1,col,mask);
968 }
969 else // super classes
970 {
971 y = (baseRows-1)*(cellHeight+labelVertSpacing)+
972 cellHeight+
973 di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
974 image->drawVertArrow(x,y,y+labelVertSpacing/2-1,col,mask);
975 }
976 }
977 else
978 {
979 t << protToString(p) << "\n";
980 if (doBase)
981 {
982 t << "0 " << di->xfPos()/gridWidth << " "
983 << (di->yfPos()/gridHeight+superRowsF-1.0f) << " out\n";
984 }
985 else
986 {
987 t << "1 " << di->xfPos()/gridWidth << " "
988 << (superRowsF-1.75f-di->yfPos()/gridHeight)
989 << " out\n";
990 }
991 }
992 /* write input line */
993 DiagramItem *first = dil.front();
994 DiagramItem *last = dil.back();
995 if (first!=last && !first->isInList()) /* connect with all base classes */
996 {
997 if (bitmap)
998 {
999 uint32_t xs = first->xPos()*(cellWidth+labelHorSpacing)/gridWidth
1000 + cellWidth/2;
1001 uint32_t xe = last->xPos()*(cellWidth+labelHorSpacing)/gridWidth
1002 + cellWidth/2;
1003 if (doBase) // base classes
1004 {
1005 image->drawHorzLine(y,xs,xe,col,mask);
1006 }
1007 else // super classes
1008 {
1009 image->drawHorzLine(y+labelVertSpacing/2,xs,xe,col,mask);
1010 }
1011 }
1012 else
1013 {
1014 t << protToString(p) << "\n";
1015 if (doBase)
1016 {
1017 t << first->xfPos()/gridWidth << " "
1018 << last->xfPos()/gridWidth << " "
1019 << (first->yfPos()/gridHeight+superRowsF-1.0f)
1020 << " conn\n";
1021 }
1022 else
1023 {
1024 t << first->xfPos()/gridWidth << " "
1025 << last->xfPos()/gridWidth << " "
1026 << (superRowsF-first->yfPos()/gridHeight)
1027 << " conn\n";
1028 }
1029 }
1030 }
1031 }
1032 }
1033 }
1034 }
1035}

References Image::drawHorzArrow, Image::drawHorzLine, Image::drawVertArrow, Image::drawVertLine, FALSE, DiagramItem::getChildren, getMinProtectionLevel, gridHeight, gridWidth, Image::height, DiagramItem::isInList, labelHorSpacing, labelVertSpacing, m_rows, parent, DiagramItem::parentItem, DiagramItem::protection, protToColor, protToMask, protToString, TRUE, DiagramItem::xfPos, DiagramItem::xPos, DiagramItem::yfPos and DiagramItem::yPos.

end()

iterator TreeDiagram::end ()
inline

Definition at line 129 of file diagram.cpp.

129 iterator end() { return m_rows.end(); }

Reference m_rows.

moveChildren()

void TreeDiagram::moveChildren (DiagramItem * root, int dx)

Definition at line 112 of file diagram.cpp.

407{
408 for (const auto &di : root->getChildren())
409 {
410 di->move(dx,0);
411 moveChildren(di,dx);
412 }
413}

References DiagramItem::getChildren and moveChildren.

Referenced by moveChildren.

numRows()

uint32_t TreeDiagram::numRows ()
inline

Definition at line 125 of file diagram.cpp.

125 uint32_t numRows() const { return static_cast<uint32_t>(m_rows.size()); }

Reference m_rows.

row()

DiagramRow * TreeDiagram::row (int index)
inline

Definition at line 124 of file diagram.cpp.

124 DiagramRow *row(int index) { return m_rows.at(index).get(); }

Reference m_rows.

Referenced by computeLayout, computeRows, layoutTree and TreeDiagram.

Private Member Functions

layoutTree()

bool TreeDiagram::layoutTree (DiagramItem * root, uint32_t row)

Definition at line 131 of file diagram.cpp.

416{
417 bool moved=FALSE;
418 //printf("layoutTree(%s,%d)\n",qPrint(root->label()),r);
419
420 if (root->numChildren()>0)
421 {
422 auto children = root->getChildren();
423 uint32_t pPos=root->xPos();
424 uint32_t cPos=root->avgChildPos();
425 if (pPos>cPos) // move children
426 {
427 const auto &row=m_rows.at(r+1);
428 //printf("Moving children %d-%d in row %d\n",
429 // dil->getFirst()->number(),row->count()-1,r+1);
430 for (uint32_t k=children.front()->number();k<row->numItems();k++)
431 {
432 row->item(k)->move(static_cast<int>(pPos-cPos),0);
433 }
434 moved=TRUE;
435 }
436 else if (pPos<cPos) // move parent
437 {
438 const auto &row=m_rows.at(r);
439 //printf("Moving parents %d-%d in row %d\n",
440 // root->number(),row->count()-1,r);
441 for (uint32_t k=root->number();k<row->numItems();k++)
442 {
443 row->item(k)->move(static_cast<int>(cPos-pPos),0);
444 }
445 moved=TRUE;
446 }
447
448 // recurse to children
449 auto it = children.begin();
450 for (;it!=children.end() && !moved && !(*it)->isInList();++it)
451 {
452 moved = layoutTree(*it,r+1);
453 }
454 }
455 return moved;
456}

References DiagramItem::avgChildPos, FALSE, DiagramItem::getChildren, layoutTree, m_rows, DiagramItem::number, DiagramItem::numChildren, row, TRUE and DiagramItem::xPos.

Referenced by computeLayout and layoutTree.

Private Member Attributes

m_rows

Vec TreeDiagram::m_rows

The documentation for this class was generated from the following file:


Generated via doxygen2docusaurus by Doxygen 1.14.0.