8 #include "attributeitem.h"
9 #include "branchitem.h"
12 #include "linkablemapobj.h"
13 #include "mainwindow.h"
14 #include "slideitem.h"
16 #include "taskmodel.h"
18 #include "xlinkitem.h"
20 extern Main *mainWindow;
21 extern Settings settings;
22 extern TaskModel *taskModel;
23 extern QString vymVersion;
25 parseVYMHandler::parseVYMHandler()
27 // Default is to load everything
28 contentFilter = 0x0000; // TODO use filters for all content types below
31 void parseVYMHandler::setContentFilter (const int &c)
36 bool parseVYMHandler::startDocument()
41 stateStack.append(StateInit);
48 bool parseVYMHandler::startElement ( const QString&, const QString&,
49 const QString& eName, const QXmlAttributes& atts )
53 qDebug()<< "startElement: <"<< eName
55 << " laststate="<<stateStack.last()
56 << " loadMode="<<loadMode
57 //<<" line="<<QXmlDefaultHandler::lineNumber();
58 <<"contentFilter="<<contentFilter;
60 stateStack.append (state);
61 if ( state == StateInit && (eName == "vymmap") )
67 if (loadMode==NewMap )
76 if (!atts.value( "version").isEmpty() )
78 version = atts.value("version");
79 if (!versionLowerOrEqualThanVym( version ))
80 QMessageBox::warning( 0, QObject::tr("Warning: Version Problem") ,
81 QObject::tr("<h3>Map is newer than VYM</h3>"
82 "<p>The map you are just trying to load was "
83 "saved using vym %1. "
84 "The version of this vym is %2. "
85 "If you run into problems after pressing "
86 "the ok-button below, updating vym should help.</p>").arg(version).arg(vymVersion));
88 model->setVersion(version);
92 } else if ( eName == "select" && state == StateMap )
95 } else if ( eName == "setting" && state == StateMap )
97 state=StateMapSetting;
101 readSettingAttr (atts);
103 } else if ( eName == "slide" && state == StateMap )
106 if (! contentFilter && SlideContent)
108 // Ignore slides during paste
109 lastSlide=model->addSlide();
111 model->relinkSlide (lastSlide, insertPos);
115 } else if ( eName == "mapcenter" && state == StateMap )
117 state=StateMapCenter;
118 if (loadMode==NewMap)
120 // Really use the found mapcenter as MCO in a new map
121 lastBranch=model->createMapCenter();
124 // Treat the found mapcenter as a branch
125 // in an existing map
126 BranchItem *bi=model->getSelectedBranch();
130 if (loadMode==ImportAdd)
134 lastBranch=model->createBranch(lastBranch);
137 lastBranch=model->addNewBranch(lastBranch, insertPos);
145 insertPos=lastBranch->num() +1;
146 model->clearItem (lastBranch);
149 BranchItem *pi=bi->parentBranch();
150 lastBranch=model->addNewBranch(pi, insertPos);
155 // if nothing selected, add mapCenter without parent
156 lastBranch=model->createMapCenter();
158 readBranchAttr (atts);
160 (eName == "standardflag" ||eName == "standardFlag") &&
161 (state == StateMapCenter || state==StateBranch))
163 state=StateStandardFlag;
164 } else if ( eName == "heading" && (state == StateMapCenter||state==StateBranch || state == StateInit))
166 if (state == StateInit)
168 // Only read some stuff like VymNote or Heading
169 // e.g. for undo/redo
170 lastBranch = model->getSelectedBranch();
171 if (version.isEmpty() ) version = "0.0.0";
173 if (!lastBranch) return false;
178 if (!atts.value( "fonthint").isEmpty() )
179 vymtext.setFontHint(atts.value ("fonthint") );
180 if (!atts.value( "textMode").isEmpty() )
182 if (atts.value ("textMode") == "richText" )
183 vymtext.setRichText(true);
185 vymtext.setRichText(false);
187 if (!atts.value( "textColor").isEmpty() )
189 // For compatibility with <= 2.4.0 set both branch and
191 col.setNamedColor(atts.value("textColor"));
192 lastBranch->setHeadingColor(col );
193 vymtext.setColor(col);
195 } else if ( eName == "task" && (state == StateMapCenter||state==StateBranch))
198 lastTask=taskModel->createTask (lastBranch);
199 if (!readTaskAttr(atts)) return false;
200 } else if ( eName == "note" &&
201 (state == StateMapCenter ||state==StateBranch))
202 { // only for backward compatibility (<1.4.6). Use htmlnote now.
206 if (!readNoteAttr (atts) ) return false;
207 } else if ( eName == "htmlnote" && state == StateMapCenter)
208 { // only for backward compatibility. Use vymnote now
211 if (!atts.value( "fonthint").isEmpty() )
212 vymtext.setFontHint(atts.value ("fonthint") );
213 } else if ( eName == "vymnote" && (state == StateMapCenter || state==StateBranch || state == StateInit))
215 if (state == StateInit)
216 // Only read some stuff like VymNote or Heading
217 // e.g. for undo/redo
219 lastBranch = model->getSelectedBranch();
220 if (version.isEmpty() ) version = "0.0.0";
225 if (!atts.value( "fonthint").isEmpty() )
226 vymtext.setFontHint(atts.value ("fonthint") );
227 if (!atts.value( "textMode").isEmpty() )
229 if (atts.value ("textMode") == "richText" )
230 vymtext.setRichText(true);
232 vymtext.setRichText(false);
234 } else if ( eName == "floatimage" &&
235 (state == StateMapCenter ||state==StateBranch))
238 lastImage=model->createImage(lastBranch);
239 if (!readImageAttr(atts)) return false;
240 } else if ( (eName == "branch"||eName=="floatimage") && state == StateMap)
242 // This is used in vymparts, which have no mapcenter or for undo
244 TreeItem *ti=model->getSelectedItem();
247 // If a vym part is _loaded_ (not imported),
248 // selection==lmo==NULL
249 // Treat it like ImportAdd then...
251 // we really have no MCO at this time
252 lastBranch=model->createMapCenter();
253 model->select (lastBranch);
254 model->setHeadingPlainText("Import");
257 if (ti && ti->isBranchLikeType() )
259 lastBranch=(BranchItem*)ti;
263 if (loadMode==ImportAdd)
265 lastBranch=model->createBranch(lastBranch);
267 model->relinkBranch (lastBranch,(BranchItem*)ti,insertPos);
269 model->clearItem (lastBranch);
270 readBranchAttr (atts);
271 } else if (eName=="floatimage")
274 lastImage=model->createImage (lastBranch);
275 if (!readImageAttr(atts)) return false;
278 } else if ( eName == "branch" && state == StateMapCenter)
281 lastBranch=model->createBranch(lastBranch);
282 readBranchAttr (atts);
283 } else if ( eName == "htmlnote" && state == StateBranch)
284 { // only for backward compatibility. Use vymnote now
287 if (!atts.value( "fonthint").isEmpty() )
288 vymtext.setFontHint(atts.value ("fonthint") );
289 } else if ( eName == "frame" && (state == StateBranch||state==StateMapCenter))
292 if (!readFrameAttr(atts)) return false;
293 } else if ( eName == "xlink" && state == StateBranch )
295 // Obsolete after 1.13.2
296 state=StateBranchXLink;
297 if (!readXLinkAttr (atts)) return false;
298 } else if ( eName == "xlink" && state == StateMap)
301 if (!readLinkNewAttr (atts)) return false;
302 } else if ( eName == "branch" && state == StateBranch )
304 lastBranch=model->createBranch(lastBranch);
305 readBranchAttr (atts);
306 } else if ( eName == "html" &&
307 (state == StateHtmlNote || state == StateVymNote) )
313 } else if ( eName == "attribute" &&
314 (state == StateBranch || state == StateMapCenter ) )
316 state=StateAttribute;
317 QList<QVariant> cData;
318 cData << "new attribute" << "undef";
319 AttributeItem *ai=new AttributeItem (cData);
322 if (!atts.value("type").isEmpty())
323 ai->setKey(atts.value("type"));
324 if (!atts.value("key").isEmpty())
325 ai->setKey(atts.value("key"));
326 if (!atts.value("value").isEmpty())
327 ai->setKey(atts.value("value"));
330 } else if ( state == StateHtml )
332 // accept all while in html mode,
337 return false; // Error
341 bool parseVYMHandler::endElement ( const QString&, const QString&, const QString &eName)
343 //qDebug()<< "endElement </" <<eName <<"> state=" <<state ;
350 model->emitDataChanged (lastBranch);
351 lastBranch=(BranchItem*)(lastBranch->parent());
354 // Empty branches may not be scrolled
355 // (happens if bookmarks are imported)
356 if (lastBranch->isScrolled() && lastBranch->branchCount()==0)
357 lastBranch->unScroll();
358 model->emitDataChanged (lastBranch);
360 lastBranch=(BranchItem*)(lastBranch->parent());
361 lastBranch->setLastSelectedBranch (0);
364 if ( versionLowerOrEqual( version, "2.4.99") && htmldata.contains("<html>") )
365 // versions before 2.5.0 didn't use CDATA to save richtext
366 vymtext.setAutoText(htmldata);
368 vymtext.setText (htmldata);
369 lastBranch->setHeading (vymtext);
371 case StateHtmlNote: // Richtext note, needed anyway for backward compatibility
372 vymtext.setRichText (htmldata);
373 lastBranch->setNote (vymtext);
380 vymtext.setText (htmldata);
381 lastBranch->setNote (vymtext);
383 case StateMapSetting:
384 // version >= 2.5.0 previously value only as attribut
385 settings.setLocalValue(model->getDestPath(), lastSetting, htmldata);
387 case StateVymNote: // Might be richtext or plaintext with
389 if ( versionLowerOrEqual( version, "2.4.99") && htmldata.contains("<html>") )
390 // versions before 2.5.0 didn't use CDATA to save richtext
391 vymtext.setAutoText(htmldata);
393 vymtext.setText (htmldata);
394 lastBranch->setNote (vymtext);
397 htmldata+="</"+eName+">";
399 htmldata.replace ("<br></br>","<br />");
404 state=stateStack.takeLast();
408 bool parseVYMHandler::characters ( const QString& ch)
410 // qDebug()<< "xml-vym: characters "<<ch<<" state="<<state;
412 QString ch_org=quotemeta (ch);
413 QString ch_simplified=ch.simplified();
414 //if ( ch_simplified.isEmpty() ) return true;
418 case StateInit: break;
419 case StateMap: break;
421 model->select(ch_simplified);
423 case StateMapSetting:
426 case StateMapCenter: break;
427 case StateNote: // only in vym <1.4.6
428 htmldata += ch_simplified;
430 case StateBranch: break;
431 case StateStandardFlag:
432 lastBranch->activateStandardFlag(ch_simplified);
434 case StateImage: break;
438 case StateHtmlNote: // Only for compatibility
453 QString parseVYMHandler::errorString()
455 return "the document is not in the VYM file format";
458 bool parseVYMHandler::readMapAttr (const QXmlAttributes& a)
461 if (!a.value( "author").isEmpty() )
462 model->setAuthor(a.value( "author" ) );
463 if (!a.value( "title").isEmpty() )
464 model->setTitle (a.value( "title" ) );
465 if (!a.value( "comment").isEmpty() )
466 model->setComment (a.value( "comment" ) );
467 if (!a.value( "branchCount").isEmpty() )
469 branchesTotal=a.value("branchCount").toInt();
470 if (branchesTotal>10)
473 mainWindow->setProgressMaximum (branchesTotal);
477 if (!a.value( "backgroundColor").isEmpty() )
479 col.setNamedColor(a.value("backgroundColor"));
480 model->getScene()->setBackgroundBrush(col);
482 if (!a.value( "defaultFont").isEmpty() )
485 font.fromString(a.value("defaultFont"));
486 model->setMapDefaultFont (font);
488 if (!a.value( "selectionColor").isEmpty() )
490 col.setNamedColor(a.value("selectionColor"));
491 model->setSelectionColor(col);
493 if (!a.value( "linkColorHint").isEmpty() )
495 if (a.value("linkColorHint")=="HeadingColor")
496 model->setMapLinkColorHint(LinkableMapObj::HeadingColor);
498 model->setMapLinkColorHint(LinkableMapObj::DefaultColor);
500 if (!a.value( "linkStyle").isEmpty() )
501 model->setMapLinkStyle(a.value("linkStyle"));
502 if (!a.value( "linkColor").isEmpty() )
504 col.setNamedColor(a.value("linkColor"));
505 model->setMapDefLinkColor(col);
508 QPen pen (model->getMapDefXLinkPen() );
509 if (!a.value( "defXLinkColor").isEmpty() )
511 col.setNamedColor(a.value("defXLinkColor"));
514 if (!a.value( "defXLinkWidth").isEmpty() )
515 pen.setWidth(a.value("defXLinkWidth").toInt ());
516 if (!a.value( "defXLinkPenStyle").isEmpty() )
519 Qt::PenStyle ps=penStyle (a.value("defXLinkPenStyle"),ok );
520 if (!ok) return false;
523 model->setMapDefXLinkPen (pen);
525 if (!a.value( "defXLinkStyleBegin").isEmpty() )
526 model->setMapDefXLinkStyleBegin( a.value( "defXLinkStyleBegin" ) );
527 if (!a.value( "defXLinkStyleEnd").isEmpty() )
528 model->setMapDefXLinkStyleEnd( a.value( "defXLinkStyleEnd" ) );
530 if (!a.value( "mapZoomFactor").isEmpty() )
531 model->setMapZoomFactor(a.value("mapZoomFactor").toDouble());
532 if (!a.value( "mapRotationAngle").isEmpty() )
533 model->setMapRotationAngle(a.value("mapRotationAngle").toDouble());
537 bool parseVYMHandler::readBranchAttr (const QXmlAttributes& a)
541 mainWindow->addProgressValue ((float)branchesCounter/branchesTotal);
545 if (!readOOAttr(a)) return false;
547 if (!a.value( "scrolled").isEmpty() )
548 lastBranch->toggleScroll();
549 // (interesting for import of KDE bookmarks)
551 if (!a.value( "incImgV").isEmpty() )
553 if (a.value("incImgV")=="true")
554 lastBranch->setIncludeImagesVer(true);
556 lastBranch->setIncludeImagesVer(false);
558 if (!a.value( "incImgH").isEmpty() )
560 if (a.value("incImgH")=="true")
561 lastBranch->setIncludeImagesHor(true);
563 lastBranch->setIncludeImagesHor(false);
565 if (a.value("childrenFreePos")=="true")
566 lastBranch->setChildrenLayout(BranchItem::FreePositioning);
570 bool parseVYMHandler::readFrameAttr (const QXmlAttributes& a)
574 OrnamentedObj* oo=(OrnamentedObj*)(lastMI->getLMO());
580 if (!a.value( "frameType").isEmpty() )
581 oo->setFrameType (a.value("frameType"));
582 if (!a.value( "penColor").isEmpty() )
583 oo->setFramePenColor (a.value("penColor"));
584 if (!a.value( "brushColor").isEmpty() )
586 oo->setFrameBrushColor (a.value("brushColor"));
587 lastMI->setBackgroundColor (a.value("brushColor"));
589 if (!a.value( "padding").isEmpty() )
591 x=a.value("padding").toInt(&ok);
592 if (ok) oo->setFramePadding(x);
594 if (!a.value( "borderWidth").isEmpty() )
596 x=a.value("borderWidth").toInt(&ok);
597 if (ok) oo->setFrameBorderWidth(x);
599 if (!a.value( "includeChildren").isEmpty() )
601 if (a.value("includeChildren")=="true")
602 oo->setFrameIncludeChildren(true);
604 oo->setFrameIncludeChildren(false);
613 bool parseVYMHandler::readOOAttr (const QXmlAttributes& a)
619 if (!a.value( "relPosX").isEmpty() )
621 if (!a.value( "relPosY").isEmpty() )
623 x=a.value("relPosX").toFloat (&okx);
624 y=a.value("relPosY").toFloat (&oky);
626 lastMI->setRelPos (QPointF(x,y));
628 return false; // Couldn't read relPos
631 if (!a.value( "absPosX").isEmpty() )
633 if (!a.value( "absPosY").isEmpty() )
635 x=a.value("absPosX").toFloat (&okx);
636 y=a.value("absPosY").toFloat (&oky);
638 lastMI->setAbsPos (QPointF(x,y));
640 return false; // Couldn't read absPos
643 if (!a.value( "url").isEmpty() )
644 lastMI->setURL (a.value ("url"));
645 if (!a.value( "vymLink").isEmpty() )
646 lastMI->setVymLink (a.value ("vymLink"));
647 if (!a.value( "hideInExport").isEmpty() )
648 if (a.value("hideInExport")=="true")
649 lastMI->setHideInExport(true);
651 if (!a.value( "hideLink").isEmpty())
653 if (a.value ("hideLink") =="true")
654 lastMI->setHideLinkUnselected(true);
656 lastMI->setHideLinkUnselected(false);
659 if (!a.value( "localTarget").isEmpty() )
660 if (a.value ("localTarget")=="true")
661 lastMI->toggleTarget();
662 if (!a.value( "rotation").isEmpty() )
664 x=a.value("rotation").toFloat (&okx);
666 lastMI->setRotation (x);
668 return false; // Couldn't read rotation
671 if (!a.value( "uuid").isEmpty() )
673 // While pasting, check for existing UUID
674 if (loadMode!=ImportAdd && !model->findUuid(a.value( "uuid")))
675 lastMI->setUuid (a.value( "uuid") );
681 bool parseVYMHandler::readNoteAttr (const QXmlAttributes& a)
682 { // only for backward compatibility (<1.4.6). Use htmlnote now.
685 if (!a.value( "href").isEmpty() )
688 fn=parseHREF(a.value ("href") );
690 QString s; // Reading a note
692 if ( !file.open( QIODevice::ReadOnly) )
694 qWarning ()<<"parseVYMHandler::readNoteAttr: Couldn't load "+fn;
697 QTextStream stream( &file );
698 stream.setCodec("UTF-8");
700 while ( !stream.atEnd() ) {
701 lines += stream.readLine()+"\n";
705 lines ="<html><head><meta name=\"qrichtext\" content=\"1\" /></head><body>" + lines + "</p></body></html>";
706 vymtext.setText (lines); // this probably should set type, too...
708 if (!a.value( "fonthint").isEmpty() )
709 vymtext.setFontHint(a.value ("fonthint") );
710 lastBranch->setNote(vymtext);
714 bool parseVYMHandler::readImageAttr (const QXmlAttributes& a)
718 if (!readOOAttr(a)) return false;
720 if (!a.value( "href").isEmpty() )
723 if (!lastImage->load (parseHREF(a.value ("href") ) ))
725 QMessageBox::warning( 0, "Warning: " ,
726 "Couldn't load image\n"+parseHREF(a.value ("href") ));
732 if (!a.value( "zPlane").isEmpty() )
733 lastImage->setZValue (a.value("zPlane").toInt ());
736 if (!a.value( "relPosX").isEmpty() )
738 if (!a.value( "relPosY").isEmpty() )
741 x=a.value("relPosX").toFloat (&okx);
742 y=a.value("relPosY").toFloat (&oky);
744 lastImage->setRelPos (QPointF (x,y) );
746 // Couldn't read relPos
753 if (!a.value( "scaleX").isEmpty() )
755 x=a.value("scaleX").toFloat (&okx);
756 if (!okx ) return false;
759 if (!a.value( "scaleY").isEmpty() )
761 y=a.value("scaleY").toFloat (&oky);
762 if (!oky ) return false;
765 lastImage->setScale (x,y);
767 if (!readOOAttr(a)) return false;
769 if (!a.value ("originalName").isEmpty() )
771 lastImage->setOriginalFilename (a.value("originalName"));
776 bool parseVYMHandler::readXLinkAttr (const QXmlAttributes& a)
778 // Obsolete, see also readLinkAttr
780 if (!a.value( "beginID").isEmpty() )
782 if (!a.value( "endID").isEmpty() )
784 TreeItem *beginBI=model->findBySelectString (a.value( "beginID"));
785 TreeItem *endBI=model->findBySelectString (a.value( "endID"));
786 if (beginBI && endBI && beginBI->isBranchLikeType() && endBI->isBranchLikeType() )
788 Link *li=new Link (model);
789 li->setBeginBranch ( (BranchItem*)beginBI );
790 li->setEndBranch ( (BranchItem*)endBI);
791 QPen pen=li->getPen();
793 if (!a.value( "color").isEmpty() )
796 col.setNamedColor(a.value("color"));
800 if (!a.value( "width").isEmpty() )
803 pen.setWidth(a.value ("width").toInt (&okx, 10));
805 model->createLink (li);
812 bool parseVYMHandler::readLinkNewAttr (const QXmlAttributes& a)
814 // object ID is used starting in version 1.8.76
815 // (before there was beginBranch and endBranch)
817 // Starting in 1.13.2 xlinks are no longer subitems of branches,
818 // but listed at the end of the data in a map. This makes handling
819 // of links much safer and easier
821 if (!a.value( "beginID").isEmpty() )
823 if (!a.value( "endID").isEmpty() )
825 TreeItem *beginBI=model->findBySelectString (a.value( "beginID"));
826 TreeItem *endBI=model->findBySelectString (a.value( "endID"));
827 if (beginBI && endBI && beginBI->isBranchLikeType() && endBI->isBranchLikeType() )
829 Link *li=new Link (model);
830 li->setBeginBranch ( (BranchItem*)beginBI );
831 li->setEndBranch ( (BranchItem*)endBI);
833 model->createLink (li);
836 QPen pen=li->getPen();
837 if (!a.value( "type").isEmpty() )
839 li->setLinkType (a.value( "type") );
841 if (!a.value( "color").isEmpty() )
844 col.setNamedColor(a.value("color"));
847 if (!a.value( "width").isEmpty() )
849 pen.setWidth(a.value ("width").toInt (&okx, 10));
851 if (!a.value( "penstyle").isEmpty() )
853 pen.setStyle( penStyle (a.value ("penstyle"), okx));
857 if (!a.value( "styleBegin").isEmpty() )
858 li->setStyleBegin( a.value( "styleBegin" ) );
859 if (!a.value( "styleEnd").isEmpty() )
860 li->setStyleEnd( a.value( "styleEnd" ) );
863 XLinkObj *xlo=(XLinkObj*)(li->getMO() );
864 if (xlo && !a.value( "c0").isEmpty() )
866 QPointF p=point(a.value("c0"),okx );
867 if (okx) xlo->setC0 (p);
869 if (xlo && !a.value( "c1").isEmpty() )
871 QPointF p=point(a.value("c1"),okx );
872 if (okx) xlo->setC1 (p);
880 bool parseVYMHandler::readSettingAttr (const QXmlAttributes& a)
882 if (!a.value( "key").isEmpty() )
884 lastSetting = a.value( "key" );
885 if (!a.value( "value").isEmpty() )
886 // Beginning with 2.5.0 value is stored as between tags,
887 // no longer as attribute
888 settings.setLocalValue(model->getDestPath(), a.value ("key"), a.value ("value"));
898 bool parseVYMHandler::readSlideAttr (const QXmlAttributes& a)
900 QStringList scriptlines; // FIXME-3 needed for switching to inScript
901 // Most attributes are obsolete with inScript
902 if (!lastSlide) return false;
904 if (!a.value( "name").isEmpty() )
905 lastSlide->setName (a.value( "name" ) );
906 if (!a.value( "zoom").isEmpty() )
909 qreal z=a.value ("zoom").toDouble(&ok);
910 if (!ok) return false;
911 scriptlines.append( QString("setMapZoom(%1)").arg(z) );
913 if (!a.value( "rotation").isEmpty() )
916 qreal z=a.value ("rotation").toDouble(&ok);
917 if (!ok) return false;
918 scriptlines.append( QString("setMapRotation(%1)").arg(z) );
920 if (!a.value( "duration").isEmpty() )
923 int d=a.value ("duration").toInt(&ok);
924 if (!ok) return false;
925 scriptlines.append( QString("setMapAnimDuration(%1)").arg(d) );
927 if (!a.value( "curve").isEmpty() )
930 int i=a.value ("curve").toInt(&ok);
931 if (!ok ) return false;
932 if (i<0 || i>QEasingCurve::OutInBounce) return false;
933 scriptlines.append( QString("setMapAnimCurve(%1)").arg(i) );
935 if (!a.value( "mapitem").isEmpty() )
937 TreeItem *ti=model->findBySelectString ( a.value( "mapitem") );
938 if (!ti) return false;
939 scriptlines.append( QString("centerOnID(\"%1\")").arg(ti->getUuid().toString() ) );
941 if (!a.value( "inScript").isEmpty() )
943 lastSlide->setInScript( unquotemeta( a.value( "inScript") ) );
945 lastSlide->setInScript( unquotemeta( scriptlines.join(";\n") ) );
947 if (!a.value( "outScript").isEmpty() )
949 lastSlide->setOutScript( unquotemeta( a.value( "outScript") ) );
955 bool parseVYMHandler::readTaskAttr (const QXmlAttributes& a)
957 if (!lastTask) return false;
959 if (!a.value( "status").isEmpty() )
960 lastTask->setStatus (a.value( "status" ) );
961 if (!a.value( "awake").isEmpty() )
962 lastTask->setAwake (a.value( "awake" ) );
963 if (!a.value( "date_creation").isEmpty() )
964 lastTask->setDateCreation ( a.value( "date_creation" ) );
965 if (!a.value( "date_modified").isEmpty() )
966 lastTask->setDateModified( a.value( "date_modified" ) );
967 if (!a.value( "date_sleep").isEmpty() )
968 lastTask->setDateSleep( a.value( "date_sleep" ) );