void flowwidget::LoadXML(std::istream &data) { QXmlSimpleReader qxsr; qxsr.setContentHandler(XMLHandlr); qxsr.setErrorHandler(XMLHandlr); QIODevice* iodev = new IOStreamBridge(data); if (qxsr.parse(QXmlInputSource(iodev))) { std::cerr << "[FlowWidget] Recentering nodes and adjusting scale." << std::endl; double GenMinimumX = std::numeric_limits<double>::max(); double GenExtremeX = std::numeric_limits<double>::min(); double GenMinimumY = std::numeric_limits<double>::max(); double GenExtremeY = std::numeric_limits<double>::min(); std::for_each(XMLHandlr->OrphanNodes.begin(), XMLHandlr->OrphanNodes.end(), [&](std::pair<std::string, FlowNode> nodepair) { NodeSize ns = getNodeSize(QFont("sans-serif", BaseFontSize*nodepair.second.FontSizeMult), QFont("sans-serif", BaseFontSize*nodepair.second.FontSizeMult*1.5), nodepair.second); if (nodepair.second.CenterPosX - double(ns.Width/2) < GenMinimumX) GenMinimumX = nodepair.second.CenterPosX - double(ns.Width/2); if (nodepair.second.CenterPosX + double(ns.Width/2) > GenExtremeX) GenExtremeX = nodepair.second.CenterPosX + double(ns.Width/2); if (nodepair.second.CenterPosY - double(ns.Height/2) < GenMinimumY) GenMinimumY = nodepair.second.CenterPosY - double(ns.Height/2); if (nodepair.second.CenterPosY + double(ns.Height/2) > GenExtremeY) GenExtremeY = nodepair.second.CenterPosY + double(ns.Height/2); }); QLineF XLine(QPointF(GenMinimumX, 0), QPointF(GenExtremeX, 0)); QLineF YLine(QPointF(GenMinimumY, 0), QPointF(GenExtremeY, 0)); if (XLine.length() > YLine.length()) { PermaScale = 1.0/XLine.length(); } else { PermaScale = 1.0/YLine.length(); } double NewCenterX = (GenMinimumX + GenExtremeX) / 2.0; double NewCenterY = (GenMinimumY + GenExtremeY) / 2.0; std::cerr << "[FlowWidget] Nodes are off by X " << -NewCenterX << ", Y " << -NewCenterY << ", deducted from XMin " << GenMinimumX << ", XMax " << GenExtremeX << ", YMin " << GenMinimumY << ", YMax" << GenExtremeY << std::endl; for (auto itr = XMLHandlr->OrphanNodes.begin(); itr != XMLHandlr->OrphanNodes.end(); itr++) { itr->second.CenterPosX -= NewCenterX; itr->second.CenterPosY -= NewCenterY; } std::cerr << "[FlowWidget] Recentered nodes. Ready!" << std::endl; } else { std::cerr << "[FlowWidget] Error loading XML." << std::endl; } }
XLine operator*( const XTransform &tx, const XLine &line ) { return XLine( tx * line.position(), tx.linear() * line.direction(), XLine::PointAndDirection ); }