Chris@44: Chris@44: #include "grapher.h" Chris@44: Chris@44: #include Chris@44: #include Chris@44: Chris@44: #include Chris@44: Chris@44: typedef QSet ColumnSet; Chris@44: typedef QMap GridAlloc; Chris@44: typedef QMap IdChangesetMap; Chris@44: typedef QSet ChangesetSet; Chris@44: Chris@44: ChangesetItem * Chris@44: layout(Changeset *cs, Chris@44: IdChangesetMap idCsetMap, Chris@44: ChangesetItemMap items, Chris@44: GridAlloc &alloc, Chris@44: ChangesetSet &handled) Chris@44: { Chris@44: if (!cs) { Chris@44: throw std::string("Null Changeset"); Chris@44: } Chris@44: if (!items.contains(cs)) { Chris@44: throw std::string("Changeset not in item map"); Chris@44: } Chris@44: ChangesetItem *item = items[cs]; Chris@44: if (handled.contains(cs)) { Chris@44: return item; Chris@44: } Chris@44: int row = 0; Chris@44: int col = 0; Chris@44: if (!cs->parents().empty()) { Chris@44: bool haveRow = false; Chris@44: foreach (QString parentId, cs->parents()) { Chris@44: if (parentId == "") continue; //!!! Chris@44: std::cerr << "recursing to parent \"" << parentId.toStdString() << "\" of \"" << cs->id().toStdString() << "\"" << std::endl; Chris@44: ChangesetItem *parentItem = Chris@44: layout(idCsetMap[parentId], Chris@44: idCsetMap, Chris@44: items, Chris@44: alloc, Chris@44: handled); Chris@44: if (!haveRow || parentItem->row() < row) { Chris@44: row = parentItem->row(); Chris@44: haveRow = true; Chris@44: } Chris@44: col += parentItem->column(); Chris@44: } Chris@44: col /= cs->parents().size(); Chris@44: row = row - 1; Chris@44: while (alloc[row].contains(col)) { Chris@44: if (col > 0) col = -col; Chris@44: else col = -col + 1; Chris@44: } Chris@44: alloc[row].insert(col); Chris@44: } Chris@44: item->setColumn(col); Chris@44: item->setRow(row); Chris@44: item->setX(col * 100); Chris@44: item->setY(row * 100); Chris@44: handled.insert(cs); Chris@44: return item; Chris@44: } Chris@44: Chris@44: void Chris@44: Grapher::layout(Changesets csets, ChangesetItemMap items) Chris@44: { Chris@44: IdChangesetMap idCsetMap; Chris@44: foreach (Changeset *cs, csets) { Chris@44: std::cerr << cs->id().toStdString() << std::endl; Chris@44: if (cs->id() == "") { Chris@44: throw std::string("Changeset has no ID"); Chris@44: } Chris@44: if (idCsetMap.contains(cs->id())) { Chris@44: throw std::string("Changeset ID is already in map"); Chris@44: } Chris@44: idCsetMap[cs->id()] = cs; Chris@44: } Chris@44: Chris@44: GridAlloc alloc; Chris@44: ChangesetSet handled; Chris@44: foreach (Changeset *cs, csets) { Chris@44: ::layout(cs, idCsetMap, items, alloc, handled); Chris@44: } Chris@44: } Chris@44: