1.1 --- a/branchitem.cpp	Mon Apr 20 10:42:05 2009 +0000
     1.2 +++ b/branchitem.cpp	Thu Apr 23 12:15:31 2009 +0000
     1.3 @@ -307,3 +307,17 @@
     1.4  	return (BranchObj*)lmo;
     1.5  }
     1.6  
     1.7 +BranchObj* BranchItem::createMapObj(QGraphicsScene *scene)	
     1.8 +{
     1.9 +	// Initialize BranchObj, order of things is important...
    1.10 +	cout << "BI::createMO scene="<<scene<<endl;
    1.11 +    BranchObj* newbo=new BranchObj(scene);
    1.12 +    newbo->setParObj(parent()->getLMO() );
    1.13 +	newbo->setTreeItem (this);
    1.14 +	newbo->setDefAttr(BranchObj::NewBranch);
    1.15 +	//newbo->updateLink();
    1.16 +
    1.17 +	lmo=newbo;
    1.18 +	return newbo;
    1.19 +}
    1.20 +
     2.1 --- a/branchitem.h	Mon Apr 20 10:42:05 2009 +0000
     2.2 +++ b/branchitem.h	Thu Apr 23 12:15:31 2009 +0000
     2.3 @@ -3,8 +3,10 @@
     2.4  
     2.5  #include "treeitem.h"
     2.6  
     2.7 +
     2.8  class QString;
     2.9  class BranchObj;
    2.10 +class QGraphicsScene;
    2.11  
    2.12  class BranchItem:public TreeItem
    2.13  {
    2.14 @@ -38,6 +40,7 @@
    2.15  	virtual TreeItem* findID (QString sid);		//! search map for object with ID string
    2.16  
    2.17  	BranchObj* getBranchObj();	
    2.18 +	BranchObj* createMapObj(QGraphicsScene *scene);		//! Create classic object in GraphicsView
    2.19  };
    2.20  
    2.21  #endif
     3.1 --- a/branchobj.cpp	Mon Apr 20 10:42:05 2009 +0000
     3.2 +++ b/branchobj.cpp	Thu Apr 23 12:15:31 2009 +0000
     3.3 @@ -22,23 +22,22 @@
     3.4  //    cout << "Const BranchObj ()\n";
     3.5      setParObj (this);	
     3.6      init();
     3.7 -    depth=-1;
     3.8  }
     3.9  
    3.10 -BranchObj::BranchObj (QGraphicsScene* s):OrnamentedObj (s)
    3.11 +BranchObj::BranchObj (QGraphicsScene* s):OrnamentedObj (s)// FIXME-3 needed at all?
    3.12  {
    3.13 -//    cout << "Const BranchObj (s)  called from MapCenterObj (s)\n";
    3.14 +//    cout << "Const BranchObj (s)  \n";
    3.15  	parObj=NULL;
    3.16      scene=s;
    3.17 +	init();
    3.18  }
    3.19  
    3.20 -BranchObj::BranchObj (QGraphicsScene* s, LinkableMapObj* p):OrnamentedObj (s)
    3.21 +BranchObj::BranchObj (QGraphicsScene* s, LinkableMapObj* p):OrnamentedObj (s)// FIXME-3 needed at all?
    3.22  {
    3.23  //    cout << "Const BranchObj (s,p)\n";
    3.24      scene=s;
    3.25      setParObj (p);	
    3.26 -    depth=p->getDepth()+1;
    3.27 -	if (depth==1)
    3.28 +	if (treeItem->depth()==1)
    3.29  		// Calc angle to mapCenter if I am a mainbranch
    3.30  		// needed for reordering the mainbranches clockwise 
    3.31  		// around mapcenter 
    3.32 @@ -120,7 +119,7 @@
    3.33  
    3.34  void BranchObj::clear() 
    3.35  {
    3.36 -	setVisibility (true);
    3.37 +	//setVisibility (true); //FIXME-4 needed?
    3.38  
    3.39  	while (!floatimage.isEmpty())
    3.40  		delete floatimage.takeFirst();
    3.41 @@ -149,14 +148,14 @@
    3.42  		parObjTmpBuf=parObj;
    3.43  
    3.44  	// ignore mapcenter and mainbranch
    3.45 -	if (lmo->getDepth()<2) off=0;
    3.46 +	if (treeItem->depth()<2) off=0;
    3.47  	if (off==0)
    3.48  		link2ParPos=false;
    3.49  	else
    3.50  		link2ParPos=true;
    3.51  	parObj=o;
    3.52  
    3.53 -	depth=parObj->getDepth()+1;
    3.54 +	// FIXME-2 depth=parObj->getDepth()+1;
    3.55  
    3.56  	// setLinkStyle calls updateLink, only set it once
    3.57  	if (style!=getDefLinkStyle() ) setLinkStyle (getDefLinkStyle());
    3.58 @@ -165,7 +164,7 @@
    3.59  	// Usually the positioning would be done by reposition(),
    3.60  	// but then also the destination branch would "Jump" around...
    3.61  	// Better just do it approximately
    3.62 -	if (depth==1)
    3.63 +	if (treeItem->depth()==1)
    3.64  	{	// new parent is the mapcenter itself
    3.65  
    3.66  		QPointF p= normalise ( QPointF (m.x() - o->getChildPos().x(),
    3.67 @@ -213,7 +212,7 @@
    3.68  		link2ParPos=false;
    3.69  		parObj=parObjTmpBuf;
    3.70  		parObjTmpBuf=NULL;
    3.71 -		depth=parObj->getDepth()+1;
    3.72 +		//FIXME-2 depth=parObj->getDepth()+1;
    3.73  		setLinkStyle (getDefLinkStyle() );
    3.74  		updateLink();
    3.75  	}		
    3.76 @@ -222,7 +221,7 @@
    3.77  void BranchObj::setVisibility(bool v, int toDepth)
    3.78  {
    3.79  	BranchItem *bi=(BranchItem*)treeItem;
    3.80 -    if (depth <= toDepth)
    3.81 +    if (bi->depth() <= toDepth)
    3.82      {
    3.83  		frame->setVisibility(v);
    3.84  		heading->setVisibility(v);
    3.85 @@ -669,7 +668,7 @@
    3.86  void BranchObj::setDefAttr (BranchModification mod)
    3.87  {
    3.88  	int fontsize;
    3.89 -	switch (depth)
    3.90 +	switch (treeItem->depth())
    3.91  	{
    3.92  		case 0: fontsize=16; break;
    3.93  		case 1: fontsize=12; break;
    3.94 @@ -688,7 +687,7 @@
    3.95  	calcBBoxSize();
    3.96  }
    3.97  
    3.98 -BranchObj* BranchObj::addBranch()
    3.99 +BranchObj* BranchObj::addBranch()	// FIXME-3 still needed?
   3.100  {
   3.101      BranchObj* newbo=new BranchObj(scene,this);
   3.102      newbo->setParObj(this);
   3.103 @@ -724,7 +723,7 @@
   3.104  {
   3.105  	//FIXME-1 branch.append (bo);
   3.106  	bo->setParObj (this);
   3.107 -	bo->depth=depth+1;
   3.108 +	//FIXME-2 bo->depth=depth+1;
   3.109  	bo->setDefAttr(MovedBranch);
   3.110  	BranchItem *bi=(BranchItem*)treeItem;
   3.111  	if ( bi->isScrolled() ) bi->tmpUnscroll();
   3.112 @@ -757,14 +756,14 @@
   3.113  	savePosInAngle();
   3.114  	// Add new bo and resort branches
   3.115  	bo->angle=pos-0.5;
   3.116 -	//FIXME-1 branch.append (bo);
   3.117 +	//FIXME-4 branch.append (bo);
   3.118  	bo->setParObj (this);
   3.119 -	bo->depth=depth+1;
   3.120 +	//FIXME-2 bo->depth=depth+1;
   3.121  	bo->setDefAttr (MovedBranch);
   3.122  	BranchItem *bi=(BranchItem*)treeItem;
   3.123  	if ( bi->isScrolled() ) bi->tmpUnscroll();
   3.124  	//setLastSelectedBranch (bo); //FIXME-3 needed?
   3.125 -	//FIXME-1 qSort (branch.begin(),branch.end(), isAbove);
   3.126 +	//FIXME-2 qSort (branch.begin(),branch.end(), isAbove);
   3.127  	return bo;
   3.128  }
   3.129  
   3.130 @@ -785,7 +784,7 @@
   3.131  	*/
   3.132  }
   3.133  
   3.134 -void BranchObj::removeChildren()
   3.135 +void BranchObj::removeChildren()	// FIXME-3 not needed here
   3.136  {
   3.137  	clear();
   3.138  }
   3.139 @@ -914,6 +913,7 @@
   3.140  	else
   3.141  		return NULL;
   3.142  
   3.143 +/* FIXME-1
   3.144  	// Create new pointer to myself at dst
   3.145  	if (pos<0||dst->getDepth()==0)
   3.146  	{	
   3.147 @@ -934,22 +934,25 @@
   3.148  		} else
   3.149  			return NULL;
   3.150  	}	
   3.151 +*/	
   3.152  }
   3.153  
   3.154  void BranchObj::alignRelativeTo (QPointF ref,bool alignSelf)
   3.155  {
   3.156  	qreal th = bboxTotal.height();	
   3.157 +	int depth=treeItem->depth();
   3.158  // TODO testing
   3.159  /*
   3.160 -	QString h=QString (treeItem->depth(),' ');
   3.161 +
   3.162 +	QString h=QString (depth,' ');
   3.163  	h+=treeItem->getHeading();
   3.164  	h+=QString (15,' ');
   3.165  	h.truncate (15);
   3.166  	QPointF pp; if (parObj) pp=parObj->getChildPos();
   3.167  	cout << "BO::alignRelTo ";
   3.168  	cout<<h.toStdString();
   3.169 -//	cout << "    d="<<treeItem->depth()<<
   3.170 -cout<<  "  ref="<<ref<<
   3.171 +	cout << "    d="<<depth<<
   3.172 +//cout<<  "  ref="<<ref<<
   3.173        	"  bbox.tL="<<bboxTotal.topLeft()<<
   3.174  		"  absPos="<<absPos<<
   3.175  //		"  relPos="<<relPos<<
   3.176 @@ -968,7 +971,7 @@
   3.177  	setOrientation();
   3.178  	//updateLink();
   3.179  
   3.180 -	if (depth==1)
   3.181 +	if (depth==1 && parObj)
   3.182  	{
   3.183  		// Position relatively, if needed
   3.184  		//if (useRelPos) move2RelPos (relPos.x(), relPos.y());
   3.185 @@ -1046,7 +1049,7 @@
   3.186  //	cout << "  orient="<<orientation<<endl;
   3.187  */		
   3.188  
   3.189 -	if (depth==0)
   3.190 +	if (treeItem->depth()==0)
   3.191  	{
   3.192  		// only calculate the sizes once. If the deepest LMO 
   3.193  		// changes its height,
   3.194 @@ -1108,6 +1111,11 @@
   3.195  		if (!treeItem->getBranchNum(i)->isHidden())
   3.196  			r=addBBox(treeItem->getBranchObjNum(i)->getTotalBBox(),r);
   3.197  
   3.198 +/* FIXME-3 lots of occurences of treeItem->getBranchObjNum(i) in branchobj.cpp
   3.199 +            better check if they are not NULL and maybe simplify...
   3.200 +			(have been NULL at least in calcBBoxSizeWithChilds...)
   3.201 +*/			
   3.202 +
   3.203  /*
   3.204  	FIXME-1 for (int i=0; i<floatimage.size(); ++i)
   3.205  		if (!floatimage.at(i)->isHidden())
   3.206 @@ -1164,7 +1172,7 @@
   3.207  	// sum of heights 
   3.208  	// maximum of widths 
   3.209  	// minimum of y
   3.210 -	for (int i=0; i<treeItem->branchCount(); ++i)
   3.211 +	for (int i=0; i<treeItem->branchCount(); i++)
   3.212  	{
   3.213  		if (!bi->getBranchNum(i)->isHidden())
   3.214  		{
     4.1 --- a/branchobj.h	Mon Apr 20 10:42:05 2009 +0000
     4.2 +++ b/branchobj.h	Thu Apr 23 12:15:31 2009 +0000
     4.3 @@ -71,8 +71,8 @@
     4.4  	virtual FloatImageObj* getFloatImageNum(const uint &);
     4.5  protected:	
     4.6  	virtual void savePosInAngle();					// write pos in angle for resorting			
     4.7 +public:	
     4.8  	virtual void setDefAttr (BranchModification);	// set default attributes (font, size, ...)
     4.9 -public:	
    4.10      virtual BranchObj* addBranch();
    4.11      virtual BranchObj* addBranch(BranchObj*);		// makes deep copy of BranchObj
    4.12      virtual BranchObj* addBranchPtr(BranchObj*);	// just adds pointer
     5.1 --- a/floatimageobj.cpp	Mon Apr 20 10:42:05 2009 +0000
     5.2 +++ b/floatimageobj.cpp	Thu Apr 23 12:15:31 2009 +0000
     5.3 @@ -16,7 +16,6 @@
     5.4  //    cout << "Const FloatImageObj ()\n";
     5.5      setParObj (this);	
     5.6      init();
     5.7 -    depth=-1;
     5.8  }
     5.9  
    5.10  FloatImageObj::FloatImageObj (QGraphicsScene* s):FloatObj(s)
    5.11 @@ -24,7 +23,6 @@
    5.12   //   cout << "Const FloatImageObj (s)  called from MapCenterObj (s)\n";
    5.13      setParObj (this);	
    5.14      init();
    5.15 -    depth=-1;
    5.16  }
    5.17  
    5.18  FloatImageObj::FloatImageObj (QGraphicsScene *s, OrnamentedObj* p):FloatObj(s,p)
     6.1 --- a/floatobj.cpp	Mon Apr 20 10:42:05 2009 +0000
     6.2 +++ b/floatobj.cpp	Thu Apr 23 12:15:31 2009 +0000
     6.3 @@ -11,7 +11,6 @@
     6.4  //    cout << "Const FloatObj ()\n";
     6.5      setParObj (this);	
     6.6      init();
     6.7 -    depth=-1;
     6.8  }
     6.9  
    6.10  FloatObj::FloatObj (QGraphicsScene* s):OrnamentedObj(s)
    6.11 @@ -19,14 +18,12 @@
    6.12  //	cout << "Const FloatObj (s)  called from MapCenterObj (s)\n";
    6.13      setParObj (this);	
    6.14      init();
    6.15 -    depth=-1;
    6.16  }
    6.17  
    6.18  FloatObj::FloatObj (QGraphicsScene* s, LinkableMapObj* p):OrnamentedObj (s)
    6.19  {
    6.20  //    cout << "Const FloatObj (s,p)\n";
    6.21      setParObj (p);	
    6.22 -    depth=p->getDepth()+1;
    6.23      init();
    6.24  }
    6.25  
     7.1 --- a/linkablemapobj.cpp	Mon Apr 20 10:42:05 2009 +0000
     7.2 +++ b/linkablemapobj.cpp	Thu Apr 23 12:15:31 2009 +0000
     7.3 @@ -59,7 +59,6 @@
     7.4  {
     7.5  	model=NULL;
     7.6  
     7.7 -    depth=-1;	
     7.8      childObj=NULL;
     7.9      parObj=NULL;
    7.10      parObjTmpBuf=NULL;
    7.11 @@ -212,6 +211,7 @@
    7.12  		//return UndefinedStyle;
    7.13  	}
    7.14  	Style ls=model->getMapLinkStyle();
    7.15 +	int depth=treeItem->depth();
    7.16  	if (depth==0) return UndefinedStyle;
    7.17  	switch (ls)
    7.18  	{
    7.19 @@ -360,7 +360,7 @@
    7.20  			break;
    7.21  		default:
    7.22  			break;
    7.23 -	} // switch (style)	
    7.24 +	} 
    7.25  }
    7.26  
    7.27  QColor LinkableMapObj::getLinkColor()
    7.28 @@ -577,7 +577,7 @@
    7.29  		num=part.right(part.length() - 3);
    7.30  		if (typ=="mc:")
    7.31  		{
    7.32 -			if (depth>0)
    7.33 +			if (treeItem->depth()>0)
    7.34  				return false;	// in a subtree there is no center
    7.35  			else
    7.36  				break;
    7.37 @@ -621,11 +621,6 @@
    7.38      return orientation;
    7.39  }
    7.40  
    7.41 -int LinkableMapObj::getDepth()
    7.42 -{
    7.43 -    return depth;
    7.44 -}
    7.45 -
    7.46  QPointF LinkableMapObj::getRandPos()
    7.47  {
    7.48  	// Choose a random position with given distance to parent:
     8.1 --- a/linkablemapobj.h	Mon Apr 20 10:42:05 2009 +0000
     8.2 +++ b/linkablemapobj.h	Thu Apr 23 12:15:31 2009 +0000
     8.3 @@ -19,7 +19,7 @@
     8.4  */
     8.5  
     8.6  class LinkableMapObj:public QObject, public MapObj {
     8.7 -	Q_OBJECT
     8.8 +	Q_OBJECT		// FIXME-3 really needed here?
     8.9  public:
    8.10  	/*! Orientation of an object depends on the position relative to the parent */
    8.11  	enum Orientation {
    8.12 @@ -101,7 +101,6 @@
    8.13      QPointF getChildPos();					// returns pos where children dock
    8.14      QPointF getParPos();						// returns pos where parents dock
    8.15      Orientation getOrientation();			// get orientation
    8.16 -    virtual int getDepth();					// return depth
    8.17  	virtual QPointF getRandPos();			// make randomised position
    8.18  
    8.19  	virtual void reposition();
    8.20 @@ -126,11 +125,10 @@
    8.21  	VymModel* model;												
    8.22      Orientation orientation;     
    8.23      qreal linkwidth;				// width of a link
    8.24 -    int depth;						// depth: undef=-1 mapCenter=0 branch=1..n
    8.25  	QRectF bboxTotal;				// bounding box including children
    8.26  
    8.27      LinkableMapObj* childObj;
    8.28 -    LinkableMapObj* parObj;
    8.29 +    LinkableMapObj* parObj;		// FIXME-2 really still needed? Better get from TreeItem
    8.30      LinkableMapObj* parObjTmpBuf;	// temporary buffer the original parent
    8.31      qreal bottomlineY;              // vertical offset of dockpos to pos
    8.32  
     9.1 --- a/mainwindow.cpp	Mon Apr 20 10:42:05 2009 +0000
     9.2 +++ b/mainwindow.cpp	Thu Apr 23 12:15:31 2009 +0000
     9.3 @@ -3070,7 +3070,7 @@
     9.4  void Main::editUpperBranch()
     9.5  {
     9.6  	VymModel *m=currentModel();
     9.7 -	if (m) m->selectUpperBranch();
     9.8 +	if (m) m->selectUpperBranch();	// FIXME-0 check also lower... this probably should go into view...
     9.9  }
    9.10  
    9.11  void Main::editLowerBranch()
    10.1 --- a/mapcenterobj.cpp	Mon Apr 20 10:42:05 2009 +0000
    10.2 +++ b/mapcenterobj.cpp	Thu Apr 23 12:15:31 2009 +0000
    10.3 @@ -45,7 +45,6 @@
    10.4  	// TODO this should be done in TextObj later...
    10.5  	//QFont font ("Sans Serif,16,-1,5,50,0,0,0,0,0");		
    10.6  	//heading->setFont(font);
    10.7 -	depth=0;
    10.8  	setDefAttr(MovedBranch);
    10.9  
   10.10  	frame->setFrameType (FrameObj::Rectangle);
    11.1 --- a/mapeditor.cpp	Mon Apr 20 10:42:05 2009 +0000
    11.2 +++ b/mapeditor.cpp	Thu Apr 23 12:15:31 2009 +0000
    11.3 @@ -719,7 +719,7 @@
    11.4  			}
    11.5  		} else	
    11.6  		{	// selection != a FloatObj
    11.7 -			if (lmosel->getDepth()==0)		//FIXME-1 also moved mapcenters could be linked, but not working here...
    11.8 +			if (seli->depth()==0)		//FIXME-1 also moved mapcenters could be linked, but not working here...
    11.9  			{
   11.10  				// Move MapCenter
   11.11  				if (e->buttons()== Qt::LeftButton && e->modifiers()==Qt::ShiftModifier) 
   11.12 @@ -729,7 +729,7 @@
   11.13  				model->updateRelPositions();
   11.14  			} else
   11.15  			{	
   11.16 -				if (lmosel->getDepth()==1)
   11.17 +				if (seli->depth()==1)
   11.18  				{
   11.19  					// Move mainbranch
   11.20  					lmosel->move(p.x() -movingObj_start.x(), p.y()-movingObj_start.y() );		
   11.21 @@ -797,13 +797,12 @@
   11.22  void MapEditor::mouseReleaseEvent(QMouseEvent* e)
   11.23  {
   11.24      QPointF p = mapToScene(e->pos());
   11.25 -	TreeItem *dsti=findMapItem(p, NULL);
   11.26 -	LinkableMapObj* dst=NULL;
   11.27 -	if (dsti) dst=dsti->getLMO();	//FIXME-2 get rid of dst...
   11.28 -
   11.29  	TreeItem *seli=model->getSelectedItem();
   11.30  	LinkableMapObj *lmosel=seli->getLMO();	// FIXME-2 get rid of lmosel
   11.31  
   11.32 +	TreeItem *dsti=findMapItem(p, seli);
   11.33 +	LinkableMapObj* dst=NULL;
   11.34 +	if (dsti) dst=dsti->getLMO();	//FIXME-2 get rid of dst...
   11.35  
   11.36  
   11.37  	// Have we been picking color?
   11.38 @@ -905,37 +904,36 @@
   11.39  			QString preSelStr=model->getSelectString(lmosel);
   11.40  
   11.41  			copyingObj=false;	
   11.42 -			if (dsti ) 
   11.43 +			if (dsti && dsti->isBranchLikeType() ) 
   11.44  			{
   11.45  				// We have a destination, relink to that
   11.46  
   11.47  				BranchObj* bsel=model->getSelectedBranchObj();
   11.48 -				TreeItem * tisel=model->getSelectedItem();
   11.49  				BranchObj* bdst=(BranchObj*)dst;
   11.50 -				TreeItem* tidst=dst->getTreeItem();
   11.51  
   11.52  				QString preParStr=model->getSelectString (bsel->getParObj());
   11.53 -				QString preNum=QString::number (tisel->num(),10);
   11.54 +				QString preNum=QString::number (seli->num(),10);
   11.55  				QString preDstParStr;
   11.56  
   11.57  				if (e->state() & Qt::ShiftModifier && dst->getParObj())
   11.58  				{	// Link above dst
   11.59  					preDstParStr=model->getSelectString (dst->getParObj());
   11.60 -					bsel->linkTo ( (BranchObj*)(bdst->getParObj()), tidst->num());
   11.61 +					bsel->linkTo ( (BranchObj*)(bdst->getParObj()), seli->num());
   11.62  				} else 
   11.63  				if (e->state() & Qt::ControlModifier && dst->getParObj())
   11.64  				{
   11.65  					// Link below dst
   11.66  					preDstParStr=model->getSelectString (dst->getParObj());
   11.67 -					bsel->linkTo ( (BranchObj*)(bdst->getParObj()), tidst->num()+1);
   11.68 +					bsel->linkTo ( (BranchObj*)(bdst->getParObj()), seli->num()+1);
   11.69  				} else	
   11.70  				{	// Append to dst
   11.71  					preDstParStr=model->getSelectString(dst);
   11.72  					bsel->linkTo (bdst,-1);
   11.73 -					if (dst->getDepth()==0) bsel->move (savePos);
   11.74 +					model->relinkBranch ((BranchItem*)seli,(BranchItem*)dsti);
   11.75 +					if (dsti->depth()==0) bsel->move (savePos);
   11.76  				} 
   11.77  				QString postSelStr=model->getSelectString(lmosel);
   11.78 -				QString postNum=QString::number (tisel->num(),10);
   11.79 +				QString postNum=QString::number (seli->num(),10);
   11.80  
   11.81  				QString undoCom="linkTo (\""+ 
   11.82  					preParStr+ "\"," + preNum  +"," + 
   11.83 @@ -955,7 +953,7 @@
   11.84  			{
   11.85  				// No destination, undo  temporary move
   11.86  
   11.87 -				if (lmosel->getDepth()==1)
   11.88 +				if (seli->depth()==1)
   11.89  				{
   11.90  					cout << "ME::releaseMouse d=1\n"; // FIXME_1    better use depth
   11.91  					// The select string might be different _after_ moving around.
   11.92 @@ -974,7 +972,7 @@
   11.93  				}
   11.94  
   11.95  				// Draw the original link, before selection was moved around
   11.96 -				if (settings.value("/animation/use",false).toBool() && lmosel->getDepth()>1) 
   11.97 +				if (settings.value("/animation/use",false).toBool() && seli->depth()>1) 
   11.98  				{
   11.99  					lmosel->setRelPos();	// calc relPos first for starting point
  11.100  					QPointF dst=bi->getBranchObj()->getParObj()->getChildPos();		// FIXME-3 check getBO here...
    12.1 --- a/ornamentedobj.cpp	Mon Apr 20 10:42:05 2009 +0000
    12.2 +++ b/ornamentedobj.cpp	Thu Apr 23 12:15:31 2009 +0000
    12.3 @@ -407,13 +407,13 @@
    12.4  {
    12.5  	QString posAttr;
    12.6  
    12.7 -	if (depth==0)
    12.8 +	if (treeItem->depth()==0)
    12.9  		posAttr=		
   12.10  			attribut("absPosX",QString().setNum(absPos.x())) +
   12.11  			attribut("absPosY",QString().setNum(absPos.y())); 
   12.12  	else
   12.13  	{
   12.14 -		if (depth==1 || typeid (*this)==typeid (FloatImageObj))
   12.15 +		if (treeItem->depth()==1 || typeid (*this)==typeid (FloatImageObj))
   12.16  		{
   12.17  			if (relPos.x()==0 && relPos.y()==0)
   12.18  				setRelPos();
    13.1 --- a/treeitem.cpp	Mon Apr 20 10:42:05 2009 +0000
    13.2 +++ b/treeitem.cpp	Thu Apr 23 12:15:31 2009 +0000
    13.3 @@ -35,12 +35,14 @@
    13.4  
    13.5  TreeItem::~TreeItem()
    13.6  {
    13.7 +	cout << "Destructor TreeItem\n";
    13.8 +	//if (lmo) delete (lmo);
    13.9      qDeleteAll(childItems);
   13.10  }
   13.11  
   13.12  QString TreeItem::saveToDir (const QString &tmpdir,const QString &prefix, const QPointF& offset)
   13.13  {
   13.14 -	qWarning ("TreeItem::saveToDir called directly");
   13.15 +	cout << "TreeItem::saveToDir called directly for ("<<getHeadingStd()<<"), instead of inherited type...\n";	//FIXME-1 triggered on save
   13.16  	return QString();
   13.17  }
   13.18  
   13.19 @@ -86,7 +88,9 @@
   13.20  	else
   13.21  	{
   13.22  		cout << "TI::removeChild this="<<this<<"  row="<<row<<endl;
   13.23 -		delete childItems.takeAt (row);
   13.24 +		if (childItems.at(row)->isBranchLikeType())
   13.25 +			branchCounter--;
   13.26 +		childItems.removeAt (row);
   13.27  	}
   13.28  }
   13.29  
   13.30 @@ -145,7 +149,7 @@
   13.31  
   13.32  int TreeItem::depth() 
   13.33  {
   13.34 -	int d=-1;
   13.35 +	int d=-2;
   13.36  	TreeItem *ti=this;
   13.37  	while (ti!=NULL)
   13.38  	{
   13.39 @@ -160,6 +164,11 @@
   13.40      return parentItem;
   13.41  }
   13.42  
   13.43 +int TreeItem::childNum()
   13.44 +{
   13.45 +	return parentItem->childItems.indexOf (this);
   13.46 +}
   13.47 +
   13.48  int TreeItem::num()
   13.49  {
   13.50  	switch (type)
   13.51 @@ -200,7 +209,7 @@
   13.52  	return itemData[0].toString();
   13.53  }
   13.54  
   13.55 -std::string TreeItem::headingStd () const
   13.56 +std::string TreeItem::getHeadingStd () const
   13.57  {
   13.58  	return itemData[0].toString().toStdString();
   13.59  }
    14.1 --- a/treeitem.h	Mon Apr 20 10:42:05 2009 +0000
    14.2 +++ b/treeitem.h	Thu Apr 23 12:15:31 2009 +0000
    14.3 @@ -47,14 +47,15 @@
    14.4  
    14.5  	/*! Return number of item in parent by type, 
    14.6  	    e.g. first branch has number 0           */
    14.7 -	int num();		
    14.8 +	int childNum();				//! Return number of item in list of all children
    14.9 +	int num();					//! Return number of item by type
   14.10  	int num (TreeItem *item);	//! Return number of item by type
   14.11  
   14.12  	// Accessing data
   14.13      QVariant data(int column) const;
   14.14  	void setHeading (const QString s);
   14.15  	QString getHeading() const;
   14.16 -	std::string headingStd() const;	//! convenience function used for debugging
   14.17 +	std::string getHeadingStd() const;	//! convenience function used for debugging
   14.18  
   14.19  protected:
   14.20  	NoteObj note;
    15.1 --- a/treemodel.cpp	Mon Apr 20 10:42:05 2009 +0000
    15.2 +++ b/treemodel.cpp	Thu Apr 23 12:15:31 2009 +0000
    15.3 @@ -186,13 +186,16 @@
    15.4  	int last=row+count-1;
    15.5  	cout << "TreeModel::removeRows row="<<row<<"  count="<<count<<"  last="<<last<<endl;
    15.6      TreeItem *pi= getItem (parent);
    15.7 +	TreeItem *ti;
    15.8  	cout << "  pi="<<pi<<"  "<<pi->getHeading().toStdString()<<endl;
    15.9  	beginRemoveRows (parent,row,last);
   15.10  
   15.11  	for (int i=row; i<=last; i++)
   15.12  	{
   15.13  		cout << "TreeModel::removeRows removing i="<<i<<std::endl;
   15.14 -		pi->removeChild (row);
   15.15 +		ti=pi->getChildNum (row);
   15.16 +		pi->removeChild (row);	// does not delete object!
   15.17 +		delete (ti);
   15.18  	}
   15.19  	endRemoveRows ();
   15.20  	return true;
    16.1 --- a/version.h	Mon Apr 20 10:42:05 2009 +0000
    16.2 +++ b/version.h	Thu Apr 23 12:15:31 2009 +0000
    16.3 @@ -6,8 +6,8 @@
    16.4  #define __VYM_NAME "VYM"
    16.5  #define __VYM_VERSION "1.13.0"
    16.6  //#define __VYM_CODENAME "Codename: RC-1"
    16.7 -#define __VYM_CODENAME "Codename: development version"
    16.8 -#define __VYM_BUILD_DATE "2009-04-20"
    16.9 +#define __VYM_CODENAME "Codename: development version, not for production!"
   16.10 +#define __VYM_BUILD_DATE "2009-04-23"
   16.11  
   16.12  
   16.13  bool checkVersion(const QString &);
    17.1 --- a/vymmodel.cpp	Mon Apr 20 10:42:05 2009 +0000
    17.2 +++ b/vymmodel.cpp	Thu Apr 23 12:15:31 2009 +0000
    17.3 @@ -2008,10 +2008,9 @@
    17.4  	return mci;
    17.5  }
    17.6  
    17.7 -BranchItem* VymModel::createBranch()	// FIXME-2 switcht addNewBrancInt to BranchItem...
    17.8 -{
    17.9 -	BranchObj* bo=addNewBranchInt (-2);
   17.10 -	return (BranchItem*)bo->getTreeItem();
   17.11 +BranchItem* VymModel::createBranch()	
   17.12 +{
   17.13 +	return addNewBranchInt (-2);
   17.14  }
   17.15  
   17.16  TreeItem* VymModel::createImage()	//FIXME-2
   17.17 @@ -2123,7 +2122,7 @@
   17.18  }
   17.19  
   17.20  
   17.21 -BranchObj* VymModel::addNewBranchInt(int num)
   17.22 +BranchItem* VymModel::addNewBranchInt(int num)
   17.23  {
   17.24  	// Depending on pos:
   17.25  	// -3		insert in children of parent  above selection 
   17.26 @@ -2158,6 +2157,8 @@
   17.27  
   17.28  			// save scroll state. If scrolled, automatically select
   17.29  			// new branch in order to tmp unscroll parent...
   17.30 +			newbo=bi->createMapObj(mapScene);
   17.31 +			/*
   17.32  			newbo=bo->addBranch();
   17.33  
   17.34  			if (newbo)
   17.35 @@ -2166,63 +2167,70 @@
   17.36  				newbo->setTreeItem (bi);
   17.37  				select (bi); 
   17.38  			}
   17.39 +			*/
   17.40 +			select (bi);
   17.41  			
   17.42  		}else if (num==-1)
   17.43  		{
   17.44 +		/*
   17.45  			num=bi->num()+1;
   17.46  			bo=(BranchObj*)bo->getParObj();
   17.47  			if (bo) newbo=bo->insertBranch(num);	//FIXME-1 VM still missing 
   17.48 +		*/	
   17.49  		}else if (num==-3)
   17.50  		{
   17.51 +		/*
   17.52  			num=bi->num();
   17.53  			bo=(BranchObj*)bo->getParObj();
   17.54  			if (bo) newbo=bo->insertBranch(num);	//FIXME-1 VM still missing
   17.55 +		*/	
   17.56  		}
   17.57  	}	
   17.58 -	return newbo;
   17.59 +	return bi;
   17.60  }	
   17.61  
   17.62 -BranchObj* VymModel::addNewBranch(int pos)
   17.63 +BranchItem* VymModel::addNewBranch(int pos)
   17.64  {
   17.65  	// Different meaning than num in addNewBranchInt!
   17.66  	// -1	add above
   17.67  	//  0	add as child
   17.68  	// +1	add below
   17.69 -	BranchObj *bo = getSelectedBranchObj();	//FIXME-2
   17.70 -	BranchObj *newbo=NULL;
   17.71 -
   17.72 -	if (bo)
   17.73 +	BranchItem *newbi=NULL;
   17.74 +	BranchItem *selbi=getSelectedBranchItem();
   17.75 +
   17.76 +	if (selbi)
   17.77  	{
   17.78  		// FIXME-2 VM  do we still need this in model? setCursor (Qt::ArrowCursor);
   17.79  
   17.80 -		newbo=addNewBranchInt (pos-2);
   17.81 -
   17.82 -		if (newbo)
   17.83 +		newbi=addNewBranchInt (pos-2);
   17.84 +
   17.85 +		if (newbi)
   17.86  		{
   17.87  			saveState(
   17.88 -				newbo->getTreeItem(),		
   17.89 +				newbi,		
   17.90  				"delete ()",
   17.91 -				bo->getTreeItem(),
   17.92 +				selbi,
   17.93  				QString ("addBranch (%1)").arg(pos),
   17.94 -				QString ("Add new branch to %1").arg(getObjectName(bo)));	
   17.95 +				QString ("Add new branch to %1").arg(getObjectName(selbi)));	
   17.96  
   17.97  			reposition();
   17.98  			// selection.update(); FIXME-3
   17.99 -			latestSelectionString=getSelectString(newbo);
  17.100 +			latestSelectionString=getSelectString(newbi);
  17.101  			// In Network mode, the client needs to know where the new branch is,
  17.102  			// so we have to pass on this information via saveState.
  17.103  			// TODO: Get rid of this positioning workaround
  17.104 -			QString ps=qpointfToString (newbo->getAbsPos());
  17.105 +			/* FIXME-4  network problem:  QString ps=qpointfToString (newbo->getAbsPos());
  17.106  			sendData ("selectLatestAdded ()");
  17.107  			sendData (QString("move %1").arg(ps));
  17.108  			sendSelection();
  17.109 +			*/
  17.110  		}
  17.111  	}	
  17.112 -	return newbo;
  17.113 +	return newbi;
  17.114  }
  17.115  
  17.116  
  17.117 -BranchObj* VymModel::addNewBranchBefore()	//FIXME-2
  17.118 +BranchItem* VymModel::addNewBranchBefore()	//FIXME-2
  17.119  {
  17.120  /*
  17.121  	BranchObj *newbo=NULL;
  17.122 @@ -2258,6 +2266,22 @@
  17.123  	return NULL;
  17.124  }
  17.125  
  17.126 +BranchItem* VymModel::relinkBranch (BranchItem *branch, BranchItem *dst, int pos)
  17.127 +{
  17.128 +	cout << "VM::relinkBranch  "<<branch->getHeadingStd()<<"  to "<<dst->getHeadingStd()<<"  at pos="<<pos<<endl;
  17.129 +	if (branch && dst)
  17.130 +	{
  17.131 +		BranchItem *branchpi=(BranchItem*)branch->parent();
  17.132 +		BranchItem *dstpi=(BranchItem*)dst->parent();
  17.133 +		if (pos<0)
  17.134 +		{
  17.135 +			// Append as last branch to dst
  17.136 +			branchpi->removeChild (branch->childNum() );
  17.137 +			dst->appendChild (branch);
  17.138 +		}
  17.139 +	}
  17.140 +}
  17.141 +
  17.142  void VymModel::deleteSelection()
  17.143  {
  17.144  	BranchObj *bo = getSelectedBranchObj();	// FIXME-2 VM should not be necessary
  17.145 @@ -2319,7 +2343,7 @@
  17.146  		beginRemoveRows (parentIndex,n,n);
  17.147  		removeRows (n,1,parentIndex);
  17.148  		endRemoveRows();
  17.149 -		par->removeBranch(bo);	// remove from BranchObj lists...
  17.150 +		//	delete (selbi->getLMO() );	// FIXME-0 selbi is removed implicetely, destructor is called. from there BO is deleted, but somhow still segfaulting :-(
  17.151  		select (par);
  17.152  		ensureSelectionVisible();
  17.153  		reposition();
  17.154 @@ -3964,8 +3988,9 @@
  17.155  		rootItem->getBranchObjNum(i)->reposition();	//	for positioning heading
  17.156  }
  17.157  
  17.158 -QPolygonF VymModel::shape(BranchObj *bo)
  17.159 -{
  17.160 +QPolygonF VymModel::shape(BranchObj *bo)	//FIXME-4
  17.161 +{
  17.162 +/*
  17.163  	// Creating (arbitrary) shapes
  17.164  
  17.165  	QPolygonF p;
  17.166 @@ -3995,7 +4020,7 @@
  17.167  			<<rb.bottomLeft()
  17.168  			<<QPointF (rb.bottomRight().x(), ra.bottomRight().y() ) ;
  17.169  	return p;		
  17.170 -
  17.171 +	*/
  17.172  }
  17.173  
  17.174  void VymModel::moveAway(LinkableMapObj *lmo)	//FIXME-5
  17.175 @@ -4354,7 +4379,7 @@
  17.176  
  17.177  void VymModel::startAnimation(BranchObj *bo, const QPointF &start, const QPointF &dest)
  17.178  {
  17.179 -	if (bo && bo->getDepth()>0) 
  17.180 +	if (bo && bo->getTreeItem()->depth()>0) 
  17.181  	{
  17.182  		AnimPoint ap;
  17.183  		ap.setStart (start);
  17.184 @@ -4710,197 +4735,136 @@
  17.185  
  17.186  void VymModel::selectNextBranchInt()
  17.187  {
  17.188 -	// Increase number of branch
  17.189 -	BranchItem *selbi=getSelectedBranchItem();
  17.190 -	if (selbi)
  17.191 +	BranchItem *bi=getSelectedBranchItem();
  17.192 +	if (bi)
  17.193  	{
  17.194 -		QString s=getSelectString();
  17.195 -		QString part;
  17.196 -		QString typ;
  17.197 -		QString num;
  17.198 -
  17.199 -		// Where am I? 
  17.200 -		part=s.section(",",-1);
  17.201 -		typ=part.left (3);
  17.202 -		num=part.right(part.length() - 3);
  17.203 -
  17.204 -		s=s.left (s.length() -num.length());
  17.205 -
  17.206 -		// Go to next lmo
  17.207 -		num=QString ("%1").arg(num.toUInt()+1);
  17.208 -
  17.209 -		s=s+num;
  17.210 +		TreeItem *pi=bi->parent();
  17.211 +		if (bi!=rootItem)
  17.212 +		{
  17.213 +			int i=bi->num();
  17.214 +			if (i<pi->branchCount() )
  17.215 +			{
  17.216 +				// select previous branch with same parent
  17.217 +				i++;
  17.218 +				select (pi->getBranchNum(i));
  17.219 +				return;
  17.220 +			}
  17.221 +		}
  17.222  		
  17.223 -		// Try to select this one
  17.224 -		if (select (s)) return;
  17.225 -
  17.226 -		// We have no direct successor, 
  17.227 -		// try to increase the parental number in order to
  17.228 -		// find a successor with same depth
  17.229 -
  17.230 -		int d=getSelectedBranchItem()->depth();
  17.231 -		int oldDepth=d;
  17.232 -		int i;
  17.233 -		bool found=false;
  17.234 -		bool b;
  17.235 -		while (!found && d>0)
  17.236 -		{
  17.237 -			s=s.section (",",0,d-1);
  17.238 -			// replace substring of current depth in s with "1"
  17.239 -			part=s.section(",",-1);
  17.240 -			typ=part.left (3);
  17.241 -			num=part.right(part.length() - 3);
  17.242 -
  17.243 -			if (d>1)
  17.244 -			{	
  17.245 -				// increase number of parent
  17.246 -				num=QString ("%1").arg(num.toUInt()+1);
  17.247 -				s=s.section (",",0,d-2) + ","+ typ+num;
  17.248 -			} else
  17.249 -			{
  17.250 -				// Special case, look at orientation
  17.251 -				if (getSelectedLMO()->getOrientation()==LinkableMapObj::RightOfCenter)	// FIXME-3 check access to LMO
  17.252 -					num=QString ("%1").arg(num.toUInt()+1);
  17.253 -				else	
  17.254 -					num=QString ("%1").arg(num.toUInt()-1);
  17.255 -				s=typ+num;
  17.256 -			}	
  17.257 -
  17.258 -			if (select (s))
  17.259 -				// pad to oldDepth, select the first branch for each depth
  17.260 -				for (i=d;i<oldDepth;i++)
  17.261 -				{
  17.262 -					b=select (s);
  17.263 -					if (b)
  17.264 -					{	
  17.265 -						if ( getSelectedItem()->branchCount()>0)
  17.266 -							s+=",bo:0";
  17.267 -						else	
  17.268 -							break;
  17.269 -					} else
  17.270 -						break;
  17.271 -				}	
  17.272 -
  17.273 -			// try to select the freshly built string
  17.274 -			found=select(s);
  17.275 -			d--;
  17.276 -		}
  17.277 -		return;
  17.278 -	}	
  17.279 -}
  17.280 -
  17.281 -void VymModel::selectPrevBranchInt()
  17.282 -{
  17.283 -	// Decrease number of branch
  17.284 -	if (selectionType()==TreeItem::Branch)
  17.285 -	{
  17.286 -		QString s=getSelectString();
  17.287 -		QString part;
  17.288 -		QString typ;
  17.289 -		QString num;
  17.290 -
  17.291 -		// Where am I? 
  17.292 -		part=s.section(",",-1);
  17.293 -		typ=part.left (3);
  17.294 -		num=part.right(part.length() - 3);
  17.295 -
  17.296 -		s=s.left (s.length() -num.length());
  17.297 -
  17.298 -		int n=num.toInt()-1;
  17.299 -		
  17.300 -		// Go to next lmo
  17.301 -		num=QString ("%1").arg(n);
  17.302 -		s=s+num;
  17.303 -		
  17.304 -		// Try to select this one
  17.305 -		if (n>=0 && select (s)) return;
  17.306 -
  17.307 -		// We have no direct precessor, 
  17.308 -		// try to decrease the parental number in order to
  17.309 -		// find a precessor with same depth
  17.310 -
  17.311 -		int d=getSelectedBranchItem()->depth();
  17.312 -		int oldDepth=d;
  17.313 -		int i;
  17.314 -		bool found=false;
  17.315 -		bool b;
  17.316 -		while (!found && d>0)
  17.317 -		{
  17.318 -			s=s.section (",",0,d-1);
  17.319 -			// replace substring of current depth in s with "1"
  17.320 -			part=s.section(",",-1);
  17.321 -			typ=part.left (3);
  17.322 -			num=part.right(part.length() - 3);
  17.323 -
  17.324 -			if (d>1)
  17.325 -			{
  17.326 -				// decrease number of parent
  17.327 -				num=QString ("%1").arg(num.toInt()-1);
  17.328 -				s=s.section (",",0,d-2) + ","+ typ+num;
  17.329 -			} else
  17.330 -			{
  17.331 -				// Special case, look at orientation
  17.332 -				if (getSelectedLMO()->getOrientation()==LinkableMapObj::RightOfCenter)	// FIXME-3 check access to LMO
  17.333 -					num=QString ("%1").arg(num.toInt()-1);
  17.334 -				else	
  17.335 -					num=QString ("%1").arg(num.toInt()+1);
  17.336 -				s=typ+num;
  17.337 -			}	
  17.338 -
  17.339 -			if (select(s))
  17.340 -				// pad to oldDepth, select the last branch for each depth
  17.341 -				for (i=d;i<oldDepth;i++)
  17.342 -				{
  17.343 -					b=select (s);
  17.344 -					if (b)
  17.345 -						if ( getSelectedItem()->branchCount()>0)
  17.346 -							s+=",bo:"+ QString ("%1").arg( getSelectedItem()->branchCount()-1 );
  17.347 -						else	
  17.348 -							break;
  17.349 -					else
  17.350 -						break;
  17.351 -				}	
  17.352 -			
  17.353 -			// try to select the freshly built string
  17.354 -			found=select(s);
  17.355 -			d--;
  17.356 -		}
  17.357 -		return;
  17.358 -	}	
  17.359 -}
  17.360 -
  17.361 -void VymModel::selectUpperBranch()
  17.362 -{
  17.363 -	if (selection.isBlocked() ) return;
  17.364 -
  17.365 -	BranchItem *bi=getSelectedBranchItem();
  17.366 -	if (bi && bi->getType()==TreeItem::Branch)
  17.367 -	{
  17.368 -		if (bi->getBranchObj()->getOrientation()==LinkableMapObj::RightOfCenter)	//FIXME-3 check getBO
  17.369 -			selectPrevBranchInt();
  17.370 -		else
  17.371 -			if (bi->depth()==1)
  17.372 -				selectNextBranchInt();
  17.373 -			else
  17.374 -				selectPrevBranchInt();
  17.375  	}
  17.376  }
  17.377  
  17.378 +void VymModel::selectPrevBranchInt()
  17.379 +{
  17.380 +
  17.381 +	BranchItem *bi=getSelectedBranchItem();
  17.382 +	if (bi)
  17.383 +	{
  17.384 +		BranchItem *pi=(BranchItem*)bi->parent();
  17.385 +		if (bi!=rootItem)
  17.386 +		{
  17.387 +			int i=bi->num();
  17.388 +			if (i>0)
  17.389 +			{
  17.390 +				// select previous branch with same parent
  17.391 +				bi=pi->getBranchNum(i-1);
  17.392 +				select (bi);
  17.393 +				return;
  17.394 +			}
  17.395 +			bi=pi;
  17.396 +			while (bi->branchCount() >0)
  17.397 +				bi=bi->getLastBranch();
  17.398 +			select (bi);	
  17.399 +
  17.400 +			// Try to select last branch in parent pi2 previous to own parent pi
  17.401 +			/*
  17.402 +			TreeItem *pi2=pi->parent();
  17.403 +			if (pi2)
  17.404 +			{
  17.405 +				int j=pi->num();
  17.406 +				if (pi2->)
  17.407 +			}
  17.408 +			*/
  17.409 +		}
  17.410 +	}
  17.411 +}
  17.412 +
  17.413 +void VymModel::selectAboveBranchInt()
  17.414 +{
  17.415 +	BranchItem *bi=getSelectedBranchItem();
  17.416 +	if (bi)
  17.417 +	{
  17.418 +		BranchItem *newbi=NULL;
  17.419 +		BranchItem *pi=(BranchItem*)bi->parent();
  17.420 +		int i=bi->num();
  17.421 +		if (i>0)
  17.422 +		{
  17.423 +			// goto previous branch with same parent
  17.424 +			newbi=pi->getBranchNum(i-1);
  17.425 +			while (newbi->branchCount() >0 )
  17.426 +				newbi=newbi->getLastBranch();
  17.427 +		}
  17.428 +		else
  17.429 +			newbi=pi;
  17.430 +		if (newbi==rootItem) 
  17.431 + 			// already at top branch (resp. mapcenter)
  17.432 +			return;
  17.433 +		select (newbi);
  17.434 +	}
  17.435 +}
  17.436 +
  17.437 +void VymModel::selectBelowBranchInt()
  17.438 +{
  17.439 +	BranchItem *bi=getSelectedBranchItem();
  17.440 +	if (bi)
  17.441 +	{
  17.442 +		BranchItem *newbi=NULL;
  17.443 +
  17.444 +		if (bi->branchCount() >0)
  17.445 +			newbi=bi->getFirstBranch();
  17.446 +		else
  17.447 +		{
  17.448 +			BranchItem *pi;
  17.449 +			int i;
  17.450 +			while (!newbi)
  17.451 +			{
  17.452 +				pi=(BranchItem*)bi->parent();
  17.453 +				i=bi->num();
  17.454 +				if (pi->branchCount()-1 > i)
  17.455 +				{
  17.456 +					newbi=(BranchItem*)pi->getBranchNum(i+1);
  17.457 +					//done...
  17.458 +					break;
  17.459 +				}	
  17.460 +				else
  17.461 +					// look for siblings of myself 
  17.462 +					// or parent, or parent of parent...
  17.463 +					bi=pi;
  17.464 +				if (bi==rootItem)
  17.465 +					// already at end
  17.466 +					return;
  17.467 +			}	
  17.468 +		}
  17.469 +		select (newbi);
  17.470 +	}
  17.471 +}
  17.472 +
  17.473 +void VymModel::selectUpperBranch()
  17.474 +{
  17.475 +	if (selection.isBlocked() ) return;
  17.476 +
  17.477 +	BranchItem *bi=getSelectedBranchItem();
  17.478 +	if (bi && bi->isBranchLikeType())
  17.479 +		selectAboveBranchInt();
  17.480 +}
  17.481 +
  17.482  void VymModel::selectLowerBranch()
  17.483  {
  17.484  	if (selection.isBlocked() ) return;
  17.485  
  17.486  	BranchItem *bi=getSelectedBranchItem();
  17.487 -	if (bi && bi->getType()==TreeItem::Branch)
  17.488 -	{
  17.489 -		if (bi->getBranchObj()->getOrientation()==LinkableMapObj::RightOfCenter)	//FIXME-3 check getBO
  17.490 -			selectNextBranchInt();
  17.491 -		else
  17.492 -			if (bi->depth()==1)
  17.493 -				selectPrevBranchInt();
  17.494 -			else
  17.495 -				selectNextBranchInt();
  17.496 -	}			
  17.497 +	if (bi && bi->isBranchLikeType())
  17.498 +		selectBelowBranchInt();
  17.499  }
  17.500  
  17.501  
    18.1 --- a/vymmodel.h	Mon Apr 20 10:42:05 2009 +0000
    18.2 +++ b/vymmodel.h	Thu Apr 23 12:15:31 2009 +0000
    18.3 @@ -309,7 +309,7 @@
    18.4  	MapCenterObj* getLastMapCenter();		//!< get last added MapCenter, used for context menu
    18.5  
    18.6  private:	
    18.7 -    BranchObj* addNewBranchInt(int);		// pos allows to add above/below selection
    18.8 +    BranchItem* addNewBranchInt(int);		// pos allows to add above/below selection
    18.9  public:	
   18.10  	/*! \Add new branch
   18.11  		
   18.12 @@ -318,8 +318,9 @@
   18.13  		 0 as child of selection
   18.14  		 1 below selection
   18.15  	*/
   18.16 -    BranchObj* addNewBranch(int pos);		
   18.17 -    BranchObj* addNewBranchBefore();		//!< Insert branch between selection and its parent
   18.18 +    BranchItem* addNewBranch(int pos);		
   18.19 +    BranchItem* addNewBranchBefore();		//!< Insert branch between selection and its parent
   18.20 +	BranchItem* relinkBranch (BranchItem* branch, BranchItem* dst, int pos =-1);	//! Relink branch to dst at position pos
   18.21      void deleteSelection();					//!< Delete selection
   18.22  	void deleteKeepChildren();				//!< remove branch, but keep children
   18.23  	void deleteChildren();					//!< keep branch, but remove children
   18.24 @@ -558,7 +559,9 @@
   18.25  
   18.26  private:	
   18.27  	void selectNextBranchInt();		// Increment number of branch
   18.28 -	void selectPrevBranchInt();		// Decrement number of branch
   18.29 +	void selectPrevBranchInt();		//! Select the branch which would be above in vymmap view
   18.30 +	void selectAboveBranchInt();	//! Select the branch which would be above current selection in TreeView
   18.31 +	void selectBelowBranchInt();		// Increment number of branch
   18.32  public:	
   18.33      void selectUpperBranch();
   18.34      void selectLowerBranch();