void PortionDrawer::updateNodePositions(DiagramDrawer &drawer) { if(mGraph) { if(mGraph->getNodes().size() != mNodePositions.size()) { mNodePositions.resize(mGraph->getNodes().size()); } std::vector<size_t> depths = getCallDepths(); std::vector<int> columnPositions = getColumnPositions(drawer, depths); int yOffset = 0; const int margin = 20; int pad = static_cast<int>(drawer.getTextExtentHeight("W")); for(size_t i=0; i<mNodePositions.size(); i++) { GraphRect rect = getNodeRect(drawer, i); rect.start.y = yOffset; yOffset += pad + rect.size.y; rect.start.y += margin; rect.start.x = margin + columnPositions[depths[i]]; mNodePositions[i] = rect.start; } } #define PORTION_GENES 1 #if(PORTION_GENES) if(mNodePositions.size() > 0) { DiagramDependencyGenes genes; GraphRect rect = getNodeRect(drawer, 0); genes.initialize(*this, static_cast<size_t>(rect.size.y)); genes.updatePositionsInDrawer(); } #endif }
GraphSize OperationDrawer::drawOrSizeDiagram(DiagramDrawer &drawer, OperationGraph &graph, const OperationDrawOptions &options, bool draw) { mCharHeight = static_cast<int>(drawer.getTextExtentHeight("W")); int pad = mCharHeight / 3; if(pad < 1) pad = 1; mPad = pad; GraphPoint startpos(mCharHeight, mCharHeight); GraphPoint pos = startpos; GraphSize size; GraphSize diagramSize; int maxy = 0; std::vector<int> classEndY; for(size_t i=0; i<graph.mOpClasses.size(); i++) { OperationClass &opClass = graph.mOpClasses[i]; opClass.setPosition(pos); size = drawClass(drawer, opClass, options, draw); size_t condDepth = graph.getNestDepth(i); size.x += static_cast<int>(condDepth) * mPad; opClass.setSize(size); pos.x += size.x + mCharHeight; classEndY.push_back(startpos.y + size.y); if(size.y > maxy) maxy = size.y; } diagramSize.x = pos.x; pos = startpos; pos.y = startpos.y + maxy; // space between class rect and operations std::set<const OperationDefinition*> drawnOperations; for(const auto &oper : graph.mOperations) { if(drawnOperations.find(oper) == drawnOperations.end()) { size = drawOperation(drawer, pos, *oper, graph, options, drawnOperations, draw); pos.y += size.y; } } if(draw) { drawLifeLines(drawer, graph.mOpClasses, classEndY, pos.y); } diagramSize.y = pos.y + mCharHeight; return diagramSize; }
void PortionDrawer::getNodeText(DiagramDrawer &drawer, std::vector<DrawString> &drawStrings, std::vector<bool> &virtOpers) { float textHeight = drawer.getTextExtentHeight("W"); int pad = static_cast<int>(textHeight / 7.f * 2); int yTextOffset = static_cast<int>(textHeight) + pad; for(size_t i=0; i<mGraph->getNodes().size(); i++) { GraphRect rect = getNodeRect(drawer, i); rect.start.x += pad; rect.start.y += yTextOffset; PortionNode const &node = mGraph->getNodes()[i]; drawStrings.push_back(DrawString(rect.start, node.getDisplayName().getStr())); virtOpers.push_back(node.isVirtualOperation()); } }