# HG changeset patch # User insilmaril # Date 1121784270 0 # Node ID 9b9c7e8b9147b60a36faa52fb011878066e9e5b4 # Parent 0dc9286ad3d4b7ecae146f4931c854bb4a5cb550 enhanced dragdrop, speedup for moving branches diff -r 0dc9286ad3d4 -r 9b9c7e8b9147 branchobj.cpp --- a/branchobj.cpp Wed Jul 13 11:36:15 2005 +0000 +++ b/branchobj.cpp Tue Jul 19 14:44:30 2005 +0000 @@ -1091,15 +1091,14 @@ { // Find current parent and // remove pointer to myself there - if (!dst) return NULL; - BranchObj *par=(BranchObj*)(parObj); if (par) par->removeBranchPtr (this); else return NULL; + // Create new pointer to myself at dst if (pos<0||dst->getDepth()==0) { // links myself as last branch at dst diff -r 0dc9286ad3d4 -r 9b9c7e8b9147 demos/time-management.vym Binary file demos/time-management.vym has changed diff -r 0dc9286ad3d4 -r 9b9c7e8b9147 demos/todo.vym Binary file demos/todo.vym has changed diff -r 0dc9286ad3d4 -r 9b9c7e8b9147 exportxhtmldialog.ui --- a/exportxhtmldialog.ui Wed Jul 13 11:36:15 2005 +0000 +++ b/exportxhtmldialog.ui Tue Jul 19 14:44:30 2005 +0000 @@ -8,8 +8,8 @@ 0 0 - 614 - 757 + 514 + 468 @@ -21,11 +21,11 @@ Export XHTML - + unnamed - + layout17 @@ -80,14 +80,60 @@ - + + + layout17 + + + + unnamed + + + + spacer5 + + + Horizontal + + + Expanding + + + + 61 + 21 + + + + + + exportButton + + + Export + + + true + + + + + cancelButton + + + Cancel + + + + + buttonGroup2 - 3 - 3 + 5 + 5 0 0 @@ -155,180 +201,260 @@ - + - layout6 + groupBox2 + + + Stylesheets unnamed - + - browsePostExportButton + layout7 - - - 0 - 0 - 0 - 0 - + + + unnamed + + + + textLabel2 + + + + 0 + 5 + 0 + 0 + + + + + 125 + 0 + + + + XSL: + + + AlignVCenter|AlignRight + + + + + lineEditXSL + + + + + browseXSLButton + + + + 0 + 0 + 0 + 0 + + + + Browse + + + + + + + layout6 - - Browse - - - - - textLabel1_3 - - - - 1 - 5 - 0 - 0 - - - - Before export: - - - AlignVCenter|AlignRight - - - - - lineEditXSL - - - - - browseXSLButton - - - - 0 - 0 - 0 - 0 - - - - Browse - - - - - lineEditPreScript - - - - - browsePreExportButton - - - - 0 - 0 - 0 - 0 - - - - Browse - - - - - textLabel2_3 - - - Stylesheets: - - - - - browseCSSButton - - - - 0 - 0 - 0 - 0 - - - - Browse - - - - - textLabel1_2 - - - CSS: - - - AlignVCenter|AlignRight - - - - - textLabel2_2 - - - - 1 - 5 - 0 - 0 - - - - NoFrame - - - After Export: - - - AlignVCenter|AlignRight - - - - - lineEditCSS - - - - - textLabel2 - - - XSL: - - - AlignVCenter|AlignRight - - - - - lineEditPostScript - - - - - textLabel1_4 - - - Scripts: - + + + unnamed + + + + textLabel1_2 + + + + 0 + 5 + 0 + 0 + + + + + 125 + 0 + + + + CSS: + + + AlignVCenter|AlignRight + + + + + lineEditCSS + + + + + browseCSSButton + + + + 0 + 0 + 0 + 0 + + + + Browse + + + - + + + groupBox1 + + + Scripts + + + + unnamed + + + + layout4 + + + + unnamed + + + + textLabel1_3 + + + + 0 + 5 + 0 + 0 + + + + + 125 + 0 + + + + Before export: + + + AlignVCenter|AlignRight + + + + + lineEditPostScript + + + + + browsePreExportButton + + + + 0 + 0 + 0 + 0 + + + + Browse + + + + + + + layout5 + + + + unnamed + + + + textLabel2_2 + + + + 0 + 5 + 0 + 0 + + + + + 125 + 0 + + + + NoFrame + + + After Export: + + + AlignVCenter|AlignRight + + + + + lineEditPreScript + + + + + browsePostExportButton + + + + 0 + 0 + 0 + 0 + + + + Browse + + + + + + + spacer3 @@ -336,62 +462,16 @@ Vertical - Expanding + MinimumExpanding 20 - 60 + 20 - - - layout17 - - - - unnamed - - - - spacer5 - - - Horizontal - - - Expanding - - - - 61 - 21 - - - - - - exportButton - - - Export - - - true - - - - - cancelButton - - - Cancel - - - - - + diff -r 0dc9286ad3d4 -r 9b9c7e8b9147 linkablemapobj.cpp --- a/linkablemapobj.cpp Wed Jul 13 11:36:15 2005 +0000 +++ b/linkablemapobj.cpp Tue Jul 19 14:44:30 2005 +0000 @@ -536,7 +536,6 @@ part=s.section(",",0,0); typ=part.left (3); num=part.right(part.length() - 3); - if (typ=="mc:") { if (depth>0) diff -r 0dc9286ad3d4 -r 9b9c7e8b9147 mainwindow.cpp --- a/mainwindow.cpp Wed Jul 13 11:36:15 2005 +0000 +++ b/mainwindow.cpp Tue Jul 19 14:44:30 2005 +0000 @@ -1861,7 +1861,7 @@ { QMessageBox::information( findWindow, tr( "VYM -Information:" ), tr("No matches found for ")+ - "'"+s+"'"); + ""+s+""); } } diff -r 0dc9286ad3d4 -r 9b9c7e8b9147 mapeditor.cpp --- a/mapeditor.cpp Wed Jul 13 11:36:15 2005 +0000 +++ b/mapeditor.cpp Tue Jul 19 14:44:30 2005 +0000 @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -611,37 +612,93 @@ */ } -void MapEditor::parseAtom(const QString &s) +void MapEditor::parseAtom(const QString &atom) { API api; - QString c,p,p0; - api.parseCommand (s,c,p); - api.getString(p,p0); - /* FIXME testing - cout <<"ME::parseAtom s="<move (x,y); + } + } + } + else if (com=="linkBranchToPos") + { + if (selection && typeid(*selection) == typeid(BranchObj) ) + { + if (api.checkParamCount(4)) + { + s=api.parString(ok,0); + LinkableMapObj *dst=mapCenter->findObjBySelect (s); + if (dst) + { + if (typeid(*dst) == typeid(BranchObj) ) + ((BranchObj*)(selection))->moveBranchTo ((BranchObj*)(dst),-1); + if (typeid(*dst) == typeid(MapCenterObj) ) + { + ((BranchObj*)(selection))->moveBranchTo ((BranchObj*)(dst),-1); + x=api.parInt (ok,2); + if (ok) + { + y=api.parInt (ok,3); + if (ok) ((BranchObj*)(selection))->move (x,y); + } + } + } + } + } + } else if (com=="setHeading") + { + if (api.checkParamCount(1)) + { + s=api.parString (ok,0); + if (ok) setHeading (s); + } + } // Internal commands, used for undo etc. - else if (c==QString("undoMap")) + else if (com==QString("undoMap")) undoXML(""); - else if (c==QString("undoPart")) - undoXML(p0); - else if (c=="select") - select (p0); + else if (com==QString("undoPart")) + { + if (api.checkParamCount(1)) + { + s=api.parString (ok,0); + undoXML(s); + } + } else if (com=="select") + if (api.checkParamCount(1)) + { + s=api.parString(ok,0); + if (ok) select (s); + } else + api.setError ("Unknown command in: "+atom); + + // Any errors? + if (api.error()) { cout << "MapEditor::parseAtom: Error!\n"; - cout << " Command unknown: \""<unselect(); selection=NULL; } + */ parseAtom (undoCommand); mapCenter->reposition(); @@ -1415,6 +1474,21 @@ } } +void MapEditor::linkBranchToPos (LinkableMapObj *dst, const int &pos, const QPoint &p) +{ + // FIXME no saveState, because this is only internal at undo so far + if (selection && typeid(*selection) == typeid(BranchObj) ) + { + if (dst && typeid(*dst) == typeid(BranchObj) ) + ((BranchObj*)(selection))->moveBranchTo ((BranchObj*)(dst),-1); + if (dst && typeid(*dst) == typeid(MapCenterObj) ) + { + ((BranchObj*)(selection))->moveBranchTo ((BranchObj*)(dst),-1); + ((BranchObj*)(selection))->move (p); + } + } +} + void MapEditor::editHeading() { // Finish open lineEdits @@ -3006,7 +3080,6 @@ selection->select(); adjustCanvasSize(); - } // Check, if systemFlag clicked @@ -3035,6 +3108,11 @@ // Left Button Move Branches if (e->button() == QMouseEvent::LeftButton ) { + movingObj_start.setX( p.x() - selection->x() ); + movingObj_start.setY( p.y() - selection->y() ); + movingObj_orgPos.setX (lmo->x() ); + movingObj_orgPos.setY (lmo->y() ); + // If modMode==copy, then we want to "move" the _new_ object around // then we need the offset from p to the _old_ selection, because of tmp if (actionModModeCopy->isOn() && @@ -3043,20 +3121,13 @@ if (typeid(*selection)==typeid(BranchObj) ) { copyingObj=true; - movingObj_start.setX( p.x() - selection->x() ); - movingObj_start.setY( p.y() - selection->y() ); mapCenter->addBranch ((BranchObj*)(selection)); unselect(); selection=mapCenter->getLastBranch(); selection->select(); mapCenter->reposition(); } - } else - { - movingObj_start.setX( p.x() - selection->x() ); - movingObj_start.setY( p.y() - selection->y() ); - } - + } movingObj=selection; } else // Middle Button Toggle Scroll @@ -3137,7 +3208,6 @@ // setLinkStyle calls updateLink, only set it once if (fio->getLinkStyle()!=fio->getDefLinkStyle() ) fio->setLinkStyle (fio->getDefLinkStyle()); - } // TODO if (typeid(*selection) == typeid(FloatTextObj)) } @@ -3156,7 +3226,7 @@ { // depth==1, mainbranch setChanged(); - saveState(lmosel); + saveState("move "+qpointToString(movingObj_orgPos)); lmosel->move(p.x() -movingObj_start.x(), p.y()-movingObj_start.y() ); } else { @@ -3299,50 +3369,34 @@ copyingObj=false; - if (!dst ) + if (dst ) { - if (copyingObj) - { - // remove the current selection, if we have no destination - selection->unselect(); - ((BranchObj*)(selection->getParObj()))->removeBranch ((BranchObj*)(selection)); - if (selectionLast) - { - selection=selectionLast; - selectionLast=NULL; - selection->select(); - } - } - } else - { + BranchObj* bs=((BranchObj*)(selection)); setChanged(); - saveState(); + saveState ("linkBranchToPos (\""+ + (bs->getParObj())->getSelectString()+ + "\","+ + QString("%1").arg(bs->getNum())+ + ","+ + QString ("%1,%2").arg(movingObj_orgPos.x()).arg(movingObj_orgPos.y())+ + ")"); // TODO we also could check, if dest and src are on same branch, // then it would be sufficient to saveState of this branch // Modifiers allow to insert above/below dst if (e->state() & QMouseEvent::ShiftButton) { - ((BranchObj*)(selection))->moveBranchTo - ( - (BranchObj*)(dst), - ((BranchObj*)(dst))->getNum() - ); - //if (selection) selection->select(); + bs->moveBranchTo ( (BranchObj*)(dst), ((BranchObj*)(dst))->getNum()); } else if (e->state() & QMouseEvent::ControlButton) { - ((BranchObj*)(selection))->moveBranchTo - ( - (BranchObj*)(dst), - ((BranchObj*)(dst))->getNum()+1 - ); - //if (selection) selection->select(); + bs->moveBranchTo ( (BranchObj*)(dst), ((BranchObj*)(dst))->getNum()+1); } else { - ((BranchObj*)(selection))->moveBranchTo ((BranchObj*)(dst),-1); + bs->moveBranchTo ((BranchObj*)(dst),-1); if (dst->getDepth()==0) - ((BranchObj*)(selection))->move (savePos); + bs->move (savePos); + cout << "ME::release start was: "<format(i);i++) // Debug mime type +// cerr << event->format(i) << endl; + if (selection && (typeid(*selection) == typeid(BranchObj)) || (typeid(*selection) == typeid(MapCenterObj))) { @@ -3414,13 +3472,30 @@ } // If Uri are dragged from firefox - if (event->provides("text/x-moz-url") ){ + if (event->provides("_NETSCAPE_URL")){ event->accept(); return; } + + // If QTextDrag can decode mime type + if (QTextDrag::canDecode(event)) { + event->accept(); + return; + } + } event->ignore(); } + +bool isUnicode16(const QByteArray &d) +{ + // FIXME: make more precise check for unicode 16. + // Guess unicode16 if any of second bytes are zero + unsigned int length = max(0,d.size()-2)/2; + for (unsigned int i = 0; iprovides("image/png")) { QPixmap pix; @@ -3444,7 +3520,7 @@ } else if (event->provides("application/x-moz-file-promise-url") && event->provides("application/x-moz-nativeimage")) { - // Contains url to the img src in UTF-16 + // Contains url to the img src in unicode16 QByteArray d = event->encodedData("application/x-moz-file-promise-url"); QString url = QString((const QChar*)d.data(),d.size()/2); fetchImage(url); @@ -3453,14 +3529,40 @@ } else if (event->provides ("text/uri-list")) { // Uris provided e.g. by konqueror QUriDrag::decode (event,uris); - } else if (event->provides ("text/x-moz-url-data")) + } else if (event->provides ("_NETSCAPE_URL")) { // Uris provided by Mozilla - QString str; - QTextDrag::decode (event,str); - uris.append(str); + QStringList l = QStringList::split("\n", event->encodedData("_NETSCAPE_URL")); + uris.append(l[0]); + heading = l[1]; + } else if (event->provides("text/html")) { + + // Handels text mime types + // Look like firefox allways handle text as unicode16 (2 bytes per char.) + QByteArray d = event->encodedData("text/html"); + QString text; + if (isUnicode16(d)) + text = QString((const QChar*)d.data(),d.size()/2); + else + text = QString(d); + + textEditor->setText(text); + + event->accept(); + update=true; + } else if (event->provides("text/plain")) { + QByteArray d = event->encodedData("text/plain"); + QString text; + if (isUnicode16(d)) + text = QString((const QChar*)d.data(),d.size()/2); + else + text = QString(d); + + textEditor->setText(text); + + event->accept(); + update= true; } - if (uris.count()>0) { QStringList files; @@ -3473,12 +3575,23 @@ if (bo) { s=QUriDrag::uriToLocalFile(u); - if (s) - files.append(QDir::convertSeparators(s)); - else - urls.append (u); - bo->setHeading(u); - bo->setURL (u); + if (s) { + QString file = QDir::convertSeparators(s); + heading = QFileInfo(file).baseName(); + files.append(file); + if (file.endsWith(".vym", false)) + bo->setVymLink(file); + else + bo->setURL(u); + } else { + urls.append (u); + bo->setURL(u); + } + + if (heading) + bo->setHeading(heading); + else + bo->setHeading(u); } } update=true; @@ -3486,6 +3599,7 @@ if (update) { + setChanged(); mapCenter->reposition(); adjustCanvasSize(); canvas()->update(); @@ -3515,8 +3629,7 @@ } -void -MapEditor::imageDataFetched(const QByteArray &a, QNetworkOperation */*nop*/) +void MapEditor::imageDataFetched(const QByteArray &a, QNetworkOperation */*nop*/) { if (!imageBuffer) imageBuffer = new QBuffer(); if (!imageBuffer->isOpen()) { @@ -3526,21 +3639,24 @@ } -void -MapEditor::imageDataFinished(QNetworkOperation *nop) +void MapEditor::imageDataFinished(QNetworkOperation *nop) { - imageBuffer->close(); - if (nop->state()==QNetworkProtocol::StDone) { - QPixmap img(imageBuffer->buffer()); - addFloatImage(img); - } - - delete imageBuffer; - imageBuffer = 0; + if (nop->state()==QNetworkProtocol::StDone) { + QPixmap img(imageBuffer->buffer()); + addFloatImage(img); + } + + if (imageBuffer) { + imageBuffer->close(); + if (imageBuffer) { + imageBuffer->close(); + delete imageBuffer; + imageBuffer = 0; + } + } } -void -MapEditor::fetchImage(const QString &url) +void MapEditor::fetchImage(const QString &url) { if (urlOperator) { urlOperator->stop(); diff -r 0dc9286ad3d4 -r 9b9c7e8b9147 mapeditor.h --- a/mapeditor.h Wed Jul 13 11:36:15 2005 +0000 +++ b/mapeditor.h Tue Jul 19 14:44:30 2005 +0000 @@ -84,6 +84,7 @@ void cut(); // cut to clipboard and backup void moveBranchUp(); void moveBranchDown(); + void linkBranchToPos(LinkableMapObj*,const int &, const QPoint &);// move selection to dst and pos void editHeading(); // Start editing heading private: void setHeading(const QString &); // Just set the heading for selection @@ -190,6 +191,7 @@ LinkableMapObj* selectionLast; // last selection MapObj* movingObj; // moving a MapObj MapObj* linkingObj_src; // part of a link + QPoint movingObj_orgPos; // org. pos of mouse before move QPoint movingObj_start; // rel. pos of mouse to absPos QPoint movingCont_start; // inital pos of moving Content or QPoint movingVec; // how far has Content moved diff -r 0dc9286ad3d4 -r 9b9c7e8b9147 mapobj.cpp --- a/mapobj.cpp Wed Jul 13 11:36:15 2005 +0000 +++ b/mapobj.cpp Tue Jul 19 14:44:30 2005 +0000 @@ -1,4 +1,5 @@ #include "mapobj.h" +#include "misc.h" ///////////////////////////////////////////////////////////////// // MapObj @@ -70,6 +71,11 @@ return bbox.height(); } +QString MapObj::getPos() +{ + return qpointToString(absPos); +} + void MapObj::move (double x, double y) { int xi=static_cast (x); diff -r 0dc9286ad3d4 -r 9b9c7e8b9147 mapobj.h --- a/mapobj.h Wed Jul 13 11:36:15 2005 +0000 +++ b/mapobj.h Tue Jul 19 14:44:30 2005 +0000 @@ -9,6 +9,7 @@ using namespace std; #define Z_BBOX 0 +#define Z_XLINK 10 #define Z_LINK 20 #define Z_FRAME 50 #define Z_SELBOX 60 @@ -28,6 +29,7 @@ virtual int y(); virtual int width(); virtual int height(); + virtual QString getPos(); // Return position as string (x,y) virtual void move (double x,double y); // move to absolute Position virtual void moveBy (double x,double y); // move to relative Position virtual bool inBBox(QPoint); // Check if Point is in bbox diff -r 0dc9286ad3d4 -r 9b9c7e8b9147 misc.cpp --- a/misc.cpp Wed Jul 13 11:36:15 2005 +0000 +++ b/misc.cpp Tue Jul 19 14:44:30 2005 +0000 @@ -3,10 +3,14 @@ #include "misc.h" +QString qpointToString (const QPoint &p) +{ + return "(" + QString("%1").arg(p.x()) +","+ QString ("%1").arg (p.y()) +")"; +} ostream &operator<< (ostream &stream, QPoint const &p) { - return (stream << "(" << p.x() << "," << p.y() << ")"); + return (stream << qpointToString(p) ); } float getAngle(const QPoint &p) diff -r 0dc9286ad3d4 -r 9b9c7e8b9147 misc.h --- a/misc.h Wed Jul 13 11:36:15 2005 +0000 +++ b/misc.h Tue Jul 19 14:44:30 2005 +0000 @@ -6,18 +6,11 @@ using namespace std; -#define Z_BBOX 0 -#define Z_XLINK 10 -#define Z_LINK 20 -#define Z_FRAME 50 -#define Z_SELBOX 60 -#define Z_ICON 80 -#define Z_TEXT 100 - enum LoadMode {NewMap,ImportAdd,ImportReplace}; enum SaveMode {PartOfMap,CompleteMap,UndoCommand}; ///////////////////////////////////////////////////////////////////////////// +QString qpointToString (const QPoint &p); extern ostream &operator<< (ostream &stream, QPoint const &p); float getAngle(const QPoint &); QPoint normalise (const QPoint &); diff -r 0dc9286ad3d4 -r 9b9c7e8b9147 version.h --- a/version.h Wed Jul 13 11:36:15 2005 +0000 +++ b/version.h Tue Jul 19 14:44:30 2005 +0000 @@ -1,7 +1,7 @@ #ifndef VERSION_H #define VERSION_H -#define __VYM_VERSION__ "1.7.0" -#define __BUILD_DATE__ "July 13, 2005" +#define __VYM_VERSION__ "1.7.1" +#define __BUILD_DATE__ "July 19, 2005" #endif