insilmaril@40: #include insilmaril@40: #include insilmaril@40: insilmaril@40: #include "geometry.h" // for addBBox insilmaril@40: #include "vymmodel.h" insilmaril@40: insilmaril@40: insilmaril@40: extern Settings settings; insilmaril@40: insilmaril@40: VymModel::VymModel() insilmaril@40: { insilmaril@40: // cout << "Const VymModel\n"; insilmaril@40: } insilmaril@40: insilmaril@40: insilmaril@40: VymModel::~VymModel() insilmaril@40: { insilmaril@59: //cout << "Destr VymModel\n"; insilmaril@59: clear(); insilmaril@40: } insilmaril@40: insilmaril@40: void VymModel::clear() insilmaril@40: { insilmaril@40: while (!mapCenters.isEmpty()) insilmaril@40: delete mapCenters.takeFirst(); insilmaril@40: } insilmaril@40: insilmaril@40: void VymModel::init () insilmaril@40: { insilmaril@40: addMapCenter(); insilmaril@40: insilmaril@40: // animations insilmaril@40: animationUse=settings.readBoolEntry("/animation/use",false); insilmaril@40: animationTicks=settings.readNumEntry("/animation/ticks",10); insilmaril@40: animationInterval=settings.readNumEntry("/animation/interval",50); insilmaril@40: animObjList.clear(); insilmaril@40: animationTimer=new QTimer (this); insilmaril@40: connect(animationTimer, SIGNAL(timeout()), this, SLOT(animate())); insilmaril@40: insilmaril@40: } insilmaril@40: insilmaril@40: void VymModel::setMapEditor(MapEditor *me) insilmaril@40: { insilmaril@40: mapEditor=me; insilmaril@40: for (int i=0; isetMapEditor(mapEditor); insilmaril@40: } insilmaril@40: insilmaril@40: MapEditor* VymModel::getMapEditor() insilmaril@40: { insilmaril@40: return mapEditor; insilmaril@40: } insilmaril@40: insilmaril@40: void VymModel::setVersion (const QString &s) insilmaril@40: { insilmaril@40: version=s; insilmaril@40: } insilmaril@40: insilmaril@40: void VymModel::setAuthor (const QString &s) insilmaril@40: { insilmaril@40: author=s; insilmaril@40: } insilmaril@40: insilmaril@40: QString VymModel::getAuthor() insilmaril@40: { insilmaril@40: return author; insilmaril@40: } insilmaril@40: insilmaril@40: void VymModel::setComment (const QString &s) insilmaril@40: { insilmaril@40: comment=s; insilmaril@40: } insilmaril@40: insilmaril@40: QString VymModel::getComment () insilmaril@40: { insilmaril@40: return comment; insilmaril@40: } insilmaril@40: insilmaril@40: QString VymModel::getDate () insilmaril@40: { insilmaril@40: return QDate::currentDate().toString ("yyyy-MM-dd"); insilmaril@40: } insilmaril@40: insilmaril@40: void VymModel::setScene (QGraphicsScene *s) insilmaril@40: { insilmaril@40: mapScene=s; insilmaril@40: init(); // Here we have a mapScene set, insilmaril@40: // which is (still) needed to create MapCenters insilmaril@40: } insilmaril@40: insilmaril@40: QGraphicsScene* VymModel::getScene () insilmaril@40: { insilmaril@40: return mapScene; insilmaril@40: } insilmaril@40: insilmaril@40: MapCenterObj* VymModel::addMapCenter() insilmaril@40: { insilmaril@40: return addMapCenter (QPointF(0,0)); insilmaril@40: } insilmaril@40: insilmaril@40: MapCenterObj* VymModel::addMapCenter(QPointF absPos) insilmaril@40: { insilmaril@40: MapCenterObj *mapCenter = new MapCenterObj(mapScene); insilmaril@40: mapCenter->move (absPos); insilmaril@40: mapCenter->setVisibility (true); insilmaril@40: mapCenter->setHeading (QApplication::translate("Heading of mapcenter in new map", "New map")); insilmaril@40: mapCenter->setMapEditor(mapEditor); //FIXME needed to get defLinkStyle, mapLinkColorHint ... for later added objects insilmaril@40: mapCenters.append(mapCenter); insilmaril@40: return mapCenter; insilmaril@40: } insilmaril@40: insilmaril@40: MapCenterObj *VymModel::removeMapCenter(MapCenterObj* mco) insilmaril@40: { insilmaril@40: int i=mapCenters.indexOf (mco); insilmaril@40: if (i>=0) insilmaril@40: { insilmaril@40: mapCenters.removeAt (i); insilmaril@40: delete (mco); insilmaril@40: if (i>0) return mapCenters.at(i-1); // Return previous MCO insilmaril@40: } insilmaril@40: return NULL; insilmaril@40: } insilmaril@40: insilmaril@57: MapCenterObj *VymModel::getMapCenterNum (int i) insilmaril@57: { insilmaril@57: if (i>mapCenters.count()-1 || i<0) insilmaril@57: return NULL; insilmaril@57: else insilmaril@57: return mapCenters.at(i); insilmaril@57: } insilmaril@57: insilmaril@57: int VymModel::countMapCenters() insilmaril@57: { insilmaril@57: return mapCenters.count(); insilmaril@57: } insilmaril@57: insilmaril@62: int VymModel::countBranches() insilmaril@62: { insilmaril@62: uint b=0; insilmaril@62: BranchObj *bo=first(); insilmaril@62: while (bo) insilmaril@62: { insilmaril@62: b++; insilmaril@62: bo=next(bo); insilmaril@62: } insilmaril@62: return b; insilmaril@62: } insilmaril@62: insilmaril@40: BranchObj* VymModel::first() insilmaril@40: { insilmaril@40: if (mapCenters.count()>0) insilmaril@40: return mapCenters.first(); insilmaril@40: else insilmaril@40: return NULL; insilmaril@40: } insilmaril@40: insilmaril@40: BranchObj* VymModel::next(BranchObj *bo_start) insilmaril@40: { insilmaril@40: BranchObj *rbo; insilmaril@40: BranchObj *bo=bo_start; insilmaril@40: if (bo) insilmaril@40: { insilmaril@40: // Try to find next branch in current MapCenter insilmaril@40: rbo=bo->next(); insilmaril@40: if (rbo) return rbo; insilmaril@40: insilmaril@40: // Try to find MapCenter of bo insilmaril@40: while (bo->getDepth()>0) bo=(BranchObj*)bo->getParObj(); insilmaril@40: insilmaril@40: // Try to find next MapCenter insilmaril@40: int i=mapCenters.indexOf ((MapCenterObj*)bo); insilmaril@40: if (i+2 > mapCenters.count() || i<0) return NULL; insilmaril@40: if (mapCenters.at(i+1)!=bo_start) insilmaril@40: return mapCenters.at(i+1); insilmaril@40: } insilmaril@40: return NULL; insilmaril@40: } insilmaril@40: insilmaril@40: LinkableMapObj* VymModel::findMapObj(QPointF p, LinkableMapObj *excludeLMO) insilmaril@40: { insilmaril@40: LinkableMapObj *lmo; insilmaril@40: insilmaril@40: for (int i=0;ifindMapObj (p,excludeLMO); insilmaril@40: if (lmo) return lmo; insilmaril@40: } insilmaril@40: return NULL; insilmaril@40: } insilmaril@40: insilmaril@40: LinkableMapObj* VymModel::findObjBySelect(const QString &s) insilmaril@40: { insilmaril@40: LinkableMapObj *lmo; insilmaril@40: if (!s.isEmpty() ) insilmaril@40: { insilmaril@40: QString part; insilmaril@40: QString typ; insilmaril@40: QString num; insilmaril@40: part=s.section(",",0,0); insilmaril@40: typ=part.left (2); insilmaril@40: num=part.right(part.length() - 3); insilmaril@40: if (typ=="mc" && num.toInt()>=0 && num.toInt() findObjBySelect(s); insilmaril@40: if (lmo) return lmo; insilmaril@40: } insilmaril@40: return NULL; insilmaril@40: } insilmaril@40: insilmaril@40: LinkableMapObj* VymModel::findID (const QString &s) insilmaril@40: { insilmaril@40: LinkableMapObj *lmo; insilmaril@40: for (int i=0; ifindID (s); insilmaril@40: if (lmo) return lmo; insilmaril@40: } insilmaril@40: return NULL; insilmaril@40: } insilmaril@40: insilmaril@40: QString VymModel::saveToDir (const QString &tmpdir,const QString &prefix, int verbose, const QPointF &offset) insilmaril@40: { insilmaril@40: QString s; insilmaril@40: insilmaril@40: for (int i=0; isaveToDir (tmpdir,prefix,verbose,offset); insilmaril@40: return s; insilmaril@40: } insilmaril@40: insilmaril@40: insilmaril@40: ////////////////////////////////////////////// insilmaril@40: // View related insilmaril@40: ////////////////////////////////////////////// insilmaril@40: insilmaril@40: void VymModel::updateRelPositions() insilmaril@40: { insilmaril@40: for (int i=0; iupdateRelPositions(); insilmaril@40: } insilmaril@40: insilmaril@40: void VymModel::reposition() insilmaril@40: { insilmaril@40: for (int i=0;ireposition(); // for positioning heading insilmaril@40: } insilmaril@40: insilmaril@40: QPolygonF VymModel::shape(BranchObj *bo) insilmaril@40: { insilmaril@40: // Creating (arbitrary) shapes insilmaril@40: insilmaril@40: QPolygonF p; insilmaril@40: QRectF rb=bo->getBBox(); insilmaril@40: if (bo->getDepth()==0) insilmaril@40: { insilmaril@40: // Just take BBox of this mapCenter insilmaril@40: p<getTotalBBox(); insilmaril@40: if (bo->getOrientation()==LinkableMapObj::LeftOfCenter) insilmaril@40: p <" insilmaril@40: <<"="<getHeading() )<<")" insilmaril@40: <<" with ("<< qPrintable (boB->getHeading() ) insilmaril@40: <<") willIntersect" insilmaril@40: <getNum()); insilmaril@40: else insilmaril@40: // Branch, call myself recursively insilmaril@40: s= getSelectString(par) + ",bo:" + QString("%1").arg(((BranchObj*)lmo)->getNum()); insilmaril@40: } else insilmaril@40: { insilmaril@40: // MapCenter insilmaril@40: int i=mapCenters.indexOf ((MapCenterObj*)lmo); insilmaril@40: if (i>=0) s=QString("mc:%1").arg(i); insilmaril@40: } insilmaril@40: } insilmaril@40: return s; insilmaril@40: insilmaril@40: } insilmaril@40: insilmaril@40: insilmaril@40: void VymModel::setHideTmp (HideTmpMode mode) insilmaril@40: { insilmaril@40: for (int i=0;isetHideTmp (mode); insilmaril@40: } insilmaril@40: insilmaril@40: QRectF VymModel::getTotalBBox() insilmaril@40: { insilmaril@40: QRectF r; insilmaril@40: for (int i=0;igetTotalBBox(), r); insilmaril@40: return r; insilmaril@40: } insilmaril@40: