1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/attributeitem.cpp	Thu Sep 17 09:41:09 2009 +0000
     1.3 @@ -0,0 +1,156 @@
     1.4 +
     1.5 +#include "attributeitem.h"
     1.6 +
     1.7 +#include <iostream>
     1.8 +using namespace std;
     1.9 +
    1.10 +extern bool debug;
    1.11 +
    1.12 +AttributeItem::AttributeItem(const QList<QVariant> &data, TreeItem *parent):TreeItem (data,parent)
    1.13 +{
    1.14 +	TreeItem::setType (Attribute);
    1.15 +	//table=NULL;
    1.16 +	//definition=NULL;
    1.17 +	type=Attribute;
    1.18 +
    1.19 +	internal=false;
    1.20 +}
    1.21 +
    1.22 +AttributeItem::~AttributeItem()
    1.23 +{
    1.24 +}
    1.25 +
    1.26 +void AttributeItem::setKey (const QString &k, const Type &t)
    1.27 +{
    1.28 +/*
    1.29 +	if (!table)
    1.30 +	{
    1.31 +		qWarning (QString("AttributeItem::setKey (%1)  No table defined!\n").arg(k).ascii());
    1.32 +		return;	
    1.33 +	}
    1.34 +	
    1.35 +	if (!definition)
    1.36 +	{
    1.37 +		definition=table->getDef(k);
    1.38 +		if (!definition)
    1.39 +		{
    1.40 +			table->addKey (k,t);
    1.41 +			return;	
    1.42 +		}
    1.43 +	}	
    1.44 +	qWarning (QString("AttributeItem::setKey (%1)  attribute already defined!\n").arg(k).ascii());
    1.45 +	*/
    1.46 +}
    1.47 +
    1.48 +QString AttributeItem::getKey ()
    1.49 +{
    1.50 +/*
    1.51 +	if (!table)
    1.52 +	{
    1.53 +		qWarning ("AttributeItem::getKey ()  No table defined!");
    1.54 +		return QString();	
    1.55 +	}
    1.56 +	if (!definition)
    1.57 +	{
    1.58 +		qWarning ("AttributeItem::getKey ()  No attribute defined!");
    1.59 +		return QString ();	
    1.60 +	}	
    1.61 +	return definition->getKey();
    1.62 +	*/
    1.63 +}
    1.64 +
    1.65 +void AttributeItem::setValue(const QString &v)
    1.66 +{
    1.67 +/*
    1.68 +	if (!table)
    1.69 +	{
    1.70 +		qWarning (QString ("AttributeItem::setValue (%1)  No table defined!").arg(v));
    1.71 +		return;	
    1.72 +	}
    1.73 +	if (!definition)
    1.74 +	{
    1.75 +		qWarning (QString ("AttributeItem::setValue (%1)  No attribute defined!").arg(v));
    1.76 +		return;	
    1.77 +	}	
    1.78 +	definition->setValue (v);
    1.79 +*/
    1.80 +}
    1.81 +
    1.82 +QVariant AttributeItem::getValue()
    1.83 +{
    1.84 +/*
    1.85 +	if (!table)
    1.86 +	{
    1.87 +		qWarning ("AttributeItem::getValue  No table defined!");
    1.88 +		return QString();	
    1.89 +	}
    1.90 +	if (!definition)
    1.91 +	{
    1.92 +		qWarning ("AttributeItem::getValue  No attribute defined!");
    1.93 +		return QString();	
    1.94 +	}	
    1.95 +	QVariant v= definition->getValue();
    1.96 +	return v;
    1.97 +	*/
    1.98 +}
    1.99 +
   1.100 +void AttributeItem::setType (const Type &t)
   1.101 +{
   1.102 +/*
   1.103 +	if (!table)
   1.104 +	{
   1.105 +		qWarning ("AttributeItem::setType  No table defined!");
   1.106 +		return;
   1.107 +	}
   1.108 +	if (!definition)
   1.109 +	{
   1.110 +		qWarning ("Attribute::setType  No attribute defined!");
   1.111 +		return; 
   1.112 +	}	
   1.113 +	definition->setType (t);
   1.114 +*/
   1.115 +}
   1.116 +
   1.117 +AttributeItem::Type AttributeItem::getAttributeType()
   1.118 +{
   1.119 +/*
   1.120 +	if (!table)
   1.121 +	{
   1.122 +		qWarning ("AttributeItem::getType  No table defined!");
   1.123 +		return Undefined;	
   1.124 +	}
   1.125 +	if (!definition)
   1.126 +	{
   1.127 +		qWarning ("AttributeItem::getType  No attribute defined!");
   1.128 +		return Undefined;	
   1.129 +	}	
   1.130 +	return definition->getType();
   1.131 +*/
   1.132 +}
   1.133 +
   1.134 +QString AttributeItem::getTypeString()
   1.135 +{
   1.136 +/*
   1.137 +	if (!table)
   1.138 +	{
   1.139 +		qWarning ("AttributeItem::getTypeString  No table defined!");
   1.140 +		return "Undefined";	
   1.141 +	}
   1.142 +	if (!definition)
   1.143 +	{
   1.144 +		qWarning ("Attribute::getTypeString  No AttributeItem defined!");
   1.145 +		return "Undefined";	
   1.146 +	}	
   1.147 +	return definition->getTypeString();
   1.148 +*/	
   1.149 +}
   1.150 +
   1.151 +QString AttributeItem::getDataXML()
   1.152 +{
   1.153 +	QString a=beginElement ("attribute");
   1.154 +	a+=attribut ("key",getKey());
   1.155 +	a+=attribut ("value",getValue().toString() );
   1.156 +	a+=attribut ("type",getTypeString () );
   1.157 +	return a;
   1.158 +}
   1.159 +
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/attributeitem.h	Thu Sep 17 09:41:09 2009 +0000
     2.3 @@ -0,0 +1,41 @@
     2.4 +#ifndef ATTRIBUTEITEM_H
     2.5 +#define ATTRIBUTEITEM_H
     2.6 +
     2.7 +#include <QStringList>
     2.8 +#include <QVariant>
     2.9 +
    2.10 +#include "treeitem.h"
    2.11 +
    2.12 +/*! \brief A key and a value 
    2.13 +    The data itself is stored in Attribute Definitions (AttributeDef). 
    2.14 +	A list of these tables AttributeTable is maintained for every MapEditor.
    2.15 +*/
    2.16 +class AttributeItem:public TreeItem {
    2.17 +
    2.18 +enum Type {
    2.19 +	Undefined,	//!< Undefined type
    2.20 +	IntList,	//!< Free integer
    2.21 +	FreeInt,	//!< Free integer
    2.22 +	StringList, //!< List of strings, one can be attribute value
    2.23 +	FreeString,	//!< Any string can be attribute value, not unique
    2.24 +	UniqueString//!< UniqueString, e.g. for IDs
    2.25 +};
    2.26 +
    2.27 +public:
    2.28 +	AttributeItem(const QList<QVariant> &data, TreeItem *parent = 0);
    2.29 +	virtual ~AttributeItem();
    2.30 +	void setKey (const QString &k, const Type &t);
    2.31 +	QString getKey ();
    2.32 +	void setValue (const QString &v);
    2.33 +	QVariant getValue ();
    2.34 +	void setType (const Type &t);
    2.35 +	AttributeItem::Type getAttributeType ();
    2.36 +	QString getTypeString ();
    2.37 +	QString getDataXML();
    2.38 +protected:
    2.39 +	QString freeString;		//!< String value for type FreeString
    2.40 +	bool internal;			//!< Internal attributes cannot be edited by user
    2.41 +};
    2.42 +
    2.43 +#endif
    2.44 +
     3.1 --- a/branchitem.cpp	Fri Sep 11 12:56:15 2009 +0000
     3.2 +++ b/branchitem.cpp	Thu Sep 17 09:41:09 2009 +0000
     3.3 @@ -45,6 +45,11 @@
     3.4  	tmpUnscrolled=other->tmpUnscrolled;
     3.5  }
     3.6  
     3.7 +BranchItem* BranchItem::parentBranch ()
     3.8 +{
     3.9 +	return (BranchItem*) parentItem;
    3.10 +}
    3.11 +
    3.12  void BranchItem::insertBranch (int pos, BranchItem *branch)
    3.13  {
    3.14  	if (pos<0) pos=0;
    3.15 @@ -216,7 +221,7 @@
    3.16  			}
    3.17  		}
    3.18  	}
    3.19 -	model->reposition();	// FIXME-3 we don't really want to update view from here...
    3.20 +	//model->reposition();	// FIXME-3 we don't really want to update view from here...
    3.21  	return true;
    3.22  }
    3.23  
    3.24 @@ -273,10 +278,30 @@
    3.25  	}	
    3.26  }
    3.27  
    3.28 +void BranchItem::sortChildren()
    3.29 +{
    3.30 +	int childCount=branchCounter; 
    3.31 +	int curChildIndex;
    3.32 +	bool madeChanges=false;
    3.33 +	do
    3.34 +	{
    3.35 +		madeChanges=false;
    3.36 +		for(curChildIndex=1;curChildIndex<childCount;curChildIndex++){
    3.37 +			BranchItem* curChild =getBranchNum(curChildIndex);
    3.38 +			BranchItem* prevChild=getBranchNum(curChildIndex-1);
    3.39 +			if(prevChild->getHeading().compare(curChild->getHeading())>0)
    3.40 +			{
    3.41 +				model->moveUp(curChild);
    3.42 +				madeChanges=true;
    3.43 +			}
    3.44 +		}
    3.45 +	}while(madeChanges);
    3.46 +}
    3.47 +
    3.48  void BranchItem::setIncludeImagesVer(bool b)
    3.49  {
    3.50  	includeImagesVer=b;
    3.51 -	/* calcBBoxSize(); FIXME-2
    3.52 +	/* calcBBoxSize(); FIXME-3
    3.53  	positionBBox();
    3.54  	requestReposition();
    3.55  	*/
    3.56 @@ -290,7 +315,7 @@
    3.57  void BranchItem::setIncludeImagesHor(bool b)
    3.58  {
    3.59  	includeImagesHor=b;
    3.60 -	/* calcBBoxSize(); FIXME-2
    3.61 +	/* calcBBoxSize(); FIXME-3
    3.62  	positionBBox();
    3.63  	requestReposition();
    3.64  	*/
    3.65 @@ -377,7 +402,7 @@
    3.66  	}
    3.67  	return NULL;
    3.68  }
    3.69 -
    3.70 +/*
    3.71  TreeItem* BranchItem::findID (QString sid)	//FIXME-3 move to TreeItem	//FIXME-4 search images
    3.72  {
    3.73  	// Search branches
    3.74 @@ -392,7 +417,6 @@
    3.75  	if (sid==objID) return this;
    3.76  
    3.77  
    3.78 -/*
    3.79  	// Search float images 
    3.80      for (int i=0; i<floatimage.size(); ++i )
    3.81  		if (floatimage.at(i)->inBox(p) && 
    3.82 @@ -400,10 +424,9 @@
    3.83  			floatimage.at(i)->getParObj()!= excludeLMO &&
    3.84  			floatimage.at(i)->isVisibleObj() 
    3.85  		) return floatimage.at(i);
    3.86 -*/
    3.87      return NULL;
    3.88  }
    3.89 -
    3.90 +*/
    3.91  void BranchItem::updateStyles()
    3.92  {
    3.93  	// FIXME-5 compare also MapItem::initLMO...
     4.1 --- a/branchitem.h	Fri Sep 11 12:56:15 2009 +0000
     4.2 +++ b/branchitem.h	Thu Sep 17 09:41:09 2009 +0000
     4.3 @@ -15,6 +15,7 @@
     4.4      BranchItem(const QList<QVariant> &data, TreeItem *parent = 0);
     4.5      virtual ~BranchItem();
     4.6  	virtual void copy (BranchItem *item);
     4.7 +	virtual BranchItem* parentBranch();
     4.8  
     4.9  	virtual void insertBranch (int pos,BranchItem *branch);
    4.10  
    4.11 @@ -34,7 +35,7 @@
    4.12  	virtual bool hasScrolledParent(BranchItem*);	// true, if any of the parents is scrolled
    4.13  	virtual void tmpUnscroll();				// unscroll scrolled parents temporary e.g. during "find" process
    4.14  	virtual void resetTmpUnscroll();		// scroll all tmp scrolled parents again e.g. when unselecting
    4.15 -
    4.16 +	virtual void sortChildren();		//! Sort children 
    4.17  
    4.18  protected:
    4.19  	bool includeImagesVer;			//! include floatimages in bbox vertically
    4.20 @@ -57,7 +58,7 @@
    4.21  
    4.22  public:
    4.23  	TreeItem* findMapItem (QPointF p,TreeItem* excludeTI);	//! search map for branches or images. Ignore excludeTI, where search is started 
    4.24 -	virtual TreeItem* findID (QString sid);	//! search map for object with ID string
    4.25 +//	virtual TreeItem* findID (QString sid);	//! search map for object with ID string
    4.26  
    4.27  	virtual void updateStyles ();			//! update related fonts, parObjects, links, ...
    4.28  	virtual BranchObj* getBranchObj();	
     5.1 --- a/branchobj.cpp	Fri Sep 11 12:56:15 2009 +0000
     5.2 +++ b/branchobj.cpp	Thu Sep 17 09:41:09 2009 +0000
     5.3 @@ -505,28 +505,6 @@
     5.4  	calcBBoxSize();
     5.5  }
     5.6  
     5.7 -void BranchObj::sortChildren() //FIXME-3 not moved to model yet 
     5.8 -{
     5.9 -/*
    5.10 -	int childCount=branch.count(); 
    5.11 -	int curChildIndex;
    5.12 -	bool madeChanges=false;
    5.13 -	do
    5.14 -	{
    5.15 -		madeChanges=false;
    5.16 -		for(curChildIndex=1;curChildIndex<childCount;curChildIndex++){
    5.17 -			BranchObj* curChild=(BranchObj*)treeItem->getBranchObjNum(curChildIndex);
    5.18 -			BranchObj* prevChild=(BranchObj*)treeItem->getBranchObjNum(curChildIndex-1);
    5.19 -			if(prevChild->heading->text().compare(curChild->heading->text())>0)
    5.20 -			{
    5.21 -				this->moveBranchUp(curChild);
    5.22 -				madeChanges=true;
    5.23 -			}
    5.24 -		}
    5.25 -	}while(madeChanges);
    5.26 -*/
    5.27 -}
    5.28 -
    5.29  void BranchObj::alignRelativeTo (QPointF ref,bool alignSelf)
    5.30  {
    5.31  	qreal th = bboxTotal.height();	
    5.32 @@ -545,10 +523,10 @@
    5.33  //cout<<  "  ref="<<ref<<
    5.34        	"  bbox.tL="<<bboxTotal.topLeft()<<
    5.35  		"  absPos="<<absPos<<
    5.36 -//		"  relPos="<<relPos<<
    5.37 +		"  relPos="<<relPos<<
    5.38  //		"  parPos="<<pp<<
    5.39 -		"  w="<<bbox.width()<<
    5.40 -		"  h="<<bbox.height()<<
    5.41 +//		"  w="<<bbox.width()<<
    5.42 +//		"  h="<<bbox.height()<<
    5.43  //		"  orient="<<orientation<<
    5.44  //		"  alignSelf="<<alignSelf<<
    5.45  //		"  scrolled="<<((BranchItem*)treeItem)->isScrolled()<<
     6.1 --- a/branchobj.h	Fri Sep 11 12:56:15 2009 +0000
     6.2 +++ b/branchobj.h	Thu Sep 17 09:41:09 2009 +0000
     6.3 @@ -48,7 +48,6 @@
     6.4  public:	
     6.5  	virtual void setDefAttr (BranchModification);	// set default attributes (font, size, ...)
     6.6  
     6.7 -    virtual void sortChildren();
     6.8      virtual void alignRelativeTo(const QPointF, bool alignSelf=false );
     6.9  	virtual void reposition();
    6.10  	virtual void unsetAllRepositionRequests();
     7.1 --- a/mainwindow.cpp	Fri Sep 11 12:56:15 2009 +0000
     7.2 +++ b/mainwindow.cpp	Thu Sep 17 09:41:09 2009 +0000
     7.3 @@ -23,7 +23,7 @@
     7.4  #include "warningdialog.h"
     7.5  #include "xlinkitem.h"
     7.6  
     7.7 -#include <modeltest.h>	// FIXME-3
     7.8 +//#include <modeltest.h>	// FIXME-3
     7.9  
    7.10  #if defined(Q_OS_WIN32)
    7.11  // Define only this structure as opposed to
    7.12 @@ -665,6 +665,13 @@
    7.13  	editMenu->addAction (a);
    7.14  	actionMoveDown=a;
    7.15  	
    7.16 +    a = new QAction(QPixmap(), tr( "&Detach","Context menu" ),this);
    7.17 +	a->setStatusTip ( tr( "Detach branch and use as mapcenter","Context menu" ) );
    7.18 +	a->setShortcut ( Qt::Key_D );					// Detach branch
    7.19 +	editMenu->addAction (a);
    7.20 +    connect( a, SIGNAL( triggered() ), this, SLOT( editDetach() ) );
    7.21 +	actionDetach=a;
    7.22 +	
    7.23  	a = new QAction( QPixmap(iconPath+"editsort.png" ), tr( "Sort children","Edit menu" ), this );
    7.24  	connect( a, SIGNAL( activated() ), this, SLOT( editSortChildren() ) );
    7.25  	a->setEnabled (true);
    7.26 @@ -1547,6 +1554,7 @@
    7.27  
    7.28  	actionSaveBranch->addTo( branchContextMenu );
    7.29  	actionFileNewCopy->addTo (branchContextMenu );
    7.30 +	actionDetach->addTo (branchContextMenu );
    7.31  
    7.32  	branchContextMenu->addSeparator();	
    7.33  	branchContextMenu->addAction ( actionLoadImage);
    7.34 @@ -1710,7 +1718,7 @@
    7.35  {
    7.36  	VymModel *vm=new VymModel;
    7.37  
    7.38 -new ModelTest(vm, this);	//FIXME-3
    7.39 +//new ModelTest(vm, this);	//FIXME-3
    7.40  
    7.41  
    7.42  	VymView *vv=new VymView (vm);
    7.43 @@ -2699,6 +2707,7 @@
    7.44  void Main::editMapInfo()
    7.45  {
    7.46  	VymModel *m=currentModel();
    7.47 +	if (!m) return;
    7.48  
    7.49  	ExtraInfoDialog dia;
    7.50  	dia.setMapName (m->getFileName() );
    7.51 @@ -2707,27 +2716,27 @@
    7.52  
    7.53  	// Calc some stats
    7.54  	QString stats;
    7.55 -/* FIXME-2 no stats at the moment (view dependent...)
    7.56 -    stats+=tr("%1 items on map\n","Info about map").arg (mapScene->items().size(),6);
    7.57 +    stats+=tr("%1 items on map\n","Info about map").arg (m->getScene()->items().size(),6);
    7.58  
    7.59  	uint b=0;
    7.60  	uint f=0;
    7.61  	uint n=0;
    7.62  	uint xl=0;
    7.63 -	BranchObj *bo;
    7.64 -	bo=m->first();
    7.65 -	while (bo) 
    7.66 +	BranchItem *cur=NULL;
    7.67 +	BranchItem *prev=NULL;
    7.68 +	m->next(cur,prev);
    7.69 +	while (cur) 
    7.70  	{
    7.71 -		if (!bo->getNote().isEmpty() ) n++;
    7.72 -		f+= bo->countFloatImages();
    7.73 +		if (!cur->getNote().isEmpty() ) n++;
    7.74 +		f+= cur->imageCount();
    7.75  		b++;
    7.76 -		xl+=bo->countXLinks();
    7.77 -		bo=m->next(bo);
    7.78 +		xl+=cur->xlinkCount();
    7.79 +		m->next(cur,prev);
    7.80  	}
    7.81 +
    7.82      stats+=QString ("%1 xLinks \n").arg (xl,6);
    7.83      stats+=QString ("%1 notes\n").arg (n,6);
    7.84      stats+=QString ("%1 images\n").arg (f,6);
    7.85 -*/
    7.86      stats+=QString ("%1 branches\n").arg (m->branchCount(),6);
    7.87  	dia.setStats (stats);
    7.88  
    7.89 @@ -2751,6 +2760,12 @@
    7.90  	if (m) m->moveDown();
    7.91  }
    7.92  
    7.93 +void Main::editDetach()
    7.94 +{
    7.95 +	VymModel *m=currentModel();
    7.96 +	if (m) m->detach();
    7.97 +}
    7.98 +
    7.99  void Main::editSortChildren()
   7.100  {
   7.101  	VymModel *m=currentModel();
   7.102 @@ -3591,6 +3606,11 @@
   7.103  {
   7.104  	if (!currentMapEditor()) return;
   7.105  	currentMapEditor()->testFunction1();
   7.106 +	/*
   7.107 +	VymModel *m=currentModel();
   7.108 +	if (!m) return;
   7.109 +	m->clearItem (m->getSelectedItem());
   7.110 +	*/
   7.111  }
   7.112  
   7.113  void Main::testFunction2()
     8.1 --- a/mainwindow.h	Fri Sep 11 12:56:15 2009 +0000
     8.2 +++ b/mainwindow.h	Thu Sep 17 09:41:09 2009 +0000
     8.3 @@ -144,6 +144,7 @@
     8.4  	void editMapInfo();
     8.5      void editMoveUp();	
     8.6      void editMoveDown();	
     8.7 +    void editDetach();	
     8.8  	void editSortChildren();
     8.9      void editToggleScroll();
    8.10      void editExpandAll();
    8.11 @@ -278,6 +279,7 @@
    8.12  	QAction *actionPaste;
    8.13  	QAction *actionMoveUp;
    8.14  	QAction *actionMoveDown;
    8.15 +	QAction *actionDetach;
    8.16  	QAction *actionSortChildren;
    8.17  	QAction *actionToggleScroll;
    8.18  	QAction *actionExpandAll;
     9.1 --- a/mapeditor.cpp	Fri Sep 11 12:56:15 2009 +0000
     9.2 +++ b/mapeditor.cpp	Thu Sep 17 09:41:09 2009 +0000
     9.3 @@ -186,6 +186,8 @@
     9.4  
     9.5  void MapEditor::scrollTo (const QModelIndex &index)
     9.6  {
     9.7 +	//cout <<"ME::scrollTo aborted\n";
     9.8 +	//return;
     9.9  	if (index.isValid())
    9.10  	{
    9.11  		LinkableMapObj* lmo=NULL;
    9.12 @@ -454,6 +456,7 @@
    9.13  
    9.14  void MapEditor::testFunction1()
    9.15  {
    9.16 +	cout << "ME::test1  selected TI="<<model->getSelectedItem()<<endl;
    9.17  	/*
    9.18  	// Code copied from Qt sources
    9.19  	QRectF rect=model->getSelectedBranchObj()->getBBox();
    10.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    10.2 +++ b/mysortfilterproxymodel.cpp	Thu Sep 17 09:41:09 2009 +0000
    10.3 @@ -0,0 +1,99 @@
    10.4 +/****************************************************************************
    10.5 +**
    10.6 +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
    10.7 +** Contact: Qt Software Information (qt-info@nokia.com)
    10.8 +**
    10.9 +** This file is part of the example classes of the Qt Toolkit.
   10.10 +**
   10.11 +** Commercial Usage
   10.12 +** Licensees holding valid Qt Commercial licenses may use this file in
   10.13 +** accordance with the Qt Commercial License Agreement provided with the
   10.14 +** Software or, alternatively, in accordance with the terms contained in
   10.15 +** a written agreement between you and Nokia.
   10.16 +**
   10.17 +**
   10.18 +** GNU General Public License Usage
   10.19 +** Alternatively, this file may be used under the terms of the GNU
   10.20 +** General Public License versions 2.0 or 3.0 as published by the Free
   10.21 +** Software Foundation and appearing in the file LICENSE.GPL included in
   10.22 +** the packaging of this file.  Please review the following information
   10.23 +** to ensure GNU General Public Licensing requirements will be met:
   10.24 +** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
   10.25 +** http://www.gnu.org/copyleft/gpl.html.  In addition, as a special
   10.26 +** exception, Nokia gives you certain additional rights. These rights
   10.27 +** are described in the Nokia Qt GPL Exception version 1.3, included in
   10.28 +** the file GPL_EXCEPTION.txt in this package.
   10.29 +**
   10.30 +** Qt for Windows(R) Licensees
   10.31 +** As a special exception, Nokia, as the sole copyright holder for Qt
   10.32 +** Designer, grants users of the Qt/Eclipse Integration plug-in the
   10.33 +** right for the Qt/Eclipse Integration to link to functionality
   10.34 +** provided by Qt Designer and its related libraries.
   10.35 +**
   10.36 +** If you are unsure which license is appropriate for your use, please
   10.37 +** contact the sales department at qt-sales@nokia.com.
   10.38 +**
   10.39 +****************************************************************************/
   10.40 +
   10.41 +#include <QtGui>
   10.42 +
   10.43 +#include "mysortfilterproxymodel.h"
   10.44 +
   10.45 +MySortFilterProxyModel::MySortFilterProxyModel(QObject *parent)
   10.46 +    : QSortFilterProxyModel(parent)
   10.47 +{
   10.48 +}
   10.49 +/*
   10.50 +void MySortFilterProxyModel::setFilterMinimumDate(const QDate &date)
   10.51 +{
   10.52 +    minDate = date;
   10.53 +    invalidateFilter();
   10.54 +}
   10.55 +void MySortFilterProxyModel::setFilterMaximumDate(const QDate &date)
   10.56 +{
   10.57 +    maxDate = date;
   10.58 +    invalidateFilter();
   10.59 +}
   10.60 +*/
   10.61 +
   10.62 +#include <iostream>
   10.63 +using namespace std;
   10.64 +bool MySortFilterProxyModel::filterAcceptsRow(int sourceRow,
   10.65 +        const QModelIndex &sourceParent) const
   10.66 +{
   10.67 +	return true;
   10.68 +cout << "MSFPM  sM="<<sourceModel()<<endl;
   10.69 +    QModelIndex index0 = sourceModel()->index(sourceRow, 0, sourceParent);
   10.70 +    QModelIndex index1 = sourceModel()->index(sourceRow, 1, sourceParent);
   10.71 +
   10.72 +    return (sourceModel()->data(index0).toString().contains(filterRegExp()) );
   10.73 +}
   10.74 +
   10.75 +/*
   10.76 +bool MySortFilterProxyModel::lessThan(const QModelIndex &left,
   10.77 +                                      const QModelIndex &right) const
   10.78 +{
   10.79 +    QVariant leftData = sourceModel()->data(left);
   10.80 +    QVariant rightData = sourceModel()->data(right);
   10.81 +    if (leftData.type() == QVariant::DateTime) {
   10.82 +        return leftData.toDateTime() < rightData.toDateTime();
   10.83 +    } else {
   10.84 +        QRegExp *emailPattern = new QRegExp("([\\w\\.]*@[\\w\\.]*)");
   10.85 +
   10.86 +        QString leftString = leftData.toString();
   10.87 +        if(left.column() == 1 && emailPattern->indexIn(leftString) != -1)
   10.88 +            leftString = emailPattern->cap(1);
   10.89 +
   10.90 +        QString rightString = rightData.toString();
   10.91 +        if(right.column() == 1 && emailPattern->indexIn(rightString) != -1)
   10.92 +            rightString = emailPattern->cap(1);
   10.93 +
   10.94 +        return QString::localeAwareCompare(leftString, rightString) < 0;
   10.95 +    }
   10.96 +}
   10.97 +bool MySortFilterProxyModel::dateInRange(const QDate &date) const
   10.98 +{
   10.99 +    return (!minDate.isValid() || date > minDate)
  10.100 +           && (!maxDate.isValid() || date < maxDate);
  10.101 +}
  10.102 +*/
    11.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    11.2 +++ b/mysortfilterproxymodel.h	Thu Sep 17 09:41:09 2009 +0000
    11.3 @@ -0,0 +1,70 @@
    11.4 +/****************************************************************************
    11.5 +**
    11.6 +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
    11.7 +** Contact: Qt Software Information (qt-info@nokia.com)
    11.8 +**
    11.9 +** This file is part of the example classes of the Qt Toolkit.
   11.10 +**
   11.11 +** Commercial Usage
   11.12 +** Licensees holding valid Qt Commercial licenses may use this file in
   11.13 +** accordance with the Qt Commercial License Agreement provided with the
   11.14 +** Software or, alternatively, in accordance with the terms contained in
   11.15 +** a written agreement between you and Nokia.
   11.16 +**
   11.17 +**
   11.18 +** GNU General Public License Usage
   11.19 +** Alternatively, this file may be used under the terms of the GNU
   11.20 +** General Public License versions 2.0 or 3.0 as published by the Free
   11.21 +** Software Foundation and appearing in the file LICENSE.GPL included in
   11.22 +** the packaging of this file.  Please review the following information
   11.23 +** to ensure GNU General Public Licensing requirements will be met:
   11.24 +** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
   11.25 +** http://www.gnu.org/copyleft/gpl.html.  In addition, as a special
   11.26 +** exception, Nokia gives you certain additional rights. These rights
   11.27 +** are described in the Nokia Qt GPL Exception version 1.3, included in
   11.28 +** the file GPL_EXCEPTION.txt in this package.
   11.29 +**
   11.30 +** Qt for Windows(R) Licensees
   11.31 +** As a special exception, Nokia, as the sole copyright holder for Qt
   11.32 +** Designer, grants users of the Qt/Eclipse Integration plug-in the
   11.33 +** right for the Qt/Eclipse Integration to link to functionality
   11.34 +** provided by Qt Designer and its related libraries.
   11.35 +**
   11.36 +** If you are unsure which license is appropriate for your use, please
   11.37 +** contact the sales department at qt-sales@nokia.com.
   11.38 +**
   11.39 +****************************************************************************/
   11.40 +
   11.41 +#ifndef MYSORTFILTERPROXYMODEL_H
   11.42 +#define MYSORTFILTERPROXYMODEL_H
   11.43 +
   11.44 +#include <QDate>
   11.45 +#include <QSortFilterProxyModel>
   11.46 +
   11.47 +//! [0]
   11.48 +class MySortFilterProxyModel : public QSortFilterProxyModel
   11.49 +{
   11.50 +    Q_OBJECT
   11.51 +
   11.52 +public:
   11.53 +    MySortFilterProxyModel(QObject *parent = 0);
   11.54 +
   11.55 + //   QDate filterMinimumDate() const { return minDate; }
   11.56 +//    void setFilterMinimumDate(const QDate &date);
   11.57 +
   11.58 +//    QDate filterMaximumDate() const { return maxDate; }
   11.59 +//    void setFilterMaximumDate(const QDate &date);
   11.60 +
   11.61 +protected:
   11.62 +    bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const;
   11.63 +//    bool lessThan(const QModelIndex &left, const QModelIndex &right) const;
   11.64 +
   11.65 +private:
   11.66 +    bool dateInRange(const QDate &date) const;
   11.67 +
   11.68 +    QDate minDate;
   11.69 +    QDate maxDate;
   11.70 +};
   11.71 +//! [0]
   11.72 +
   11.73 +#endif
    12.1 --- a/treeitem.cpp	Fri Sep 11 12:56:15 2009 +0000
    12.2 +++ b/treeitem.cpp	Thu Sep 17 09:41:09 2009 +0000
    12.3 @@ -175,18 +175,6 @@
    12.4  	}
    12.5  }
    12.6  
    12.7 -/*
    12.8 -void TreeItem::clear()	// FIXME-2 used in vymmodel addMapInsert, but needs to be used via model and emit layout changes...
    12.9 -{
   12.10 -	cout << "TI::clear\n";
   12.11 -	while ( childItems.size()>0)
   12.12 -	{
   12.13 -		branchCounter--;
   12.14 -		childItems.removeAt (0);
   12.15 -	}
   12.16 -}
   12.17 -*/
   12.18 -
   12.19  TreeItem *TreeItem::child(int row)
   12.20  {
   12.21      return childItems.value(row);
    13.1 --- a/treeitem.h	Fri Sep 11 12:56:15 2009 +0000
    13.2 +++ b/treeitem.h	Thu Sep 17 09:41:09 2009 +0000
    13.3 @@ -41,7 +41,6 @@
    13.4  
    13.5      virtual void appendChild (TreeItem *child);
    13.6  	virtual void removeChild (int row);
    13.7 -//	virtual void clear();
    13.8  
    13.9      virtual TreeItem *child(int row);
   13.10      virtual int childCount() const;
    14.1 --- a/treemodel.cpp	Fri Sep 11 12:56:15 2009 +0000
    14.2 +++ b/treemodel.cpp	Thu Sep 17 09:41:09 2009 +0000
    14.3 @@ -235,36 +235,12 @@
    14.4  		pi=rootItem;
    14.5  	TreeItem *ti;
    14.6  
    14.7 -	cout << "TM::removeRows  pi="<<pi<<"  row="<<row<<"  count="<<count<<endl;
    14.8 +	//cout << "TM::removeRows  pi="<<pi<<"  row="<<row<<"  count="<<count<<endl;
    14.9  	for (int i=row; i<=last; i++)
   14.10  	{
   14.11  		ti=pi->getChildNum (row);
   14.12 -		cout << "   pi="<<pi<<"  ti="<<ti<<endl;
   14.13  		pi->removeChild (row);	// does not delete object!
   14.14  		delete ti;
   14.15 -		/* FIXME-3
   14.16 -		switch (ti->getType()) 
   14.17 -		{
   14.18 -			case TreeItem::MapCenter: 
   14.19 -				delete (BranchItem*)ti; 
   14.20 -				break;
   14.21 -			case TreeItem::Branch:
   14.22 -				delete (BranchItem*)ti; 
   14.23 -				break;
   14.24 -			case TreeItem::Image:
   14.25 -				delete (ImageItem*)ti; 
   14.26 -				break;
   14.27 -			case TreeItem::Attribute:
   14.28 -				delete (AttributeItem*)ti; 
   14.29 -				break;
   14.30 -			case TreeItem::XLink:
   14.31 -				delete (XLinkItem*)ti; 
   14.32 -				break;
   14.33 -			default:
   14.34 -				delete ti;
   14.35 -				break;
   14.36 -		}
   14.37 -		*/
   14.38  	}
   14.39  	return true;
   14.40  }
    15.1 --- a/vymmodel.cpp	Fri Sep 11 12:56:15 2009 +0000
    15.2 +++ b/vymmodel.cpp	Thu Sep 17 09:41:09 2009 +0000
    15.3 @@ -640,7 +640,7 @@
    15.4  	return err;
    15.5  }
    15.6  
    15.7 -void VymModel::addMapReplaceInt(const QString &undoSel, const QString &path)	// FIXME-1 test e.g. with undo color subtree
    15.8 +void VymModel::addMapReplaceInt(const QString &undoSel, const QString &path)	
    15.9  {
   15.10  	QString pathDir=path.left(path.findRev("/"));
   15.11  	QDir d(pathDir);
   15.12 @@ -1077,7 +1077,6 @@
   15.13  
   15.14  
   15.15  	parseAtom (redoCommand);
   15.16 -	reposition();
   15.17  
   15.18  	blockSaveState=blockSaveStateOrg;
   15.19  
   15.20 @@ -1156,7 +1155,6 @@
   15.21  		cout << "    ---------------------------"<<endl<<endl;
   15.22  	}	
   15.23  	parseAtom (undoCommand);
   15.24 -	reposition();
   15.25  
   15.26  	undosAvail--;
   15.27  	curStep--; 
   15.28 @@ -1180,7 +1178,7 @@
   15.29  
   15.30  	mainWindow->updateHistory (undoSet);
   15.31  	updateActions();
   15.32 -	emitSelectionChanged();
   15.33 +	//emitSelectionChanged();
   15.34  }
   15.35  
   15.36  bool VymModel::isUndoAvailable()
   15.37 @@ -1439,7 +1437,7 @@
   15.38  	return  ti;
   15.39  }
   15.40  
   15.41 -TreeItem* VymModel::findID (const QString &s)
   15.42 +TreeItem* VymModel::findID (const QString &s)	//FIXME-4 Search also other types...
   15.43  {
   15.44  	BranchItem *cur=NULL;
   15.45  	BranchItem *prev=NULL;
   15.46 @@ -1602,9 +1600,7 @@
   15.47  
   15.48  void VymModel::setScene (QGraphicsScene *s)
   15.49  {
   15.50 -	mapScene=s;	// FIXME-2 VM should not be necessary anymore, move all occurences to MapEditor
   15.51 -    //init();	// Here we have a mapScene set, 
   15.52 -			// which is (still) needed to create MapCenters
   15.53 +	mapScene=s;	
   15.54  }
   15.55  
   15.56  void VymModel::setURL(const QString &url) 
   15.57 @@ -1918,47 +1914,80 @@
   15.58  	}
   15.59  }
   15.60  
   15.61 -void VymModel::moveUp()	//FIXME-2 crashes if trying to move MCO
   15.62 +bool VymModel::moveUp(BranchItem *bi)	//FIXME-2 crashes if trying to move MCO
   15.63 +{
   15.64 +	if (bi && bi->canMoveUp()) 
   15.65 +		return relinkBranch (bi,(BranchItem*)bi->parent(),bi->num()-1);
   15.66 +	else	
   15.67 +		return false;
   15.68 +}
   15.69 +
   15.70 +void VymModel::moveUp()	
   15.71  {
   15.72  	BranchItem *selbi=getSelectedBranch();
   15.73  	if (selbi)
   15.74  	{
   15.75 -		if (!selbi->canMoveUp()) return;
   15.76  		QString oldsel=getSelectString();
   15.77 -		if (relinkBranch (selbi,(BranchItem*)selbi->parent(),selbi->num()-1) )
   15.78 -
   15.79 -			saveState (getSelectString(),"moveDown ()",oldsel,"moveUp ()",QString("Move up %1").arg(getObjectName(selbi)));
   15.80 +		if (moveUp (selbi))
   15.81 +			saveState (
   15.82 +				getSelectString(),"moveDown ()",
   15.83 +				oldsel,"moveUp ()",
   15.84 +				QString("Move up %1").arg(getObjectName(selbi)));
   15.85  	}
   15.86  }
   15.87  
   15.88 +bool VymModel::moveDown(BranchItem *bi)	
   15.89 +{
   15.90 +	if (bi && bi->canMoveDown())
   15.91 +		return relinkBranch (bi,(BranchItem*)bi->parent(),bi->num()+1);
   15.92 +	else
   15.93 +		return false;
   15.94 +}
   15.95 +
   15.96  void VymModel::moveDown()	
   15.97  {
   15.98  	BranchItem *selbi=getSelectedBranch();
   15.99  	if (selbi)
  15.100  	{
  15.101 -		if (!selbi->canMoveDown()) return;
  15.102  		QString oldsel=getSelectString();
  15.103 -		if ( relinkBranch (selbi,(BranchItem*)selbi->parent(),selbi->num()+1) )
  15.104 -
  15.105 -			saveState (getSelectString(),"moveUp ()",oldsel,"moveDown ()",QString("Move down %1").arg(getObjectName(selbi)));
  15.106 +		if ( moveDown(selbi))
  15.107 +			saveState (
  15.108 +				getSelectString(),"moveUp ()",
  15.109 +				oldsel,"moveDown ()",
  15.110 +				QString("Move down %1").arg(getObjectName(selbi)));
  15.111  	}
  15.112  }
  15.113  
  15.114 -void VymModel::sortChildren()	// FIXME-2 not implemented yet
  15.115 -{
  15.116 -/*
  15.117 -	BranchObj* bo=getSelectedBranch();
  15.118 -	if (bo)
  15.119 +void VymModel::detach()	
  15.120 +{
  15.121 +	BranchItem *selbi=getSelectedBranch();
  15.122 +	if (selbi && selbi->depth()>0)
  15.123  	{
  15.124 -		if(treeItem->branchCount()>1)
  15.125 +		//QString oldsel=getSelectString();
  15.126 +		if ( relinkBranch (selbi,rootItem,-1) )
  15.127 +			saveState (
  15.128 +				selbi,QString("relink()"), //FIXME-1 add paramters
  15.129 +				selbi,"detach ()",
  15.130 +				QString("Detach %1").arg(getObjectName(selbi))
  15.131 +			);
  15.132 +	}
  15.133 +}
  15.134 +
  15.135 +void VymModel::sortChildren()
  15.136 +{
  15.137 +	BranchItem* selbi=getSelectedBranch();
  15.138 +	if (selbi)
  15.139 +	{
  15.140 +		if(selbi->branchCount()>1)
  15.141  		{
  15.142 -			saveStateChangingPart(bo,bo, "sortChildren ()",QString("Sort children of %1").arg(getObjectName(bo)));
  15.143 -			bo->sortChildren();
  15.144 +			saveStateChangingPart(
  15.145 +				selbi,selbi, "sortChildren ()",
  15.146 +				QString("Sort children of %1").arg(getObjectName(selbi)));
  15.147 +			selbi->sortChildren();
  15.148  			reposition();
  15.149  			emitShowSelection();
  15.150  		}
  15.151  	}
  15.152 -*/
  15.153  }
  15.154  
  15.155  BranchItem* VymModel::createMapCenter()
  15.156 @@ -2437,7 +2466,6 @@
  15.157  
  15.158  TreeItem* VymModel::deleteItem (TreeItem *ti)
  15.159  {
  15.160 -	cout << "VM::deleteItem "<<ti<<"  "<<getSelectString(ti).toStdString()<<endl;
  15.161  	if (ti)
  15.162  	{
  15.163  		TreeItem *pi=ti->parent();
  15.164 @@ -2457,6 +2485,29 @@
  15.165  	return NULL;
  15.166  }
  15.167  
  15.168 +void VymModel::clearItem (TreeItem *ti)
  15.169 +{
  15.170 +	if (ti)
  15.171 +	{
  15.172 +		QModelIndex parentIndex=index(ti);
  15.173 +		if (!parentIndex.isValid()) return;
  15.174 +
  15.175 +		int n=ti->childCount();
  15.176 +		if (n==0) return;
  15.177 +
  15.178 +		emit (layoutAboutToBeChanged() );
  15.179 +
  15.180 +		beginRemoveRows (parentIndex,0,n-1);
  15.181 +		removeRows (0,n,parentIndex);
  15.182 +		endRemoveRows();
  15.183 +		reposition();
  15.184 +
  15.185 +		emit (layoutChanged() );
  15.186 +
  15.187 +	}	
  15.188 +	return ;
  15.189 +}
  15.190 +
  15.191  bool VymModel::scrollBranch(BranchItem *bi)
  15.192  {
  15.193  	if (bi)	
  15.194 @@ -2478,7 +2529,7 @@
  15.195  			);
  15.196  			emitDataHasChanged(bi);
  15.197  			emitSelectionChanged();
  15.198 -			mapScene->update(); //Needed for _quick_ update,  even in 1.13.x //FIXME-3 force update via signal...
  15.199 +			mapScene->update(); //Needed for _quick_ update,  even in 1.13.x 
  15.200  			return true;
  15.201  		}
  15.202  	}	
  15.203 @@ -2492,7 +2543,9 @@
  15.204  		if (!bi->isScrolled()) return false;
  15.205  		if (bi->branchCount()==0) return false;
  15.206  		if (bi->depth()==0) return false;
  15.207 -
  15.208 +		if (bi->toggleScroll())
  15.209 +		{
  15.210 +			reposition();
  15.211  		QString u,r;
  15.212  		u="scroll";
  15.213  		r="unscroll";
  15.214 @@ -2503,13 +2556,12 @@
  15.215  			QString ("%1 ()").arg(r),
  15.216  			QString ("%1 %2").arg(r).arg(getObjectName(bi))
  15.217  		);
  15.218 -		bi->toggleScroll();
  15.219  		emitDataHasChanged(bi);
  15.220  		emitSelectionChanged();
  15.221 -
  15.222 -		mapScene->update(); //Needed for _quick_ update,  even in 1.13.x //FIXME-3 force update via signal...
  15.223 +			mapScene->update(); //Needed for _quick_ update,  even in 1.13.x 
  15.224  		return true;
  15.225  	}	
  15.226 +	}	
  15.227  	return false;
  15.228  }
  15.229  
  15.230 @@ -2523,24 +2575,34 @@
  15.231  		else
  15.232  			scrollBranch (bi);
  15.233  	}
  15.234 -	// saveState is called in above functions
  15.235 +	// saveState & reposition are called in above functions
  15.236  }
  15.237  
  15.238 -void VymModel::unscrollChildren() 	// FIXME-2	first, next moved to vymmodel
  15.239 -
  15.240 -{
  15.241 -/*
  15.242 -	BranchObj *bo=getSelectedBranch();
  15.243 -	if (bo)
  15.244 +void VymModel::unscrollChildren() 	//FIXME-2 does not update flag yet, possible segfault
  15.245 +{
  15.246 +	BranchItem *selbi=getSelectedBranch();
  15.247 +	BranchItem *prev=NULL;
  15.248 +	BranchItem *cur=selbi;
  15.249 +	if (selbi)
  15.250  	{
  15.251 -		bo->first();
  15.252 -		while (bo) 
  15.253 +		saveStateChangingPart(
  15.254 +			selbi,
  15.255 +			selbi,
  15.256 +			QString ("unscrollChildren ()"),
  15.257 +			QString ("unscroll all children of %1").arg(getObjectName(selbi))
  15.258 +		);	
  15.259 +		while (cur) 
  15.260  		{
  15.261 -			if (bo->isScrolled()) unscrollBranch (bo);
  15.262 -			bo=bo->next();
  15.263 +			if (cur->isScrolled())
  15.264 +			{
  15.265 +				cur->toggleScroll(); 
  15.266 +				emitDataHasChanged (cur);
  15.267  		}
  15.268 +			cur=next (cur,prev,selbi);
  15.269 +		}	
  15.270 +		updateActions();
  15.271 +		reposition();
  15.272  	}	
  15.273 -*/	
  15.274  }
  15.275  
  15.276  void VymModel::emitExpandAll()
  15.277 @@ -2606,6 +2668,7 @@
  15.278  			QString("Set color of %1 to %2").arg(getObjectName(selbi)).arg(c.name())
  15.279  		);	
  15.280  		selbi->setHeadingColor(c); // color branch
  15.281 +		mapScene->update();
  15.282  	}
  15.283  }
  15.284  
  15.285 @@ -2627,7 +2690,7 @@
  15.286  			cur->setHeadingColor(c); // color links, color children
  15.287  			cur=next (cur,prev,selbi);
  15.288  		}	
  15.289 -
  15.290 +	mapScene->update();
  15.291  	}
  15.292  }
  15.293  
  15.294 @@ -4057,82 +4120,16 @@
  15.295  	*/
  15.296  }
  15.297  
  15.298 -void VymModel::reposition()	//FIXME-3 VM should have no need to reposition, this is done in views???
  15.299 +void VymModel::reposition()	//FIXME-4 VM should have no need to reposition, but the views...
  15.300  {
  15.301  	//cout << "VM::reposition blocked="<<blockReposition<<endl;
  15.302  	if (blockReposition) return;
  15.303  
  15.304  	for (int i=0;i<rootItem->branchCount(); i++)
  15.305  		rootItem->getBranchObjNum(i)->reposition();	//	for positioning heading
  15.306 -	emitSelectionChanged();	
  15.307 +	//emitSelectionChanged();	
  15.308  }
  15.309  
  15.310 -/*
  15.311 -QPolygonF VymModel::shape(BranchObj *bo)	//FIXME-4
  15.312 -{
  15.313 -	return QPolygonF ();
  15.314 -	// Creating (arbitrary) shapes
  15.315 -
  15.316 -	QPolygonF p;
  15.317 -	QRectF rb=bo->getBBox();
  15.318 -	if (bo->getDepth()==0)
  15.319 -	{
  15.320 -		// Just take BBox of this mapCenter
  15.321 -		p<<rb.topLeft()<<rb.topRight()<<rb.bottomRight()<<rb.bottomLeft();
  15.322 -		return p;
  15.323 -	}
  15.324 -
  15.325 -	// Take union of BBox and TotalBBox 
  15.326 -
  15.327 -	QRectF ra=bo->getTotalBBox();
  15.328 -	if (bo->getOrientation()==LinkableMapObj::LeftOfCenter)
  15.329 -		p   <<ra.bottomLeft()
  15.330 -			<<ra.topLeft()
  15.331 -			<<QPointF (rb.topLeft().x(), ra.topLeft().y() )
  15.332 -			<<rb.topRight()
  15.333 -			<<rb.bottomRight()
  15.334 -			<<QPointF (rb.bottomLeft().x(), ra.bottomLeft().y() ) ;
  15.335 -	else		
  15.336 -		p   <<ra.bottomRight()
  15.337 -			<<ra.topRight()
  15.338 -			<<QPointF (rb.topRight().x(), ra.topRight().y() )
  15.339 -			<<rb.topLeft()
  15.340 -			<<rb.bottomLeft()
  15.341 -			<<QPointF (rb.bottomRight().x(), ra.bottomRight().y() ) ;
  15.342 -	return p;		
  15.343 -}
  15.344 -*/
  15.345 -
  15.346 -/*
  15.347 -void VymModel::moveAway(LinkableMapObj *lmo)	//FIXME-5
  15.348 -{
  15.349 -	// Autolayout:
  15.350 -	//
  15.351 -	// Move all branches and MapCenters away from lmo 
  15.352 -	// to avoid collisions 
  15.353 -
  15.354 -	QPolygonF pA;
  15.355 -	QPolygonF pB;
  15.356 -
  15.357 -	BranchObj *boA=(BranchObj*)lmo;
  15.358 -	BranchObj *boB;
  15.359 -	for (int i=0; i<rootItem->branchCount(); i++)
  15.360 -	{
  15.361 -		boB=rootItem->getBranchNum(i);
  15.362 -		pA=shape (boA);
  15.363 -		pB=shape (boB);
  15.364 -		PolygonCollisionResult r = PolygonCollision(pA, pB, QPoint(0,0));
  15.365 -		cout <<"------->"
  15.366 -			<<"="<<r.intersect
  15.367 -			<<"  ("<<qPrintable(boA->getHeading() )<<")"
  15.368 -			<<"  with ("<< qPrintable (boB->getHeading() )
  15.369 -			<<")  willIntersect"
  15.370 -			<<r.willIntersect 
  15.371 -			<<"  minT="<<r.minTranslation<<endl<<endl;
  15.372 -	}
  15.373 -}
  15.374 -*/
  15.375 -
  15.376  
  15.377  void VymModel::setMapLinkStyle (const QString & s)
  15.378  {
  15.379 @@ -4274,7 +4271,7 @@
  15.380  	}
  15.381  }	
  15.382  
  15.383 -void VymModel::setMapBackgroundImage (const QString &fn)	//FIXME-2 missing savestate, move to ME
  15.384 +void VymModel::setMapBackgroundImage (const QString &fn)	//FIXME-3 missing savestate, move to ME
  15.385  {
  15.386  	QColor oldcol=mapScene->backgroundBrush().color();
  15.387  	/*
  15.388 @@ -4753,24 +4750,6 @@
  15.389  }
  15.390  
  15.391  
  15.392 -//bool VymModel::selectInt (LinkableMapObj *lmo)	// FIXME-3 still needed?
  15.393 -/*
  15.394 -{
  15.395 -	if (selection.select(lmo))
  15.396 -	{
  15.397 -		//emitSelectionChanged();
  15.398 -	}
  15.399 -}
  15.400 -
  15.401 -bool VymModel::selectInt (TreeItem *ti)	
  15.402 -{
  15.403 -	if (selection.select(lmo))
  15.404 -	{
  15.405 -		//emitSelectionChanged();
  15.406 -	}
  15.407 -}
  15.408 -*/
  15.409 -
  15.410  bool VymModel::selectFirstBranch()
  15.411  {
  15.412  	TreeItem *ti=getSelectedBranch();
    16.1 --- a/vymmodel.h	Fri Sep 11 12:56:15 2009 +0000
    16.2 +++ b/vymmodel.h	Thu Sep 17 09:41:09 2009 +0000
    16.3 @@ -190,12 +190,6 @@
    16.4  		const QString &comment, 
    16.5  		TreeItem *saveSelection);
    16.6  	/*! Overloaded for convenience */
    16.7 -    void saveStateComplete(
    16.8 -		TreeItem *undoSelection, 
    16.9 -		TreeItem* redoSelection, 
   16.10 -		const QString &redoCommand, 
   16.11 -		const QString &comment);
   16.12 -	/*! Overloaded for convenience */
   16.13      void saveStateChangingPart(
   16.14  		TreeItem *undoSelection, 
   16.15  		TreeItem* redoSelection, 
   16.16 @@ -290,8 +284,11 @@
   16.17      void paste();			//!< Paste clipboard to branch and backup
   16.18      void cut();				//!< Cut to clipboard (and copy)
   16.19  
   16.20 -    void moveUp();			//!< Move branch up
   16.21 +    bool moveUp(BranchItem *bi);	//!< Move branch up without saving state
   16.22 +    void moveUp();					//!< Move branch up with saving state
   16.23 +    bool moveDown(BranchItem *bi);	//!< Move branch down without saving state
   16.24      void moveDown();		//!< Move branch down
   16.25 +	void detach();					//!< Detach branch and use as new mapcenter
   16.26  	void sortChildren();	//!< Sort children lexically
   16.27  
   16.28  	// The create methods are used to quickly parse a XML file
   16.29 @@ -347,6 +344,7 @@
   16.30  	void deleteChildren();				//!< keep branch, but remove children
   16.31  
   16.32  	TreeItem* deleteItem(TreeItem*);	//!< Delete item and return parent (if parent!= rootItem)
   16.33 +	void clearItem (TreeItem* ti);		//!< Remove all children of TreeItem ti
   16.34  	bool scrollBranch(BranchItem *);
   16.35  	bool unscrollBranch(BranchItem *);
   16.36  public:	
   16.37 @@ -441,9 +439,6 @@
   16.38  	void reposition();					//!< Call reposition for all MCOs
   16.39  	void setHideTmpMode (TreeItem::HideTmpMode mode);	
   16.40  
   16.41 -	//FIXME-5 QPolygonF shape(BranchObj *bo);		//!< Returns arbitrary shape of subtree
   16.42 -	//FIXME-5 void moveAway (LinkableMapObj *lmo);//!< Autolayout: Move all out of the way
   16.43 -
   16.44  	void emitNoteHasChanged (TreeItem *ti);
   16.45  	void emitDataHasChanged (TreeItem *ti);
   16.46  
   16.47 @@ -579,8 +574,6 @@
   16.48  signals:
   16.49  	void showSelection();
   16.50  
   16.51 -//	bool selectInt(LinkableMapObj*);	//FIXME-4
   16.52 -
   16.53  public:	
   16.54      bool selectFirstBranch();
   16.55      bool selectLastBranch();
    17.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    17.2 +++ b/xlinkitem.cpp	Thu Sep 17 09:41:09 2009 +0000
    17.3 @@ -0,0 +1,210 @@
    17.4 +#include <QGraphicsScene>
    17.5 +#include "xlinkitem.h"
    17.6 +
    17.7 +#include "branchitem.h"
    17.8 +#include "linkablemapobj.h"
    17.9 +#include "vymmodel.h"
   17.10 +#include "xlinkobj.h"
   17.11 +
   17.12 +#include <iostream>
   17.13 +using namespace std;
   17.14 +
   17.15 +/////////////////////////////////////////////////////////////////
   17.16 +// XLinkItem
   17.17 +/////////////////////////////////////////////////////////////////
   17.18 +
   17.19 +XLinkItem::XLinkItem (const QList<QVariant> &data, TreeItem *parent):MapItem (data,parent)
   17.20 +
   17.21 +{
   17.22 +	//cout << "Const XLinkItem () "<<this<<endl;
   17.23 +	init();
   17.24 +}
   17.25 +
   17.26 +XLinkItem::~XLinkItem ()
   17.27 +{
   17.28 +	cout << "Destr XLinkItem "<<this<<"  lmo="<<lmo<<endl;
   17.29 +	if (lmo){cout <<" calling delete\n"; delete (lmo);}
   17.30 +	if (partnerXLink)
   17.31 +	{
   17.32 +		// Also delete partner 
   17.33 +		cout << "  deleting partner="<<partnerXLink<<endl;
   17.34 +		partnerXLink->partnerXLink=NULL;	// avoid endless recusion
   17.35 +		model->deleteItem (partnerXLink);
   17.36 +	}
   17.37 +}
   17.38 +
   17.39 +
   17.40 +void XLinkItem::init () 
   17.41 +{
   17.42 +	setType (XLink);
   17.43 +	beginBranch=NULL;
   17.44 +	endBranch=NULL;
   17.45 +	partnerXLink=NULL;
   17.46 +	isBeginXLink=true;
   17.47 +	xLinkState=XLinkItem::undefinedXLink;
   17.48 +
   17.49 +	color=QColor (180,180,180);
   17.50 +	width=1;
   17.51 +}
   17.52 +
   17.53 +void XLinkItem::setBegin (BranchItem *bi)
   17.54 +{
   17.55 +	if (bi) 
   17.56 +	{
   17.57 +		xLinkState=initXLink;
   17.58 +		beginBranch=bi;
   17.59 +	}	
   17.60 +}
   17.61 +
   17.62 +BranchItem* XLinkItem::getBegin ()
   17.63 +{
   17.64 +	return beginBranch;
   17.65 +}
   17.66 +
   17.67 +void XLinkItem::setEnd (BranchItem *bi)
   17.68 +{
   17.69 +	if (bi) 
   17.70 +	{
   17.71 +		xLinkState=initXLink;
   17.72 +		endBranch=bi;
   17.73 +	}		
   17.74 +}
   17.75 +
   17.76 +BranchItem* XLinkItem::getEnd()
   17.77 +{
   17.78 +	return endBranch;
   17.79 +}
   17.80 +
   17.81 +void XLinkItem::setWidth (int w)
   17.82 +{
   17.83 +	if (isBeginXLink)
   17.84 +	{
   17.85 +		width=w;
   17.86 +		if (lmo) ((XLinkObj*)lmo)->updateXLink();
   17.87 +		return;
   17.88 +	}
   17.89 +	if (partnerXLink)
   17.90 +		partnerXLink->setWidth (w);
   17.91 +}
   17.92 +
   17.93 +int XLinkItem::getWidth()
   17.94 +{
   17.95 +	if (isBeginXLink) return width;
   17.96 +	if (partnerXLink)
   17.97 +		return partnerXLink->getWidth();
   17.98 +	else
   17.99 +		return -1;
  17.100 +}
  17.101 +
  17.102 +void XLinkItem::setColor(QColor c)
  17.103 +{
  17.104 +	if (isBeginXLink)
  17.105 +	{
  17.106 +		color=c;
  17.107 +		if (lmo) ((XLinkObj*)lmo)->updateXLink();
  17.108 +		return;
  17.109 +	}	
  17.110 +	if (partnerXLink)
  17.111 +		partnerXLink->setColor (c);
  17.112 +}
  17.113 +
  17.114 +QColor XLinkItem::getColor()
  17.115 +{
  17.116 +	if (isBeginXLink) return color;
  17.117 +	if (partnerXLink)
  17.118 +		return partnerXLink->getColor();
  17.119 +	else
  17.120 +		return QColor();
  17.121 +}
  17.122 +
  17.123 +void XLinkItem::setEnd (QPointF p)
  17.124 +{
  17.125 +	if (lmo) ((XLinkObj*)lmo)->setEnd (p);
  17.126 +}
  17.127 +
  17.128 +bool XLinkItem::activate ()	
  17.129 +{
  17.130 +	if (beginBranch && endBranch)
  17.131 +	{
  17.132 +		if (beginBranch==endBranch) return false;
  17.133 +
  17.134 +		partnerXLink=model->createXLink (endBranch);
  17.135 +		partnerXLink->setBegin (beginBranch);
  17.136 +		partnerXLink->setEnd (endBranch);
  17.137 +		partnerXLink->partnerXLink=this;
  17.138 +		partnerXLink->isBeginXLink=false;
  17.139 +
  17.140 +		xLinkState=activeXLink;
  17.141 +		partnerXLink->xLinkState=activeXLink;
  17.142 +		partnerXLink->setHeading ("xLink to: "+beginBranch->getHeading());
  17.143 +		setHeading ("xLink to: "+endBranch->getHeading());
  17.144 +
  17.145 +		model->updateActions();
  17.146 +		return true;
  17.147 +	} else
  17.148 +		return false;
  17.149 +}
  17.150 +
  17.151 +bool XLinkItem::isBegin()
  17.152 +{
  17.153 +	return isBeginXLink;
  17.154 +}
  17.155 +
  17.156 +void XLinkItem::updateXLink()
  17.157 +{
  17.158 +	if(lmo && isBeginXLink) 
  17.159 +		((XLinkObj*)lmo)->updateXLink();
  17.160 +	else 
  17.161 +		if (partnerXLink) partnerXLink->updateXLink();
  17.162 +}
  17.163 +
  17.164 +void XLinkItem::updateVisibility()
  17.165 +{
  17.166 +	if (lmo) lmo->updateVisibility();
  17.167 +}
  17.168 +
  17.169 +BranchItem* XLinkItem::getPartnerBranch()
  17.170 +{
  17.171 +	if (!beginBranch && !endBranch)
  17.172 +		return NULL;
  17.173 +	if (isBeginXLink)
  17.174 +		return endBranch;
  17.175 +	else	
  17.176 +		return beginBranch;
  17.177 +}
  17.178 +
  17.179 +
  17.180 +XLinkItem* XLinkItem::getPartnerXLink()
  17.181 +{
  17.182 +	return partnerXLink;
  17.183 +}
  17.184 +
  17.185 +
  17.186 +QString XLinkItem::saveToDir ()
  17.187 +{
  17.188 +	QString s="";
  17.189 +	if (beginBranch && endBranch && xLinkState==activeXLink)
  17.190 +	{
  17.191 +		if (beginBranch==endBranch )
  17.192 +			qWarning ("XLI::saveToDir  beginBranch==endBranch"); //FIXME-3	s=""
  17.193 +		else
  17.194 +		{
  17.195 +			QString colAttr=attribut ("color",color.name());
  17.196 +			QString widAttr=attribut ("width",QString().setNum(width,10));
  17.197 +			QString begSelAttr=attribut ("beginID",model->getSelectString(beginBranch));
  17.198 +			QString endSelAttr=attribut ("endID",  model->getSelectString(endBranch));
  17.199 +			s=beginElement ("xlink", colAttr +widAttr +begSelAttr +endSelAttr);
  17.200 +
  17.201 +			s+=endElement ("xlink");
  17.202 +		}
  17.203 +	}
  17.204 +	return s;
  17.205 +}
  17.206 +
  17.207 +XLinkObj* XLinkItem::createMapObj(QGraphicsScene *scene)  
  17.208 +{
  17.209 +	XLinkObj* xlo=new XLinkObj (scene,this);
  17.210 +	lmo=(LinkableMapObj*)xlo;
  17.211 +	return xlo;
  17.212 +}
  17.213 +
    18.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    18.2 +++ b/xlinkitem.h	Thu Sep 17 09:41:09 2009 +0000
    18.3 @@ -0,0 +1,48 @@
    18.4 +#ifndef XLINKITEM_H
    18.5 +#define XLINKITEM_H
    18.6 +
    18.7 +class BranchItem;
    18.8 +class XLinkObj;
    18.9 +class QGraphicsScene;
   18.10 +
   18.11 +#include "mapitem.h"
   18.12 +
   18.13 +/*! \brief xlinks are used to draw arbitrary connections between branches (BranchObj) in the map. */
   18.14 +
   18.15 +/////////////////////////////////////////////////////////////////////////////
   18.16 +class XLinkItem:public MapItem {
   18.17 +public:
   18.18 +	enum XLinkState {undefinedXLink,initXLink,activeXLink,deleteXLink};	
   18.19 +
   18.20 +	XLinkItem (const QList<QVariant> &data, TreeItem *parent=NULL);
   18.21 +    virtual ~XLinkItem ();
   18.22 +    virtual void init ();
   18.23 +	void setBegin (BranchItem*);
   18.24 +	BranchItem* getBegin();
   18.25 +	void setEnd   (BranchItem*);
   18.26 +	void setEnd   (QPointF);
   18.27 +	BranchItem* getEnd();
   18.28 +	void setColor(QColor);
   18.29 +	QColor getColor();
   18.30 +	void setWidth (int);
   18.31 +	int getWidth ();
   18.32 +	bool activate ();			//! Creates a 2nd XLink (without a XLinkObj attached) 
   18.33 +	bool isBegin();		//! true, if this is master xLink, which may have an XLinkObj attached
   18.34 +	void updateXLink();
   18.35 +	virtual void updateVisibility();	// FIXME-3 not really needed atm...
   18.36 +	BranchItem* getPartnerBranch ();
   18.37 +	XLinkItem *getPartnerXLink();	//! Partner XLink
   18.38 +	QString saveToDir ();
   18.39 +	virtual XLinkObj* createMapObj(QGraphicsScene *scene);
   18.40 +
   18.41 +private:
   18.42 +	XLinkState xLinkState;	// init during drawing or active
   18.43 +	QColor color;
   18.44 +	int width;
   18.45 +	BranchItem *beginBranch;
   18.46 +	BranchItem *endBranch;
   18.47 +	XLinkItem *partnerXLink;
   18.48 +	bool isBeginXLink;
   18.49 +};
   18.50 +
   18.51 +#endif
    19.1 --- a/xml-vym.cpp	Fri Sep 11 12:56:15 2009 +0000
    19.2 +++ b/xml-vym.cpp	Thu Sep 17 09:41:09 2009 +0000
    19.3 @@ -14,8 +14,6 @@
    19.4  #include "version.h"
    19.5  #include "xlinkitem.h"
    19.6  
    19.7 -static ImageItem *lastImageItem;
    19.8 -static MapItem *lastMI;
    19.9  
   19.10  extern Main *mainWindow;
   19.11  extern Settings settings;
   19.12 @@ -145,7 +143,8 @@
   19.13  		{
   19.14  			// Treat the found mapcenter as a branch 
   19.15  			// in an existing map
   19.16 -			BranchItem *bi=model->getSelectedBranch();	//FIXME-2 selection is no longer used here... 
   19.17 +			BranchItem *bi=model->getSelectedBranch();	
   19.18 +			cout << "xml-vym  bi="<<bi->getHeadingStd()<<"  loadMode="<<loadMode<<endl;
   19.19  			if (bi)
   19.20  			{
   19.21  				lastBranch=bi;
   19.22 @@ -153,7 +152,7 @@
   19.23  				{
   19.24  					lastBranch=model->createBranch(lastBranch);
   19.25  				} //else
   19.26 -					//lastBranch->clear(); //FIXME-2 clear not really defined!
   19.27 +					model->clearItem(lastBranch); 
   19.28  			} else
   19.29  				// add mapCenter without parent
   19.30  				lastBranch=model->createMapCenter(); 
   19.31 @@ -190,9 +189,9 @@
   19.32  		if (!readImageAttr(atts)) return false;
   19.33  	} else if ( (eName == "branch"||eName=="floatimage") && state == StateMap) 
   19.34  	{
   19.35 -		// This is used in vymparts, which have no mapcenter!
   19.36 +		// This is used in vymparts, which have no mapcenter or for undo
   19.37  		isVymPart=true;
   19.38 -		TreeItem *ti=model->getSelectedItem();	//FIXME-3 selection is no longer used here...
   19.39 +		TreeItem *ti=model->getSelectedItem();
   19.40  		if (!ti)
   19.41  		{
   19.42  			// If a vym part is _loaded_ (not imported), 
   19.43 @@ -202,6 +201,7 @@
   19.44  			// FIXME-3 lmo=model->first()->getLMO();		
   19.45  			// Do we really have no MCO when loading?????
   19.46  			cout << "xml-vym aborted\n";
   19.47 +			return false;
   19.48  		}	
   19.49  		if (ti && ti->isBranchLikeType() )
   19.50  		{
   19.51 @@ -212,9 +212,8 @@
   19.52  				if (loadMode==ImportAdd)
   19.53  				{
   19.54  					lastBranch=model->createBranch(lastBranch);
   19.55 -					
   19.56  				} else
   19.57 -					//FIXME-2 lastBranch->clear();
   19.58 +					model->clearItem (lastBranch);
   19.59  				readBranchAttr (atts);
   19.60  			} else if (eName=="floatimage")
   19.61  			{
    20.1 --- a/xml-vym.h	Fri Sep 11 12:56:15 2009 +0000
    20.2 +++ b/xml-vym.h	Thu Sep 17 09:41:09 2009 +0000
    20.3 @@ -55,5 +55,6 @@
    20.4  
    20.5  	BranchItem* lastBranch;
    20.6  	ImageItem* lastImage;
    20.7 +	MapItem* lastMI;
    20.8  }; 
    20.9  #endif