1.1 --- a/adaptormodel.cpp Fri Apr 09 14:24:04 2010 +0000
1.2 +++ b/adaptormodel.cpp Wed Jun 09 13:14:08 2010 +0000
1.3 @@ -36,7 +36,7 @@
1.4 m_caption=newCaption;
1.5 }
1.6
1.7 -QDBusVariant AdaptorModel::query(const QString &query)
1.8 +QDBusVariant AdaptorModel::query(const QString &)
1.9 {
1.10 QString s;
1.11 if (model)
2.1 --- a/adaptormodel.h Fri Apr 09 14:24:04 2010 +0000
2.2 +++ b/adaptormodel.h Wed Jun 09 13:14:08 2010 +0000
2.3 @@ -27,7 +27,7 @@
2.4 QString caption();
2.5 void setCaption(const QString &newCaption);
2.6 public slots: // METHODS
2.7 - QDBusVariant query(const QString &query);
2.8 + QDBusVariant query(const QString &);
2.9 QDBusVariant getCurrentModelID();
2.10 QDBusVariant getHeading();
2.11 void setHeading (const QString &s);
3.1 --- a/animpoint.cpp Fri Apr 09 14:24:04 2010 +0000
3.2 +++ b/animpoint.cpp Wed Jun 09 13:14:08 2010 +0000
3.3 @@ -124,6 +124,13 @@
3.4 return animated;
3.5 }
3.6
3.7 +void AnimPoint::stop()
3.8 +{
3.9 + animated=false;
3.10 + setX (destPos.x());
3.11 + setY (destPos.y());
3.12 +}
3.13 +
3.14 void AnimPoint::initVector()
3.15 {
3.16 vector.setX (destPos.x()-startPos.x() );
4.1 --- a/animpoint.h Fri Apr 09 14:24:04 2010 +0000
4.2 +++ b/animpoint.h Wed Jun 09 13:14:08 2010 +0000
4.3 @@ -22,6 +22,7 @@
4.4 void setAnimated(bool);
4.5 bool isAnimated ();
4.6 bool animate();
4.7 + void stop();
4.8
4.9 private:
4.10 void initVector();
5.1 --- a/branchitem.cpp Fri Apr 09 14:24:04 2010 +0000
5.2 +++ b/branchitem.cpp Wed Jun 09 13:14:08 2010 +0000
5.3 @@ -1,13 +1,13 @@
5.4 +#include "branchitem.h"
5.5 +
5.6 #include "attributeitem.h"
5.7 -#include "branchitem.h"
5.8 #include "branchobj.h"
5.9 #include "vymmodel.h"
5.10 +#include "xlink.h"
5.11 #include "xlinkitem.h"
5.12
5.13 #include <QDir>
5.14
5.15 -using namespace std;
5.16 -
5.17 BranchItem::BranchItem(const QList<QVariant> &data, TreeItem *parent):MapItem (data,parent)
5.18 {
5.19 //qDebug()<< "Constr. BranchItem";
5.20 @@ -31,7 +31,7 @@
5.21
5.22 BranchItem::~BranchItem()
5.23 {
5.24 - qDebug()<< "Destr. BranchItem "<<getHeading();
5.25 + //qDebug()<< "Destr. BranchItem this="<<this<<" "<<getHeading();
5.26 if (lmo)
5.27 {
5.28 delete lmo;
5.29 @@ -69,7 +69,7 @@
5.30 branchCounter++;
5.31 }
5.32
5.33 -QString BranchItem::saveToDir (const QString &tmpdir,const QString &prefix, const QPointF& offset) //FIXME-3 Check if everything is saved...
5.34 +QString BranchItem::saveToDir (const QString &tmpdir,const QString &prefix, const QPointF& offset, QList <Link*> &tmpLinks ) //FIXME-3 Check if everything is saved...
5.35 {
5.36 // Cloudy stuff can be hidden during exports
5.37 if (hidden) return QString();
5.38 @@ -140,27 +140,15 @@
5.39 TreeItem *ti=getBranchNum(i);
5.40 while (ti)
5.41 {
5.42 - s+=getBranchNum(i)->saveToDir(tmpdir,prefix,offset);
5.43 + s+=getBranchNum(i)->saveToDir(tmpdir,prefix,offset,tmpLinks);
5.44 i++;
5.45 ti=getBranchNum(i);
5.46 }
5.47
5.48 - // Save XLinks
5.49 - QString ol; // old link
5.50 - QString cl; // current link
5.51 + // Mark Links for save
5.52 for (int i=0; i<xlinkCount(); ++i)
5.53 - {
5.54 - cl=getXLinkNum(i)->saveToDir();
5.55 - if (cl!=ol)
5.56 - {
5.57 - s+=cl;
5.58 - ol=cl;
5.59 - } else
5.60 - {
5.61 - qWarning (QString("BranchItem::saveToDir Ignoring of duplicate xLink in %1").arg(getHeading()));
5.62 - qWarning ()<<"this="<<this<< " i="<<i<<" "<<getXLinkNum(i)<<" "<<getXLinkNum(i-1);
5.63 - }
5.64 - }
5.65 + if (!tmpLinks.contains (getXLinkNum (i)->getLink() ))
5.66 + tmpLinks.append (getXLinkNum(i)->getLink() );
5.67
5.68 decIndent();
5.69 s+=endElement (elementName);
6.1 --- a/branchitem.h Fri Apr 09 14:24:04 2010 +0000
6.2 +++ b/branchitem.h Wed Jun 09 13:14:08 2010 +0000
6.3 @@ -2,11 +2,14 @@
6.4 #define BRANCHITEM_H
6.5
6.6 #include "mapitem.h"
6.7 +//#include "xlink.h"
6.8
6.9 +#include <QList>
6.10
6.11 class QString;
6.12 class QGraphicsScene;
6.13 class BranchObj;
6.14 +class Link;
6.15 class XLinkItem;
6.16
6.17 class BranchItem:public MapItem
6.18 @@ -19,7 +22,7 @@
6.19
6.20 virtual void insertBranch (int pos,BranchItem *branch);
6.21
6.22 - virtual QString saveToDir (const QString &tmpdir,const QString &prefix, const QPointF& offset);
6.23 + virtual QString saveToDir (const QString &tmpdir,const QString &prefix, const QPointF& offset,QList <Link*> &tmpLinks);
6.24
6.25 virtual void updateVisibility();
6.26
7.1 --- a/branchobj.cpp Fri Apr 09 14:24:04 2010 +0000
7.2 +++ b/branchobj.cpp Wed Jun 09 13:14:08 2010 +0000
7.3 @@ -29,7 +29,7 @@
7.4
7.5 BranchObj::~BranchObj ()
7.6 {
7.7 -// cout << "Destr BranchObj of "<<this<<" ("<<treeItem->getHeading().toStdString()<<")"<<endl;
7.8 + //qDebug()<< "Destr BranchObj of "<<this<<" ("<<treeItem->getHeading()<<")";
7.9
7.10 // If I'm animated, I need to un-animate myself first
7.11 if (anim.isAnimated() )
7.12 @@ -63,9 +63,6 @@
7.13 void BranchObj::clear()
7.14 {
7.15 //setVisibility (true); //FIXME-4 needed?
7.16 -
7.17 - while (!xlink.isEmpty())
7.18 - delete xlink.takeFirst();
7.19 }
7.20
7.21 void BranchObj::setParObjTmp(LinkableMapObj* dst, QPointF m, int off)
7.22 @@ -251,7 +248,7 @@
7.23 // set the frame
7.24 frame->setRect(QRectF(bbox.x(),bbox.y(),bbox.width(),bbox.height() ) );
7.25
7.26 - //Update links to other branches
7.27 + //Update links to other branches
7.28 XLinkObj *xlo;
7.29 for (int i=0; i<treeItem->xlinkCount(); ++i)
7.30 {
7.31 @@ -738,22 +735,24 @@
7.32 anim=ap;
7.33 }
7.34
7.35 +void BranchObj::stopAnimation()
7.36 +{
7.37 + anim.stop();
7.38 + if (useRelPos)
7.39 + setRelPos (anim);
7.40 + else
7.41 + move (anim);
7.42 +}
7.43 +
7.44 bool BranchObj::animate()
7.45 {
7.46 anim.animate ();
7.47 if ( anim.isAnimated() )
7.48 {
7.49 - //if (((MapItem*)treeItem)->getPositionMode()==MapItem::Relative)
7.50 if (useRelPos)
7.51 - {
7.52 setRelPos (anim);
7.53 - //cout<<"Animating rel "<<treeItem->getHeading().toStdString()<<" "<<anim<<" "<<anim.getStart()<<"->"<<anim.getDest()<<" "<<relPos<<endl;
7.54 - }
7.55 else
7.56 - {
7.57 move (anim);
7.58 - //cout<<"Animating abs "<<treeItem->getHeading().toStdString()<<" "<<anim<<" "<<anim.getStart()<<"->"<<anim.getDest()<<" "<<absPos<<endl;
7.59 - }
7.60 return true;
7.61 }
7.62 /*FIXME-3 reposition in BO:animate nearly never reached? needed?
8.1 --- a/branchobj.h Fri Apr 09 14:24:04 2010 +0000
8.2 +++ b/branchobj.h Wed Jun 09 13:14:08 2010 +0000
8.3 @@ -51,11 +51,10 @@
8.4 virtual void calcBBoxSizeWithChildren(); // calc size of BBox including children recursivly
8.5
8.6 virtual void setAnimation(const AnimPoint &ap);
8.7 + virtual void stopAnimation();
8.8 virtual bool animate();
8.9
8.10 protected:
8.11 - QList<XLinkObj*> xlink; // xlinks to other branches
8.12 -
8.13 AnimPoint anim;
8.14 };
8.15
9.1 --- a/editxlinkdialog.cpp Fri Apr 09 14:24:04 2010 +0000
9.2 +++ b/editxlinkdialog.cpp Wed Jun 09 13:14:08 2010 +0000
9.3 @@ -10,7 +10,7 @@
9.4 ui.setupUi (this);
9.5
9.6 delink=false;
9.7 - xli=NULL;
9.8 + link=NULL;
9.9 selbi=NULL;
9.10
9.11 connect ( ui.widthBox, SIGNAL (valueChanged( int)), this, SLOT (widthChanged (int)));
9.12 @@ -33,14 +33,14 @@
9.13
9.14 void EditXLinkDialog::widthChanged( int w)
9.15 {
9.16 - xli->setWidth(w);
9.17 + link->setWidth(w);
9.18 }
9.19
9.20 -void EditXLinkDialog::setXLink( XLinkItem * xi)
9.21 +void EditXLinkDialog::setLink( Link * l)
9.22 {
9.23 - xli=xi;
9.24 - ui.colorButton->setPaletteBackgroundColor (xli->getColor() );
9.25 - ui.widthBox->setValue(xli->getWidth());
9.26 + link=l;
9.27 + ui.colorButton->setPaletteBackgroundColor (link->getColor() );
9.28 + ui.widthBox->setValue(link->getWidth());
9.29 }
9.30
9.31 void EditXLinkDialog::setSelection(BranchItem *bi)
9.32 @@ -50,23 +50,23 @@
9.33
9.34 void EditXLinkDialog::colorButtonPressed()
9.35 {
9.36 - if (xli)
9.37 + if (link)
9.38 {
9.39 - QColor col = QColorDialog::getColor(xli->getColor(), this );
9.40 + QColor col = QColorDialog::getColor(link->getColor(), this );
9.41 if ( !col.isValid() ) return;
9.42 - xli->setColor( col );
9.43 + link->setColor( col );
9.44 ui.colorButton->setPaletteBackgroundColor (col);
9.45 }
9.46 }
9.47
9.48 void EditXLinkDialog::setColorHeadingButtonPressed()
9.49 {
9.50 - if (xli)
9.51 + if (link)
9.52 {
9.53 if (selbi)
9.54 {
9.55 QColor col=selbi->getHeadingColor();
9.56 - xli->setColor(col);
9.57 + link->setColor(col);
9.58 ui.colorButton->setPaletteBackgroundColor (col);
9.59 }
9.60 }
10.1 --- a/editxlinkdialog.h Fri Apr 09 14:24:04 2010 +0000
10.2 +++ b/editxlinkdialog.h Wed Jun 09 13:14:08 2010 +0000
10.3 @@ -17,7 +17,7 @@
10.4 Q_OBJECT
10.5 public:
10.6 EditXLinkDialog (QWidget *parent=0);
10.7 - void setXLink (XLinkItem *);
10.8 + void setLink (Link *);
10.9 void setSelection (BranchItem*);
10.10 bool useSettingsGlobal();
10.11 bool deleteXLink();
10.12 @@ -31,7 +31,7 @@
10.13 private:
10.14 Ui::EditXLinkDialog ui;
10.15 bool delink;
10.16 - XLinkItem *xli;
10.17 + Link *link;
10.18 BranchItem *selbi;
10.19 };
10.20
11.1 --- a/exports.cpp Fri Apr 09 14:24:04 2010 +0000
11.2 +++ b/exports.cpp Wed Jun 09 13:14:08 2010 +0000
11.3 @@ -156,6 +156,8 @@
11.4 // Main loop over all branches
11.5 QString s;
11.6 QString curIndent;
11.7 + QString dashIndent;
11.8 +
11.9 int i;
11.10 BranchItem *cur=NULL;
11.11 BranchItem *prev=NULL;
11.12 @@ -183,6 +185,8 @@
11.13 colString="[G]";
11.14 else
11.15 colString="[?]";
11.16 +
11.17 + dashIndent="";
11.18 switch (cur->depth())
11.19 {
11.20 case 0:
11.21 @@ -218,9 +222,14 @@
11.22 default:
11.23 ts << (curIndent + "- " + cur->getHeading());
11.24 ts << "\n";
11.25 + dashIndent=" ";
11.26 break;
11.27 }
11.28
11.29 + // If necessary, write URL
11.30 + if (!cur->getURL().isEmpty())
11.31 + ts << (curIndent + dashIndent + cur->getURL()) +"\n";
11.32 +
11.33 // If necessary, write note
11.34 if (!cur->getNoteObj().isEmpty())
11.35 {
11.36 @@ -263,6 +272,7 @@
11.37 // Main loop over all branches
11.38 QString s;
11.39 QString curIndent;
11.40 + QString dashIndent;
11.41 int i;
11.42 BranchItem *cur=NULL;
11.43 BranchItem *prev=NULL;
11.44 @@ -279,6 +289,8 @@
11.45 if (!cur->hasHiddenExportParent() )
11.46 {
11.47 //std::cout << "ExportASCII:: "<<curIndent.toStdString()<<cur->getHeading().toStdString()<<std::endl;
11.48 +
11.49 + dashIndent="";
11.50 switch (cur->depth())
11.51 {
11.52 case 0:
11.53 @@ -294,17 +306,24 @@
11.54 ts << "\n";
11.55 ts << (curIndent + "* " + cur->getHeading());
11.56 ts << "\n";
11.57 + dashIndent=" ";
11.58 break;
11.59 case 3:
11.60 ts << (curIndent + "- " + cur->getHeading());
11.61 ts << "\n";
11.62 + dashIndent=" ";
11.63 break;
11.64 default:
11.65 ts << (curIndent + "- " + cur->getHeading());
11.66 ts << "\n";
11.67 + dashIndent=" ";
11.68 break;
11.69 }
11.70
11.71 + // If necessary, write URL
11.72 + if (!cur->getURL().isEmpty())
11.73 + ts << (curIndent + dashIndent + cur->getURL()) +"\n";
11.74 +
11.75 // If necessary, write note
11.76 if (!cur->getNoteObj().isEmpty())
11.77 {
11.78 @@ -512,10 +531,11 @@
11.79 .arg(col)
11.80 .arg(id);
11.81 QString url=current->getURL();
11.82 + QString heading=quotemeta(current->getHeading());
11.83 if (!url.isEmpty())
11.84 {
11.85 s+=QString ("<a href=\"%1\">").arg(url);
11.86 - s+=QString ("<img src=\"flags/flag-url-16x16.png\">%1</a>").arg(quotemeta(current->getHeading()));
11.87 + s+=QString ("<img src=\"flags/flag-url-16x16.png\">%1</a>").arg(heading);
11.88 s+="</a>";
11.89
11.90 QRectF fbox=current->getBBoxURLFlag ();
11.91 @@ -664,7 +684,9 @@
11.92 model->setExportMode (true);
11.93
11.94 // Write header
11.95 - ts<<"<html><title>"+model->getMapName()<<"</title><body>";
11.96 + ts<<"<html>";
11.97 + ts<<"<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\"> ";
11.98 + ts<<"<title>"+model->getMapName()<<"</title><body>";
11.99 ts<<" <link rel='stylesheet' id='css.stylesheet' href='"<<cssFileName<<"' />\n";
11.100
11.101 // Include image
12.1 --- a/findresultitem.cpp Fri Apr 09 14:24:04 2010 +0000
12.2 +++ b/findresultitem.cpp Wed Jun 09 13:14:08 2010 +0000
12.3 @@ -11,7 +11,7 @@
12.4 orgID=-1;
12.5 orgIndex=-1;
12.6 orgModel=NULL;
12.7 - itemData.append(QVariant("empty"));
12.8 + if (data.isEmpty()) itemData.append(QVariant("empty"));
12.9 }
12.10
12.11 FindResultItem::~FindResultItem()
13.1 --- a/historywindow.cpp Fri Apr 09 14:24:04 2010 +0000
13.2 +++ b/historywindow.cpp Wed Jun 09 13:14:08 2010 +0000
13.3 @@ -155,6 +155,7 @@
13.4
13.5 void HistoryWindow::closeEvent (QCloseEvent *)
13.6 {
13.7 + hide();
13.8 emit (windowClosed() );
13.9 }
13.10
14.1 --- a/linkablemapobj.cpp Fri Apr 09 14:24:04 2010 +0000
14.2 +++ b/linkablemapobj.cpp Wed Jun 09 13:14:08 2010 +0000
14.3 @@ -32,8 +32,12 @@
14.4
14.5 LinkableMapObj::~LinkableMapObj()
14.6 {
14.7 - //cout << "Destructor LMO\n";
14.8 - delete (bottomline);
14.9 + //cout<< "Destructor LMO style="<<style<<" l="<<l<<" p="<<p<<" segment="<<segment.count()<<endl;
14.10 + if (bottomline)
14.11 + {
14.12 + delete (bottomline);
14.13 + bottomline=NULL;
14.14 + }
14.15 delLink();
14.16 }
14.17
15.1 --- a/main.cpp Fri Apr 09 14:24:04 2010 +0000
15.2 +++ b/main.cpp Wed Jun 09 13:14:08 2010 +0000
15.3 @@ -79,7 +79,6 @@
15.4 options.add ("run", Option::String, "r", "run");
15.5 options.add ("shortcuts", Option::Switch, "s", "shortcuts");
15.6 options.add ("shortcutsLaTeX", Option::Switch, "sl", "shortcutsLaTeX");
15.7 - options.add ("test", Option::String, "t", "test");
15.8 options.add ("version", Option::Switch, "v","version");
15.9 options.setHelpText (
15.10 "VYM - View Your Mind\n"
15.11 @@ -87,7 +86,19 @@
15.12 "Information about vym can be found in vym.pdf,\n"
15.13 "which should be part of the vym package.\n"
15.14 "It is also available at the project homepage:\n\n"
15.15 - "http://www.InSilmaril.de/vym\n");
15.16 + "http://www.InSilmaril.de/vym\n\n"
15.17 + "Usage: vym [OPTION]... [FILE]... \n"
15.18 + "Open FILEs with vym\n\n"
15.19 + "-d debug Show debugging output\n"
15.20 + "-h help Show this help text\n"
15.21 + "-l local Run with ressources in current directory\n"
15.22 + "-n STRING name Set name of instance for DBus access\n"
15.23 + "-q quit Quit immediatly after start for benchmarking\n"
15.24 + "-r FILE run Run script\n"
15.25 + "-s shortcuts Show Keyboard shortcuts on start\n"
15.26 + "-sl LaTeX Show Keyboard shortcuts in LaTeX format on start\n"
15.27 + "-v version Show vym version\n"
15.28 + );
15.29 if (options.parse())
15.30 {
15.31 cout << endl << qPrintable( options.getHelpText())<<endl;
15.32 @@ -98,7 +109,7 @@
15.33
15.34 if (options.isOn ("version"))
15.35 {
15.36 - cout << "VYM - View Your Mind (c) 2004-2009 Uwe Drechsel " << endl
15.37 + cout << "VYM - View Your Mind (c) 2004-2010 Uwe Drechsel " << endl
15.38 <<" Version: "<<__VYM_VERSION <<endl
15.39 <<"Build date: "<<__VYM_BUILD_DATE << endl
15.40 <<" "<<__VYM_CODENAME<<endl;
16.1 --- a/mainwindow.cpp Fri Apr 09 14:24:04 2010 +0000
16.2 +++ b/mainwindow.cpp Wed Jun 09 13:14:08 2010 +0000
16.3 @@ -720,7 +720,7 @@
16.4
16.5 a = new QAction(QPixmap(iconPath+"up.png" ), tr( "Move up","Edit menu" ), this);
16.6 a->setStatusTip ( tr( "Move branch up" ) );
16.7 - a->setShortcut (Qt::Key_PageUp ); // Move branch up //FIXME-2 If already on top, GraphicsView scrolls up, probably because this action is disabled?!
16.8 + a->setShortcut (Qt::Key_PageUp ); // Move branch up
16.9 a->setEnabled (false);
16.10 switchboard.addConnection(a,tr("Edit","Shortcut group"));
16.11 tb->addAction (a);
16.12 @@ -2001,7 +2001,7 @@
16.13 fileNew();
16.14 VymModel *dstModel=vymViews.last()->getModel();
16.15 dstModel->select("mc:");
16.16 - dstModel->load (clipboardDir+"/"+clipboardFile,ImportReplace, VymMap);
16.17 + dstModel->loadMap (clipboardDir+"/"+clipboardFile,ImportReplace);
16.18 }
16.19 }
16.20
16.21 @@ -2116,7 +2116,7 @@
16.22
16.23 // Finally load map into mapEditor
16.24 vm->setFilePath (fn);
16.25 - err=vm->load(fn,lmode,ftype);
16.26 + err=vm->loadMap(fn,lmode,true,ftype);
16.27
16.28 // Restore old (maybe empty) filepath, if this is an import
16.29 if (lmode!=NewMap)
16.30 @@ -2571,11 +2571,12 @@
16.31 }
16.32 }
16.33
16.34 -void Main::fileCloseMap()
16.35 +bool Main::fileCloseMap()
16.36 {
16.37 VymModel *m=currentModel();
16.38 if (m)
16.39 {
16.40 + //qDebug()<<"Main::fileCloseMap currentIndex="<<tabWidget->currentIndex();
16.41 if (m->hasChanged())
16.42 {
16.43 QMessageBox mb( vymName,
16.44 @@ -2586,6 +2587,9 @@
16.45 QMessageBox::Cancel | QMessageBox::Escape );
16.46 mb.setButtonText( QMessageBox::Yes, tr("Save modified map before closing it") );
16.47 mb.setButtonText( QMessageBox::No, tr("Discard changes"));
16.48 + mb.setModal (true);
16.49 + mb.show();
16.50 + mb.setActiveWindow();
16.51 switch( mb.exec() )
16.52 {
16.53 case QMessageBox::Yes:
16.54 @@ -2597,7 +2601,7 @@
16.55 break;
16.56 case QMessageBox::Cancel:
16.57 // do nothing
16.58 - return;
16.59 + return true;
16.60 }
16.61 }
16.62 // And here comes the segfault, because removeTab triggers
16.63 @@ -2609,7 +2613,9 @@
16.64 //delete (m->getMapEditor());
16.65
16.66 updateActions();
16.67 + return false;
16.68 }
16.69 + return true; // Better don't exit vym if there is no currentModel()...
16.70 }
16.71
16.72 void Main::filePrint()
16.73 @@ -2618,41 +2624,16 @@
16.74 currentMapEditor()->print();
16.75 }
16.76
16.77 -void Main::fileExitVYM()
16.78 +void Main::fileExitVYM()
16.79 {
16.80 // Check if one or more editors have changed
16.81 - int i;
16.82 - for (i=0;i<=vymViews.count() -1;i++)
16.83 + int i=0;
16.84 + while (vymViews.count()>0)
16.85 {
16.86 - // If something changed, ask what to do
16.87 - if (vymViews.at(i)->getModel()->hasChanged())
16.88 - {
16.89 - tabWidget->setCurrentPage(i);
16.90 - QMessageBox mb( vymName,
16.91 - tr("This map is not saved yet. Do you want to"),
16.92 - QMessageBox::Warning,
16.93 - QMessageBox::Yes | QMessageBox::Default,
16.94 - QMessageBox::No,
16.95 - QMessageBox::Cancel | QMessageBox::Escape );
16.96 - mb.setButtonText( QMessageBox::Yes, tr("Save map") );
16.97 - mb.setButtonText( QMessageBox::No, tr("Discard changes") );
16.98 - mb.setModal (true);
16.99 - mb.show();
16.100 - mb.setActiveWindow();
16.101 - switch( mb.exec() ) {
16.102 - case QMessageBox::Yes:
16.103 - // save (the changed editors) and exit
16.104 - fileSave(currentModel(), CompleteMap);
16.105 - break;
16.106 - case QMessageBox::No:
16.107 - // exit without saving
16.108 - break;
16.109 - case QMessageBox::Cancel:
16.110 - // don't save and don't exit
16.111 - return;
16.112 - }
16.113 - }
16.114 - } // loop over all MEs
16.115 + //qDebug()<<"Main::fileExitVym count="<<vymViews.count();
16.116 + tabWidget->setCurrentPage(i);
16.117 + if (fileCloseMap()) return;
16.118 + }
16.119 qApp->quit();
16.120 }
16.121
16.122 @@ -2784,12 +2765,6 @@
16.123 // Try to open new tab in existing konqueror started previously by vym
16.124 args.clear();
16.125
16.126 -/* On KDE3 use DCOP
16.127 - args<< QString("konqueror-%1").arg(procBrowser->pid())<<
16.128 - "konqueror-mainwindow#1"<<
16.129 - "newTab" <<
16.130 - urls.at(i);
16.131 -*/
16.132 args<< QString("org.kde.konqueror-%1").arg(*browserPID)<<
16.133 "/konqueror/MainWindow_1"<<
16.134 "newTab" <<
16.135 @@ -2837,7 +2812,7 @@
16.136 QString browser=settings.value("/mainwindow/readerURL" ).toString();
16.137 args<<url;
16.138 QString workDir=QDir::currentDirPath();
16.139 - if (!procBrowser->startDetached(browser,args))
16.140 + if (!QProcess::startDetached(browser,args))
16.141 {
16.142 // try to set path to browser
16.143 QMessageBox::warning(0,
16.144 @@ -3049,7 +3024,7 @@
16.145 m->nextBranch(cur,prev);
16.146 }
16.147
16.148 - stats+=QString ("%1 xLinks \n").arg (xl,6);
16.149 + stats+=QString ("%1 xLinks \n").arg (xl/2,6);
16.150 stats+=QString ("%1 notes\n").arg (n,6);
16.151 stats+=QString ("%1 images\n").arg (f,6);
16.152 stats+=QString ("%1 branches\n").arg (m->branchCount(),6);
16.153 @@ -3671,7 +3646,7 @@
16.154
16.155 void Main::updateActions()
16.156 {
16.157 - // updateActions is also called when satellites are closed //FIXME-2 doesn't update immediatly, e.g. historyWindow is still visible, when "close" is pressed
16.158 + // updateActions is also called when satellites are closed
16.159 actionViewToggleNoteEditor->setChecked (textEditor->isVisible());
16.160 actionViewToggleHistoryWindow->setChecked (historyWindow->isVisible());
16.161 actionViewTogglePropertyWindow->setChecked (branchPropertyWindow->isVisible());
17.1 --- a/mainwindow.h Fri Apr 09 14:24:04 2010 +0000
17.2 +++ b/mainwindow.h Wed Jun 09 13:14:08 2010 +0000
17.3 @@ -109,7 +109,7 @@
17.4 void fileExportKDE4Bookmarks();
17.5 void fileExportTaskjuggler();
17.6 void fileExportOOPresentation();
17.7 - void fileCloseMap();
17.8 + bool fileCloseMap();
17.9 void filePrint();
17.10 void fileExitVYM();
17.11
17.12 @@ -258,7 +258,6 @@
17.13
17.14 private:
17.15 QTabWidget *tabWidget;
17.16 - QProcess *procBrowser; //FIXME-2 remove this...
17.17 qint64 *browserPID;
17.18
17.19 QStringList imageTypes;
18.1 --- a/mapeditor.cpp Fri Apr 09 14:24:04 2010 +0000
18.2 +++ b/mapeditor.cpp Wed Jun 09 13:14:08 2010 +0000
18.3 @@ -125,7 +125,7 @@
18.4 selectionColor =QColor (255,255,0);
18.5
18.6
18.7 - // Attributes //FIXME-2 testing only...
18.8 + // Attributes //FIXME-3 testing only...
18.9 QString k;
18.10 AttributeDef *ad;
18.11 attrTable= new AttributeTable();
18.12 @@ -160,8 +160,7 @@
18.13
18.14 MapEditor::~MapEditor()
18.15 {
18.16 - //qDebug() <<"Destructor MapEditor for "<<model->getMapName();
18.17 - //model->unregisterEditor(this);
18.18 + //qDebug ()<<"Destr MapEditor this="<<this;
18.19 }
18.20
18.21 VymModel* MapEditor::getModel()
18.22 @@ -1070,28 +1069,20 @@
18.23 if ((lmo->getOrientation()!=LinkableMapObj::RightOfCenter && p.x() < lmo->getBBox().left()+20) ||
18.24 (lmo->getOrientation()!=LinkableMapObj::LeftOfCenter && p.x() > lmo->getBBox().right()-20) )
18.25 {
18.26 - // FIXME-4 if (ti->xlinkCount()>1)
18.27 - if (true)
18.28 + QMenu menu;
18.29 + QList <QAction*> alist;
18.30 + for (int i=0;i<ti->xlinkCount();i++)
18.31 + alist.append (new QAction(ti->getXLinkNum(i)->getPartnerBranch()->getHeading(),&menu));
18.32 + menu.addActions (alist);
18.33 + QAction *ra=menu.exec (e->globalPos() );
18.34 + if (ra)
18.35 + model->select (ti->getXLinkNum(alist.indexOf(ra))->getPartnerBranch ());
18.36 + while (!alist.isEmpty())
18.37 {
18.38 - QMenu menu;
18.39 - QList <QAction*> alist;
18.40 - for (int i=0;i<ti->xlinkCount();i++)
18.41 - alist.append (new QAction(ti->getXLinkNum(i)->getOtherBranch(ti)->getHeading(),&menu));
18.42 - menu.addActions (alist);
18.43 - QAction *ra=menu.exec (e->globalPos() );
18.44 - if (ra)
18.45 - model->select (ti->getXLinkNum(alist.indexOf(ra))->getOtherBranch (ti));
18.46 - while (!alist.isEmpty())
18.47 - {
18.48 - QAction *a=alist.takeFirst();
18.49 - delete a;
18.50 - }
18.51 - return;
18.52 - } else
18.53 - {
18.54 - model->select (ti->getXLinkNum(0)->getOtherBranch (ti));
18.55 - return;
18.56 - }
18.57 + QAction *a=alist.takeFirst();
18.58 + delete a;
18.59 + }
18.60 + return;
18.61 }
18.62 }
18.63 }
18.64 @@ -1112,11 +1103,13 @@
18.65 if (bi_begin)
18.66 {
18.67 drawingLink=true;
18.68 - tmpXLink=model->createXLink(bi_begin,true);
18.69 - tmpXLink->setColor(model->getMapDefXLinkColor());
18.70 - tmpXLink->setWidth(model->getMapDefXLinkWidth());
18.71 - tmpXLink->setEnd (p);
18.72 - tmpXLink->updateXLink();
18.73 + tmpLink=new Link (model);
18.74 + tmpLink->setBeginBranch (bi_begin);
18.75 + tmpLink->setColor(model->getMapDefXLinkColor());
18.76 + tmpLink->setWidth(model->getMapDefXLinkWidth());
18.77 + tmpLink->setEndPoint (p);
18.78 + tmpLink->createMapObj(mapScene);
18.79 + tmpLink->updateLink();
18.80 return;
18.81 }
18.82 }
18.83 @@ -1141,8 +1134,11 @@
18.84 movingObj_start.setY( p.y() - lmo->y() );
18.85 movingObj_orgPos.setX (lmo->x() );
18.86 movingObj_orgPos.setY (lmo->y() );
18.87 - lmo->setRelPos();
18.88 - movingObj_orgRelPos=lmo->getRelPos();
18.89 + if (ti->depth()>0)
18.90 + {
18.91 + lmo->setRelPos();
18.92 + movingObj_orgRelPos=lmo->getRelPos();
18.93 + }
18.94
18.95 // If modMode==copy, then we want to "move" the _new_ object around
18.96 // then we need the offset from p to the _old_ selection, because of tmp
18.97 @@ -1204,11 +1200,10 @@
18.98 if (mainWindow->getModMode()!=Main::ModModeCopy)
18.99 setCursor (Qt::ArrowCursor);
18.100
18.101 + // Scroll if needed
18.102 // To avoid jumping of the sceneView, only
18.103 // show selection, if not tmp linked
18.104 - /* FIXME-2 if (!lmosel->hasParObjTmp())
18.105 - model->emitShowSelection();
18.106 - */
18.107 + model->emitShowSelection();
18.108
18.109 // Now move the selection, but add relative position
18.110 // (movingObj_start) where selection was chosen with
18.111 @@ -1275,6 +1270,7 @@
18.112 seli->getBranchObjNum(i)->setOrientation();
18.113 }
18.114 }
18.115 + lmosel->move (p-movingObj_start);
18.116 } else
18.117 {
18.118 if (seli->depth()==1)
18.119 @@ -1326,8 +1322,8 @@
18.120 // Draw a link from one branch to another
18.121 if (drawingLink)
18.122 {
18.123 - tmpXLink->setEnd (p);
18.124 - tmpXLink->updateXLink();
18.125 + tmpLink->setEndPoint (p);
18.126 + tmpLink->updateLink();
18.127 }
18.128
18.129 // Move sceneView
18.130 @@ -1380,18 +1376,20 @@
18.131 // Check if we are over another branch
18.132 if (dsti)
18.133 {
18.134 - tmpXLink->setEnd ( ((BranchItem*)dsti) );
18.135 - tmpXLink->updateXLink();
18.136 - tmpXLink->activate();
18.137 + tmpLink->setEndBranch ( ((BranchItem*)dsti) );
18.138 + tmpLink->updateLink();
18.139 + model->createLink (tmpLink);
18.140 + /* FIXME-2 Link savestate missing, segfaulting on undo
18.141 model->saveState(
18.142 tmpXLink,QString("delete ()"),
18.143 dsti,QString("addXLink (\"%1\",\"%2\")").arg(model->getSelectString(tmpXLink->getBegin())).arg(model->getSelectString(dsti)),
18.144 QString("Add xLink from %1 to %2").arg(model->getObjectName(tmpXLink->getBegin())).arg(model->getObjectName(dsti))
18.145 );
18.146 + */
18.147 } else
18.148 {
18.149 - model->deleteItem(tmpXLink);
18.150 - tmpXLink=NULL;
18.151 + delete (tmpLink);
18.152 + tmpLink=NULL;
18.153 }
18.154 return;
18.155 }
18.156 @@ -1576,6 +1574,13 @@
18.157 }
18.158 }
18.159
18.160 +void MapEditor::wheelEvent(QWheelEvent* e)
18.161 +{
18.162 + //qDebug ()<<"ME::wheelEvent"; //FIXME-2 stop all animations in vymModel here
18.163 + //model->stopAllAnimation();
18.164 + QGraphicsView::wheelEvent (e);
18.165 +}
18.166 +
18.167 void MapEditor::resizeEvent (QResizeEvent* e)
18.168 {
18.169 QGraphicsView::resizeEvent( e );
19.1 --- a/mapeditor.h Fri Apr 09 14:24:04 2010 +0000
19.2 +++ b/mapeditor.h Wed Jun 09 13:14:08 2010 +0000
19.3 @@ -7,6 +7,7 @@
19.4 #include <QPropertyAnimation>
19.5
19.6 #include "attribute.h"
19.7 +#include "xlink.h"
19.8 #include "ornamentedobj.h"
19.9 #include "settings.h"
19.10 #include "vymmodel.h"
19.11 @@ -93,6 +94,8 @@
19.12 virtual void mouseMoveEvent(QMouseEvent*);
19.13 virtual void mouseReleaseEvent(QMouseEvent*);
19.14 virtual void mouseDoubleClickEvent(QMouseEvent*);
19.15 + virtual void wheelEvent(QWheelEvent*);
19.16 +
19.17 virtual void resizeEvent( QResizeEvent * );
19.18
19.19 void dragEnterEvent (QDragEnterEvent *);
19.20 @@ -116,7 +119,7 @@
19.21 bool drawingLink; // true while creating a link
19.22 bool copyingObj; // true while modModeCopy
19.23 bool objectMoved; // true if object was not clicked, but moved with mouse
19.24 - XLinkItem* tmpXLink;
19.25 + Link* tmpLink;
19.26
19.27 MapObj* movingObj; // moving a MapObj
19.28 QPointF movingObj_orgPos; // org. pos of mouse before move
20.1 --- a/noteobj.cpp Fri Apr 09 14:24:04 2010 +0000
20.2 +++ b/noteobj.cpp Wed Jun 09 13:14:08 2010 +0000
20.3 @@ -52,7 +52,7 @@
20.4 return getNoteASCII ("",80);
20.5 }
20.6
20.7 -QString NoteObj::getNoteASCII(QString indent, const int &width)
20.8 +QString NoteObj::getNoteASCII(QString indent, const int &) //FIXME-3 use width
20.9 {
20.10 if (note.isEmpty()) return note;
20.11 QString r=note;
21.1 --- a/treeitem.cpp Fri Apr 09 14:24:04 2010 +0000
21.2 +++ b/treeitem.cpp Wed Jun 09 13:14:08 2010 +0000
21.3 @@ -17,7 +17,7 @@
21.4
21.5 TreeItem::TreeItem()
21.6 {
21.7 - cout << "Constr. TI this="<<this<<endl;
21.8 + //cout << "Constr. TI this="<<this<<endl;
21.9 init();
21.10 itemData.clear();
21.11 rootItem=this;
21.12 @@ -38,13 +38,30 @@
21.13
21.14 TreeItem::~TreeItem()
21.15 {
21.16 - //cout << "Destructor TreeItem "<<getHeadingStd()<<endl;
21.17 + //qDebug()<<"Destr TreeItem this="<<this<<" childcount="<<childItems.count();
21.18 + /*
21.19 + qDeleteAll(childItems); // Call delete //FIXME-3 use this instead of below
21.20 + qDebug()<<" ok1";
21.21 + childItems.clear(); // and clear list
21.22 + qDebug()<<" ok2";use
21.23 + */
21.24 +
21.25 + /*
21.26 + if (this==rootItem)
21.27 + {
21.28 + qDebug()<<" I'm rootItem, aborting";
21.29 + return;
21.30 + }
21.31 + */
21.32 + //qDebug()<<" ="<<getHeading();
21.33 TreeItem *ti;
21.34 while (!childItems.isEmpty())
21.35 {
21.36 + //qDebug()<<" ="<<ti->getHeading();
21.37 ti=childItems.takeFirst();
21.38 + //qDebug()<<" ti="<<ti;
21.39 delete ti;
21.40 - }
21.41 + }
21.42 }
21.43
21.44
21.45 @@ -316,6 +333,7 @@
21.46 void TreeItem::setHeading (const QString s)
21.47 {
21.48 itemData[0]=s;
21.49 + //qDebug()<<"TI::setHeading this="<<this<<" "<<s;
21.50 }
21.51
21.52 QString TreeItem::getHeading () const
21.53 @@ -591,9 +609,17 @@
21.54 {
21.55 if (n>=0 && n<branchCounter)
21.56 {
21.57 - return (BranchObj*)(getBranchNum(n)->getLMO());
21.58 - } else
21.59 - return NULL;
21.60 + BranchItem *bi=getBranchNum(n);
21.61 + if (bi)
21.62 + {
21.63 + BranchObj *bo=(BranchObj*)(bi->getLMO());
21.64 + if (bo)
21.65 + return bo;
21.66 + else
21.67 + qDebug()<<"TI::getBONum bo=NULL";
21.68 + }
21.69 + }
21.70 + return NULL;
21.71 }
21.72
21.73 ImageItem* TreeItem::getImageNum (const int &n)
21.74 @@ -634,14 +660,10 @@
21.75 if (xlinkCounter>0 )
21.76 {
21.77 XLinkItem *xli=getXLinkNum (n);
21.78 - if (!xli) return NULL;
21.79 - if (xli->isBegin() )
21.80 - return (XLinkObj*)(xli->getLMO());
21.81 - else
21.82 + if (xli)
21.83 {
21.84 - xli=xli->getPartnerXLink();
21.85 - if (!xli) return NULL;
21.86 - return (XLinkObj*)(xli->getLMO());
21.87 + Link *l=xli->getLink();
21.88 + if (l) return l->getXLinkObj();
21.89 }
21.90 }
21.91 return NULL;
22.1 --- a/treemodel.cpp Fri Apr 09 14:24:04 2010 +0000
22.2 +++ b/treemodel.cpp Wed Jun 09 13:14:08 2010 +0000
22.3 @@ -17,6 +17,7 @@
22.4
22.5 TreeModel::~TreeModel()
22.6 {
22.7 + //qDebug()<<"Destr TreeModel this="<<this;
22.8 delete rootItem;
22.9 }
22.10
23.1 --- a/treemodel.h Fri Apr 09 14:24:04 2010 +0000
23.2 +++ b/treemodel.h Wed Jun 09 13:14:08 2010 +0000
23.3 @@ -8,6 +8,7 @@
23.4
23.5 class BranchItem;
23.6 class TreeItem;
23.7 +class Link;
23.8 class LinkableMapObj;
23.9
23.10 class TreeModel : public QAbstractItemModel
23.11 @@ -40,6 +41,10 @@
23.12
23.13 protected:
23.14 BranchItem *rootItem;
23.15 +
23.16 + QList <Link*> xlinks;
23.17 + QList <Link*> xlinks_obsolete;
23.18 +
23.19 };
23.20
23.21 #endif
24.1 --- a/version.h Fri Apr 09 14:24:04 2010 +0000
24.2 +++ b/version.h Wed Jun 09 13:14:08 2010 +0000
24.3 @@ -4,10 +4,10 @@
24.4 #include <QString>
24.5
24.6 #define __VYM_NAME "VYM"
24.7 -#define __VYM_VERSION "1.13.3"
24.8 +#define __VYM_VERSION "1.13.4"
24.9 //#define __VYM_CODENAME "Codename: RC-1"
24.10 #define __VYM_CODENAME "Codename: development version, not for production!"
24.11 -#define __VYM_BUILD_DATE "2010-04-09"
24.12 +#define __VYM_BUILD_DATE "2010-06-08"
24.13
24.14
24.15 bool checkVersion(const QString &);
25.1 --- a/vym.changelog Fri Apr 09 14:24:04 2010 +0000
25.2 +++ b/vym.changelog Wed Jun 09 13:14:08 2010 +0000
25.3 @@ -1,3 +1,43 @@
25.4 +-------------------------------------------------------------------
25.5 +Tue Jun 8 17:17:41 CEST 2010 - vym@insilmaril.de
25.6 +
25.7 +- Version: 1.13.4
25.8 +- Bugfix: ImportReplace of a map with multiple mapcenters
25.9 +- Bugfix: Toolbar icon updated immediatly when history window is closed
25.10 +
25.11 +-------------------------------------------------------------------
25.12 +Mon Jun 7 10:40:15 CEST 2010 - vym@insilmaril.de
25.13 +
25.14 +- Bugfix: Umlauts in HTML export (set encoding to UTF-8)
25.15 +- Bugfix: xLink handling while deleting/restoring xLinks
25.16 +
25.17 +-------------------------------------------------------------------
25.18 +Tue Jun 1 15:50:44 CEST 2010 - vym@insilmaril.de
25.19 +
25.20 +- Version: 1.13.3
25.21 +- Bugfix: Rewrote xlink engine in large parts to address
25.22 + several issues
25.23 +
25.24 +-------------------------------------------------------------------
25.25 +Fri Apr 30 10:26:59 CEST 2010 - vym@insilmaril.de
25.26 +
25.27 +- Bugfix: Don't reset zoomFactor after load
25.28 +
25.29 +-------------------------------------------------------------------
25.30 +Thu Apr 29 13:16:50 CEST 2010 - vym@insilmaril.de
25.31 +
25.32 +- Feature: Added some helptext about commandline options
25.33 +
25.34 +-------------------------------------------------------------------
25.35 +Wed Apr 28 17:43:10 CEST 2010 - vym@insilmaril.de
25.36 +
25.37 +- Feature: ASCII exports show URLs now
25.38 +
25.39 +-------------------------------------------------------------------
25.40 +Thu Apr 22 16:07:44 CEST 2010 - vym@insilmaril.de
25.41 +
25.42 +- Bugfix: Removed empty field in findresults TreeView
25.43 +
25.44 -------------------------------------------------------------------
25.45 Fri Apr 9 16:12:55 CEST 2010 - vym@insilmaril.de
25.46
26.1 --- a/vym.pro Fri Apr 09 14:24:04 2010 +0000
26.2 +++ b/vym.pro Wed Jun 09 13:14:08 2010 +0000
26.3 @@ -91,6 +91,7 @@
26.4 vymmodel.h \
26.5 vymview.h \
26.6 warningdialog.h \
26.7 + xlink.h \
26.8 xlinkitem.h \
26.9 xlinkobj.h \
26.10 xml-base.h \
26.11 @@ -161,6 +162,7 @@
26.12 vymmodel.cpp \
26.13 vymview.cpp \
26.14 warningdialog.cpp \
26.15 + xlink.cpp \
26.16 xlinkitem.cpp \
26.17 xlinkobj.cpp \
26.18 xml-base.cpp \
26.19 @@ -225,4 +227,4 @@
26.20 INSTALLS += doc
26.21 DEFINES += VYM_DOCDIR=\\\"$${DOCDIR}\\\"
26.22
26.23 -include(test/modeltest/modeltest.pri)
26.24 +#include(test/modeltest/modeltest.pri)
27.1 --- a/vymmodel.cpp Fri Apr 09 14:24:04 2010 +0000
27.2 +++ b/vymmodel.cpp Wed Jun 09 13:14:08 2010 +0000
27.3 @@ -12,14 +12,13 @@
27.4 #include "exporthtmldialog.h"
27.5 #include "file.h"
27.6 #include "findresultmodel.h"
27.7 -#include "geometry.h" // for addBBox
27.8 #include "mainwindow.h"
27.9 #include "misc.h"
27.10 #include "parser.h"
27.11 #include "process.h"
27.12
27.13 -#include "warningdialog.h"
27.14 #include "xlinkitem.h"
27.15 +#include "xlinkobj.h"
27.16 #include "xml-freemind.h"
27.17 #include "xmlobj.h"
27.18 #include "xml-vym.h"
27.19 @@ -54,7 +53,7 @@
27.20
27.21 VymModel::VymModel()
27.22 {
27.23 - //cout << "Const VymModel\n";
27.24 + //qDebug()<< "Const VymModel";
27.25 init();
27.26 rootItem->setModel (this);
27.27 }
27.28 @@ -62,18 +61,20 @@
27.29
27.30 VymModel::~VymModel()
27.31 {
27.32 - //cout << "Destr VymModel\n";
27.33 + //qDebug() << "Destr VymModel begin this="<<this;
27.34 autosaveTimer->stop();
27.35 fileChangedTimer->stop();
27.36 - clear();
27.37 - if (mapEditor) delete (mapEditor);
27.38 + //qApp->processEvents(); // Update view (scene()->update() is not enough)
27.39 + //qDebug() << "Destr VymModel end this="<<this;
27.40 }
27.41
27.42 void VymModel::clear()
27.43 {
27.44 - unselect();
27.45 while (rootItem->childCount() >0)
27.46 + {
27.47 + //qDebug()<<"VM::clear ri="<<rootItem<<" ri->count()="<<rootItem->childCount();
27.48 deleteItem (rootItem->getChildNum(0) );
27.49 + }
27.50 }
27.51
27.52 void VymModel::init ()
27.53 @@ -125,11 +126,11 @@
27.54 // find routine
27.55 findReset();
27.56
27.57 - // animations // FIXME-3 switch to new animation system
27.58 - animationUse=settings.readBoolEntry("/animation/use",false); // FIXME-3 add options to control _what_ is animated
27.59 + // animations // FIXME-4 switch to new animation system
27.60 + animationUse=settings.readBoolEntry("/animation/use",false); // FIXME-4 add options to control _what_ is animated
27.61 animationTicks=settings.readNumEntry("/animation/ticks",10);
27.62 animationInterval=settings.readNumEntry("/animation/interval",50);
27.63 - animObjList.clear();
27.64 + animObjList.clear();
27.65 animationTimer=new QTimer (this);
27.66 connect(animationTimer, SIGNAL(timeout()), this, SLOT(animate()));
27.67
27.68 @@ -144,6 +145,9 @@
27.69
27.70 hidemode=TreeItem::HideNone;
27.71
27.72 + // Avoid recursions later
27.73 + cleaningUpLinks=false;
27.74 +
27.75 // Network
27.76 netstate=Offline;
27.77
27.78 @@ -236,21 +240,34 @@
27.79 // Find the used flags while traversing the tree // FIXME-3 this can be done local to vymmodel maybe...
27.80 standardFlagsMaster->resetUsedCounter();
27.81
27.82 +
27.83 + // Temporary list of links
27.84 + QList <Link*> tmpLinks;
27.85 +
27.86 // Build xml recursivly
27.87 if (!saveSel)
27.88 + {
27.89 // Save all mapcenters as complete map, if saveSel not set
27.90 - s+=saveTreeToDir(tmpdir,prefix,offset);
27.91 - else
27.92 + s+=saveTreeToDir(tmpdir,prefix,offset,tmpLinks);
27.93 +
27.94 + // Save local settings
27.95 + s+=settings.getDataXML (destPath);
27.96 +
27.97 + // Save selection
27.98 + if (getSelectedItem() && !saveSel )
27.99 + s+=xml.valueElement("select",getSelectString());
27.100 +
27.101 + } else
27.102 {
27.103 switch (saveSel->getType())
27.104 {
27.105 case TreeItem::Branch:
27.106 // Save Subtree
27.107 - s+=((BranchItem*)saveSel)->saveToDir(tmpdir,prefix,offset);
27.108 + s+=((BranchItem*)saveSel)->saveToDir(tmpdir,prefix,offset,tmpLinks);
27.109 break;
27.110 case TreeItem::MapCenter:
27.111 // Save Subtree
27.112 - s+=((BranchItem*)saveSel)->saveToDir(tmpdir,prefix,offset);
27.113 + s+=((BranchItem*)saveSel)->saveToDir(tmpdir,prefix,offset,tmpLinks);
27.114 break;
27.115 case TreeItem::Image:
27.116 // Save Image
27.117 @@ -262,12 +279,11 @@
27.118 }
27.119 }
27.120
27.121 - // Save local settings
27.122 - s+=settings.getDataXML (destPath);
27.123 -
27.124 - // Save selection
27.125 - if (getSelectedItem() && !saveSel )
27.126 - s+=xml.valueElement("select",getSelectString());
27.127 + // Save XLinks
27.128 + for (int i=0; i<tmpLinks.count();++i)
27.129 + {
27.130 + s+=tmpLinks.at(i)->saveToDir();
27.131 + }
27.132
27.133 xml.decIndent();
27.134 s+=xml.endElement("vymmap");
27.135 @@ -278,12 +294,11 @@
27.136 return s;
27.137 }
27.138
27.139 -QString VymModel::saveTreeToDir (const QString &tmpdir,const QString &prefix, const QPointF &offset)
27.140 +QString VymModel::saveTreeToDir (const QString &tmpdir,const QString &prefix, const QPointF &offset, QList <Link*> &tmpLinks)
27.141 {
27.142 QString s;
27.143 -
27.144 for (int i=0; i<rootItem->branchCount(); i++)
27.145 - s+=rootItem->getBranchNum(i)->saveToDir (tmpdir,prefix,offset);
27.146 + s+=rootItem->getBranchNum(i)->saveToDir (tmpdir,prefix,offset,tmpLinks);
27.147 return s;
27.148 }
27.149
27.150 @@ -338,10 +353,22 @@
27.151 return destPath;
27.152 }
27.153
27.154 -ErrorCode VymModel::load (QString fname, const LoadMode &lmode, const FileType &ftype)
27.155 +ErrorCode VymModel::loadMap (
27.156 + QString fname,
27.157 + const LoadMode &lmode,
27.158 + bool saveStateFlag,
27.159 + const FileType &ftype,
27.160 + int pos)
27.161 {
27.162 ErrorCode err=success;
27.163
27.164 + // Get updated zoomFactor, before applying one read from file in the end
27.165 + if (mapEditor) zoomFactor=mapEditor->getZoomFactorTarget();
27.166 +
27.167 + // For ImportReplace let's insert a new branch and replace that
27.168 + BranchItem *selbi=getSelectedBranch();
27.169 + BranchItem *newbi=NULL;
27.170 +
27.171 parseBaseHandler *handler;
27.172 fileType=ftype;
27.173 switch (fileType)
27.174 @@ -361,20 +388,23 @@
27.175 selModel->clearSelection();
27.176 } else
27.177 {
27.178 - BranchItem *bi=getSelectedBranch();
27.179 - if (!bi) return aborted;
27.180 + if (!selbi) return aborted;
27.181 if (lmode==ImportAdd)
27.182 - saveStateChangingPart(
27.183 - bi,
27.184 - bi,
27.185 + if (saveStateFlag) saveStateChangingPart(
27.186 + selbi,
27.187 + selbi,
27.188 QString("addMapInsert (%1)").arg(fname),
27.189 - QString("Add map %1 to %2").arg(fname).arg(getObjectName(bi)));
27.190 - else
27.191 - saveStateChangingPart(
27.192 - bi,
27.193 - bi,
27.194 + QString("Add map %1 to %2").arg(fname).arg(getObjectName(selbi)));
27.195 + if (lmode==ImportReplace)
27.196 + {
27.197 + if (saveStateFlag) saveStateChangingPart(
27.198 + selbi,
27.199 + selbi,
27.200 QString("addMapReplace(%1)").arg(fname),
27.201 - QString("Add map %1 to %2").arg(fname).arg(getObjectName(bi)));
27.202 + QString("Add map %1 to %2").arg(fname).arg(getObjectName(selbi)));
27.203 + newbi=addNewBranchInt (selbi,-1); // Add below selection
27.204 + select (newbi);
27.205 + }
27.206 }
27.207
27.208
27.209 @@ -465,7 +495,11 @@
27.210 tmpdir=fname.left(fname.findRev("/",-1));
27.211 handler->setTmpDir (tmpdir);
27.212 handler->setInputFile (file.name());
27.213 - handler->setLoadMode (lmode);
27.214 + if (lmode==ImportReplace)
27.215 + handler->setLoadMode (ImportAdd,pos);
27.216 + else
27.217 + handler->setLoadMode (lmode,pos);
27.218 +
27.219 bool ok = reader.parse( source );
27.220 blockReposition=false;
27.221 blockSaveState=blockSaveStateOrg;
27.222 @@ -473,18 +507,27 @@
27.223 file.close();
27.224 if ( ok )
27.225 {
27.226 - reposition();
27.227 - emitSelectionChanged();
27.228 if (lmode==NewMap)
27.229 {
27.230 mapDefault=false;
27.231 mapChanged=false;
27.232 mapUnsaved=false;
27.233 autosaveTimer->stop();
27.234 +
27.235 + // Reset timestamp to check for later updates of file
27.236 + fileChangedTime=QFileInfo (destPath).lastModified();
27.237 }
27.238
27.239 - // Reset timestamp to check for later updates of file
27.240 - fileChangedTime=QFileInfo (destPath).lastModified();
27.241 +
27.242 +
27.243 + if (lmode==ImportReplace)
27.244 + {
27.245 + deleteItem (selbi);
27.246 + select (newbi);
27.247 + deleteKeepChildren (false);
27.248 + }
27.249 + reposition();
27.250 + emitSelectionChanged();
27.251 } else
27.252 {
27.253 QMessageBox::critical( 0, tr( "Critical Parse Error" ),
27.254 @@ -640,96 +683,6 @@
27.255 return err;
27.256 }
27.257
27.258 -void VymModel::addMapReplaceInt(const QString &undoSel, const QString &path)
27.259 -{
27.260 - QString pathDir=path.left(path.findRev("/"));
27.261 - QDir d(pathDir);
27.262 - QFile file (path);
27.263 -
27.264 - if (d.exists() )
27.265 - {
27.266 - // We need to parse saved XML data
27.267 - parseVYMHandler handler;
27.268 - QXmlInputSource source( file);
27.269 - QXmlSimpleReader reader;
27.270 - reader.setContentHandler( &handler );
27.271 - reader.setErrorHandler( &handler );
27.272 - handler.setModel ( this);
27.273 - handler.setTmpDir ( pathDir ); // needed to load files with rel. path
27.274 - if (undoSel.isEmpty())
27.275 - {
27.276 - unselect();
27.277 - clear();
27.278 - handler.setLoadMode (NewMap);
27.279 - } else
27.280 - {
27.281 - select (undoSel);
27.282 - handler.setLoadMode (ImportReplace);
27.283 - }
27.284 - blockReposition=true;
27.285 - bool ok = reader.parse( source );
27.286 - blockReposition=false;
27.287 - if (! ok )
27.288 - {
27.289 - // This should never ever happen
27.290 - QMessageBox::critical( 0, tr( "Critical Parse Error while reading %1").arg(path),
27.291 - handler.errorProtocol());
27.292 - }
27.293 - } else
27.294 - QMessageBox::critical( 0, tr( "Critical Error" ), tr("Could not read %1").arg(path));
27.295 -}
27.296 -
27.297 -bool VymModel::addMapInsertInt (const QString &path)
27.298 -{
27.299 - QString pathDir=path.left(path.findRev("/"));
27.300 - QDir d(pathDir);
27.301 - QFile file (path);
27.302 -
27.303 - if (d.exists() )
27.304 - {
27.305 - // We need to parse saved XML data
27.306 - parseVYMHandler handler;
27.307 - QXmlInputSource source( file);
27.308 - QXmlSimpleReader reader;
27.309 - reader.setContentHandler( &handler );
27.310 - reader.setErrorHandler( &handler );
27.311 - handler.setModel (this);
27.312 - handler.setTmpDir ( pathDir ); // needed to load files with rel. path
27.313 - handler.setLoadMode (ImportAdd);
27.314 - blockReposition=true;
27.315 - bool ok = reader.parse( source );
27.316 - blockReposition=false;
27.317 - if ( ok ) return true;
27.318 - {
27.319 - // This should never ever happen
27.320 - QMessageBox::critical( 0, tr( "Critical Parse Error while reading %1").arg(path),
27.321 - handler.errorProtocol());
27.322 - }
27.323 - } else
27.324 - QMessageBox::critical( 0, tr( "Critical Error" ), tr("Could not read %1").arg(path));
27.325 - return false;
27.326 -}
27.327 -
27.328 -bool VymModel::addMapInsertInt (const QString &path, int pos)
27.329 -{
27.330 - BranchItem *selbi=getSelectedBranch();
27.331 - if (selbi)
27.332 - {
27.333 - if (addMapInsertInt (path))
27.334 - {
27.335 - if (selbi->depth()>0)
27.336 - relinkBranch (selbi->getLastBranch(), selbi,pos);
27.337 - return true;
27.338 - } else
27.339 - {
27.340 - QMessageBox::critical( 0, tr( "Critical Error" ), tr("Could not read %1").arg(path));
27.341 - return false;
27.342 - }
27.343 - }
27.344 - qWarning ("ME::addMapInsertInt nothing selected");
27.345 - return false;
27.346 -}
27.347 -
27.348 ImageItem* VymModel::loadFloatImageInt (BranchItem *dst,QString fn)
27.349 {
27.350 ImageItem *ii=createImage(dst);
27.351 @@ -975,7 +928,7 @@
27.352 {
27.353 case QMessageBox::Yes:
27.354 // Reload map
27.355 - load (filePath,NewMap,fileType);
27.356 + loadMap (filePath);
27.357 case QMessageBox::Cancel:
27.358 fileChangedTime=tmod; // allow autosave to overwrite newer file!
27.359 }
27.360 @@ -1109,7 +1062,7 @@
27.361 return false;
27.362 }
27.363
27.364 -void VymModel::undo()
27.365 +void VymModel::undo() //FIXME-1 segfault when trying to undo in a brandnew map
27.366 {
27.367 // Can we undo at all?
27.368 if (undosAvail<1) return;
27.369 @@ -1253,6 +1206,7 @@
27.370 makeSubDirs (histDir);
27.371
27.372 // Save depending on how much needs to be saved
27.373 + QList <Link*> tmpLinks;
27.374 if (saveSel)
27.375 backupXML=saveToDir (histDir,mapName+"-",false, QPointF (),saveSel);
27.376
27.377 @@ -1529,7 +1483,7 @@
27.378 return sortFilter;
27.379 }
27.380
27.381 -void VymModel::setHeading(const QString &s)
27.382 +void VymModel::setHeading(const QString &s)
27.383 {
27.384 BranchItem *selbi=getSelectedBranch();
27.385 if (selbi)
27.386 @@ -1541,7 +1495,7 @@
27.387 "setHeading (\""+s+"\")",
27.388 QString("Set heading of %1 to \"%2\"").arg(getObjectName(selbi)).arg(s) );
27.389 selbi->setHeading(s );
27.390 - emitDataHasChanged ( selbi); //FIXME-3 maybe emit signal from TreeItem?
27.391 + emitDataHasChanged ( selbi); //FIXME-4 maybe emit signal from TreeItem?
27.392 reposition();
27.393 emitSelectionChanged();
27.394 }
27.395 @@ -1655,7 +1609,7 @@
27.396 {
27.397 rmodel->clear();
27.398 rmodel->setSearchString (s);
27.399 - rmodel->setSearchFlags (0); //FIXME-2 translate cs to QTextDocument::FindFlag
27.400 + rmodel->setSearchFlags (0); //FIXME-3 translate cs to QTextDocument::FindFlag
27.401 BranchItem *cur=NULL;
27.402 BranchItem *prev=NULL;
27.403 nextBranch(cur,prev);
27.404 @@ -1671,7 +1625,7 @@
27.405 int j=0;
27.406 while ( i>=0)
27.407 {
27.408 - i=n.indexOf (s,i,cs); //FIXME-2 add subitems to rmodel
27.409 + i=n.indexOf (s,i,cs);
27.410 if (i>=0)
27.411 {
27.412 // If not there yet, add "parent" item
27.413 @@ -2050,20 +2004,17 @@
27.414
27.415 void VymModel::pasteNoSave(const int &n)
27.416 {
27.417 - bool old=blockSaveState;
27.418 - blockSaveState=true;
27.419 bool zippedOrg=zipped;
27.420 if (redosAvail > 0 || n!=0)
27.421 {
27.422 // Use the "historical" buffer
27.423 QString bakMapName(QString("history-%1").arg(n));
27.424 QString bakMapDir(tmpMapDir +"/"+bakMapName);
27.425 - load (bakMapDir+"/"+clipboardFile,ImportAdd, VymMap);
27.426 + loadMap (bakMapDir+"/"+clipboardFile,ImportAdd, false);
27.427 } else
27.428 // Use the global buffer
27.429 - load (clipboardDir+"/"+clipboardFile,ImportAdd, VymMap);
27.430 + loadMap (clipboardDir+"/"+clipboardFile,ImportAdd, false);
27.431 zipped=zippedOrg;
27.432 - blockSaveState=old;
27.433 }
27.434
27.435 void VymModel::paste()
27.436 @@ -2231,39 +2182,61 @@
27.437 return NULL;
27.438 }
27.439
27.440 -XLinkItem* VymModel::createXLink(BranchItem *bi,bool createMO)
27.441 -{
27.442 - if (bi)
27.443 - {
27.444 +bool VymModel::createLink(Link *link, bool createMO)
27.445 +{
27.446 + BranchItem *begin=link->getBeginBranch();
27.447 + BranchItem *end =link->getEndBranch();
27.448 +
27.449 + if (!begin || !end)
27.450 + {
27.451 + qWarning ()<<"VM::createXLinkNew part of XLink is NULL";
27.452 + return false;
27.453 + }
27.454 +
27.455 +
27.456 QModelIndex parix;
27.457 int n;
27.458
27.459 QList<QVariant> cData;
27.460 - cData << "new xLink"<<"undef";
27.461 -
27.462 - XLinkItem *newxli=new XLinkItem(cData) ;
27.463 - newxli->setBegin (bi);
27.464 +
27.465 + cData << "new Link begin"<<"undef";
27.466 + XLinkItem *newli=new XLinkItem(cData) ;
27.467 + newli->setLink (link);
27.468 + link->setBeginLinkItem (newli);
27.469
27.470 emit (layoutAboutToBeChanged() );
27.471
27.472 - parix=index(bi);
27.473 - n=bi->getRowNumAppend(newxli);
27.474 + parix=index(begin);
27.475 + n=begin->getRowNumAppend(newli);
27.476 beginInsertRows (parix,n,n);
27.477 - bi->appendChild (newxli);
27.478 + begin->appendChild (newli);
27.479 endInsertRows ();
27.480
27.481 + cData.clear();
27.482 + cData << "new Link end"<<"undef";
27.483 + newli=new XLinkItem(cData) ;
27.484 + newli->setLink (link);
27.485 + link->setEndLinkItem (newli);
27.486 +
27.487 + parix=index(end);
27.488 + n=end->getRowNumAppend(newli);
27.489 + beginInsertRows (parix,n,n);
27.490 + end->appendChild (newli);
27.491 + endInsertRows ();
27.492 +
27.493 emit (layoutChanged() );
27.494
27.495 - // save scroll state. If scrolled, automatically select
27.496 - // new branch in order to tmp unscroll parent...
27.497 + xlinks.append (link);
27.498 + link->activate();
27.499 +
27.500 if (createMO)
27.501 {
27.502 - newxli->createMapObj(mapScene);
27.503 + link->createMapObj(mapScene);
27.504 reposition();
27.505 }
27.506 - return newxli;
27.507 - }
27.508 - return NULL;
27.509 +// }
27.510 + //return newli;
27.511 + return true;
27.512 }
27.513
27.514 AttributeItem* VymModel::addAttribute()
27.515 @@ -2279,7 +2252,7 @@
27.516 return NULL;
27.517 }
27.518
27.519 -AttributeItem* VymModel::addAttribute(AttributeItem *ai) // FIXME-2 savestate missing
27.520 +AttributeItem* VymModel::addAttribute(AttributeItem *ai) // FIXME-3 savestate missing
27.521 {
27.522 BranchItem *selbi=getSelectedBranch();
27.523 if (selbi)
27.524 @@ -2294,7 +2267,7 @@
27.525
27.526 emit (layoutChanged() );
27.527
27.528 - ai->createMapObj(mapScene); //FIXME-2 check that...
27.529 + ai->createMapObj(mapScene); //FIXME-3 check that...
27.530 reposition();
27.531 return ai;
27.532 }
27.533 @@ -2564,7 +2537,30 @@
27.534 return false;
27.535 }
27.536
27.537 -void VymModel::deleteSelection() //FIXME-2 xLinks in a deleted subtree are not restored on undo
27.538 +void VymModel::cleanupLinks()
27.539 +{
27.540 + // This probably could be done more elegant from destructor of a Link,
27.541 + // but somehow this resulted in strange segfaults deep in Qt and glibc...
27.542 + //qDebug ()<<"VM::cleanupLinks begin"<< "CUL="<<cleaningUpLinks;
27.543 + cleaningUpLinks=true;
27.544 + Link *l;
27.545 + XLinkItem *xli;
27.546 + while (!xlinks_obsolete.isEmpty())
27.547 + {
27.548 + l=xlinks_obsolete.takeFirst();
27.549 + xli=l->getBeginLinkItem();
27.550 + //qDebug()<<"VM::cleanupLinks a) l="<<l<<" xli="<<xli;
27.551 + if (xli) deleteItem (xli);
27.552 + xli=l->getEndLinkItem();
27.553 + //qDebug()<<"VM::cleanupLinks b) l="<<l<<" xli="<<xli;
27.554 + if (xli) deleteItem (xli);
27.555 + delete (l);
27.556 + }
27.557 + cleaningUpLinks=false;
27.558 + //qDebug ()<<"VM::cleanupLinks end";
27.559 +}
27.560 +
27.561 +void VymModel::deleteSelection()
27.562 {
27.563 BranchItem *selbi=getSelectedBranch();
27.564
27.565 @@ -2586,12 +2582,14 @@
27.566 }
27.567 return;
27.568 }
27.569 +
27.570 TreeItem *ti=getSelectedItem();
27.571 +
27.572 if (ti)
27.573 { // Delete other item
27.574 TreeItem *pi=ti->parent();
27.575 if (!pi) return;
27.576 - if (ti->getType()==TreeItem::Image || ti->getType()==TreeItem::Attribute)
27.577 + if (ti->getType()==TreeItem::Image || ti->getType()==TreeItem::Attribute||ti->getType()==TreeItem::XLink)
27.578 {
27.579 saveStateChangingPart(
27.580 pi,
27.581 @@ -2605,16 +2603,12 @@
27.582 select (pi);
27.583 reposition();
27.584 emitShowSelection();
27.585 - } else if (ti->getType()==TreeItem::XLink)
27.586 - {
27.587 - //FIXME-2 savestate for deleting xlink missing
27.588 - deleteItem (ti);
27.589 } else
27.590 qWarning ("VymmModel::deleteSelection() unknown type?!");
27.591 }
27.592 }
27.593
27.594 -void VymModel::deleteKeepChildren() //FIXME-3 does not work yet for mapcenters
27.595 +void VymModel::deleteKeepChildren(bool saveStateFlag) //FIXME-3 does not work yet for mapcenters
27.596
27.597 {
27.598 BranchItem *selbi=getSelectedBranch();
27.599 @@ -2634,7 +2628,7 @@
27.600
27.601 QPointF p;
27.602 if (selbi->getLMO()) p=selbi->getLMO()->getRelPos();
27.603 - saveStateChangingPart(
27.604 + if (saveStateFlag) saveStateChangingPart(
27.605 pi,
27.606 selbi,
27.607 "deleteKeepChildren ()",
27.608 @@ -2693,6 +2687,7 @@
27.609 if (ti)
27.610 {
27.611 TreeItem *pi=ti->parent();
27.612 + //qDebug()<<"VM::deleteItem start ti="<<ti<<" "<<ti->getHeading()<<" pi="<<pi<<"="<<pi->getHeading();
27.613 QModelIndex parentIndex=index(pi);
27.614
27.615 emit (layoutAboutToBeChanged() );
27.616 @@ -2704,11 +2699,19 @@
27.617 reposition();
27.618
27.619 emit (layoutChanged() );
27.620 + //qDebug()<<"VM::deleteItem end ti="<<ti;
27.621 + if (!cleaningUpLinks) cleanupLinks();
27.622 if (pi->depth()>=0) return pi;
27.623 }
27.624 return NULL;
27.625 }
27.626
27.627 +void VymModel::deleteLink(Link* l)
27.628 +{
27.629 + int i=xlinks.indexOf(l);
27.630 + if (i>-1) xlinks_obsolete.append (xlinks.takeAt (i));
27.631 +}
27.632 +
27.633 void VymModel::clearItem (TreeItem *ti)
27.634 {
27.635 if (ti)
27.636 @@ -3138,35 +3141,30 @@
27.637 }
27.638 }
27.639
27.640 -void VymModel::editXLink(int i)
27.641 -{
27.642 - i=0;
27.643 +void VymModel::editXLink(int i)
27.644 +{
27.645 BranchItem *selbi=getSelectedBranch();
27.646 if (selbi)
27.647 {
27.648 - XLinkItem *xli=selbi->getXLinkNum(i);
27.649 - if (xli)
27.650 + Link *l=selbi->getXLinkNum(i)->getLink();
27.651 + if (l)
27.652 {
27.653 EditXLinkDialog dia;
27.654 - dia.setXLink (xli);
27.655 + dia.setLink (l);
27.656 dia.setSelection(selbi);
27.657 if (dia.exec() == QDialog::Accepted)
27.658 {
27.659 if (dia.useSettingsGlobal() )
27.660 {
27.661 - setMapDefXLinkColor (xli->getColor() );
27.662 - setMapDefXLinkWidth (xli->getWidth() );
27.663 + setMapDefXLinkColor (l->getColor() );
27.664 + setMapDefXLinkWidth (l->getWidth() );
27.665 }
27.666 - if (dia.deleteXLink()) deleteItem (xli);
27.667 + if (dia.deleteXLink()) delete (l);
27.668 }
27.669 }
27.670 }
27.671 }
27.672
27.673 -
27.674 -
27.675 -
27.676 -
27.677 //////////////////////////////////////////////
27.678 // Scripting
27.679 //////////////////////////////////////////////
27.680 @@ -3252,7 +3250,7 @@
27.681 //s=parser.parString (ok,0); // selection
27.682 t=parser.parString (ok,0); // path to map
27.683 if (QDir::isRelativePath(t)) t=(tmpMapDir + "/"+t);
27.684 - addMapReplaceInt(getSelectString(selbi),t);
27.685 + loadMap (t,ImportReplace,false,VymMap,n);
27.686 }
27.687 /////////////////////////////////////////////////////////////////////
27.688 } else if (com==QString("addMapInsert"))
27.689 @@ -3271,18 +3269,19 @@
27.690 t=parser.parString (ok,0); // path to map
27.691 n=parser.parInt(ok,1); // position
27.692 if (QDir::isRelativePath(t)) t=(tmpMapDir + "/"+t);
27.693 - addMapInsertInt(t,n);
27.694 + loadMap (t,ImportAdd,false,VymMap,n);
27.695 }
27.696 } else if (parser.parCount()==1)
27.697 {
27.698 t=parser.parString (ok,0); // path to map
27.699 if (QDir::isRelativePath(t)) t=(tmpMapDir + "/"+t);
27.700 - addMapInsertInt(t);
27.701 + loadMap (t,ImportAdd,false);
27.702 } else
27.703 parser.setError (Aborted,"Wrong number of parameters");
27.704 /////////////////////////////////////////////////////////////////////
27.705 - } else if (com==QString("addXLink"))
27.706 - {
27.707 + } else if (com==QString("addXLink")) //FIXME-2 not ported yet to Link
27.708 + {
27.709 + /*
27.710 if (parser.parCount()>1)
27.711 {
27.712 s=parser.parString (ok,0); // begin
27.713 @@ -3308,6 +3307,7 @@
27.714 parser.setError (Aborted,"Couldn't select begin or end of xLink");
27.715 } else
27.716 parser.setError (Aborted,"Need at least 2 parameters for begin and end");
27.717 + */
27.718 /////////////////////////////////////////////////////////////////////
27.719 } else if (com=="clearFlags")
27.720 {
27.721 @@ -4424,8 +4424,15 @@
27.722 //cout << "VM::reposition blocked="<<blockReposition<<endl;
27.723 if (blockReposition) return;
27.724
27.725 + BranchObj *bo;
27.726 for (int i=0;i<rootItem->branchCount(); i++)
27.727 - rootItem->getBranchObjNum(i)->reposition(); // for positioning heading
27.728 + {
27.729 + bo=rootItem->getBranchObjNum(i);
27.730 + if (bo)
27.731 + bo->reposition(); // for positioning heading
27.732 + else
27.733 + qDebug()<<"VM::reposition bo=0";
27.734 + }
27.735 //emitSelectionChanged();
27.736 }
27.737
27.738 @@ -4763,6 +4770,20 @@
27.739 animObjList.removeAt (i);
27.740 }
27.741
27.742 +void VymModel::stopAllAnimation ()
27.743 +{
27.744 + BranchObj *bo;
27.745 + int i=0;
27.746 + while (i<animObjList.size() )
27.747 + {
27.748 + bo=(BranchObj*)animObjList.at(i);
27.749 + bo->stopAnimation();
27.750 + bo->requestReposition();
27.751 + i++;
27.752 + }
27.753 + reposition();
27.754 +}
27.755 +
27.756 void VymModel::sendSelection()
27.757 {
27.758 if (netstate!=Server) return;
27.759 @@ -5269,3 +5290,8 @@
27.760 return s;
27.761 }
27.762
27.763 +QString VymModel::getSelectString (BranchItem *bi)
27.764 +{
27.765 + return getSelectString ((TreeItem*)bi);
27.766 +}
27.767 +
28.1 --- a/vymmodel.h Fri Apr 09 14:24:04 2010 +0000
28.2 +++ b/vymmodel.h Wed Jun 09 13:14:08 2010 +0000
28.3 @@ -21,6 +21,7 @@
28.4 class BranchItem;
28.5 class FindResultModel;
28.6 class MapEditor;
28.7 +class Link;
28.8 class XLinkItem;
28.9
28.10 class VymModel : public TreeModel {
28.11 @@ -46,7 +47,7 @@
28.12 void init();
28.13 void makeTmpDirectories(); //!< create temporary directories e.g. for history
28.14
28.15 - MapEditor* getMapEditor(); // FIXME-2 still necessary?
28.16 + MapEditor* getMapEditor();
28.17 uint getID(); //! Return unique ID of model
28.18
28.19 bool isRepositionBlocked(); //!< While load or undo there is no need to update graphicsview
28.20 @@ -83,7 +84,7 @@
28.21 QString saveToDir (const QString &tmpdir, const QString &prefix, bool writeflags, const QPointF &offset, TreeItem *saveSel);
28.22
28.23 /*! Save all data in tree*/
28.24 - QString saveTreeToDir (const QString&,const QString&,const QPointF&);// Save data recursivly to tempdir
28.25 + QString saveTreeToDir (const QString&,const QString&,const QPointF&,QList <Link*> &tmpLinks);// Save data recursivly to tempdir
28.26
28.27
28.28 /*! \brief Sets filepath, filename and mapname
28.29 @@ -110,17 +111,19 @@
28.30 The data is read from file. Depending on LoadMode the current
28.31 selection gets replaced by data or the data is appended.
28.32 */
28.33 - ErrorCode load (QString, const LoadMode &, const FileType& ); // newmap, import/replace selection
28.34 + ErrorCode loadMap (
28.35 + QString, //!< Path
28.36 + const LoadMode &lmode=NewMap, //!< New map, replace or add to selection
28.37 + bool saveStateFlag=true, //!< If called internally for history, don't save
28.38 + const FileType &ftype=VymMap, //!< VymMap or FreeMind
28.39 + int pos=-1 //!< Optionally tell position where to add data
28.40 + );
28.41
28.42 public:
28.43 /*! \brief Save the map to file */
28.44 ErrorCode save(const SaveMode &);
28.45
28.46 private:
28.47 - void addMapReplaceInt(const QString & undoSel, const QString & path);
28.48 - bool addMapInsertInt (const QString & path);
28.49 - bool addMapInsertInt (const QString & path, int pos);
28.50 -
28.51 ImageItem* loadFloatImageInt (BranchItem *dst,QString);
28.52 void saveFloatImageInt (ImageItem*, const QString &, const QString &);
28.53 public:
28.54 @@ -321,7 +324,9 @@
28.55 BranchItem* createMapCenter(); //!< Create MapCenter
28.56 BranchItem* createBranch(BranchItem *dst); //!< Create Branch
28.57 ImageItem* createImage(BranchItem *dst); //!< Create image
28.58 - XLinkItem* createXLink(BranchItem *dst,bool createMO=false); //!< Create XLink starting at dst
28.59 +
28.60 +public:
28.61 + bool createLink(Link *l, bool createMO=false); //!< Create XLink
28.62
28.63 AttributeItem* addAttribute();
28.64 AttributeItem* addAttribute(AttributeItem* );
28.65 @@ -366,15 +371,20 @@
28.66 bool relinkBranch (BranchItem* branch, BranchItem* dst, int pos =-1);
28.67 bool relinkImage (ImageItem* image, BranchItem* dst);
28.68
28.69 +private:
28.70 + bool cleaningUpLinks; //!< True while cleaning up to avoid recursion
28.71 +public:
28.72 + void cleanupLinks(); //!< Delete orphaned XLinkItems
28.73 void deleteSelection(); //!< Delete selection
28.74 - void deleteKeepChildren(); //!< remove branch, but keep children
28.75 + void deleteKeepChildren(bool saveStateFlag=true); //!< remove branch, but keep children
28.76 +public:
28.77 void deleteChildren(); //!< keep branch, but remove children
28.78
28.79 TreeItem* deleteItem(TreeItem*); //!< Delete item and return parent (if parent!= rootItem)
28.80 + void deleteLink (Link*); //!< Remove Link and related LinkItems in TreeModel
28.81 void clearItem (TreeItem* ti); //!< Remove all children of TreeItem ti
28.82 bool scrollBranch(BranchItem *);
28.83 bool unscrollBranch(BranchItem *);
28.84 -public:
28.85 void toggleScroll();
28.86 void unscrollChildren();
28.87 void emitExpandAll();
28.88 @@ -406,7 +416,7 @@
28.89 QString getVymLink(); // return path to map
28.90 QStringList getVymLinks(); // return paths in subtree
28.91 void followXLink (int);
28.92 - void editXLink (int);
28.93 + void editXLink (int i=0);
28.94
28.95
28.96
28.97 @@ -536,6 +546,7 @@
28.98 void startAnimation(BranchObj *bo, const QPointF &v);
28.99 void startAnimation(BranchObj *bo, const QPointF &start, const QPointF &dest);
28.100 void stopAnimation(MapObj *mo);
28.101 + void stopAllAnimation();
28.102
28.103 ////////////////////////////////////////////
28.104 // Network related
28.105 @@ -631,6 +642,7 @@
28.106 QString getSelectString ();
28.107 QString getSelectString (LinkableMapObj *lmo);
28.108 QString getSelectString (TreeItem *item);
28.109 + QString getSelectString (BranchItem *item);
28.110
28.111
28.112 signals:
29.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
29.2 +++ b/xlink.cpp Wed Jun 09 13:14:08 2010 +0000
29.3 @@ -0,0 +1,192 @@
29.4 +#include <QDebug>
29.5 +
29.6 +#include "xlink.h"
29.7 +
29.8 +#include "vymmodel.h"
29.9 +#include "xlinkitem.h"
29.10 +#include "xlinkobj.h"
29.11 +
29.12 +/////////////////////////////////////////////////////////////////
29.13 +// Link
29.14 +/////////////////////////////////////////////////////////////////
29.15 +
29.16 +Link::Link (VymModel *m)
29.17 +{
29.18 + //qDebug() << "Const Link () this="<<this;
29.19 + init();
29.20 + model=m;
29.21 +}
29.22 +
29.23 +Link::~Link ()
29.24 +{
29.25 + //qDebug()<<"* Destr Link begin this="<<this<<" bLI="<<beginLinkItem<<" eLI="<<endLinkItem;
29.26 + //deactivate();
29.27 + //qDebug()<<"* Destr Link end this="<<this;
29.28 +}
29.29 +
29.30 +void Link::init ()
29.31 +{
29.32 + xlo=NULL;
29.33 + beginBranch=NULL;
29.34 + endBranch=NULL;
29.35 + xLinkState=Link::undefinedXLink;
29.36 +
29.37 + color=QColor (180,180,180);
29.38 + width=1;
29.39 +}
29.40 +
29.41 +void Link::setBeginBranch (BranchItem *bi)
29.42 +{
29.43 + if (bi)
29.44 + {
29.45 + xLinkState=initXLink;
29.46 + beginBranch=bi;
29.47 + }
29.48 +}
29.49 +
29.50 +BranchItem* Link::getBeginBranch ()
29.51 +{
29.52 + return beginBranch;
29.53 +}
29.54 +
29.55 +void Link::setEndBranch (BranchItem *bi)
29.56 +{
29.57 + if (bi)
29.58 + {
29.59 + xLinkState=initXLink;
29.60 + endBranch=bi;
29.61 + }
29.62 +}
29.63 +
29.64 +BranchItem* Link::getEndBranch()
29.65 +{
29.66 + return endBranch;
29.67 +}
29.68 +
29.69 +void Link::setEndPoint (QPointF p)
29.70 +{
29.71 + if (xlo) xlo->setEnd (p);
29.72 +}
29.73 +
29.74 +void Link::setBeginLinkItem (XLinkItem *li)
29.75 +{
29.76 + if (li)
29.77 + {
29.78 + xLinkState=initXLink;
29.79 + beginLinkItem=li;
29.80 + }
29.81 +}
29.82 +
29.83 +XLinkItem* Link::getBeginLinkItem ()
29.84 +{
29.85 + return beginLinkItem;
29.86 +}
29.87 +
29.88 +void Link::setEndLinkItem (XLinkItem *li)
29.89 +{
29.90 + if (li)
29.91 + {
29.92 + xLinkState=initXLink;
29.93 + endLinkItem=li;
29.94 + }
29.95 +}
29.96 +
29.97 +XLinkItem* Link::getEndLinkItem()
29.98 +{
29.99 + return endLinkItem;
29.100 +}
29.101 +
29.102 +void Link::setWidth (int w)
29.103 +{
29.104 + width=w;
29.105 + if (xlo) xlo->updateXLink();
29.106 +}
29.107 +
29.108 +int Link::getWidth()
29.109 +{
29.110 + return width;
29.111 +}
29.112 +
29.113 +void Link::setColor(QColor c)
29.114 +{
29.115 + color=c;
29.116 + if (xlo) xlo->updateXLink();
29.117 +}
29.118 +
29.119 +QColor Link::getColor()
29.120 +{
29.121 + return color;
29.122 +}
29.123 +
29.124 +bool Link::activate ()
29.125 +{
29.126 + if (beginBranch && endBranch)
29.127 + {
29.128 +
29.129 + if (beginBranch==endBranch) return false;
29.130 + xLinkState=activeXLink;
29.131 +
29.132 + model->updateActions();
29.133 + return true;
29.134 + } else
29.135 + return false;
29.136 +}
29.137 +
29.138 +void Link::deactivate ()
29.139 +{
29.140 + // Remove pointers from XLinkItem to Link and
29.141 + // delete XLinkObj
29.142 +
29.143 + xLinkState=deleteXLink;
29.144 + if (beginLinkItem) beginLinkItem->setLink (NULL);
29.145 + if (endLinkItem) endLinkItem->setLink (NULL);
29.146 + if (xlo)
29.147 + {
29.148 + delete (xlo);
29.149 + xlo=NULL;
29.150 + }
29.151 +}
29.152 +
29.153 +void Link::removeXLinkItem (XLinkItem *xli)
29.154 +{
29.155 + if (xli==beginLinkItem) beginLinkItem=NULL;
29.156 + if (xli==endLinkItem) endLinkItem=NULL;
29.157 +}
29.158 +
29.159 +void Link::updateLink()
29.160 +{
29.161 + if(xlo ) xlo->updateXLink();
29.162 +}
29.163 +
29.164 +QString Link::saveToDir ()
29.165 +{
29.166 + QString s="";
29.167 + if (beginBranch && endBranch && xLinkState==activeXLink)
29.168 + {
29.169 + if (beginBranch==endBranch )
29.170 + qWarning ("Link::saveToDir beginBranch==endBranch");
29.171 + else
29.172 + {
29.173 + QString colAttr=attribut ("color",color.name());
29.174 + QString widAttr=attribut ("width",QString().setNum(width,10));
29.175 + QString begSelAttr=attribut ("beginID",model->getSelectString(beginBranch));
29.176 + QString endSelAttr=attribut ("endID", model->getSelectString(endBranch));
29.177 + s=singleElement ("xlink", colAttr +widAttr +begSelAttr +endSelAttr);
29.178 +
29.179 + }
29.180 + }
29.181 + return s;
29.182 +}
29.183 +
29.184 +XLinkObj* Link::getXLinkObj()
29.185 +{
29.186 + return xlo;
29.187 +}
29.188 +
29.189 +XLinkObj* Link::createMapObj(QGraphicsScene *scene)
29.190 +{
29.191 + if (!xlo) xlo=new XLinkObj (scene,this);
29.192 + return xlo;
29.193 +}
29.194 +
29.195 +
30.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
30.2 +++ b/xlink.h Wed Jun 09 13:14:08 2010 +0000
30.3 @@ -0,0 +1,64 @@
30.4 +#ifndef LINK_H
30.5 +#define LINK_H
30.6 +
30.7 +#include <QColor>
30.8 +
30.9 +#include "xmlobj.h"
30.10 +
30.11 +class QPointF;
30.12 +class QGraphicsScene;
30.13 +class QString;
30.14 +
30.15 +class BranchItem;
30.16 +class LinkableMapObj;
30.17 +class VymModel;
30.18 +class XLinkItem;
30.19 +class XLinkObj;
30.20 +
30.21 +
30.22 +class Link:public XMLObj
30.23 +{
30.24 +public:
30.25 + enum XLinkState {undefinedXLink,initXLink,activeXLink,deleteXLink};
30.26 +
30.27 + Link (VymModel *m);
30.28 + virtual ~Link();
30.29 + virtual void init ();
30.30 + void setBeginBranch (BranchItem*);
30.31 + BranchItem* getBeginBranch();
30.32 + void setEndBranch (BranchItem*);
30.33 + void setEndPoint(QPointF);
30.34 + BranchItem* getEndBranch();
30.35 + void setBeginLinkItem (XLinkItem*);
30.36 + XLinkItem* getBeginLinkItem();
30.37 + void setEndLinkItem (XLinkItem*);
30.38 + XLinkItem* getEndLinkItem ();
30.39 + void setColor(QColor);
30.40 + QColor getColor();
30.41 + void setWidth (int);
30.42 + int getWidth ();
30.43 + bool activate ();
30.44 + void deactivate ();
30.45 + void removeXLinkItem (XLinkItem *xli);
30.46 + void updateLink();
30.47 + QString saveToDir ();
30.48 + XLinkObj* getXLinkObj();
30.49 + XLinkObj* createMapObj(QGraphicsScene *scene);
30.50 +
30.51 +private:
30.52 + XLinkState xLinkState; // init during drawing or active
30.53 + QColor color;
30.54 + int width;
30.55 +
30.56 + XLinkObj *xlo;
30.57 + VymModel *model;
30.58 +
30.59 + BranchItem *beginBranch;
30.60 + BranchItem *endBranch;
30.61 + XLinkItem *beginLinkItem;
30.62 + XLinkItem *endLinkItem;
30.63 +};
30.64 +
30.65 +
30.66 +#endif
30.67 +
31.1 --- a/xlinkitem.cpp Fri Apr 09 14:24:04 2010 +0000
31.2 +++ b/xlinkitem.cpp Wed Jun 09 13:14:08 2010 +0000
31.3 @@ -19,205 +19,51 @@
31.4
31.5 XLinkItem::~XLinkItem ()
31.6 {
31.7 - qDebug() << "Destr XLinkItem "<<this<<" lmo="<<lmo;
31.8 - if (lmo)
31.9 + //qDebug() << "Destr XLinkItem begin "<<this<<" pI="<<parentItem<<" link="<<link;
31.10 + if (link)
31.11 {
31.12 - qDebug() <<" calling delete (lmo)";
31.13 - delete (lmo);
31.14 - }
31.15 - if (partnerXLink)
31.16 - {
31.17 - // Also delete partner
31.18 - qDebug() << " deleting partner="<<partnerXLink;
31.19 - partnerXLink->partnerXLink=NULL; // avoid endless recusion
31.20 - model->deleteItem (partnerXLink);
31.21 - }
31.22 + // tell the model to remove the link later
31.23 + // (and then remove partner link in VymModel::cleanupLinks)
31.24 + model->deleteLink (link);
31.25 + link->removeXLinkItem (this);
31.26 + link->deactivate();
31.27 + }
31.28 + //qDebug() << "Destr XLinkItem end"<<this;
31.29 }
31.30
31.31
31.32 void XLinkItem::init ()
31.33 {
31.34 setType (XLink);
31.35 - beginBranch=NULL;
31.36 - endBranch=NULL;
31.37 - partnerXLink=NULL;
31.38 - isBeginXLink=true;
31.39 - xLinkState=XLinkItem::undefinedXLink;
31.40 -
31.41 - color=QColor (180,180,180);
31.42 - width=1;
31.43 + link=NULL;
31.44 }
31.45
31.46 -void XLinkItem::setBegin (BranchItem *bi)
31.47 +void XLinkItem::setLink (Link *l)
31.48 {
31.49 - if (bi)
31.50 - {
31.51 - xLinkState=initXLink;
31.52 - beginBranch=bi;
31.53 - }
31.54 + link=l;
31.55 }
31.56
31.57 -BranchItem* XLinkItem::getBegin ()
31.58 +Link* XLinkItem::getLink ()
31.59 {
31.60 - return beginBranch;
31.61 -}
31.62 -
31.63 -void XLinkItem::setEnd (BranchItem *bi)
31.64 -{
31.65 - if (bi)
31.66 - {
31.67 - xLinkState=initXLink;
31.68 - endBranch=bi;
31.69 - }
31.70 -}
31.71 -
31.72 -BranchItem* XLinkItem::getEnd()
31.73 -{
31.74 - return endBranch;
31.75 -}
31.76 -
31.77 -void XLinkItem::setWidth (int w)
31.78 -{
31.79 - if (isBeginXLink)
31.80 - {
31.81 - width=w;
31.82 - if (lmo) ((XLinkObj*)lmo)->updateXLink();
31.83 - return;
31.84 - }
31.85 - if (partnerXLink)
31.86 - partnerXLink->setWidth (w);
31.87 -}
31.88 -
31.89 -int XLinkItem::getWidth()
31.90 -{
31.91 - if (isBeginXLink) return width;
31.92 - if (partnerXLink)
31.93 - return partnerXLink->getWidth();
31.94 - else
31.95 - return -1;
31.96 -}
31.97 -
31.98 -void XLinkItem::setColor(QColor c)
31.99 -{
31.100 - if (isBeginXLink)
31.101 - {
31.102 - color=c;
31.103 - if (lmo) ((XLinkObj*)lmo)->updateXLink();
31.104 - return;
31.105 - }
31.106 - if (partnerXLink)
31.107 - partnerXLink->setColor (c);
31.108 -}
31.109 -
31.110 -QColor XLinkItem::getColor()
31.111 -{
31.112 - if (isBeginXLink) return color;
31.113 - if (partnerXLink)
31.114 - return partnerXLink->getColor();
31.115 - else
31.116 - return QColor();
31.117 -}
31.118 -
31.119 -void XLinkItem::setEnd (QPointF p)
31.120 -{
31.121 - if (lmo) ((XLinkObj*)lmo)->setEnd (p);
31.122 -}
31.123 -
31.124 -bool XLinkItem::activate ()
31.125 -{
31.126 - if (beginBranch && endBranch)
31.127 - {
31.128 - if (beginBranch==endBranch) return false;
31.129 -
31.130 - partnerXLink=model->createXLink (endBranch);
31.131 - partnerXLink->setBegin (beginBranch);
31.132 - partnerXLink->setEnd (endBranch);
31.133 - partnerXLink->partnerXLink=this;
31.134 - partnerXLink->isBeginXLink=false;
31.135 -
31.136 - xLinkState=activeXLink;
31.137 - partnerXLink->xLinkState=activeXLink;
31.138 - partnerXLink->setHeading ("xLink to: "+beginBranch->getHeading());
31.139 - setHeading ("xLink to: "+endBranch->getHeading());
31.140 -
31.141 - model->updateActions();
31.142 - return true;
31.143 - } else
31.144 - return false;
31.145 -}
31.146 -
31.147 -bool XLinkItem::isBegin()
31.148 -{
31.149 - return isBeginXLink;
31.150 + return link;
31.151 }
31.152
31.153 void XLinkItem::updateXLink()
31.154 {
31.155 - if(lmo && isBeginXLink)
31.156 - ((XLinkObj*)lmo)->updateXLink();
31.157 - else
31.158 - if (partnerXLink) partnerXLink->updateXLink();
31.159 -}
31.160 -
31.161 -void XLinkItem::updateVisibility()
31.162 -{
31.163 - if (lmo) lmo->updateVisibility();
31.164 + qDebug()<<"XLI::updateXLink";
31.165 + if (link)
31.166 + link->updateLink();
31.167 }
31.168
31.169 BranchItem* XLinkItem::getPartnerBranch()
31.170 {
31.171 - if (!beginBranch && !endBranch)
31.172 - return NULL;
31.173 - if (isBeginXLink)
31.174 - return endBranch;
31.175 - else
31.176 - return beginBranch;
31.177 + if (link && link->getBeginBranch() && link->getEndBranch())
31.178 + {
31.179 + if (parentItem==link->getBeginBranch())
31.180 + return link->getEndBranch();
31.181 + else
31.182 + return link->getBeginBranch();
31.183 + }
31.184 + return NULL;
31.185 }
31.186
31.187 -BranchItem* XLinkItem::getOtherBranch(TreeItem *ti)
31.188 -{
31.189 - BranchItem *pb=getPartnerBranch();
31.190 - if (!pb) return NULL;
31.191 -
31.192 - if (ti==beginBranch)
31.193 - return endBranch;
31.194 - else
31.195 - return beginBranch;
31.196 -}
31.197 -
31.198 -
31.199 -
31.200 -XLinkItem* XLinkItem::getPartnerXLink()
31.201 -{
31.202 - return partnerXLink;
31.203 -}
31.204 -
31.205 -
31.206 -QString XLinkItem::saveToDir ()
31.207 -{
31.208 - QString s="";
31.209 - if (beginBranch && endBranch && xLinkState==activeXLink)
31.210 - {
31.211 - if (beginBranch==endBranch )
31.212 - qWarning ("XLI::saveToDir beginBranch==endBranch"); //FIXME-3 s=""
31.213 - else
31.214 - {
31.215 - QString colAttr=attribut ("color",color.name());
31.216 - QString widAttr=attribut ("width",QString().setNum(width,10));
31.217 - QString begSelAttr=attribut ("beginID",model->getSelectString(beginBranch));
31.218 - QString endSelAttr=attribut ("endID", model->getSelectString(endBranch));
31.219 - s=beginElement ("xlink", colAttr +widAttr +begSelAttr +endSelAttr);
31.220 -
31.221 - s+=endElement ("xlink");
31.222 - }
31.223 - }
31.224 - return s;
31.225 -}
31.226 -
31.227 -XLinkObj* XLinkItem::createMapObj(QGraphicsScene *scene)
31.228 -{
31.229 - XLinkObj* xlo=new XLinkObj (scene,this);
31.230 - lmo=(LinkableMapObj*)xlo;
31.231 - return xlo;
31.232 -}
31.233 -
32.1 --- a/xlinkitem.h Fri Apr 09 14:24:04 2010 +0000
32.2 +++ b/xlinkitem.h Wed Jun 09 13:14:08 2010 +0000
32.3 @@ -2,14 +2,16 @@
32.4 #define XLINKITEM_H
32.5
32.6 class BranchItem;
32.7 +class QGraphicsScene;
32.8 class XLinkObj;
32.9 -class QGraphicsScene;
32.10
32.11 #include "mapitem.h"
32.12 +#include "xlink.h"
32.13
32.14 /*! \brief xlinks are used to draw arbitrary connections between branches (BranchObj) in the map. */
32.15
32.16 /////////////////////////////////////////////////////////////////////////////
32.17 +
32.18 class XLinkItem:public MapItem {
32.19 public:
32.20 enum XLinkState {undefinedXLink,initXLink,activeXLink,deleteXLink};
32.21 @@ -17,33 +19,13 @@
32.22 XLinkItem (const QList<QVariant> &data, TreeItem *parent=NULL);
32.23 virtual ~XLinkItem ();
32.24 virtual void init ();
32.25 - void setBegin (BranchItem*);
32.26 - BranchItem* getBegin();
32.27 - void setEnd (BranchItem*);
32.28 - void setEnd (QPointF);
32.29 - BranchItem* getEnd();
32.30 - void setColor(QColor);
32.31 - QColor getColor();
32.32 - void setWidth (int);
32.33 - int getWidth ();
32.34 - bool activate (); //! Creates a 2nd XLink (without a XLinkObj attached)
32.35 - bool isBegin(); //! true, if this is master xLink, which may have an XLinkObj attached
32.36 + void setLink (Link*);
32.37 + Link* getLink ();
32.38 void updateXLink();
32.39 - virtual void updateVisibility(); // FIXME-3 not really needed atm...
32.40 BranchItem* getPartnerBranch ();
32.41 - BranchItem* getOtherBranch (TreeItem *ti);
32.42 - XLinkItem *getPartnerXLink(); //! Partner XLink
32.43 - QString saveToDir ();
32.44 - virtual XLinkObj* createMapObj(QGraphicsScene *scene);
32.45
32.46 private:
32.47 - XLinkState xLinkState; // init during drawing or active
32.48 - QColor color;
32.49 - int width;
32.50 - BranchItem *beginBranch;
32.51 - BranchItem *endBranch;
32.52 - XLinkItem *partnerXLink;
32.53 - bool isBeginXLink;
32.54 + Link *link;
32.55 };
32.56
32.57 #endif
33.1 --- a/xlinkobj.cpp Fri Apr 09 14:24:04 2010 +0000
33.2 +++ b/xlinkobj.cpp Wed Jun 09 13:14:08 2010 +0000
33.3 @@ -1,11 +1,9 @@
33.4 +#include <QDebug>
33.5 +
33.6 #include "xlinkobj.h"
33.7
33.8 #include "branchobj.h"
33.9 #include "branchitem.h"
33.10 -#include "xlinkitem.h"
33.11 -
33.12 -#include <iostream>
33.13 -using namespace std;
33.14
33.15 /////////////////////////////////////////////////////////////////
33.16 // XLinkObj
33.17 @@ -13,16 +11,18 @@
33.18
33.19 int XLinkObj::arrowSize=10; // make instances
33.20
33.21 -XLinkObj::XLinkObj (QGraphicsScene* scene, TreeItem* ti):MapObj(scene,ti)
33.22 +XLinkObj::XLinkObj (QGraphicsScene* scene,Link *l):MapObj(scene)
33.23 {
33.24 - //cout << "Const XLinkObj (s)\n";
33.25 + //qDebug()<< "Const XLinkObj (s,Link)";
33.26 + link=l;
33.27 init();
33.28 }
33.29
33.30
33.31 +
33.32 XLinkObj::~XLinkObj ()
33.33 {
33.34 - //cout << "Destr XLinkObj\n";
33.35 + //qDebug() << "Destr XLinkObj";
33.36 delete (line);
33.37 delete (poly);
33.38 }
33.39 @@ -30,16 +30,15 @@
33.40
33.41 void XLinkObj::init ()
33.42 {
33.43 - XLinkItem *xli=(XLinkItem*)treeItem;
33.44 visBranch=NULL;
33.45
33.46 - pen.setColor ( xli->getColor() );
33.47 - pen.setWidth ( xli->getWidth() );
33.48 + pen.setColor ( link->getColor() );
33.49 + pen.setWidth ( link->getWidth() );
33.50 pen.setCapStyle ( Qt::RoundCap );
33.51 line=scene->addLine(QLineF(1,1,1,1),pen);
33.52 - line->setZValue (Z_XLINK);
33.53 - poly=scene->addPolygon(QPolygonF(),pen, xli->getColor());
33.54 - poly->setZValue (Z_XLINK);
33.55 + line->setZValue (Z_LINK);
33.56 + poly=scene->addPolygon(QPolygonF(),pen, link->getColor());
33.57 + poly->setZValue (Z_LINK);
33.58 setVisibility (true);
33.59 }
33.60
33.61 @@ -53,7 +52,7 @@
33.62 {
33.63 QPointF a,b;
33.64 QPolygonF pa;
33.65 - if (visBranch)
33.66 + if (visBranch)
33.67 {
33.68 // Only one of the linked branches is visible
33.69 BranchObj *bo=(BranchObj*)(visBranch->getLMO());
33.70 @@ -81,7 +80,7 @@
33.71 } else
33.72 {
33.73 // Both linked branches are visible
33.74 - BranchItem *bi=((XLinkItem*)treeItem)->getBegin();
33.75 + BranchItem *bi=link->getBeginBranch();
33.76 if ( bi)
33.77 {
33.78 // If a link is just drawn in the editor,
33.79 @@ -96,8 +95,7 @@
33.80 // This shouldn't be reached normally...
33.81 a=beginPos;
33.82
33.83 - // FIXME-3 try to get rid of xLinkstate if (xLinkState==activeXLink && endBranch)
33.84 - bi=((XLinkItem*)treeItem)->getEnd();
33.85 + bi=link->getEndBranch();
33.86 if (bi)
33.87 {
33.88 BranchObj *bo=(BranchObj*)(bi->getLMO());
33.89 @@ -112,10 +110,9 @@
33.90
33.91 beginPos=a;
33.92 endPos=b;
33.93 - XLinkItem *xli=(XLinkItem*)treeItem;
33.94 - pen.setColor ( xli->getColor() );
33.95 - pen.setWidth ( xli->getWidth() );
33.96 - poly->setBrush (xli->getColor() );
33.97 + pen.setColor ( link->getColor() );
33.98 + pen.setWidth ( link->getWidth() );
33.99 + poly->setBrush (link->getColor() );
33.100 line->setPen (pen);
33.101 line->setLine(a.x(), a.y(), b.x(), b.y());
33.102 }
33.103 @@ -148,12 +145,12 @@
33.104
33.105 void XLinkObj::setVisibility ()
33.106 {
33.107 - BranchItem* beginBI=((XLinkItem*)treeItem)->getBegin();
33.108 + BranchItem* beginBI=link->getBeginBranch();
33.109 BranchObj* beginBO=NULL;
33.110 if (beginBI) beginBO=(BranchObj*)(beginBI->getLMO());
33.111
33.112 BranchObj* endBO=NULL;
33.113 - BranchItem* endBI=((XLinkItem*)treeItem)->getEnd();
33.114 + BranchItem* endBI=link->getEndBranch();
33.115 if (endBI) endBO=(BranchObj*)(endBI->getLMO());
33.116 if (beginBO && endBO)
33.117 {
34.1 --- a/xlinkobj.h Fri Apr 09 14:24:04 2010 +0000
34.2 +++ b/xlinkobj.h Wed Jun 09 13:14:08 2010 +0000
34.3 @@ -2,6 +2,7 @@
34.4 #define XLINKOBJ_H
34.5
34.6 #include "mapobj.h"
34.7 +#include "xlink.h"
34.8
34.9 class BranchObj;
34.10 class BranchItem;
34.11 @@ -11,7 +12,7 @@
34.12 /////////////////////////////////////////////////////////////////////////////
34.13 class XLinkObj:public MapObj {
34.14 public:
34.15 - XLinkObj (QGraphicsScene* scene, TreeItem* ti);
34.16 + XLinkObj (QGraphicsScene* scene, Link* l );
34.17 virtual ~XLinkObj ();
34.18 virtual void init ();
34.19 virtual void setEnd (QPointF);
34.20 @@ -30,6 +31,7 @@
34.21 QPointF endPos;
34.22
34.23 BranchItem *visBranch; // the "visible" part of a partially scrolled li
34.24 + Link *link;
34.25 };
34.26
34.27 #endif
35.1 --- a/xml-base.cpp Fri Apr 09 14:24:04 2010 +0000
35.2 +++ b/xml-base.cpp Wed Jun 09 13:14:08 2010 +0000
35.3 @@ -99,8 +99,9 @@
35.4 inputFile=f;
35.5 }
35.6
35.7 -void parseBaseHandler::setLoadMode (const LoadMode &lm)
35.8 +void parseBaseHandler::setLoadMode (const LoadMode &lm, int p)
35.9 {
35.10 loadMode=lm;
35.11 + insertPos=p;
35.12 }
35.13
36.1 --- a/xml-base.h Fri Apr 09 14:24:04 2010 +0000
36.2 +++ b/xml-base.h Wed Jun 09 13:14:08 2010 +0000
36.3 @@ -29,12 +29,14 @@
36.4 void setModel (VymModel *);
36.5 void setTmpDir (QString);
36.6 void setInputFile (QString);
36.7 - void setLoadMode (const LoadMode &);
36.8 + void setLoadMode (const LoadMode &,int p=-1);
36.9
36.10 protected:
36.11 QString errorProt;
36.12
36.13 LoadMode loadMode;
36.14 + int insertPos;
36.15 +
36.16 bool isVymPart;
36.17 // State state;
36.18 // State laststate;
37.1 --- a/xml-vym.cpp Fri Apr 09 14:24:04 2010 +0000
37.2 +++ b/xml-vym.cpp Wed Jun 09 13:14:08 2010 +0000
37.3 @@ -146,9 +146,15 @@
37.4 lastBranch=bi;
37.5 if (loadMode==ImportAdd)
37.6 {
37.7 + // Import Add
37.8 lastBranch=model->createBranch(lastBranch);
37.9 - } //else
37.10 - model->clearItem(lastBranch);
37.11 + } else
37.12 + {
37.13 + // Import Replace
37.14 + // Parser should not be called with ImportReplace any longer,
37.15 + // that's done in VymModel now.
37.16 + qDebug()<<"xml-vym: ImportReplace ?!";
37.17 + }
37.18 } else
37.19 // add mapCenter without parent
37.20 lastBranch=model->createMapCenter();
37.21 @@ -208,6 +214,8 @@
37.22 if (loadMode==ImportAdd)
37.23 {
37.24 lastBranch=model->createBranch(lastBranch);
37.25 + if (insertPos>=0)
37.26 + model->relinkBranch (lastBranch,(BranchItem*)ti,insertPos);
37.27 } else
37.28 model->clearItem (lastBranch);
37.29 readBranchAttr (atts);
37.30 @@ -239,6 +247,10 @@
37.31 {
37.32 state=StateBranchXLink;
37.33 if (!readXLinkAttr (atts)) return false;
37.34 + } else if ( eName == "xlink" && state == StateMap)
37.35 + {
37.36 + state=StateLink;
37.37 + if (!readLinkNewAttr (atts)) return false;
37.38 } else if ( eName == "branch" && state == StateBranch )
37.39 {
37.40 lastBranch=model->createBranch(lastBranch);
37.41 @@ -545,10 +557,17 @@
37.42 return true;
37.43 }
37.44
37.45 -bool parseVYMHandler::readXLinkAttr (const QXmlAttributes& a)
37.46 +bool parseVYMHandler::readXLinkAttr (const QXmlAttributes& a)
37.47 {
37.48 + // Format of links was changed several times:
37.49 + //
37.50 // object ID is used starting in version 1.8.76
37.51 // (before there was beginBranch and endBranch)
37.52 + //
37.53 + // Starting in 1.13.2 xlinks are no longer subitems of branches,
37.54 + // but listed at the end of the data in a map. This make handling
37.55 + // of links much safer and easier
37.56 +
37.57 if (!a.value( "beginID").isEmpty() )
37.58 {
37.59 if (!a.value( "endID").isEmpty() )
37.60 @@ -557,28 +576,66 @@
37.61 TreeItem *endBI=model->findBySelectString (a.value( "endID"));
37.62 if (beginBI && endBI && beginBI->isBranchLikeType() && endBI->isBranchLikeType() )
37.63 {
37.64 - XLinkItem *xli=model->createXLink (lastBranch,true);
37.65 - xli->setBegin ( (BranchItem*)beginBI );
37.66 - xli->setEnd ( (BranchItem*)endBI);
37.67 - xli->activate();
37.68 + Link *li=new Link (model);
37.69 + li->setBeginBranch ( (BranchItem*)beginBI );
37.70 + li->setEndBranch ( (BranchItem*)endBI);
37.71
37.72 if (!a.value( "color").isEmpty() )
37.73 {
37.74 QColor col;
37.75 col.setNamedColor(a.value("color"));
37.76 - xli->setColor (col);
37.77 + li->setColor (col);
37.78 }
37.79
37.80 if (!a.value( "width").isEmpty() )
37.81 {
37.82 bool okx;
37.83 - xli->setWidth(a.value ("width").toInt (&okx, 10));
37.84 + li->setWidth(a.value ("width").toInt (&okx, 10));
37.85 }
37.86 - xli->updateXLink();
37.87 + model->createLink (li,true); // create MO by default
37.88 }
37.89 }
37.90 }
37.91 - return true; // xLinks can only be established at the "end branch", return true
37.92 + return true;
37.93 +}
37.94 +
37.95 +bool parseVYMHandler::readLinkNewAttr (const QXmlAttributes& a)
37.96 +{
37.97 + // object ID is used starting in version 1.8.76
37.98 + // (before there was beginBranch and endBranch)
37.99 +
37.100 + // Beginning in 1.13.2 xLinks are no longer parts of branches, but
37.101 + // a separate list after all the mapCenters within <vymmap> ... </vymmap>
37.102 +
37.103 + if (!a.value( "beginID").isEmpty() )
37.104 + {
37.105 + if (!a.value( "endID").isEmpty() )
37.106 + {
37.107 + TreeItem *beginBI=model->findBySelectString (a.value( "beginID"));
37.108 + TreeItem *endBI=model->findBySelectString (a.value( "endID"));
37.109 + if (beginBI && endBI && beginBI->isBranchLikeType() && endBI->isBranchLikeType() )
37.110 + {
37.111 + Link *li=new Link (model);
37.112 + li->setBeginBranch ( (BranchItem*)beginBI );
37.113 + li->setEndBranch ( (BranchItem*)endBI);
37.114 +
37.115 + if (!a.value( "color").isEmpty() )
37.116 + {
37.117 + QColor col;
37.118 + col.setNamedColor(a.value("color"));
37.119 + li->setColor (col);
37.120 + }
37.121 +
37.122 + if (!a.value( "width").isEmpty() )
37.123 + {
37.124 + bool okx;
37.125 + li->setWidth(a.value ("width").toInt (&okx, 10));
37.126 + }
37.127 + model->createLink (li,true); // create MO by default
37.128 + }
37.129 + }
37.130 + }
37.131 + return true;
37.132 }
37.133
37.134 bool parseVYMHandler::readHtmlAttr (const QXmlAttributes& a)
38.1 --- a/xml-vym.h Fri Apr 09 14:24:04 2010 +0000
38.2 +++ b/xml-vym.h Wed Jun 09 13:14:08 2010 +0000
38.3 @@ -22,6 +22,7 @@
38.4 bool readNoteAttr (const QXmlAttributes&);
38.5 bool readImageAttr (const QXmlAttributes&);
38.6 bool readXLinkAttr (const QXmlAttributes&);
38.7 + bool readLinkNewAttr (const QXmlAttributes&);
38.8 bool readHtmlAttr (const QXmlAttributes&);
38.9 bool readSettingAttr (const QXmlAttributes&);
38.10
38.11 @@ -41,7 +42,8 @@
38.12 StateStandardFlag,
38.13 StateNote,
38.14 StateImage,
38.15 - StateHeading
38.16 + StateHeading,
38.17 + StateLink,
38.18 };
38.19
38.20 int branchesCounter;
39.1 --- a/xmlobj.cpp Fri Apr 09 14:24:04 2010 +0000
39.2 +++ b/xmlobj.cpp Wed Jun 09 13:14:08 2010 +0000
39.3 @@ -19,6 +19,29 @@
39.4 return r;
39.5 }
39.6
39.7 +QString quoteUmlaut(const QString &s)
39.8 +{
39.9 + QString r=s;
39.10 + QRegExp rx( "ü");
39.11 + r.replace ( rx,"ü");
39.12 + rx.setPattern( "Ü");
39.13 + r.replace ( rx,"Ü");
39.14 + rx.setPattern( "ö");
39.15 + r.replace ( rx,"ö");
39.16 + rx.setPattern( "Ö");
39.17 + r.replace ( rx,"Ö");
39.18 + rx.setPattern( "ä");
39.19 + r.replace ( rx,"ä");
39.20 + rx.setPattern( "Ö");
39.21 + r.replace ( rx,"Ä");
39.22 + rx.setPattern( "ß");
39.23 + r.replace ( rx,"ß");
39.24 + rx.setPattern( "€");
39.25 + r.replace ( rx,"€");
39.26 + return r;
39.27 +}
39.28 +
39.29 +
39.30
39.31
39.32 int XMLObj::actindent=0; // make instance of actindent
40.1 --- a/xmlobj.h Fri Apr 09 14:24:04 2010 +0000
40.2 +++ b/xmlobj.h Wed Jun 09 13:14:08 2010 +0000
40.3 @@ -4,6 +4,7 @@
40.4 class QString;
40.5
40.6 QString quotemeta(const QString&);
40.7 +QString quoteUmlaut(const QString&);
40.8
40.9 /////////////////////////////////////////////////////////////////////////////
40.10 class XMLObj