+++ /dev/null
-#include <QApplication>
-#include <QSvgGenerator>
-
-#if defined(VYM_DBUS)
-#include <QtDBus/QDBusConnection>
-#endif
-
-#ifndef Q_OS_WIN
-#include <unistd.h>
-#else
-#define sleep Sleep
-#endif
-
-#include <QColorDialog>
-#include <QFileDialog>
-#include <QMessageBox>
-#include <QPrinter>
-
-#include "vymmodel.h"
-
-#include "attributeitem.h"
-#include "treeitem.h"
-#include "branchitem.h"
-#include "bugagent.h"
-#include "downloadagent.h"
-#include "editxlinkdialog.h"
-#include "exports.h"
-#include "exporthtmldialog.h"
-#include "file.h"
-#include "findresultmodel.h"
-#include "lockedfiledialog.h"
-#include "mainwindow.h"
-#include "misc.h"
-#include "noteeditor.h"
-#include "options.h"
-#include "parser.h"
-#include "vymprocess.h"
-#include "scripteditor.h"
-#include "slideitem.h"
-#include "slidemodel.h"
-#include "taskeditor.h"
-#include "taskmodel.h"
-#include "warningdialog.h"
-#include "xlinkitem.h"
-#include "xlinkobj.h"
-#include "xml-freemind.h"
-#include "xmlobj.h"
-#include "xml-vym.h"
-
-#ifdef Q_OS_WIN
-#include <windows.h>
-#endif
-
-extern bool debug;
-extern bool testmode;
-extern Main *mainWindow;
-
-extern Settings settings;
-extern QString tmpVymDir;
-extern QString macroPath;
-
-extern NoteEditor *noteEditor;
-extern TaskEditor *taskEditor;
-extern ScriptEditor *scriptEditor;
-extern FlagRow *standardFlagsMaster;
-
-extern Options options;
-
-extern QString clipboardDir;
-extern QString clipboardFile;
-extern bool clipboardEmpty;
-
-extern ImageIO imageIO;
-
-extern TaskModel* taskModel;
-
-extern QString vymName;
-extern QString vymVersion;
-extern QDir vymBaseDir;
-
-extern QDir lastImageDir;
-extern QDir lastMapDir;
-extern QDir lastExportDir;
-
-extern bool bugzillaClientAvailable;
-
-extern Settings settings;
-
-uint VymModel::idLast=0; // make instance
-
-VymModel::VymModel()
-{
- //qDebug()<< "Const VymModel";
- init();
- rootItem->setModel (this);
-}
-
-VymModel::~VymModel()
-{
- //out << "Destr VymModel begin this="<<this<<" "<<mapName<<flush;
- mapEditor=NULL;
- blockReposition=true;
- autosaveTimer->stop();
- fileChangedTimer->stop();
- stopAllAnimation();
-
- //qApp->processEvents(); // Update view (scene()->update() is not enough)
- //qDebug() << "Destr VymModel end this="<<this;
-}
-
-void VymModel::clear()
-{
- while (rootItem->childCount() >0)
- {
- //qDebug()<<"VM::clear ri="<<rootItem<<" ri->count()="<<rootItem->childCount();
- deleteItem (rootItem->getChildNum(0) );
- }
-}
-
-void VymModel::init ()
-{
- // No MapEditor yet
- mapEditor = NULL;
-
- // Use default author
- author = settings.value("/user/name", tr("unknown user","default name for map author in settings")).toString();
-
- // States and IDs
- idLast++;
- modelID = idLast;
- mapChanged = false;
- mapDefault = true;
- mapUnsaved = false;
-
- // Selection history
- selModel = NULL;
- selectionBlocked= false;
- resetSelectionHistory();
-
- resetHistory();
-
- // Create tmp dirs
- makeTmpDirectories();
-
- // Files
- readonly = false;
- zipped = true;
- filePath = "";
- fileName = tr("unnamed");
- mapName = fileName;
- blockReposition = false;
- blockSaveState = false;
-
- autosaveTimer = new QTimer (this);
- connect(autosaveTimer, SIGNAL(timeout()), this, SLOT(autosave()));
-
- fileChangedTimer= new QTimer (this);
- fileChangedTimer->start(3000);
- connect(fileChangedTimer, SIGNAL(timeout()), this, SLOT(fileChanged()));
-
- // find routine
- findReset();
-
- // animations // FIXME-4 switch to new animation system
- animationUse = settings.value ("/animation/use",false).toBool(); // FIXME-4 add options to control _what_ is animated
- animationTicks = settings.value("/animation/ticks",20).toInt();
- animationInterval=settings.value("/animation/interval",5).toInt();
- animObjList.clear();
- animationTimer = new QTimer (this);
- connect(animationTimer, SIGNAL(timeout()), this, SLOT(animate()));
-
- // View - map
- defaultFont.setPointSizeF (16);
- defLinkColor = QColor (0,0,255);
- linkcolorhint = LinkableMapObj::DefaultColor;
- linkstyle = LinkableMapObj::PolyParabel;
- defXLinkPen.setWidth (1);
- defXLinkPen.setColor ( QColor (50,50,255) );
- defXLinkPen.setStyle ( Qt::DashLine );
- defXLinkStyleBegin = "HeadFull";
- defXLinkStyleEnd = "HeadFull";
-
- hasContextPos = false;
-
- hidemode = TreeItem::HideNone;
-
- // Animation in MapEditor
- zoomFactor = 1;
- rotationAngle = 0;
- animDuration = 2000;
- animCurve = QEasingCurve::OutQuint;
-
- // Initialize presentation slides
- slideModel = new SlideModel (this);
- blockSlideSelection=false;
-
- // Avoid recursions later
- cleaningUpLinks = false;
-
- // Network
- netstate = Offline;
-
-#if defined(VYM_DBUS)
- // Announce myself on DBUS
- new AdaptorModel(this); // Created and not deleted as documented in Qt
- if (!QDBusConnection::sessionBus().registerObject (QString("/vymmodel_%1").arg(modelID),this))
- qWarning ("VymModel: Couldn't register DBUS object!");
-#endif
-}
-
-void VymModel::makeTmpDirectories()
-{
- // Create unique temporary directories
- tmpMapDir = tmpVymDir+QString("/model-%1").arg(modelID);
- histPath = tmpMapDir+"/history";
- QDir d;
- d.mkdir (tmpMapDir);
-}
-
-MapEditor* VymModel::getMapEditor()
-{
- return mapEditor;
-}
-
-bool VymModel::isRepositionBlocked()
-{
- return blockReposition;
-}
-
-void VymModel::updateActions()
-{
- // Tell mainwindow to update states of actions
- mainWindow->updateActions();
-}
-
-
-
-QString VymModel::saveToDir(const QString &tmpdir, const QString &prefix, bool writeflags, const QPointF &offset, TreeItem *saveSel)
-{
- // tmpdir temporary directory to which data will be written
- // prefix mapname, which will be appended to images etc.
- //
- // writeflags Only write flags for "real" save of map, not undo
- // offset offset of bbox of whole map in scene.
- // Needed for XML export
-
- XMLObj xml;
-
- // Save Header
- QString ls;
- switch (linkstyle)
- {
- case LinkableMapObj::Line:
- ls="StyleLine";
- break;
- case LinkableMapObj::Parabel:
- ls="StyleParabel";
- break;
- case LinkableMapObj::PolyLine:
- ls="StylePolyLine";
- break;
- default:
- ls="StylePolyParabel";
- break;
- }
-
- QString s="<?xml version=\"1.0\" encoding=\"utf-8\"?><!DOCTYPE vymmap>\n";
- QString colhint="";
- if (linkcolorhint==LinkableMapObj::HeadingColor)
- colhint=xml.attribut("linkColorHint","HeadingColor");
-
- QString mapAttr=xml.attribut("version",vymVersion);
- if (!saveSel)
- mapAttr+= xml.attribut("author",author) +
- xml.attribut("title",title) +
- xml.attribut("comment",comment) +
- xml.attribut("date",getDate()) +
- xml.attribut("branchCount", QString().number(branchCount())) +
- xml.attribut("backgroundColor", mapEditor->getScene()->backgroundBrush().color().name() ) +
- xml.attribut("defaultFont", defaultFont.toString() ) +
- xml.attribut("selectionColor", mapEditor->getSelectionColor().name() ) +
- xml.attribut("linkStyle", ls ) +
- xml.attribut("linkColor", defLinkColor.name() ) +
- xml.attribut("defXLinkColor", defXLinkPen.color().name() ) +
- xml.attribut("defXLinkWidth", QString().setNum(defXLinkPen.width(),10) ) +
- xml.attribut("defXLinkPenStyle", penStyleToString (defXLinkPen.style() )) +
- xml.attribut("defXLinkStyleBegin", defXLinkStyleBegin) +
- xml.attribut("defXLinkStyleEnd", defXLinkStyleEnd) +
- xml.attribut("mapZoomFactor", QString().setNum(mapEditor->getZoomFactorTarget()) ) +
- xml.attribut("mapRotationAngle", QString().setNum(mapEditor->getAngleTarget()) ) +
- colhint;
- s+=xml.beginElement("vymmap",mapAttr);
- xml.incIndent();
-
- // Find the used flags while traversing the tree
- standardFlagsMaster->resetUsedCounter();
-
-
- // Temporary list of links
- QList <Link*> tmpLinks;
-
- // Build xml recursivly
- if (!saveSel)
- {
- // Save all mapcenters as complete map, if saveSel not set
- s+=saveTreeToDir(tmpdir,prefix,offset,tmpLinks);
-
- // Save local settings
- s+=settings.getDataXML (destPath);
-
- // Save selection
- if (getSelectedItem() && !saveSel )
- s+=xml.valueElement("select",getSelectString());
-
- } else
- {
- switch (saveSel->getType())
- {
- case TreeItem::Branch:
- // Save Subtree
- s+=((BranchItem*)saveSel)->saveToDir(tmpdir,prefix,offset,tmpLinks);
- break;
- case TreeItem::MapCenter:
- // Save Subtree
- s+=((BranchItem*)saveSel)->saveToDir(tmpdir,prefix,offset,tmpLinks);
- break;
- case TreeItem::Image:
- // Save Image
- s+=((ImageItem*)saveSel)->saveToDir(tmpdir,prefix);
- break;
- default:
- // other types shouldn't be safed directly...
- break;
- }
- }
-
- // Save XLinks
- for (int i=0; i<tmpLinks.count();++i)
- s+=tmpLinks.at(i)->saveToDir();
-
- // Save slides
- s+=slideModel->saveToDir();
-
- xml.decIndent();
- s+=xml.endElement("vymmap");
-
- if (writeflags) standardFlagsMaster->saveToDir (tmpdir+"/flags/","",writeflags);
- return s;
-}
-
-QString VymModel::saveTreeToDir (const QString &tmpdir,const QString &prefix, const QPointF &offset, QList <Link*> &tmpLinks)
-{
- QString s;
- for (int i=0; i<rootItem->branchCount(); i++)
- s+=rootItem->getBranchNum(i)->saveToDir (tmpdir,prefix,offset,tmpLinks);
- return s;
-}
-
-void VymModel::setFilePath(QString fpath, QString destname)
-{
- if (fpath.isEmpty() || fpath=="")
- {
- filePath="";
- fileName="";
- destPath="";
- } else
- {
- filePath=fpath; // becomes absolute path
- fileName=fpath; // gets stripped of path
- destPath=destname; // needed for vymlinks and during load to reset fileChangedTime
-
- // If fpath is not an absolute path, complete it
- filePath=QDir(fpath).absolutePath();
- fileDir=filePath.left (1+filePath.lastIndexOf ("/"));
-
- // Set short name, too. Search from behind:
- fileName=basename(fileName);
-
- // Forget the .vym (or .xml) for name of map
- mapName=fileName.left(fileName.lastIndexOf(".",-1,Qt::CaseSensitive) );
- }
-}
-
-void VymModel::setFilePath(QString fpath)
-{
- setFilePath (fpath,fpath);
-}
-
-QString VymModel::getFileDir()
-{
- return fileDir;
-}
-
-QString VymModel::getFilePath()
-{
- return filePath;
-}
-
-QString VymModel::getFileName()
-{
- return fileName;
-}
-
-QString VymModel::getMapName()
-{
- return mapName;
-}
-
-QString VymModel::getDestPath()
-{
- return destPath;
-}
-
-bool VymModel::parseVymText (const QString &s)
-{
- bool ok = false;
- BranchItem *bi = getSelectedBranch();
- if (bi)
- {
- parseBaseHandler *handler = new parseVYMHandler;
-
- bool blockSaveStateOrg=blockSaveState;
- blockReposition=true;
- blockSaveState=true;
- QXmlInputSource source;
- source.setData( s );
- QXmlSimpleReader reader;
- reader.setContentHandler( handler );
- reader.setErrorHandler( handler );
-
- handler->setInputString (s);
- handler->setModel ( this );
- handler->setLoadMode (ImportReplace, 0);
-
- ok = reader.parse( source );
- blockReposition=false;
- blockSaveState=blockSaveStateOrg;
- if ( ok )
- {
- emitNoteChanged( bi );
- emitDataChanged( bi );
- reposition(); // to generate bbox sizes
- } else
- {
- QMessageBox::critical( 0, tr( "Critical Parse Error" ),
- tr( handler->errorProtocol().toUtf8() ) );
- // returnCode=1;
- // Still return "success": the map maybe at least
- // partially read by the parser
- }
- }
- return ok;
-}
-
-File::ErrorCode VymModel::loadMap (
- QString fname,
- const LoadMode &lmode,
- const FileType &ftype,
- const int &contentFilter,
- int pos)
-{
- File::ErrorCode err = File::Success;
-
- // Get updated zoomFactor, before applying one read from file in the end
- if (mapEditor)
- {
- zoomFactor = mapEditor->getZoomFactorTarget();
- rotationAngle = mapEditor->getAngleTarget();
- }
-
- parseBaseHandler *handler;
- fileType=ftype;
- switch (fileType)
- {
- case VymMap:
- handler = new parseVYMHandler;
- ((parseVYMHandler*)handler)->setContentFilter (contentFilter);
- break;
- case FreemindMap : handler = new parseFreemindHandler; break;
- default:
- QMessageBox::critical( 0, tr( "Critical Parse Error" ),
- "Unknown FileType in VymModel::load()");
- return File::Aborted;
- }
-
- bool zipped_org = zipped;
-
- if (lmode == NewMap)
- {
- // Reset timestamp to check for later updates of file
- fileChangedTime = QFileInfo (destPath).lastModified();
-
- selModel->clearSelection();
- }
-
- // Create temporary directory for packing
- bool ok;
- QString tmpZipDir = makeTmpDir (ok,"vym-pack");
- if (!ok)
- {
- QMessageBox::critical( 0, tr( "Critical Load Error" ),
- tr("Couldn't create temporary directory before load\n"));
- return File::Aborted;
- }
-
- if (fname.right(4) == ".xml" || fname.right(3) == ".mm")
- err = File::NoZip;
- else
- {
- // Try to unzip file
- err = unzipDir (tmpZipDir,fname);
- }
- QString xmlfile;
- if (err == File::NoZip)
- {
- xmlfile = fname;
- zipped = false;
- } else
- {
- zipped = true;
-
- // Look for mapname.xml
- xmlfile = fname.left(fname.lastIndexOf(".", -1, Qt::CaseSensitive));
- xmlfile = xmlfile.section( '/', -1 );
- QFile mfile( tmpZipDir + "/" + xmlfile + ".xml");
- if (!mfile.exists() )
- {
- // mapname.xml does not exist, well,
- // maybe someone renamed the mapname.vym file...
- // Try to find any .xml in the toplevel
- // directory of the .vym file
- QStringList filters;
- filters<<"*.xml";
- QStringList flist = QDir (tmpZipDir).entryList(filters);
- if (flist.count() == 1)
- {
- // Only one entry, take this one
- xmlfile = tmpZipDir + "/"+flist.first();
- } else
- {
- for ( QStringList::Iterator it = flist.begin(); it != flist.end(); ++it )
- *it=tmpZipDir + "/" + *it;
- // FIXME-4 Multiple entries, load all (but only the first one into this ME)
- //mainWindow->fileLoadFromTmp (flist);
- //returnCode=1; // Silently forget this attempt to load
- qWarning ("MainWindow::load (fn) multimap found...");
- }
-
- if (flist.isEmpty() )
- {
- QMessageBox::critical( 0, tr( "Critical Load Error" ),
- tr("Couldn't find a map (*.xml) in .vym archive.\n"));
- err=File::Aborted;
- }
- } //file doesn't exist
- else
- xmlfile=mfile.fileName();
- }
-
- QFile file( xmlfile);
-
- // I am paranoid: file should exist anyway
- // according to check in mainwindow.
- if (!file.exists() )
- {
- QMessageBox::critical( 0, tr( "Critical Parse Error" ),
- tr(QString("Couldn't open map %1").arg(file.fileName()).toUtf8()));
- err=File::Aborted;
- } else
- {
- bool blockSaveStateOrg = blockSaveState;
- blockReposition = true;
- blockSaveState = true;
- mapEditor->setViewportUpdateMode (QGraphicsView::NoViewportUpdate);
- QXmlInputSource source( &file);
- QXmlSimpleReader reader;
- reader.setContentHandler( handler );
- reader.setErrorHandler( handler );
- handler->setModel ( this);
-
- // We need to set the tmpDir in order to load files with rel. path
- QString tmpdir;
- if (zipped)
- tmpdir = tmpZipDir;
- else
- tmpdir = fname.left(fname.lastIndexOf("/", -1));
- handler->setTmpDir (tmpdir);
- handler->setInputFile (file.fileName());
- if (lmode == ImportReplace)
- handler->setLoadMode (ImportReplace, pos);
- else
- handler->setLoadMode (lmode, pos);
-
- bool ok = reader.parse( source );
- blockReposition = false;
- blockSaveState = blockSaveStateOrg;
- mapEditor->setViewportUpdateMode (QGraphicsView::MinimalViewportUpdate);
- file.close();
- if ( ok )
- {
- reposition(); // to generate bbox sizes
- emitSelectionChanged();
-
- if (lmode == NewMap)
- {
- mapDefault = false;
- mapChanged = false;
- mapUnsaved = false;
- autosaveTimer->stop();
-
- resetHistory();
- resetSelectionHistory();
-
- if (! tryVymLock() && debug )
- qWarning() << "VM::loadMap no lockfile created!";
- }
-
- // Recalc priorities and sort
- taskModel->recalcPriorities();
- } else
- {
- QMessageBox::critical( 0, tr( "Critical Parse Error" ),
- tr( handler->errorProtocol().toUtf8() ) );
- // returnCode=1;
- // Still return "success": the map maybe at least
- // partially read by the parser
- }
- }
-
- // Delete tmpZipDir
- removeDir (QDir(tmpZipDir));
-
- // Restore original zip state
- zipped = zipped_org;
-
- updateActions();
-
- if (lmode!=NewMap) emitUpdateQueries();
-
- if (mapEditor)
- {
- mapEditor->setZoomFactorTarget (zoomFactor);
- mapEditor->setAngleTarget (rotationAngle);
- }
-
- if (vymView) vymView->readSettings();
-
- qApp->processEvents(); // Update view (scene()->update() is not enough)
- return err;
-}
-
-File::ErrorCode VymModel::save (const SaveMode &savemode)
-{
- QString tmpZipDir;
- QString mapFileName;
- QString safeFilePath;
-
- File::ErrorCode err=File::Success;
-
- if (zipped)
- // save as .xml
- mapFileName=mapName+".xml";
- else
- // use name given by user, even if he chooses .doc
- mapFileName=fileName;
-
- // Look, if we should zip the data:
- if (!zipped)
- {
- QMessageBox mb( vymName,
- tr("The map %1\ndid not use the compressed "
- "vym file format.\nWriting it uncompressed will also write images \n"
- "and flags and thus may overwrite files in the "
- "given directory\n\nDo you want to write the map").arg(filePath),
- QMessageBox::Warning,
- QMessageBox::Yes | QMessageBox::Default,
- QMessageBox::No ,
- QMessageBox::Cancel | QMessageBox::Escape);
- mb.setButtonText( QMessageBox::Yes, tr("compressed (vym default)") );
- mb.setButtonText( QMessageBox::No, tr("uncompressed") );
- mb.setButtonText( QMessageBox::Cancel, tr("Cancel"));
- switch( mb.exec() )
- {
- case QMessageBox::Yes:
- // save compressed (default file format)
- zipped=true;
- break;
- case QMessageBox::No:
- // save uncompressed
- zipped=false;
- break;
- case QMessageBox::Cancel:
- // do nothing
- return File::Aborted;
- break;
- }
- }
-
- // First backup existing file, we
- // don't want to add to old zip archives
- QFile f(destPath);
- if (f.exists())
- {
- if ( settings.value ("/mapeditor/writeBackupFile").toBool())
- {
- QString backupFileName(destPath + "~");
- QFile backupFile(backupFileName);
- if (backupFile.exists() && !backupFile.remove())
- {
- QMessageBox::warning(0, tr("Save Error"),
- tr("%1\ncould not be removed before saving").arg(backupFileName));
- }
- else if (!f.rename(backupFileName))
- {
- QMessageBox::warning(0, tr("Save Error"),
- tr("%1\ncould not be renamed before saving").arg(destPath));
- }
- }
- }
-
- if (zipped)
- {
- // Create temporary directory for packing
- bool ok;
- tmpZipDir=makeTmpDir (ok,"vym-zip");
- if (!ok)
- {
- QMessageBox::critical( 0, tr( "Critical Save Error" ),
- tr("Couldn't create temporary directory before save\n"));
- return File::Aborted;
- }
-
- safeFilePath=filePath;
- setFilePath (tmpZipDir+"/"+ mapName+ ".xml", safeFilePath);
- } // zipped
-
- // Create mapName and fileDir
- makeSubDirs (fileDir);
-
- QString saveFile;
- if (savemode==CompleteMap || selModel->selection().isEmpty())
- {
- // Save complete map
- if (zipped)
- // Use defined name for map within zipfile to avoid problems
- //with zip library and umlauts (see #98)
- saveFile=saveToDir (fileDir, "", true, QPointF(), NULL);
- else
- saveFile=saveToDir (fileDir, mapName + "-", true, QPointF(), NULL);
- mapChanged=false;
- mapUnsaved=false;
- autosaveTimer->stop();
- }
- else
- {
- // Save part of map
- if (selectionType() == TreeItem::Image)
- saveImage();
- else
- saveFile = saveToDir (fileDir, mapName + "-", true, QPointF(), getSelectedBranch());
- // TODO take care of multiselections
- }
-
- bool saved;
- if (zipped)
- // Use defined map name "map.xml", if zipped. Introduce in 2.6.6
- saved = saveStringToDisk(fileDir + "map.xml", saveFile);
- else
- // Use regular mapName, when saved as XML
- saved = saveStringToDisk(fileDir + mapFileName, saveFile);
- if (!saved)
- {
- err=File::Aborted;
- qWarning ("ME::saveStringToDisk failed!");
- }
-
- if (zipped)
- {
- // zip
- if (err==File::Success) err=zipDir (tmpZipDir,destPath);
-
- // Delete tmpDir
- removeDir (QDir(tmpZipDir));
-
- // Restore original filepath outside of tmp zip dir
- setFilePath (safeFilePath);
- }
-
- updateActions();
- fileChangedTime=QFileInfo (destPath).lastModified();
- return err;
-}
-
-void VymModel::loadImage (BranchItem *dst,const QString &fn)
-{
- if (!dst) dst=getSelectedBranch();
- if (dst)
- {
- QString filter=QString (tr("Images") + " (*.png *.bmp *.xbm *.jpg *.png *.xpm *.gif *.pnm *.svg);;"+tr("All","Filedialog") +" (*.*)");
- QStringList fns;
- if (fn.isEmpty() )
- fns=QFileDialog::getOpenFileNames(
- NULL,
- vymName+" - " + tr("Load image"),
- lastImageDir.path(),
- filter);
- else
- fns.append (fn);
-
- if (!fns.isEmpty() )
- {
- lastImageDir.setPath(fns.first().left(fns.first().lastIndexOf ("/")) );
- QString s;
- for (int j=0; j<fns.count(); j++)
- {
- s=fns.at(j);
- ImageItem *ii=createImage(dst);
- if (ii && ii->load (s) )
- {
- saveState(
- (TreeItem*)ii,
- "delete ()",
- dst,
- QString ("loadImage (\"%1\")").arg(s ),
- QString("Add image %1 to %2").arg(s).arg(getObjectName(dst))
- );
- // Find nice position
- FloatImageObj *fio=(FloatImageObj*)(ii->getMO() );
- if (fio)
- fio->move2RelPos (0,0);
-
- // On default include image // FIXME-4 check, if we change default settings...
- select(dst);
- setIncludeImagesHor (false);
- setIncludeImagesVer (true);
-
- reposition();
- } else
- // FIXME-4 loadFIO error handling
- qWarning ()<<"Failed to load "+s;
- }
-
- }
- }
-}
-
-void VymModel::saveImage (ImageItem *ii, QString format, QString fn)
-{
- if (!ii) ii=getSelectedImage();
- if (ii)
- {
- QString filter=QString (tr("Images") + " (*.png *.bmp *.xbm *.jpg *.png *.xpm *.gif *.pnm *.svg);;"+tr("All","Filedialog") +" (*.*)");
- if (fn.isEmpty() )
- fn=QFileDialog::getSaveFileName(
- NULL,
- vymName+" - " + tr("Save image"),
- lastImageDir.path(),
- filter,
- NULL,
- QFileDialog::DontConfirmOverwrite);
-
- if (!fn.isEmpty() )
- {
- lastImageDir.setPath(fn.left(fn.lastIndexOf ("/")) );
- if (QFile (fn).exists() )
- {
- QMessageBox mb( vymName,
- tr("The file %1 exists already.\n"
- "Do you want to overwrite it?").arg(fn),
- QMessageBox::Warning,
- QMessageBox::Yes | QMessageBox::Default,
- QMessageBox::Cancel | QMessageBox::Escape,
- QMessageBox::NoButton );
-
- mb.setButtonText( QMessageBox::Yes, tr("Overwrite") );
- mb.setButtonText( QMessageBox::No, tr("Cancel"));
- switch( mb.exec() )
- {
- case QMessageBox::Yes:
- // save
- break;
- case QMessageBox::Cancel:
- // do nothing
- return;
- break;
- }
- }
- if (format.isEmpty() ) format=imageIO.guessType(fn);
- if (format.isEmpty())
- QMessageBox::critical (0,tr("Critical Error"),tr("Unsupported format in %1").arg(fn));
- else if (!ii->save (fn, format) )
- QMessageBox::critical (0,tr("Critical Error"),tr("Couldn't save %1").arg(fn));
- }
- }
-}
-
-
-void VymModel::importDirInt(BranchItem *dst, QDir d)
-{
- bool oldSaveState = blockSaveState;
- blockSaveState = true;
- BranchItem *bi = dst;
- if (bi)
- {
- int beginDepth = bi->depth();
-
- d.setFilter(QDir::AllEntries | QDir::Hidden);
- QFileInfoList list = d.entryInfoList();
- QFileInfo fi;
-
- // Traverse directories
- for (int i = 0; i < list.size(); ++i)
- {
- fi = list.at(i);
- if (fi.isDir() && fi.fileName() != "." && fi.fileName() != ".." )
- {
- bi = addNewBranchInt(dst, -2);
- bi->setHeadingPlainText (fi.fileName() );
- bi->setHeadingColor (QColor("blue"));
- if ( !d.cd(fi.fileName()) )
- QMessageBox::critical (0,tr("Critical Import Error"),tr("Cannot find the directory %1").arg(fi.fileName()));
- else
- {
- // Recursively add subdirs
- qDebug() << "Add subdir " << bi->getHeadingPlain();
- importDirInt (bi, d);
- d.cdUp();
- }
- emitDataChanged(bi);
- }
- }
-
- for (int i = 0; i < list.size(); ++i)
- {
- fi = list.at(i);
- if (fi.isFile())
- {
- bi = addNewBranchInt (dst,-2);
- bi->setHeadingPlainText (fi.fileName() );
- bi->setHeadingColor (QColor("black"));
- if (fi.fileName().right(4) == ".vym" )
- bi->setVymLink (fi.filePath());
- emitDataChanged(bi);
- }
- }
-
- // Scroll at least some stuff
- if (dst->branchCount()>1 && dst->depth()-beginDepth>2)
- dst->toggleScroll();
- }
- blockSaveState=oldSaveState;
-}
-
-void VymModel::importDirInt (const QString &s)
-{
- BranchItem *selbi = getSelectedBranch();
- if (selbi)
- {
- saveStateChangingPart (selbi, selbi, QString ("importDir (\"%1\")").arg(s),QString("Import directory structure from %1").arg(s));
-
- QDir d(s);
- importDirInt (selbi, d);
- }
-}
-
-void VymModel::importDir()
-{
- BranchItem *selbi = getSelectedBranch();
- if (selbi)
- {
- QStringList filters;
- filters <<"VYM map (*.vym)";
- QFileDialog fd;
- fd.setWindowTitle (vymName + " - " +tr("Choose directory structure to import"));
- fd.setFileMode (QFileDialog::DirectoryOnly);
- fd.setNameFilters (filters);
- fd.setWindowTitle(vymName + " - " + tr("Choose directory structure to import"));
- fd.setAcceptMode (QFileDialog::AcceptOpen);
-
- QString fn;
- if ( fd.exec() == QDialog::Accepted &&!fd.selectedFiles().isEmpty() )
- {
- importDirInt (fd.selectedFiles().first() );
- reposition();
- }
- }
-}
-
-bool VymModel::tryVymLock()
-{
- // Defaults for author and host in vymLock
- QString defAuthor = settings.value("/user/name", tr( "unknown user", "Default for lockfiles of maps") ).toString();
- QString defHost = QHostInfo::localHostName();
- vymLock.setMapPath( filePath );
- vymLock.setAuthor( settings.value( "/user/name", defAuthor ).toString() );
- if ( getenv("HOST") != 0 )
- vymLock.setHost( getenv("HOST") );
- else
- vymLock.setHost( defHost );
-
- // Now try to lock
- if (!vymLock.tryLock() )
- {
- if (debug) qDebug() << "VymModel::tryLock failed!";
- setReadOnly( true );
- if (vymLock.getState() == VymLock::lockedByOther)
- {
- LockedFileDialog dia;
- QString a = vymLock.getAuthor();
- QString h = vymLock.getHost();
- QString s = QString( tr("Map seems to be already opened in another vym instance!\n\n "
- "Map is locked by \"%1\" on \"%2\"\n\n"
- "Please only delete the lockfile, if you are sure nobody else is currently working on this map." )) .arg(a).arg(h);
- dia.setText( s );
- dia.setWindowTitle(tr("Warning: Map already opended","VymModel"));
- if (dia.execDialog() == LockedFileDialog::DeleteLockfile)
- {
- if (vymLock.removeLock() )
- {
- mainWindow->statusMessage (tr("Removed lockfile for %1").arg(mapName));
- setReadOnly(false);
- return true;
- } else
- QMessageBox::warning(0,
- tr("Warning"),
- tr("Couldn't remove lockfile for %1").arg(mapName));
- }
- } else if (vymLock.getState() == VymLock::notWritable)
- {
- WarningDialog dia;
- QString a = vymLock.getAuthor();
- QString h = vymLock.getHost();
- QString s = QString( tr("Cannot create lockfile of map! "
- "It will be opened in readonly mode.\n\n" ));
- dia.setText( s );
- dia.setWindowTitle(tr("Warning","VymModel"));
- dia.showCancelButton( false );
- //dia.setShowAgainName("/mainwindow/mapIsLocked");
- dia.exec();
- }
- return false;
- }
- return true;
-}
-
-bool VymModel::renameMap( const QString &newPath)
-{
- QString oldPath = filePath;
- setFilePath ( newPath );
- if (vymLock.getState() == VymLock::lockedByMyself)
- {
- // vymModel owns the lockfile, try to rename it
- if (! vymLock.rename( fileName ))
- {
- qWarning ("Warning: VymModel::renameMap failed");
- setFilePath( oldPath );
- return false;
- } else
- return true;
- }
-
- // try to create new lockfile for the lock states: lockedByOther and notWritable
- return tryVymLock();
-}
-
-void VymModel::setReadOnly( bool b )
-{
- readonly = b;
- mainWindow->updateTabName( this );
-}
-
-bool VymModel::isReadOnly()
-{
- return readonly;
-}
-
-void VymModel::autosave()
-{
- if (filePath=="")
- {
- if (debug)
- qDebug() << "VymModel::autosave rejected due to missing filePath\n";
- }
-
- QDateTime now=QDateTime().currentDateTime();
-
- // Disable autosave, while we have gone back in history
- int redosAvail=undoSet.readNumValue (QString("/history/redosAvail"));
- if (redosAvail>0) return;
-
- // Also disable autosave for new map without filename
- if (filePath.isEmpty()) return;
-
-
- if (mapUnsaved
- && mapChanged
- && mainWindow->useAutosave()
- && !testmode)
- {
- if (QFileInfo(filePath).lastModified()<=fileChangedTime)
- mainWindow->fileSave (this);
- else
- if (debug)
- qDebug() <<" ME::autosave rejected, file on disk is newer than last save.\n";
-
- }
-}
-
-void VymModel::fileChanged()
-{
- // Check if file on disk has changed meanwhile
- if (!filePath.isEmpty())
- {
- if (readonly)
- {
- // unset readonly if lockfile is gone
- if (vymLock.tryLock() ) setReadOnly( false );
- } else
- {
- // FIXME-0 Check, if somebody else removed/replaced lockfile
- // Here a unique vym ID would be needed to be checked
-
- QDateTime tmod = QFileInfo (filePath).lastModified();
- if (tmod > fileChangedTime)
- {
- // FIXME-4 VM switch to current mapeditor and finish lineedits...
- QMessageBox mb( vymName,
- tr("The file of the map on disk has changed:\n\n"
- " %1\n\nDo you want to reload that map with the new file?").arg(filePath),
- QMessageBox::Question,
- QMessageBox::Yes ,
- QMessageBox::Cancel | QMessageBox::Default,
- QMessageBox::NoButton );
-
- mb.setButtonText( QMessageBox::Yes, tr("Reload"));
- mb.setButtonText( QMessageBox::No, tr("Ignore"));
- switch( mb.exec() )
- {
- case QMessageBox::Yes:
- // Reload map
- mainWindow->initProgressCounter (1);
- loadMap (filePath);
- mainWindow->removeProgressCounter ();
- break;
- case QMessageBox::Cancel:
- fileChangedTime=tmod; // allow autosave to overwrite newer file!
- }
- }
- }
- }
-}
-
-bool VymModel::isDefault()
-{
- return mapDefault;
-}
-
-void VymModel::makeDefault()
-{
- mapChanged=false;
- mapDefault=true;
-}
-
-bool VymModel::hasChanged()
-{
- return mapChanged;
-}
-
-void VymModel::setChanged()
-{
- if (!mapChanged)
- autosaveTimer->start(settings.value("/system/autosave/ms/",300000).toInt());
- mapChanged=true;
- mapDefault=false;
- mapUnsaved=true;
- findReset();
- updateActions();
-}
-
-QString VymModel::getObjectName (LinkableMapObj *lmo)
-{
- if (!lmo || !lmo->getTreeItem() ) return QString();
- return getObjectName (lmo->getTreeItem() );
-}
-
-
-QString VymModel::getObjectName (TreeItem *ti)
-{
- QString s;
- if (!ti) return QString("Error: NULL has no name!");
- s=ti->getHeadingPlain();
- if (s=="") s="unnamed";
-
- return QString ("%1 (%2)").arg(ti->getTypeName()).arg(s);
-}
-
-void VymModel::redo()
-{
- // Can we undo at all?
- if (redosAvail<1) return;
-
- bool blockSaveStateOrg=blockSaveState;
- blockSaveState=true;
-
- redosAvail--;
-
- if (undosAvail<stepsTotal) undosAvail++;
- curStep++;
- if (curStep>stepsTotal) curStep=1;
- QString undoCommand= undoSet.value (QString("/history/step-%1/undoCommand").arg(curStep));
- QString undoSelection=undoSet.value (QString("/history/step-%1/undoSelection").arg(curStep));
- QString redoCommand= undoSet.value (QString("/history/step-%1/redoCommand").arg(curStep));
- QString redoSelection=undoSet.value (QString("/history/step-%1/redoSelection").arg(curStep));
- QString comment=undoSet.value (QString("/history/step-%1/comment").arg(curStep));
- QString version=undoSet.value ("/history/version");
-
- /* TODO Maybe check for version, if we save the history
- if (!checkVersion(version))
- QMessageBox::warning(0,tr("Warning"),
- tr("Version %1 of saved undo/redo data\ndoes not match current vym version %2.").arg(version).arg(vymVersion));
- */
-
- // Find out current undo directory
- QString bakMapDir(QString(tmpMapDir+"/undo-%1").arg(curStep));
-
- if (debug)
- {
- qDebug() << "VymModel::redo() begin\n";
- qDebug() << " undosAvail="<<undosAvail;
- qDebug() << " redosAvail="<<redosAvail;
- qDebug() << " curStep="<<curStep;
- qDebug() << " ---------------------------";
- qDebug() << " comment="<<comment;
- qDebug() << " undoCom="<<undoCommand;
- qDebug() << " undoSel="<<undoSelection;
- qDebug() << " redoCom="<<redoCommand;
- qDebug() << " redoSel="<<redoSelection;
- qDebug() << " ---------------------------";
- }
-
- // select object before redo
- if (!redoSelection.isEmpty())
- select (redoSelection);
-
- bool noErr;
- QString errMsg;
- parseAtom (redoCommand,noErr,errMsg);
- if (!noErr)
- {
- if (!options.isOn("batch") )
- QMessageBox::warning(0,tr("Warning"),tr("Redo failed:\n%1").arg(errMsg));
- qWarning()<< "VM::redo aborted:\n"<<errMsg;
- }
-
- blockSaveState=blockSaveStateOrg;
-
- undoSet.setValue ("/history/undosAvail",QString::number(undosAvail));
- undoSet.setValue ("/history/redosAvail",QString::number(redosAvail));
- undoSet.setValue ("/history/curStep",QString::number(curStep));
- undoSet.writeSettings(histPath);
-
- mainWindow->updateHistory (undoSet);
- updateActions();
-
- /* TODO remove testing
- qDebug() << "ME::redo() end\n";
- qDebug() << " undosAvail="<<undosAvail;
- qDebug() << " redosAvail="<<redosAvail;
- qDebug() << " curStep="<<curStep;
- qDebug() << " ---------------------------";
- */
-}
-
-bool VymModel::isRedoAvailable()
-{
- if (undoSet.readNumValue("/history/redosAvail",0)>0)
- return true;
- return false;
-}
-
-void VymModel::undo()
-{
- // Can we undo at all?
- if (undosAvail<1) return;
-
- mainWindow->statusMessage (tr("Autosave disabled during undo."));
-
- bool blockSaveStateOrg=blockSaveState;
- blockSaveState=true;
-
- QString undoCommand= undoSet.value (QString("/history/step-%1/undoCommand").arg(curStep));
- QString undoSelection=undoSet.value (QString("/history/step-%1/undoSelection").arg(curStep));
- QString redoCommand= undoSet.value (QString("/history/step-%1/redoCommand").arg(curStep));
- QString redoSelection=undoSet.value (QString("/history/step-%1/redoSelection").arg(curStep));
- QString comment=undoSet.value (QString("/history/step-%1/comment").arg(curStep));
- QString version=undoSet.value ("/history/version");
-
- /* TODO Maybe check for version, if we save the history
- if (!checkVersion(version))
- QMessageBox::warning(0,tr("Warning"),
- tr("Version %1 of saved undo/redo data\ndoes not match current vym version %2.").arg(version).arg(vymVersion));
- */
-
- // Find out current undo directory
- QString bakMapDir(QString(tmpMapDir+"/undo-%1").arg(curStep));
-
- // select object before undo
- if (!undoSelection.isEmpty() && !select (undoSelection))
- {
- qWarning ("VymModel::undo() Could not select object for undo");
- return;
- }
-
- if (debug)
- {
- qDebug() << "VymModel::undo() begin\n";
- qDebug() << " undosAvail="<<undosAvail;
- qDebug() << " redosAvail="<<redosAvail;
- qDebug() << " curStep="<<curStep;
- qDebug() << " ---------------------------";
- qDebug() << " comment="<<comment;
- qDebug() << " undoCom="<<undoCommand;
- qDebug() << " undoSel="<<undoSelection;
- qDebug() << " redoCom="<<redoCommand;
- qDebug() << " redoSel="<<redoSelection;
- qDebug() << " ---------------------------";
- }
-
- // select object before undo
- if (!undoSelection.isEmpty())
- select (undoSelection);
-
- // bool noErr;
- QString errMsg;
- //parseAtom (undoCommand,noErr,errMsg);
- errMsg = QVariant(execute(undoCommand)).toString();
- // FIXME-3 add noErr to parameters of execute above or ignore (error message already within parseAtom)
- //
- /*
- if (!noErr)
- {
- if (!options.isOn("batch") )
- QMessageBox::warning(0,tr("Warning"),tr("Undo failed:\n%1").arg(errMsg));
- qWarning()<< "VM::undo failed:\n"<<errMsg;
- }
- */
-
- undosAvail--;
- curStep--;
- if (curStep<1) curStep = stepsTotal;
-
- redosAvail++;
-
- blockSaveState = blockSaveStateOrg;
-/* testing only
- qDebug() << "VymModel::undo() end\n";
- qDebug() << " undosAvail="<<undosAvail;
- qDebug() << " redosAvail="<<redosAvail;
- qDebug() << " curStep="<<curStep;
- qDebug() << " ---------------------------";
-*/
-
- undoSet.setValue ("/history/undosAvail",QString::number(undosAvail));
- undoSet.setValue ("/history/redosAvail",QString::number(redosAvail));
- undoSet.setValue ("/history/curStep",QString::number(curStep));
- undoSet.writeSettings(histPath);
-
- mainWindow->updateHistory (undoSet);
- updateActions();
- //emitSelectionChanged();
-}
-
-bool VymModel::isUndoAvailable()
-{
- if (undoSet.readNumValue("/history/undosAvail",0)>0)
- return true;
- return false;
-}
-
-void VymModel::gotoHistoryStep (int i)
-{
- // Restore variables
- int undosAvail=undoSet.readNumValue (QString("/history/undosAvail"));
- int redosAvail=undoSet.readNumValue (QString("/history/redosAvail"));
-
- if (i<0) i=undosAvail+redosAvail;
-
- // Clicking above current step makes us undo things
- if (i<undosAvail)
- {
- for (int j=0; j<undosAvail-i; j++) undo();
- return;
- }
- // Clicking below current step makes us redo things
- if (i>undosAvail)
- for (int j=undosAvail; j<i; j++)
- {
- if (debug) qDebug() << "VymModel::gotoHistoryStep redo "<<j<<"/"<<undosAvail<<" i="<<i;
- redo();
- }
-
- // And ignore clicking the current row ;-)
-}
-
-
-QString VymModel::getHistoryPath()
-{
- QString histName(QString("history-%1").arg(curStep));
- return (tmpMapDir+"/"+histName);
-}
-
-void VymModel::resetHistory()
-{
- curStep=0;
- redosAvail=0;
- undosAvail=0;
-
- stepsTotal=settings.value("/history/stepsTotal",100).toInt();
- undoSet.setValue ("/history/stepsTotal",QString::number(stepsTotal));
- mainWindow->updateHistory (undoSet);
-}
-
-void VymModel::saveState(
- const SaveMode &savemode,
- const QString &undoSelection,
- const QString &undoCom,
- const QString &redoSelection,
- const QString &redoCom,
- const QString &comment,
- TreeItem *saveSel,
- QString dataXML)
-{
- sendData(redoCom); //FIXME-4 testing
-
- // Main saveState
-
- if (blockSaveState) return;
-
- if (debug) qDebug() << "VM::saveState() for "<<mapName;
-
- // Find out current undo directory
- if (undosAvail<stepsTotal) undosAvail++;
- curStep++;
- if (curStep>stepsTotal) curStep=1;
-
- QString histDir=getHistoryPath();
- QString bakMapPath=histDir+"/map.xml";
-
- // Create histDir if not available
- QDir d(histDir);
- if (!d.exists())
- makeSubDirs (histDir);
-
- // Save depending on how much needs to be saved
- QList <Link*> tmpLinks;
- if (saveSel)
- dataXML=saveToDir (histDir,mapName+"-",false, QPointF (),saveSel);
-
- QString undoCommand=undoCom;
- QString redoCommand=redoCom;
- if (savemode==PartOfMap )
- {
- undoCommand.replace ("PATH",bakMapPath);
- redoCommand.replace ("PATH",bakMapPath);
- }
-
- if (!dataXML.isEmpty())
- // Write XML Data to disk
- saveStringToDisk (bakMapPath,dataXML);
-
- // We would have to save all actions in a tree, to keep track of
- // possible redos after a action. Possible, but we are too lazy: forget about redos.
- redosAvail=0;
-
- // Write the current state to disk
- undoSet.setValue ("/history/undosAvail",QString::number(undosAvail));
- undoSet.setValue ("/history/redosAvail",QString::number(redosAvail));
- undoSet.setValue ("/history/curStep",QString::number(curStep));
- undoSet.setValue (QString("/history/step-%1/undoCommand").arg(curStep),undoCommand);
- undoSet.setValue (QString("/history/step-%1/undoSelection").arg(curStep),undoSelection);
- undoSet.setValue (QString("/history/step-%1/redoCommand").arg(curStep),redoCommand);
- undoSet.setValue (QString("/history/step-%1/redoSelection").arg(curStep),redoSelection);
- undoSet.setValue (QString("/history/step-%1/comment").arg(curStep),comment);
- undoSet.setValue (QString("/history/version"),vymVersion);
- undoSet.writeSettings(histPath);
-
- if (debug)
- {
- //qDebug() << " into="<< histPath;
- qDebug() << " stepsTotal="<<stepsTotal<<
- ", undosAvail="<<undosAvail<<
- ", redosAvail="<<redosAvail<<
- ", curStep="<<curStep;
- qDebug() << " ---------------------------";
- qDebug() << " comment="<<comment;
- qDebug() << " undoCom="<<undoCommand;
- qDebug() << " undoSel="<<undoSelection;
- qDebug() << " redoCom="<<redoCommand;
- qDebug() << " redoSel="<<redoSelection;
- if (saveSel) qDebug() << " saveSel="<<qPrintable (getSelectString(saveSel));
- qDebug() << " ---------------------------";
- }
-
- mainWindow->updateHistory (undoSet);
-
- setChanged();
- updateActions();
-}
-
-
-void VymModel::saveStateChangingPart(TreeItem *undoSel, TreeItem* redoSel, const QString &rc, const QString &comment)
-{
- // save the selected part of the map, Undo will replace part of map
- QString undoSelection="";
- if (undoSel)
- undoSelection=getSelectString(undoSel);
- else
- qWarning ("VymModel::saveStateChangingPart no undoSel given!");
- QString redoSelection="";
- if (redoSel)
- redoSelection=getSelectString(undoSel);
- else
- qWarning ("VymModel::saveStateChangingPart no redoSel given!");
-
-
- saveState (PartOfMap,
- undoSelection, "addMapReplace (\"PATH\")",
- redoSelection, rc,
- comment,
- undoSel);
-}
-
-void VymModel::saveStateRemovingPart(TreeItem* redoSel, const QString &comment)
-{
- if (!redoSel)
- {
- qWarning ("VymModel::saveStateRemovingPart no redoSel given!");
- return;
- }
- QString undoSelection;
- QString redoSelection=getSelectString(redoSel);
- if (redoSel->isBranchLikeType() )
- {
- // save the selected branch of the map, Undo will insert part of map
- if (redoSel->depth()>0)
- undoSelection=getSelectString (redoSel->parent());
- saveState (PartOfMap,
- undoSelection, QString("addMapInsert (\"PATH\",%1,%2)").arg(redoSel->num()).arg(SlideContent),
- redoSelection, "delete ()",
- comment,
- redoSel);
- }
-}
-
-void VymModel::saveState(TreeItem *undoSel, const QString &uc, TreeItem *redoSel, const QString &rc, const QString &comment)
-{
- // "Normal" savestate: save commands, selections and comment
- // so just save commands for undo and redo
- // and use current selection, if empty parameter passed
-
- QString redoSelection="";
- if (redoSel) redoSelection=getSelectString(redoSel);
- QString undoSelection="";
- if (undoSel) undoSelection=getSelectString(undoSel);
-
- saveState (UndoCommand,
- undoSelection, uc,
- redoSelection, rc,
- comment,
- NULL);
-}
-
-void VymModel::saveState(const QString &undoSel, const QString &uc, const QString &redoSel, const QString &rc, const QString &comment)
-{
- // "Normal" savestate: save commands, selections and comment
- // so just save commands for undo and redo
- // and use current selection
- saveState (UndoCommand,
- undoSel, uc,
- redoSel, rc,
- comment,
- NULL);
-}
-
-void VymModel::saveState(const QString &uc, const QString &rc, const QString &comment)
-{
- // "Normal" savestate applied to model (no selection needed):
- // save commands and comment
- saveState (UndoCommand,
- NULL, uc,
- NULL, rc,
- comment,
- NULL);
-}
-
-void VymModel::saveStateMinimal(TreeItem *undoSel, const QString &uc, TreeItem *redoSel, const QString &rc, const QString &comment)
-{ // Save a change in string and merge
- // minor sequential changes */
- QString redoSelection="";
- if (redoSel) redoSelection=getSelectString(redoSel);
- QString undoSelection="";
- if (undoSel) undoSelection=getSelectString(undoSel);
-
- saveState (UndoCommand,
- undoSelection, uc,
- redoSelection, rc,
- comment,
- NULL);
-}
-
-void VymModel::saveStateBeforeLoad (LoadMode lmode, const QString &fname)
-{
- BranchItem *selbi=getSelectedBranch();
- if (selbi)
- {
- if (lmode==ImportAdd)
- saveStateChangingPart(
- selbi,
- selbi,
- QString("addMapInsert (\"%1\")").arg(fname),
- QString("Add map %1 to %2").arg(fname).arg(getObjectName(selbi)));
- if (lmode==ImportReplace)
- {
- BranchItem *pi=(BranchItem*)(selbi->parent());
- saveStateChangingPart(
- pi,
- pi,
- QString("addMapReplace(%1)").arg(fname),
- QString("Add map %1 to %2").arg(fname).arg(getObjectName(selbi)));
- }
- }
-}
-
-
-
-QGraphicsScene* VymModel::getScene ()
-{
- return mapEditor->getScene();
-}
-
-TreeItem* VymModel::findBySelectString(QString s)
-{
- if (s.isEmpty() ) return NULL;
-
- // Old maps don't have multiple mapcenters and don't save full path
- if (s.left(2) !="mc") s="mc:0,"+s;
-
- QStringList parts=s.split (",");
- QString typ;
- int n;
- TreeItem *ti=rootItem;
-
- while (!parts.isEmpty() )
- {
- typ=parts.first().left(2);
- n=parts.first().right(parts.first().length() - 3).toInt();
- parts.removeFirst();
- if (typ=="mc" || typ=="bo")
- ti=ti->getBranchNum (n);
- else if (typ=="fi")
- ti=ti->getImageNum (n);
- else if (typ=="ai")
- ti=ti->getAttributeNum (n);
- else if (typ=="xl")
- ti=ti->getXLinkItemNum (n);
- if(!ti) return NULL;
- }
- return ti;
-}
-
-TreeItem* VymModel::findID (const uint &id)
-{
- BranchItem *cur=NULL;
- BranchItem *prev=NULL;
- nextBranch(cur,prev);
- while (cur)
- {
- if (id==cur->getID() ) return cur;
- int j=0;
- while (j<cur->xlinkCount() )
- {
- XLinkItem *xli=cur->getXLinkItemNum (j);
- if (id==xli->getID() ) return xli;
- j++;
- }
- j=0;
- while (j<cur->imageCount() )
- {
- ImageItem *ii=cur->getImageNum (j);
- if (id==ii->getID() ) return ii;
- j++;
- }
- nextBranch(cur,prev);
- }
- return NULL;
-}
-
-TreeItem* VymModel::findUuid (const QUuid &id)
-{
- BranchItem *cur=NULL;
- BranchItem *prev=NULL;
- nextBranch(cur,prev);
- while (cur)
- {
- if (id==cur->getUuid() ) return cur;
- int j=0;
- while (j<cur->xlinkCount() )
- {
- XLinkItem *xli=cur->getXLinkItemNum (j);
- if (id==xli->getUuid() ) return xli;
- j++;
- }
- j=0;
- while (j<cur->imageCount() )
- {
- ImageItem *ii=cur->getImageNum (j);
- if (id==ii->getUuid() ) return ii;
- j++;
- }
- nextBranch(cur,prev);
- }
- return NULL;
-}
-
-//////////////////////////////////////////////
-// Interface
-//////////////////////////////////////////////
-void VymModel::setVersion (const QString &s)
-{
- version=s;
-}
-
-QString VymModel::getVersion()
-{
- return version;
-}
-
-void VymModel::setTitle (const QString &s)
-{
- saveState (
- QString ("setMapTitle (\"%1\")").arg(title),
- QString ("setMapTitle (\"%1\")").arg(s),
- QString ("Set title of map to \"%1\"").arg(s)
- );
- title=s;
-}
-
-QString VymModel::getTitle()
-{
- return title;
-}
-
-void VymModel::setAuthor (const QString &s)
-{
- saveState (
- QString ("setMapAuthor (\"%1\")").arg(author),
- QString ("setMapAuthor (\"%1\")").arg(s),
- QString ("Set author of map to \"%1\"").arg(s)
- );
- author=s;
-}
-
-QString VymModel::getAuthor()
-{
- return author;
-}
-
-void VymModel::setComment (const QString &s)
-{
- saveState (
- QString ("setMapComment (\"%1\")").arg(comment),
- QString ("setMapComment (\"%1\")").arg(s),
- QString ("Set comment of map")
- );
- comment=s;
-}
-
-QString VymModel::getComment ()
-{
- return comment;
-}
-
-QString VymModel::getDate ()
-{
- return QDate::currentDate().toString ("yyyy-MM-dd");
-}
-
-int VymModel::branchCount()
-{
- int c=0;
- BranchItem *cur=NULL;
- BranchItem *prev=NULL;
- nextBranch(cur,prev);
- while (cur)
- {
- c++;
- nextBranch(cur,prev);
- }
- return c;
-}
-
-void VymModel::setSortFilter (const QString &s)
-{
- sortFilter=s;
- emit (sortFilterChanged (sortFilter));
-}
-
-QString VymModel::getSortFilter ()
-{
- return sortFilter;
-}
-
-void VymModel::setHeading(const VymText &vt, BranchItem *bi)
-{
- Heading h_old;
- Heading h_new;
- h_new = vt;
- QString s = vt.getTextASCII();
- if (!bi) bi=getSelectedBranch();
- if (bi)
- {
- h_old = bi->getHeading();
- if (h_old == h_new) return;
- saveState(
- bi, "parseVymText ('" + h_old.saveToDir() + "')",
- bi, "parseVymText ('" + h_new.saveToDir() + "')",
- QString("Set heading of %1 to \"%2\"").arg(getObjectName(bi)).arg(s) );
- bi->setHeading(vt);
- emitDataChanged ( bi);
- emitUpdateQueries ();
- reposition();
- }
-}
-
-void VymModel::setHeadingPlainText(const QString &s, BranchItem *bi)
-{
- if (!bi) bi=getSelectedBranch();
- if (bi)
- {
- VymText vt = bi->getHeading();
- vt.setPlainText(s);
- if (bi->getHeading() == vt) return;
- setHeading (vt, bi);
- }
-}
-
-Heading VymModel::getHeading()
-{
- TreeItem *selti=getSelectedItem();
- if (selti) return selti->getHeading();
- qWarning() << "VymModel::getHeading Nothing selected.";
- return Heading();
-}
-
-void VymModel::setNote(const VymNote &vn)
-{
- TreeItem *selti=getSelectedItem();
- if (selti)
- {
- VymNote n_old;
- VymNote n_new;
- n_old = selti->getNote();
- n_new = vn;
- saveState(
- selti,
- "parseVymText ('" + n_old.saveToDir() + "')",
- selti,
- "parseVymText ('" + n_new.saveToDir() + "')",
- QString("Set note of %1 to \"%2\"").arg(getObjectName(selti)).arg(n_new.getTextASCII().left(20) ) );
- selti->setNote( n_new );
- emitNoteChanged( selti );
- emitDataChanged( selti );
- }
-}
-
-VymNote VymModel::getNote()
-{
- TreeItem *selti=getSelectedItem();
- if (selti)
- {
- VymNote n = selti->getNote();
- return n;
- }
- qWarning() << "VymModel::getNote Nothing selected.";
- return VymNote();
-}
-
-bool VymModel::hasRichTextNote()
-{
- TreeItem *selti=getSelectedItem();
- if (selti)
- {
- return selti->getNote().isRichText();
- }
- return false;
-}
-
-void VymModel::loadNote (const QString &fn)
-{
- BranchItem *selbi=getSelectedBranch();
- if (selbi)
- {
- QString n;
- if (!loadStringFromDisk (fn,n))
- qWarning ()<<"VymModel::loadNote Couldn't load "<<fn;
- else
- {
- VymNote vn;
- vn.setAutoText(n);
- setNote (vn);
- }
- } else
- qWarning ("VymModel::loadNote no branch selected");
-}
-
-void VymModel::saveNote (const QString &fn)
-{
- BranchItem *selbi = getSelectedBranch();
- if (selbi)
- {
- VymNote n = selbi->getNote();
- if ( n.isEmpty() )
- qWarning ()<<"VymModel::saveNote note is empty, won't save to "<<fn;
- else
- {
- if (!saveStringToDisk (fn, n.saveToDir() ))
- qWarning ()<<"VymModel::saveNote Couldn't save "<<fn;
- }
- } else
- qWarning ("VymModel::saveNote no branch selected");
-}
-
-void VymModel::findDuplicateURLs() // FIXME-3 needs GUI
-{
- // Generate map containing _all_ URLs and branches
- QString u;
- QMap <QString,BranchItem*> map;
- BranchItem *cur=NULL;
- BranchItem *prev=NULL;
- nextBranch(cur,prev);
- while (cur)
- {
- u=cur->getURL();
- if (!u.isEmpty() )
- map.insertMulti (u,cur);
- nextBranch(cur,prev);
- }
-
- // Extract duplicate URLs
- QMap <QString, BranchItem*>::const_iterator i=map.constBegin();
- QMap <QString, BranchItem*>::const_iterator firstdup=map.constEnd(); //invalid
- while (i != map.constEnd())
- {
- if (i!=map.constBegin() && i.key()==firstdup.key())
- {
- if ( i-1==firstdup )
- {
- qDebug() << firstdup.key();
- qDebug() << " - "<< firstdup.value() <<" - "<<firstdup.value()->getHeading().getText();
- }
- qDebug() << " - "<< i.value() <<" - "<<i.value()->getHeading().getText();
- } else
- firstdup=i;
-
- ++i;
- }
-}
-
-bool VymModel::findAll (FindResultModel *rmodel, QString s, Qt::CaseSensitivity cs)
-{
- rmodel->clear();
- rmodel->setSearchString (s);
- rmodel->setSearchFlags (0); //FIXME-4 translate cs to QTextDocument::FindFlag
- bool hit = false;
-
- BranchItem *cur = NULL;
- BranchItem *prev = NULL;
- nextBranch(cur,prev);
-
- FindResultItem *lastParent = NULL;
- while (cur)
- {
- lastParent = NULL;
- if (cur->getHeading().getTextASCII().contains (s,cs))
- {
- lastParent = rmodel->addItem (cur);
- hit = true;
- }
- QString n = cur->getNoteASCII();
- int i = 0;
- int j = 0;
- while ( i >= 0)
- {
- i = n.indexOf (s,i,cs);
- if (i >= 0)
- {
- // If not there yet, add "parent" item
- if (!lastParent)
- {
- lastParent = rmodel->addItem (cur);
- hit = true;
- if (!lastParent)
- qWarning() << "VymModel::findAll still no lastParent?!";
- /*
- else
- lastParent->setSelectable (false);
- */
- }
-
- // save index of occurence
- QString e = n.mid(i-15, 30);
- n.replace('\n', ' ');
- rmodel->addSubItem (lastParent, QString(tr("Note", "FindAll in VymModel") + ": \"...%1...\"").arg(n.mid(i-8,80)), cur, j);
- j++;
- i++;
- }
- }
- nextBranch(cur, prev);
- }
- return hit;
-}
-
-BranchItem* VymModel::findText (QString s,Qt::CaseSensitivity cs)
-{
- if (!s.isEmpty() && s!=findString)
- {
- findReset();
- findString=s;
- }
-
- QTextDocument::FindFlags flags=0;
- if (cs==Qt::CaseSensitive) flags=QTextDocument::FindCaseSensitively;
-
- if (!findCurrent)
- { // Nothing found or new find process
- if (EOFind)
- // nothing found, start again
- EOFind=false;
- findCurrent=NULL;
- findPrevious=NULL;
- nextBranch (findCurrent,findPrevious);
- }
- bool searching=true;
- bool foundNote=false;
- while (searching && !EOFind)
- {
- if (findCurrent)
- {
- // Searching in Note
- if (findCurrent->getNoteASCII().contains(findString,cs))
- {
- select (findCurrent);
- if (noteEditor->findText(findString,flags))
- {
- searching=false;
- foundNote=true;
- }
- }
- // Searching in Heading
- if (searching && findCurrent->getHeading().getTextASCII().contains (findString,cs) )
- {
- select(findCurrent);
- searching=false;
- }
- }
- if (!foundNote)
- {
- nextBranch(findCurrent,findPrevious);
- if (!findCurrent) EOFind=true;
- }
- }
- if (!searching)
- return getSelectedBranch();
- else
- return NULL;
-}
-
-void VymModel::findReset()
-{ // Necessary if text to find changes during a find process
- findString.clear();
- findCurrent=NULL;
- findPrevious=NULL;
- EOFind=false;
-}
-
-void VymModel::setURL(QString url)
-{
- TreeItem *selti=getSelectedItem();
- if (selti->getURL()==url) return;
- if (selti)
- {
- QString oldurl=selti->getURL();
- selti->setURL (url);
- saveState (
- selti,
- QString ("setURL (\"%1\")").arg(oldurl),
- selti,
- QString ("setURL (\"%1\")").arg(url),
- QString ("set URL of %1 to %2").arg(getObjectName(selti)).arg(url)
- );
- if (url.contains("bugzilla.novell.com/"))
- getBugzillaData(false);
- emitDataChanged (selti);
- reposition();
- }
-}
-
-QString VymModel::getURL()
-{
- TreeItem *selti=getSelectedItem();
- if (selti)
- return selti->getURL();
- else
- return QString();
-}
-
-QStringList VymModel::getURLs(bool ignoreScrolled)
-{
- QStringList urls;
- BranchItem *selbi=getSelectedBranch();
- BranchItem *cur=NULL;
- BranchItem *prev=NULL;
- nextBranch (cur,prev,true,selbi);
- while (cur)
- {
- if (!cur->getURL().isEmpty() && !(ignoreScrolled && cur->hasScrolledParent() ))
- urls.append( cur->getURL());
- nextBranch(cur,prev,true,selbi);
- }
- return urls;
-}
-
-
-void VymModel::setFrameType(const FrameObj::FrameType &t)
-{
- BranchItem *bi=getSelectedBranch();
- if (bi)
- {
- BranchObj *bo=(BranchObj*)(bi->getLMO());
- if (bo)
- {
- QString s=bo->getFrameTypeName();
- bo->setFrameType (t);
- saveState (bi, QString("setFrameType (\"%1\")").arg(s),
- bi, QString ("setFrameType (\"%1\")").arg(bo->getFrameTypeName()),QString ("set type of frame to %1").arg(s));
- reposition();
- bo->updateLinkGeometry();
- }
- }
-}
-
-void VymModel::setFrameType(const QString &s)
-{
- BranchItem *bi=getSelectedBranch();
- if (bi)
- {
- BranchObj *bo=(BranchObj*)(bi->getLMO());
- if (bo)
- {
- saveState (bi, QString("setFrameType (\"%1\")").arg(bo->getFrameTypeName()),
- bi, QString ("setFrameType (\"%1\")").arg(s),QString ("set type of frame to %1").arg(s));
- bo->setFrameType (s);
- reposition();
- bo->updateLinkGeometry();
- }
- }
-}
-
-void VymModel::toggleFrameIncludeChildren ()
-{
- BranchItem *bi=getSelectedBranch();
- if (bi)
- {
- bool b=bi->getFrameIncludeChildren();
- setFrameIncludeChildren (!b);
- }
-}
-
-void VymModel::setFrameIncludeChildren (bool b)
-{
- BranchItem *bi=getSelectedBranch();
- if (bi)
- {
- QString u= b ? "false" : "true";
- QString r=!b ? "false" : "true";
-
- saveState(
- bi,
- QString("setFrameIncludeChildren(%1)").arg(u),
- bi,
- QString("setFrameIncludeChildren(%1)").arg(r),
- QString("Include children in %1").arg(getObjectName(bi))
- );
- bi->setFrameIncludeChildren (b);
- emitDataChanged (bi);
- reposition();
- }
-}
-
-void VymModel::setFramePenColor(const QColor &c) //FIXME-4 not saved if there is no LMO
-
-{
- BranchItem *bi=getSelectedBranch();
- if (bi)
- {
- BranchObj *bo=(BranchObj*)(bi->getLMO());
- if (bo)
- {
- saveState (bi, QString("setFramePenColor (\"%1\")").arg(bo->getFramePenColor().name() ),
- bi, QString ("setFramePenColor (\"%1\")").arg(c.name() ),QString ("set pen color of frame to %1").arg(c.name() ));
- bo->setFramePenColor (c);
- }
- }
-}
-
-void VymModel::setFrameBrushColor(const QColor &c) //FIXME-4 not saved if there is no LMO
-{
- BranchItem *bi=getSelectedBranch();
- if (bi)
- {
- BranchObj *bo=(BranchObj*)(bi->getLMO());
- if (bo)
- {
- saveState (bi, QString("setFrameBrushColor (\"%1\")").arg(bo->getFrameBrushColor().name() ),
- bi, QString ("setFrameBrushColor (\"%1\")").arg(c.name() ),QString ("set brush color of frame to %1").arg(c.name() ));
- bo->setFrameBrushColor (c);
- bi->setBackgroundColor (c); //FIXME-4 redundant with above
- }
- }
-}
-
-void VymModel::setFramePadding (const int &i) //FIXME-4 not saved if there is no LMO
-{
- BranchItem *bi=getSelectedBranch();
- if (bi)
- {
- BranchObj *bo=(BranchObj*)(bi->getLMO());
- if (bo)
- {
- saveState (bi, QString("setFramePadding (\"%1\")").arg(bo->getFramePadding() ),
- bi, QString ("setFramePadding (\"%1\")").arg(i),QString ("set brush color of frame to %1").arg(i));
- bo->setFramePadding (i);
- reposition();
- bo->updateLinkGeometry();
- }
- }
-}
-
-void VymModel::setFrameBorderWidth(const int &i) //FIXME-4 not saved if there is no LMO
-{
- BranchItem *bi=getSelectedBranch();
- if (bi)
- {
- BranchObj *bo=(BranchObj*)(bi->getLMO());
- if (bo)
- {
- saveState (bi, QString("setFrameBorderWidth (\"%1\")").arg(bo->getFrameBorderWidth() ),
- bi, QString ("setFrameBorderWidth (\"%1\")").arg(i),QString ("set border width of frame to %1").arg(i));
- bo->setFrameBorderWidth (i);
- reposition();
- bo->updateLinkGeometry();
- }
- }
-}
-
-void VymModel::setIncludeImagesVer(bool b)
-{
- BranchItem *bi=getSelectedBranch();
- if (bi && b!=bi->getIncludeImagesVer() )
- {
- QString u= b ? "false" : "true";
- QString r=!b ? "false" : "true";
-
- saveState(
- bi,
- QString("setIncludeImagesVertically (%1)").arg(u),
- bi,
- QString("setIncludeImagesVertically (%1)").arg(r),
- QString("Include images vertically in %1").arg(getObjectName(bi))
- );
- bi->setIncludeImagesVer(b);
- emitDataChanged ( bi);
- reposition();
- }
-}
-
-void VymModel::setIncludeImagesHor(bool b)
-{
- BranchItem *bi=getSelectedBranch();
- if (bi && b!=bi->getIncludeImagesHor() )
- {
- QString u= b ? "false" : "true";
- QString r=!b ? "false" : "true";
-
- saveState(
- bi,
- QString("setIncludeImagesHorizontally (%1)").arg(u),
- bi,
- QString("setIncludeImagesHorizontally (%1)").arg(r),
- QString("Include images horizontally in %1").arg(getObjectName(bi))
- );
- bi->setIncludeImagesHor(b);
- emitDataChanged ( bi);
- reposition();
- }
-}
-
-void VymModel::setChildrenLayout(BranchItem::LayoutHint layoutHint) // FIXME-3 no savestate yet
-{
- BranchItem *bi=getSelectedBranch();
- if (bi)
- {
- /*
- QString u= b ? "false" : "true";
- QString r=!b ? "false" : "true";
-
- saveState(
- bi,
- QString("setIncludeImagesHorizontally (%1)").arg(u),
- bi,
- QString("setIncludeImagesHorizontally (%1)").arg(r),
- QString("Include images horizontally in %1").arg(getObjectName(bi))
- );
- */
- bi->setChildrenLayout(layoutHint);
- emitDataChanged ( bi);
- reposition();
- }
-}
-
-void VymModel::setHideLinkUnselected (bool b)
-{
- TreeItem *ti=getSelectedItem();
- if (ti && (ti->getType()==TreeItem::Image ||ti->isBranchLikeType()))
- {
- QString u= b ? "false" : "true";
- QString r=!b ? "false" : "true";
-
- saveState(
- ti,
- QString("setHideLinkUnselected (%1)").arg(u),
- ti,
- QString("setHideLinkUnselected (%1)").arg(r),
- QString("Hide link of %1 if unselected").arg(getObjectName(ti))
- );
- ((MapItem*)ti)->setHideLinkUnselected(b);
- }
-}
-
-void VymModel::setHideExport(bool b, TreeItem *ti)
-{
- if (!ti) ti=getSelectedItem();
- if (ti &&
- (ti->getType()==TreeItem::Image ||ti->isBranchLikeType()) &&
- ti->hideInExport() !=b
- )
- {
- ti->setHideInExport (b);
- QString u= b ? "false" : "true";
- QString r=!b ? "false" : "true";
-
- saveState(
- ti,
- QString ("setHideExport (%1)").arg(u),
- ti,
- QString ("setHideExport (%1)").arg(r),
- QString ("Set HideExport flag of %1 to %2").arg(getObjectName(ti)).arg (r)
- );
- emitDataChanged(ti);
- emitSelectionChanged();
- reposition();
- }
-}
-
-void VymModel::toggleHideExport()
-{
- QList <TreeItem*> selItems=getSelectedItems();
- if (selItems.count()>0 )
- {
- foreach (TreeItem* ti, selItems)
- {
- bool b=!ti->hideInExport();
- setHideExport (b,ti );
- }
- }
-}
-
-void VymModel::toggleTask()
-{
- BranchItem *selbi=getSelectedBranch();
- if (selbi)
- {
- saveStateChangingPart (
- selbi,
- selbi,
- QString ("toggleTask()"),
- QString ("Toggle task of %1").arg(getObjectName (selbi)) );
- Task *task=selbi->getTask();
- if (!task )
- {
- task=taskModel->createTask (selbi);
- taskEditor->select(task);
- }
- else
- taskModel->deleteTask (task);
-
- emitDataChanged(selbi);
- emitSelectionChanged();
- reposition();
- }
-}
-
-void VymModel::cycleTaskStatus(bool reverse)
-{
- BranchItem *selbi=getSelectedBranch();
- if (selbi)
- {
- Task *task=selbi->getTask();
- if (task)
- {
- saveStateChangingPart (
- selbi,
- selbi,
- QString ("cycleTask()"),
- QString ("Toggle task of %1").arg(getObjectName (selbi)) );
- task->cycleStatus(reverse);
- task->setDateModified();
-
- // make sure task is still visible
- taskEditor->select (task);
- emitDataChanged(selbi);
- reposition();
- }
- }
-}
-
-bool VymModel::setTaskSleep(const QString &s)
-{
- BranchItem *selbi=getSelectedBranch();
- if (selbi && !s.isEmpty() )
- {
- Task *task=selbi->getTask();
- if (task )
- {
- bool ok;
- int n=s.toInt(&ok);
- if (!ok)
- {
- // Is s a date?
- QDate d=QDate::fromString(s,Qt::ISODate);
- d=QDate::fromString(s,Qt::ISODate);
- if (d.isValid())
- // ISO date YYYY-MM-DD
- ok=true;
- else
- {
- d=QDate::fromString(s,Qt::DefaultLocaleShortDate);
- if (d.isValid())
- // Locale date, e.g. 24 Dec 2012
- ok=true;
- else
- {
- QRegExp re ("(\\d+).(\\d+).(\\d+)");
- re.setMinimal(false);
- int pos=re.indexIn(s);
- QStringList list=re.capturedTexts();
- if (pos>=0)
- {
- // German formate, e.g. 24.12.2012
- d=QDate(list.at(3).toInt(), list.at(2).toInt(), list.at(1).toInt());
- ok=true;
- } else
- {
- re.setPattern("(\\d+).(\\d+).");
- pos=re.indexIn(s);
- list=re.capturedTexts();
- if (pos>=0)
- {
- // Short German formate, e.g. 24.12.
- int month=list.at(2).toInt();
- int day=list.at(1).toInt();
- int year=QDate::currentDate().year();
- d=QDate(year, month, day);
- if (QDate::currentDate().daysTo(d) < 0)
- {
- year++;
- d=QDate(year, month, day);
- }
- ok=true;
- } else
- {
- re.setPattern("(\\d+).(\\d+).");
- }
- }
- }
- }
- if (ok) n=QDate::currentDate().daysTo(d);
- }
-
- if (ok)
- {
- int oldsleep=task->getDaysSleep();
- task->setDateSleep (n);
- task->setDateModified();
- saveState (
- selbi,
- QString("setTaskSleep (%1)").arg(oldsleep),
- selbi,
- QString("setTaskSleep (%1)").arg(n),
- QString("setTaskSleep (%1)").arg(n) );
- emitDataChanged (selbi);
- reposition();
- return true;
- }
- }
- }
- return false;
-}
-
-int VymModel::taskCount()
-{
- return taskModel->count (this);
-}
-
-void VymModel::addTimestamp() //FIXME-4 new function, localize
-{
- BranchItem *selbi=addNewBranch();
- if (selbi)
- {
- QDate today=QDate::currentDate();
- QChar c='0';
- selbi->setHeadingPlainText (
- QString ("%1-%2-%3")
- .arg(today.year(),4,10,c)
- .arg(today.month(),2,10,c)
- .arg(today.day(),2,10,c));
- emitDataChanged ( selbi);
- reposition();
- select (selbi);
- }
-}
-
-
-void VymModel::copy()
-{
- if (readonly) return;
-
- TreeItem *selti=getSelectedItem();
- if (selti &&
- (selti->getType() == TreeItem::Branch ||
- selti->getType() == TreeItem::MapCenter ||
- selti->getType() == TreeItem::Image ))
- {
- // Copy to global clipboard
- QString saveFile=saveToDir (clipboardDir, clipboardFile, true, QPointF(), selti);
- if (!saveStringToDisk(clipboardDir + "/" + clipboardFile,saveFile))
- qWarning ("ME::saveStringToDisk failed!");
-
- clipboardEmpty=false;
-
- if (redosAvail == 0)
- {
- // Copy also to history
- QString s=getSelectString(selti);
- saveState (PartOfMap, s, "nop ()", s, "copy ()","Copy selection to clipboard",selti );
- curClipboard=curStep;
- }
- updateActions();
- }
-}
-
-void VymModel::paste()
-{
- if (readonly) return;
-
- BranchItem *selbi=getSelectedBranch();
- if (selbi)
- {
- saveStateChangingPart(
- selbi,
- selbi,
- QString ("paste ()"),
- QString("Paste")
- );
- bool zippedOrg=zipped;
- loadMap (clipboardDir+"/"+clipboardFile,ImportAdd, VymMap,SlideContent);
- zipped=zippedOrg;
- reposition();
- }
-}
-
-void VymModel::cut()
-{
- if (readonly) return;
-
- TreeItem *selti=getSelectedItem();
- if ( selti && (selti->isBranchLikeType() ||selti->getType()==TreeItem::Image))
- {
- copy();
- deleteSelection();
- reposition();
- }
-}
-
-bool VymModel::moveUp(BranchItem *bi)
-{
- if (readonly) return false;
-
- bool oldState=blockSaveState;
- blockSaveState=true;
- bool result=false;
- if (bi && bi->canMoveUp())
- result=relinkBranch (bi,(BranchItem*)bi->parent(),bi->num()-1,false);
- blockSaveState=oldState;
- return result;
-}
-
-void VymModel::moveUp()
-{
- BranchItem *selbi=getSelectedBranch();
- if (selbi)
- {
- QString oldsel=getSelectString(selbi);
- if (moveUp (selbi))
- {
- saveState (
- getSelectString(selbi),"moveDown ()",
- oldsel,"moveUp ()",
- QString("Move up %1").arg(getObjectName(selbi)));
- select (selbi);
- }
- }
-}
-
-bool VymModel::moveDown(BranchItem *bi)
-{
- if (readonly) return false;
-
- bool oldState=blockSaveState;
- blockSaveState=true;
- bool result=false;
- if (bi && bi->canMoveDown())
- result=relinkBranch (bi,(BranchItem*)bi->parent(),bi->num()+1,false);
- blockSaveState=oldState;
- return result;
-}
-
-void VymModel::moveDown()
-{
- BranchItem *selbi=getSelectedBranch();
- if (selbi)
- {
- QString oldsel=getSelectString(selbi);
- if ( moveDown(selbi))
- {
- saveState (
- getSelectString(selbi),"moveUp ()",
- oldsel,"moveDown ()",
- QString("Move down %1").arg(getObjectName(selbi)));
- select (selbi);
- }
- }
-}
-
-void VymModel::detach()
-{
- BranchItem *selbi=getSelectedBranch();
- if (selbi && selbi->depth()>0)
- {
- // if no relPos have been set before, try to use current rel positions
- if (selbi->getLMO())
- for (int i=0; i<selbi->branchCount();++i)
- selbi->getBranchNum(i)->getBranchObj()->setRelPos();
-
- QString oldsel=getSelectString();
- int n=selbi->num();
- QPointF p;
- BranchObj *bo=selbi->getBranchObj();
- if (bo) p=bo->getAbsPos();
- QString parsel=getSelectString(selbi->parent());
- if ( relinkBranch (selbi,rootItem,-1,true) )
- saveState (
- getSelectString (selbi),
- QString("relinkTo (\"%1\",%2,%3,%4)").arg(parsel).arg(n).arg(p.x()).arg(p.y()),
- oldsel,
- "detach ()",
- QString("Detach %1").arg(getObjectName(selbi))
- );
- }
-}
-
-void VymModel::sortChildren(bool inverse)
-{
- BranchItem* selbi=getSelectedBranch();
- if (selbi)
- {
- if(selbi->branchCount()>1)
- {
- if (!inverse)
- saveStateChangingPart(
- selbi,selbi, "sortChildren ()",
- QString("Sort children of %1").arg(getObjectName(selbi)));
- else
- saveStateChangingPart(
- selbi,selbi, "sortChildren (false)",
- QString("Inverse sort children of %1").arg(getObjectName(selbi)));
-
- selbi->sortChildren(inverse);
- select(selbi);
- reposition();
- }
- }
-}
-
-BranchItem* VymModel::createMapCenter()
-{
- BranchItem *newbi=addMapCenter (QPointF (0,0) );
- return newbi;
-}
-
-BranchItem* VymModel::createBranch(BranchItem *dst)
-{
- if (dst)
- return addNewBranchInt (dst,-2);
- else
- return NULL;
-}
-
-ImageItem* VymModel::createImage(BranchItem *dst)
-{
- if (dst)
- {
- QModelIndex parix;
- int n;
-
- QList<QVariant> cData;
- cData << tr("Image","Default name for new image") << "undef";
-
- ImageItem *newii=new ImageItem(cData) ;
- //newii->setHeading (QApplication::translate("Heading of new image in map", "new image"));
-
- emit (layoutAboutToBeChanged() );
-
- parix=index(dst);
- if (!parix.isValid()) qDebug() << "VM::createII invalid index\n";
- n=dst->getRowNumAppend(newii);
- beginInsertRows (parix,n,n);
- dst->appendChild (newii);
- endInsertRows ();
-
- emit (layoutChanged() );
-
- // save scroll state. If scrolled, automatically select
- // new branch in order to tmp unscroll parent...
- newii->createMapObj();
- latestAddedItem=newii;
- reposition();
- return newii;
- }
- return NULL;
-}
-
-bool VymModel::createLink(Link *link)
-{
- BranchItem *begin=link->getBeginBranch();
- BranchItem *end =link->getEndBranch();
-
- if (!begin || !end)
- {
- qWarning ()<<"VM::createXLinkNew part of XLink is NULL";
- return false;
- }
-
- if (begin==end)
- {
- if (debug) qDebug()<<"VymModel::createLink begin==end, aborting";
- return false;
- }
-
- // check, if link already exists
- foreach (Link* l, xlinks)
- {
- if ( (l->getBeginBranch()==begin && l->getEndBranch()==end ) ||
- (l->getBeginBranch()==end && l->getEndBranch()==begin) )
- {
- qWarning()<<"VymModel::createLink link exists already, aborting";
- return false;
- }
- }
-
- QModelIndex parix;
- int n;
-
- QList<QVariant> cData;
-
- cData << "new Link begin"<<"undef";
- XLinkItem *newli=new XLinkItem(cData) ;
- newli->setLink (link);
- link->setBeginLinkItem (newli);
-
- emit (layoutAboutToBeChanged() );
-
- parix=index(begin);
- n=begin->getRowNumAppend(newli);
- beginInsertRows (parix,n,n);
- begin->appendChild (newli);
- endInsertRows ();
-
- cData.clear();
- cData << "new Link end"<<"undef";
- newli=new XLinkItem(cData) ;
- newli->setLink (link);
- link->setEndLinkItem (newli);
-
- parix=index(end);
- n=end->getRowNumAppend(newli);
- beginInsertRows (parix,n,n);
- end->appendChild (newli);
- endInsertRows ();
-
- emit (layoutChanged() );
-
- xlinks.append (link);
- link->activate();
-
- latestAddedItem=newli;
-
- if (!link->getMO() )
- {
- link->createMapObj();
- reposition();
- } else
- link->updateLink();
-
- link->setStyleBegin( defXLinkStyleBegin );
- link->setStyleEnd ( defXLinkStyleEnd );
- return true;
-}
-
-QColor VymModel::getXLinkColor()
-{
- Link *l=getSelectedXLink();
- if (l)
- return l->getPen().color();
- else
- return QColor();
-}
-
-int VymModel::getXLinkWidth()
-{
- Link *l=getSelectedXLink();
- if (l)
- return l->getPen().width();
- else
- return -1;
-}
-
-Qt::PenStyle VymModel::getXLinkPenStyle()
-{
- Link *l=getSelectedXLink();
- if (l)
- return l->getPen().style();
- else
- return Qt::NoPen;
-}
-
-QString VymModel::getXLinkStyleBegin()
-{
- Link *l=getSelectedXLink();
- if (l)
- return l->getStyleBeginString();
- else
- return QString();
-}
-
-QString VymModel::getXLinkStyleEnd()
-{
- Link *l=getSelectedXLink();
- if (l)
- return l->getStyleEndString();
- else
- return QString();
-}
-
-AttributeItem* VymModel::addAttribute() // Experimental, savestate missing
-
-{
- BranchItem* selbi=getSelectedBranch();
- if (selbi)
- {
- QList<QVariant> cData;
- cData << "new attribute" << "undef";
- AttributeItem *a=new AttributeItem (cData);
- a->setType (AttributeItem::FreeString);
- a->setKey ("Foo Attrib");
- a->setValue ("Att val");
-
- if (addAttribute (selbi,a)) return a;
- }
- return NULL;
-}
-
-AttributeItem* VymModel::addAttribute(BranchItem *dst,AttributeItem *ai){
- if (dst)
- {
- emit (layoutAboutToBeChanged() );
-
- QModelIndex parix=index(dst);
- int n=dst->getRowNumAppend (ai);
- beginInsertRows (parix,n,n);
- dst->appendChild (ai);
- endInsertRows ();
-
- emit (layoutChanged() );
-
- ai->createMapObj(mapEditor->getScene() );
- reposition();
- return ai;
- }
- return NULL;
-}
-
-BranchItem* VymModel::addMapCenter (bool saveStateFlag)
-{
- if (!hasContextPos)
- {
- // E.g. when called via keypresss:
- // Place new MCO in middle of existing ones,
- // Useful for "brainstorming" mode...
- contextPos=QPointF();
- BranchItem *bi;
- BranchObj *bo;
- for (int i=0;i<rootItem->branchCount();++i)
- {
- bi=rootItem->getBranchNum (i);
- bo=(BranchObj*)bi->getLMO();
- if (bo) contextPos+=bo->getAbsPos();
-
- }
- if (rootItem->branchCount()>1)
- contextPos*=1/(qreal)(rootItem->branchCount());
- }
-
-
- BranchItem *bi=addMapCenter (contextPos);
- updateActions();
- emitShowSelection();
- if (saveStateFlag)
- saveState (
- bi,
- "delete()",
- NULL,
- QString ("addMapCenter (%1,%2)").arg (contextPos.x()).arg(contextPos.y()),
- QString ("Adding MapCenter to (%1,%2)").arg (contextPos.x()).arg(contextPos.y())
- );
- emitUpdateLayout();
- return bi;
-}
-
-BranchItem* VymModel::addMapCenter(QPointF absPos)
-// createMapCenter could then probably be merged with createBranch
-{
-
- // Create TreeItem
- QModelIndex parix=index(rootItem);
-
- QList<QVariant> cData;
- cData << "VM:addMapCenter" << "undef";
- BranchItem *newbi=new BranchItem (cData,rootItem);
- newbi->setHeadingPlainText (tr("New map", "New map"));
- int n=rootItem->getRowNumAppend (newbi);
-
- emit (layoutAboutToBeChanged() );
- beginInsertRows (parix,n,n);
-
- rootItem->appendChild (newbi);
-
- endInsertRows();
- emit (layoutChanged() );
-
- // Create MapObj
- newbi->setPositionMode (MapItem::Absolute);
- BranchObj *bo=newbi->createMapObj(mapEditor->getScene() );
- if (bo) bo->move (absPos);
-
- return newbi;
-}
-
-BranchItem* VymModel::addNewBranchInt(BranchItem *dst,int pos)
-{
- // Depending on pos:
- // -3 insert in children of parent above selection
- // -2 add branch to selection
- // -1 insert in children of parent below selection
- // 0..n insert in children of parent at pos
-
- // Create TreeItem
- QList<QVariant> cData;
- cData << "" << "undef";
-
- BranchItem *parbi = dst;
- int n;
- BranchItem *newbi = new BranchItem (cData);
-
- emit (layoutAboutToBeChanged() );
-
- if (pos == -2)
- {
- n = parbi->getRowNumAppend (newbi);
- beginInsertRows (index(parbi), n, n);
- parbi->appendChild (newbi);
- endInsertRows ();
- }else if (pos == -1 || pos == -3)
- {
- // insert below selection
- parbi=(BranchItem*)dst->parent();
- n=dst->childNumber() + (3+pos)/2; //-1 |-> 1;-3 |-> 0
- beginInsertRows (index(parbi), n, n);
- parbi->insertBranch(n,newbi);
- endInsertRows ();
- } else
- { // pos >= 0
- n=parbi->getRowNumAppend (newbi) - (parbi->branchCount()-pos);
- beginInsertRows (index(parbi), n, n);
- parbi->insertBranch(pos,newbi);
- endInsertRows ();
- }
- emit (layoutChanged() );
-
- newbi->createMapObj(mapEditor->getScene());
-
- // Set color of heading to that of parent
- newbi->setHeadingColor (parbi->getHeadingColor());
-
- reposition();
- return newbi;
-}
-
-BranchItem* VymModel::addNewBranch(BranchItem *bi, int pos)
-{
- BranchItem *newbi=NULL;
- if (!bi) bi=getSelectedBranch();
-
- if (bi)
- {
- QString redosel=getSelectString(bi);
- newbi=addNewBranchInt (bi,pos);
- QString undosel=getSelectString(newbi);
-
- if (newbi)
- {
- saveState(
- undosel,
- "delete ()",
- redosel,
- QString ("addBranch (%1)").arg(pos),
- QString ("Add new branch to %1").arg(getObjectName(bi)));
-
- reposition();
- latestAddedItem=newbi;
- // In Network mode, the client needs to know where the new branch is,
- // so we have to pass on this information via saveState.
- // TODO: Get rid of this positioning workaround
- /* FIXME-4 network problem: QString ps=qpointfToString (newbo->getAbsPos());
- sendData ("selectLatestAdded ()");
- sendData (QString("move %1").arg(ps));
- sendSelection();
- */
- }
- }
- return newbi;
-}
-
-
-BranchItem* VymModel::addNewBranchBefore()
-{
- BranchItem *newbi=NULL;
- BranchItem *selbi=getSelectedBranch();
- if (selbi && selbi->getType()==TreeItem::Branch)
- // We accept no MapCenter here, so we _have_ a parent
- {
- // add below selection
- newbi=addNewBranchInt (selbi,-1);
-
- if (newbi)
- {
- //newbi->move2RelPos (p);
-
- // Move selection to new branch
- relinkBranch (selbi,newbi,0,true);
-
- // Use color of child instead of parent
- newbi->setHeadingColor (selbi->getHeadingColor() );
- emitDataChanged (newbi);
-
- saveState (newbi, "deleteKeepChildren ()", newbi, "addBranchBefore ()",
- QString ("Add branch before %1").arg(getObjectName(selbi)));
- }
- }
- return newbi;
-}
-
-bool VymModel::relinkBranch (
- BranchItem *branch,
- BranchItem *dst,
- int pos,
- bool updateSelection,
- QPointF orgPos)
-{
- if (branch && dst)
- {
- // Check if we relink to ourselves
- if (dst->isChildOf (branch) ) return false;
-
- if (updateSelection) unselectAll();
-
- // Do we need to update frame type?
- bool keepFrame=true;
-
- // Save old position for savestate
- QString preSelStr=getSelectString (branch);
- QString preNum=QString::number (branch->num(),10);
- QString preParStr=getSelectString (branch->parent());
-
- emit (layoutAboutToBeChanged() );
- BranchItem *branchpi=(BranchItem*)branch->parent();
- // Remove at current position
- int n=branch->childNum();
-
- beginRemoveRows (index(branchpi),n,n);
- branchpi->removeChild (n);
- endRemoveRows();
-
- if (pos<0 ||pos>dst->branchCount() ) pos=dst->branchCount();
-
- // Append as last branch to dst
- if (dst->branchCount()==0)
- n=0;
- else
- n=dst->getFirstBranch()->childNumber();
- beginInsertRows (index(dst),n+pos,n+pos);
- dst->insertBranch (pos,branch);
- endInsertRows();
-
- // Correct type if necessesary
- if ( branch->getType()==TreeItem::MapCenter && branch->depth() >0 )
- {
- branch->setType(TreeItem::Branch);
- keepFrame=false;
- }
-
- // reset parObj, fonts, frame, etc in related LMO or other view-objects
- branch->updateStyles(keepFrame);
-
- emitDataChanged( branch );
- reposition(); // both for moveUp/Down and relinking
-
- // Savestate
- QString postSelStr=getSelectString(branch);
- QString postNum=QString::number (branch->num(),10);
-
- QPointF savePos;
- LinkableMapObj *lmosel=branch->getLMO();
- if (lmosel) savePos=lmosel->getAbsPos();
-
- if (!blockSaveState)
- { // Don't build strings when moving up/down
- QString undoCom="relinkTo (\""+
- preParStr+ "\"," + preNum +"," +
- QString ("%1,%2").arg(orgPos.x()).arg(orgPos.y())+ ")";
-
- QString redoCom="relinkTo (\""+
- getSelectString (dst) + "\"," + postNum + "," +
- QString ("%1,%2").arg(savePos.x()).arg(savePos.y())+ ")";
-
- saveState (
- postSelStr,undoCom,
- preSelStr, redoCom,
- QString("Relink %1 to %2").arg(getObjectName(branch)).arg(getObjectName(dst)) );
- }
-
- // New parent might be invisible
- branch->updateVisibility();
-
- if (dst->isScrolled() )
- {
- if (updateSelection) select (dst);
- }
- else
- if (updateSelection) select (branch);
- return true;
- }
- return false;
-}
-
-bool VymModel::relinkImage (ImageItem *image, BranchItem *dst)
-{
- if (image && dst)
- {
- emit (layoutAboutToBeChanged() );
-
- BranchItem *pi=(BranchItem*)(image->parent());
- QString oldParString=getSelectString (pi);
- // Remove at current position
- int n=image->childNum();
- beginRemoveRows (index(pi),n,n);
- pi->removeChild (n);
- endRemoveRows();
-
- // Add at dst
- QModelIndex dstix=index(dst);
- n=dst->getRowNumAppend (image);
- beginInsertRows (dstix,n,n+1);
- dst->appendChild (image);
- endInsertRows ();
-
- // Set new parent also for lmo
- if (image->getLMO() && dst->getLMO() )
- image->getLMO()->setParObj (dst->getLMO() );
-
- emit (layoutChanged() );
- saveState(
- image,
- QString("relinkTo (\"%1\")").arg(oldParString),
- image,
- QString ("relinkTo (\"%1\")").arg(getSelectString (dst)),
- QString ("Relink floatimage to %1").arg(getObjectName(dst)));
- return true;
- }
- return false;
-}
-
-void VymModel::cleanupItems()
-{
- while (!deleteLaterIDs.isEmpty())
- {
- TreeItem *ti=findID (deleteLaterIDs.takeFirst());
- if (ti) deleteItem (ti);
- }
-}
-
-void VymModel::deleteLater(uint id)
-{
- if (!deleteLaterIDs.contains(id))
- deleteLaterIDs.append (id);
-}
-
-void VymModel::deleteSelection()
-{
- QList <uint> selectedIDs=getSelectedIDs();
- foreach (uint id, selectedIDs)
- {
- TreeItem *ti=findID (id);
- if (ti && ti->isBranchLikeType ())
- { // Delete branch
- BranchItem *selbi=(BranchItem*)ti;
- unselectAll();
- saveStateRemovingPart (selbi, QString ("Delete %1").arg(getObjectName(selbi)));
-
- BranchItem *pi=(BranchItem*)(deleteItem (selbi));
- if (pi)
- {
- if (pi->isScrolled() && pi->branchCount()==0)
- pi->unScroll();
- emitDataChanged(pi);
- select (pi);
- } else
- emitDataChanged(rootItem);
- ti=NULL;
- }
-
- // Delete other item
- if (ti)
- {
- TreeItem *pi=ti->parent();
- if (!pi) return;
- if (ti->getType()==TreeItem::Image || ti->getType()==TreeItem::Attribute||ti->getType()==TreeItem::XLink)
- {
- saveStateChangingPart(
- pi,
- ti,
- "delete ()",
- QString("Delete %1").arg(getObjectName(ti))
- );
- unselectAll();
- deleteItem (ti);
- emitDataChanged (pi);
- select (pi);
- reposition();
- } else
- qWarning ("VymmModel::deleteSelection() unknown type?!");
- }
- }
-}
-
-void VymModel::deleteKeepChildren(bool saveStateFlag)
-//deleteKeepChildren FIXME-3+ does not work yet for mapcenters
-//deleteKeepChildren FIXME-3+ children of scrolled branch stay invisible...
-{
- BranchItem *selbi=getSelectedBranch();
- BranchItem *pi;
- if (selbi)
- {
- // Don't use this on mapcenter
- if (selbi->depth()<1) return;
-
- pi=(BranchItem*)(selbi->parent());
- // Check if we have children at all to keep
- if (selbi->branchCount()==0)
- {
- deleteSelection();
- return;
- }
-
- QPointF p;
- if (selbi->getLMO()) p=selbi->getLMO()->getRelPos();
- if (saveStateFlag) saveStateChangingPart(
- pi,
- pi,
- "deleteKeepChildren ()",
- QString("Remove %1 and keep its children").arg(getObjectName(selbi))
- );
-
- QString sel=getSelectString(selbi);
- unselectAll();
- bool oldSaveState=blockSaveState;
- blockSaveState=true;
- int pos=selbi->num();
- BranchItem *bi=selbi->getFirstBranch();
- while (bi)
- {
- relinkBranch (bi,pi,pos,true);
- bi=selbi->getFirstBranch();
- pos++;
- }
- deleteItem (selbi);
- reposition();
- emitDataChanged(pi);
- select (sel);
- BranchObj *bo=getSelectedBranchObj();
- if (bo)
- {
- bo->move2RelPos (p);
- reposition();
- }
- blockSaveState=oldSaveState;
- }
-}
-
-void VymModel::deleteChildren()
-
-{
- BranchItem *selbi=getSelectedBranch();
- if (selbi)
- {
- saveStateChangingPart(
- selbi,
- selbi,
- "deleteChildren ()",
- QString( "Remove children of branch %1").arg(getObjectName(selbi))
- );
- emit (layoutAboutToBeChanged() );
-
- QModelIndex ix=index (selbi);
- int n=selbi->branchCount()-1;
- beginRemoveRows (ix,0,n);
- removeRows (0,n+1,ix);
- endRemoveRows();
- if (selbi->isScrolled()) unscrollBranch (selbi);
- emit (layoutChanged() );
- reposition();
- }
-}
-
-TreeItem* VymModel::deleteItem (TreeItem *ti)
-{
- if (ti)
- {
- TreeItem *pi=ti->parent();
- //qDebug()<<"VM::deleteItem start ti="<<ti<<" "<<ti->getHeading()<<" pi="<<pi<<"="<<pi->getHeading();
-
- TreeItem::Type t=ti->getType();
-
- QModelIndex parentIndex=index(pi);
-
- emit (layoutAboutToBeChanged() );
-
- int n=ti->childNum();
- beginRemoveRows (parentIndex,n,n);
- removeRows (n,1,parentIndex);
- endRemoveRows();
-
- // Size of parent branch might change when deleting images
- if (t==TreeItem::Image)
- {
- BranchObj *bo=(BranchObj*) ( ((BranchItem*)pi)->getMO() );
- if (bo) bo->calcBBoxSize();
- }
-
- reposition();
-
- emit (layoutChanged() );
- emitUpdateQueries ();
- if (!cleaningUpLinks) cleanupItems();
-
- //qDebug()<<"VM::deleteItem end ti="<<ti;
- if (pi->depth()>=0) return pi;
- }
- return NULL;
-}
-
-void VymModel::deleteLink(Link* l)
-{
- if (xlinks.removeOne (l)) delete (l);
-}
-
-void VymModel::clearItem (TreeItem *ti)
-{
- if (ti)
- {
- // Clear task (or other data in item itself)
- ti->clear();
-
- QModelIndex parentIndex=index(ti);
- if (!parentIndex.isValid()) return;
-
- int n=ti->childCount();
- if (n==0) return;
-
- emit (layoutAboutToBeChanged() );
-
- beginRemoveRows (parentIndex,0,n-1);
- removeRows (0,n,parentIndex);
- endRemoveRows();
-
-
- reposition();
-
- emit (layoutChanged() );
-
- }
- return ;
-}
-
-bool VymModel::scrollBranch(BranchItem *bi)
-{
- if (bi)
- {
- if (bi->isScrolled()) return false;
- if (bi->branchCount()==0) return false;
- if (bi->depth()==0) return false;
- if (bi->toggleScroll())
- {
- QString u,r;
- r="scroll";
- u="unscroll";
- saveState(
- bi,
- QString ("%1 ()").arg(u),
- bi,
- QString ("%1 ()").arg(r),
- QString ("%1 %2").arg(r).arg(getObjectName(bi))
- );
- emitDataChanged(bi);
- emitSelectionChanged();
- reposition();
- mapEditor->getScene()->update(); //Needed for _quick_ update, even in 1.13.x
- return true;
- }
- }
- return false;
-}
-
-bool VymModel::unscrollBranch(BranchItem *bi)
-{
- if (bi)
- {
- if (!bi->isScrolled()) return false;
- if (bi->toggleScroll())
- {
- QString u,r;
- u="scroll";
- r="unscroll";
- saveState(
- bi,
- QString ("%1 ()").arg(u),
- bi,
- QString ("%1 ()").arg(r),
- QString ("%1 %2").arg(r).arg(getObjectName(bi))
- );
- emitDataChanged(bi);
- emitSelectionChanged();
- reposition();
- mapEditor->getScene()->update(); //Needed for _quick_ update, even in 1.13.x
- return true;
- }
- }
- return false;
-}
-
-void VymModel::toggleScroll()
-{
- BranchItem *selbi=getSelectedBranch();
- if (selbi)
- {
- if (selbi->isScrolled())
- unscrollBranch (selbi);
- else
- scrollBranch (selbi);
- // Note: saveState & reposition are called in above functions
- }
-}
-
-void VymModel::unscrollChildren()
-{
- BranchItem *selbi=getSelectedBranch();
- if (selbi)
- {
- saveStateChangingPart(
- selbi,
- selbi,
- QString ("unscrollChildren ()"),
- QString ("unscroll all children of %1").arg(getObjectName(selbi))
- );
- BranchItem *prev=NULL;
- BranchItem *cur=NULL;
- nextBranch (cur,prev,true,selbi);
- while (cur)
- {
- if (cur->isScrolled())
- {
- cur->toggleScroll();
- emitDataChanged (cur);
- }
- nextBranch (cur,prev,true,selbi);
- }
- updateActions();
- reposition();
- // Would this help??? emitSelectionChanged();
- }
-}
-
-void VymModel::setScale(qreal xn, qreal yn)
-{
- ImageItem *selii=getSelectedImage();
- if (selii)
- {
- qreal sx=selii->getScaleX();
- qreal sy=selii->getScaleY();
- selii->setScale (xn,yn);
- saveState (
- selii,
- QString ("setScale(%1,%2)").arg(sx).arg(sy),
- selii,
- QString ("setScale(%1,%2)").arg(xn).arg(yn),
- QString ("Scale %1").arg(getObjectName(selii))
- );
- reposition();
- }
-}
-
-void VymModel::growSelectionSize() //FIXME-3 Also for heading in BranchItem?
-{
- ImageItem *selii=getSelectedImage();
- if (selii)
- {
- qreal f=0.05;
- qreal sx=selii->getScaleX();
- qreal sy=selii->getScaleY();
- setScale (sx+f,sy+f);
- }
-}
-
-void VymModel::shrinkSelectionSize()
-{
- ImageItem *selii=getSelectedImage();
- if (selii)
- {
- qreal f=0.05;
- qreal sx=selii->getScaleX();
- qreal sy=selii->getScaleY();
- setScale (sx-f,sy-f);
- }
-}
-
-void VymModel::resetSelectionSize()
-{
- ImageItem *selii=getSelectedImage();
- if (selii) setScale (1,1);
-}
-
-void VymModel::emitExpandAll()
-{
- emit (expandAll() );
-}
-
-void VymModel::emitExpandOneLevel()
-{
- emit (expandOneLevel () );
-}
-
-void VymModel::emitCollapseOneLevel()
-{
- emit (collapseOneLevel () );
-}
-
-void VymModel::emitCollapseUnselected()
-{
- emit (collapseUnselected() );
-}
-
-void VymModel::toggleTarget()
-{
- BranchItem *selbi=getSelectedBranch();
- if (selbi)
- {
- selbi->toggleTarget();
- reposition();
- saveState (
- selbi,
- "toggleTarget()",
- selbi,
- "toggleTarget",
- "Toggle target");
- }
-}
-
-ItemList VymModel::getTargets()
-{
- ItemList targets;
-
- //rmodel->setSearchString (s);
-
- BranchItem *cur=NULL;
- BranchItem *prev=NULL;
- nextBranch(cur,prev);
-
- while (cur)
- {
- if (cur->hasActiveSystemFlag("system-target"))
- targets[cur->getID()] = (cur->getHeading()).getTextASCII();
- nextBranch(cur,prev);
- }
- return targets;
-}
-
-void VymModel::toggleStandardFlag (const QString &name, FlagRow *master)
-{
- BranchItem *bi=getSelectedBranch();
- if (bi)
- {
- QString u,r;
- if (bi->hasActiveStandardFlag(name))
- {
- r="unsetFlag";
- u="setFlag";
- }
- else
- {
- u="unsetFlag";
- r="setFlag";
- }
- saveState(
- bi,
- QString("%1 (\"%2\")").arg(u).arg(name),
- bi,
- QString("%1 (\"%2\")").arg(r).arg(name),
- QString("Toggling standard flag \"%1\" of %2").arg(name).arg(getObjectName(bi)));
- bi->toggleStandardFlag (name, master);
- emitDataChanged (bi);
- reposition();
- }
-}
-
-void VymModel::addFloatImage (const QImage &img)
-{
- BranchItem *selbi=getSelectedBranch();
- if (selbi)
- {
- ImageItem *ii=createImage (selbi);
- ii->load(img);
- ii->setOriginalFilename("No original filename (image added by dropevent)");
- QString s=getSelectString(selbi);
- saveState (PartOfMap, s, "nop ()", s, "copy ()","Copy dropped image to clipboard",ii );
- saveState (ii,"delete ()", selbi,QString("paste(%1)").arg(curStep),"Pasting dropped image");
- reposition();
- }
-}
-
-
-void VymModel::colorBranch (QColor c)
-{
- QList <BranchItem*> selbis=getSelectedBranches();
- foreach (BranchItem* selbi, selbis)
- {
- saveState(
- selbi,
- QString ("colorBranch (\"%1\")").arg(selbi->getHeadingColor().name()),
- selbi,
- QString ("colorBranch (\"%1\")").arg(c.name()),
- QString("Set color of %1 to %2").arg(getObjectName(selbi)).arg(c.name())
- );
- selbi->setHeadingColor(c); // color branch
- emitDataChanged (selbi);
- taskEditor->showSelection();
- }
- mapEditor->getScene()->update();
-}
-
-void VymModel::colorSubtree (QColor c, BranchItem *b)
-{
- QList <BranchItem*> selbis;
- if (b)
- selbis.append (b);
- else
- selbis=getSelectedBranches();
- foreach (BranchItem *bi,selbis)
- {
- saveStateChangingPart(
- bi,
- bi,
- QString ("colorSubtree (\"%1\")").arg(c.name()),
- QString ("Set color of %1 and children to %2").arg(getObjectName(bi)).arg(c.name())
- );
- BranchItem *prev=NULL;
- BranchItem *cur=NULL;
- nextBranch (cur,prev,true,bi);
- while (cur)
- {
- cur->setHeadingColor(c); // color links, color children
- emitDataChanged (cur);
- nextBranch (cur,prev,true,bi);
- }
- }
- taskEditor->showSelection();
- mapEditor->getScene()->update();
-}
-
-QColor VymModel::getCurrentHeadingColor()
-{
- BranchItem *selbi=getSelectedBranch();
- if (selbi) return selbi->getHeadingColor();
-
- QMessageBox::warning(0,"Warning","Can't get color of heading,\nthere's no branch selected");
- return Qt::black;
-}
-
-void VymModel::note2URLs()
-{
- BranchItem *selbi=getSelectedBranch();
- if (selbi)
- {
- saveStateChangingPart(
- selbi,
- selbi,
- QString ("note2URLs()"),
- QString ("Extract URLs from note of %1").arg(getObjectName(selbi))
- );
-
- QString n = selbi->getNoteASCII();
- if (n.isEmpty()) return;
- QRegExp re ("(http.*)(\\s|\"|')");
- re.setMinimal (true);
-
- BranchItem *bi;
- int pos = 0;
- while ((pos = re.indexIn(n, pos)) != -1)
- {
- bi=createBranch (selbi);
- bi->setHeadingPlainText (re.cap(1));
- bi->setURL (re.cap(1));
- emitDataChanged (bi);
- pos += re.matchedLength();
- }
-
- }
-}
-
-void VymModel::editHeading2URL()
-{
- TreeItem *selti=getSelectedItem();
- if (selti)
- setURL (selti->getHeadingPlain());
-}
-
-void VymModel::editBugzilla2URL()
-{
- TreeItem *selti=getSelectedItem();
- if (selti)
- {
- QString h=selti->getHeadingPlain();
- QRegExp rx("(\\d+)");
- if (rx.indexIn(h) !=-1)
- setURL ("https://bugzilla.novell.com/show_bug.cgi?id="+rx.cap(1) );
- }
-}
-
-void VymModel::getBugzillaData(bool subtree)
-{
- if (!bugzillaClientAvailable)
- {
- WarningDialog dia;
- dia.setText(
- QObject::tr("No Bugzilla client found. "
- " For openSUSE you can install by (running as root):\n\n","VymModel, how to install Bugzilla client module")+
- " zypper ar http://download.opensuse.org/repositories/openSUSE:/Tools/openSUSE_XX.Y/ openSUSE:Tools_XX.Y\n"+
- " zypper in perl-SUSE-BugzillaClient\n\n"+
- " and replace XX.Y with your version of openSUSE, e.g. 11.4\n\n"+
- QObject::tr("Alternatively you can also add the repository\n"
- "and install the perl module for Bugzilla access using YaST","VymModel, how to install Bugzilla client module")
- );
- dia.setWindowTitle(QObject::tr("Warning: Couldn't find Bugzilla client","VymModel"));
- dia.setShowAgainName("/BugzillaClient/missing");
- dia.exec();
- return;
- }
-
- BranchItem *selbi=getSelectedBranch();
- if (selbi)
- {
- QString url;
- BranchItem *prev=NULL;
- BranchItem *cur=NULL;
- nextBranch (cur,prev,true,selbi);
- while (cur)
- {
- url=cur->getURL();
- if (!url.isEmpty())
- {
- // Don't run query again if we are in update mode
- if (!subtree || ! url.contains("buglist.cgi") )
- {
- new BugAgent (cur,url);
- mainWindow->statusMessage (tr("Contacting Bugzilla...","VymModel"));
- }
- }
- if (subtree)
- nextBranch (cur,prev,true,selbi);
- else
- cur=NULL;
- }
- }
-}
-
-void VymModel::editFATE2URL()
-{
- TreeItem *selti=getSelectedItem();
- if (selti)
- {
- QString url= "http://keeper.suse.de:8080/webfate/match/id?value=ID"+selti->getHeadingPlain();
- saveState(
- selti,
- "setURL (\""+selti->getURL()+"\")",
- selti,
- "setURL (\""+url+"\")",
- QString("Use heading of %1 as link to FATE").arg(getObjectName(selti))
- );
- selti->setURL (url);
- // FIXME-4 updateActions();
- }
-}
-
-void VymModel::setVymLink (const QString &s) //FIXME-4 fail, if s does not exist
-{
- BranchItem *bi=getSelectedBranch();
- if (bi)
- {
- saveState(
- bi,
- "setVymLink (\""+bi->getVymLink()+"\")",
- bi,
- "setVymLink (\""+s+"\")",
- QString("Set vymlink of %1 to %2").arg(getObjectName(bi)).arg(s)
- );
- bi->setVymLink(s);
- emitDataChanged (bi);
- reposition();
- }
-}
-
-void VymModel::deleteVymLink()
-{
- BranchItem *bi=getSelectedBranch();
- if (bi)
- {
- saveState(
- bi,
- "setVymLink (\""+bi->getVymLink()+"\")",
- bi,
- "setVymLink (\"\")",
- QString("Unset vymlink of %1").arg(getObjectName(bi))
- );
- bi->setVymLink ("");
- emitDataChanged (bi);
- reposition();
- updateActions();
- }
-}
-
-QString VymModel::getVymLink()
-{
- BranchItem *bi=getSelectedBranch();
- if (bi)
- return bi->getVymLink();
- else
- return "";
-
-}
-
-QStringList VymModel::getVymLinks()
-{
- QStringList links;
- BranchItem *selbi=getSelectedBranch();
- BranchItem *cur=NULL;
- BranchItem *prev=NULL;
- nextBranch (cur,prev,true,selbi);
- while (cur)
- {
- if (!cur->getVymLink().isEmpty()) links.append( cur->getVymLink());
- nextBranch (cur,prev,true,selbi);
- }
- return links;
-}
-
-
-void VymModel::followXLink(int i)
-{
- BranchItem *selbi=getSelectedBranch();
- if (selbi)
- {
- selbi=selbi->getXLinkItemNum(i)->getPartnerBranch();
- if (selbi) select (selbi);
- }
-}
-
-void VymModel::editXLink()
-{
- Link *l=getSelectedXLink();
- if (l)
- {
- EditXLinkDialog dia;
- dia.setLink (l);
- if (dia.exec() == QDialog::Accepted)
- {
- if (dia.useSettingsGlobal() )
- {
- setMapDefXLinkPen( l->getPen() );
- setMapDefXLinkStyleBegin( l->getStyleBeginString() );
- setMapDefXLinkStyleEnd( l->getStyleEndString() );
- }
- }
- }
-}
-
-void VymModel::setXLinkColor(const QString &new_col)
-{
- Link *l = getSelectedXLink();
- if (l)
- {
- QPen pen = l->getPen();
- QColor new_color = QColor( new_col );
- QColor old_color = pen.color();
- if (new_color == old_color) return;
- pen.setColor( new_color);
- l->setPen( pen );
- saveState(
- l->getBeginLinkItem(),
- QString("setXLinkColor(\"%1\")").arg(old_color.name() ),
- l->getBeginLinkItem(),
- QString("setXLinkColor(\"%1\")").arg(new_color.name() ),
- QString("set color of xlink to %1").arg(new_color.name() ) );
- }
-}
-
-void VymModel::setXLinkLineStyle(const QString &new_style)
-{
- Link *l = getSelectedXLink();
- if (l)
- {
- QPen pen = l->getPen();
- QString old_style = penStyleToString( pen.style() );
- if (new_style == old_style) return;
- bool ok;
- pen.setStyle( penStyle(new_style, ok) );
- l->setPen( pen );
- saveState(
- l->getBeginLinkItem(),
- QString("setXLinkLineStyle(\"%1\")").arg(old_style),
- l->getBeginLinkItem(),
- QString("setXLinkLineStyle(\"%1\")").arg(new_style),
- QString("set style of xlink to %1").arg(new_style) );
- }
-}
-
-void VymModel::setXLinkStyleBegin(const QString &new_style)
-{
- Link *l=getSelectedXLink();
- if (l)
- {
- QString old_style = l->getStyleBeginString();
- if (new_style == old_style) return;
- l->setStyleBegin( new_style );
- saveState(
- l->getBeginLinkItem(),
- QString("setXLinkStyleBegin(\"%1\")").arg(old_style),
- l->getBeginLinkItem(),
- QString("setXLinkStyleBegin(\"%1\")").arg(new_style),
- "set style of xlink begin");
- }
-}
-
-void VymModel::setXLinkStyleEnd(const QString &new_style)
-{
- Link *l=getSelectedXLink();
- if (l)
- {
- QString old_style = l->getStyleEndString();
- if (new_style == old_style) return;
- l->setStyleEnd( new_style );
- saveState(
- l->getBeginLinkItem(),
- QString("setXLinkStyleEnd(\"%1\")").arg(old_style),
- l->getBeginLinkItem(),
- QString("setXLinkStyleEnd(\"%1\")").arg(new_style),
- "set style of xlink end");
- }
-}
-
-void VymModel::setXLinkWidth(int new_width)
-{
- Link *l=getSelectedXLink();
- if (l)
- {
- QPen pen = l->getPen();
- int old_width = pen.width();
- if (new_width == old_width) return;
- pen.setWidth( new_width);
- l->setPen( pen );
- saveState(
- l->getBeginLinkItem(),
- QString("setXLinkWidth(%1)").arg(old_width),
- l->getBeginLinkItem(),
- QString("setXLinkWidth(%1)").arg(new_width),
- "set width of xlink");
- }
-}
-
-//////////////////////////////////////////////
-// Scripting
-//////////////////////////////////////////////
-
-QVariant VymModel::parseAtom(const QString &atom, bool &noErr, QString &errorMsg)
-{
- TreeItem* selti=getSelectedItem();
- BranchItem *selbi=getSelectedBranch();
- QString s,t;
- double x,y;
- int n;
- bool b,ok;
- QVariant returnValue="";
-
- // Split string s into command and parameters
- parser.parseAtom (atom);
-
- if (parser.getCommand().length() == 0)
- {
- errorMsg.clear();
- noErr=true;
- return returnValue;
- }
-
- // Check set of parameters
- if (parser.errorLevel()==NoError && parser.checkParameters(selti) )
- {
- QString com=parser.getCommand();
- // - MS VS2013 compiler has nested if limit - work around that with
- // do{}while(0); and breaks
- do {
- /////////////////////////////////////////////////////////////////////
- if (com=="addBranch")
- {
- if (parser.parCount()==0)
- addNewBranch ();
- else
- addNewBranch ( selbi,parser.parInt (ok,0) );
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="addBranchBefore")
- {
- addNewBranchBefore ();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com==QString("addMapCenter"))
- {
- x=parser.parDouble (ok,0);
- y=parser.parDouble (ok,1);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com==QString("addMapInsert"))
- {
- t=parser.parString (ok,0); // path to map
- int contentFilter=0x0000;
-
- int pc=parser.parCount();
- int pos=-1;
- // Get position
- if (pc>1)
- {
- pos=parser.parInt(ok,1); // position
- if (!ok)
- parser.setError (Aborted,"Couldn't read position");
- }
-
- // Get contentFilter (to filter e.g. slides)
- if (pc>2)
- {
- contentFilter=parser.parInt (ok,2);
- if (!ok)
- parser.setError (Aborted,"Couldn't read content Filter");
- }
-
- if (parser.errorLevel() == NoError)
- {
- if (QDir::isRelativePath(t))
- t=(QDir::currentPath() + "/"+t);
- saveStateBeforeLoad (ImportAdd, t);
- if (File::Aborted==loadMap (t,ImportAdd,VymMap,contentFilter,pos) )
- parser.setError (Aborted,QString("Couldn't load %1").arg(t) );
- }
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com==QString("addMapReplace"))
- {
- t=parser.parString (ok,0); // path to map
- if (QDir::isRelativePath(t))
- t=(QDir::currentPath() + "/"+t);
- saveStateBeforeLoad (ImportReplace, t);
- if (File::Aborted==loadMap (t,ImportReplace,VymMap) )
- parser.setError (Aborted,QString("Couldn't load %1").arg(t) );
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com==QString("addSlide"))
- {
- addSlide();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com==QString("addXLink"))
- {
- s=parser.parString (ok,0); // begin
- t=parser.parString (ok,1); // end
- BranchItem *begin=(BranchItem*)findBySelectString(s);
- BranchItem *end=(BranchItem*)findBySelectString(t);
- if (begin && end)
- {
- if (begin->isBranchLikeType() && end->isBranchLikeType())
- {
- Link *li=new Link (this);
- li->setBeginBranch ( (BranchItem*)begin );
- li->setEndBranch ( (BranchItem*)end);
-
- createLink (li);
- QPen pen=li->getPen();
- if (parser.parCount()>2)
- {
- int w=parser.parInt (ok,2);
- if (ok) pen.setWidth(w);
- }
- if (parser.parCount()>3)
- {
- QColor col=parser.parColor (ok,3);
- if (ok) pen.setColor (col);
- }
- if (parser.parCount()>4)
- {
- QString st0=parser.parString (ok,4);
- if (ok)
- {
- Qt::PenStyle st1=penStyle (st0,ok);
- if (ok)
- pen.setStyle (st1);
- else
- parser.setError (Aborted, "Couldn't read penstyle");
- }
- }
- if (ok) li->setPen(pen);
- }
- else
- parser.setError (Aborted,"begin or end of xLink are not branch or mapcenter");
-
- } else
- parser.setError (Aborted,"Couldn't find begin or end of xLink");
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="branchCount")
- {
- returnValue=selti->branchCount();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="centerCount")
- {
- returnValue=rootItem->branchCount();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="centerOnID")
- {
- s=parser.parString(ok,0);
- TreeItem *ti=findUuid(QUuid(s));
- if (ti)
- {
- LinkableMapObj *lmo=((MapItem*)ti)->getLMO();
- if (zoomFactor>0 && lmo)
- mapEditor->setViewCenterTarget (
- lmo->getBBox().center(),
- zoomFactor,
- rotationAngle,
- animDuration,
- animCurve);
- else
- qWarning()<<"VymModel::centerOnID failed!";
- } else
- parser.setError(Aborted,QString("Could not find ID: \"%1\"").arg(s));
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="clearFlags")
- {
- selbi->deactivateAllStandardFlags();
- reposition();
- emitDataChanged(selbi);
- setChanged();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="colorBranch")
- {
- QColor c=parser.parColor (ok,0);
- colorBranch (c);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="colorSubtree")
- {
- QColor c=parser.parColor (ok,0);
- colorSubtree (c);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="copy")
- {
- copy();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="cut")
- {
- cut();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="cycleTask")
- {
- ok=true;
- if (parser.parCount()==0) b=false;
- if (parser.parCount()==1) b=parser.parBool(ok,0);
- if (ok) cycleTaskStatus (b);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="delete")
- {
- deleteSelection();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="deleteKeepChildren")
- {
- deleteKeepChildren();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="deleteChildren")
- {
- deleteChildren();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="deleteSlide")
- {
- n = parser.parInt (ok,0);
- if (!ok || n < 0 || n >= slideModel->count() - 1)
- parser.setError (Aborted,"Index out of range");
- else
- deleteSlide(n);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="exportAO")
- {
- QString fname=parser.parString(ok,0);
- exportAO (fname,false);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="exportASCII")
- {
- QString fname = parser.parString(ok, 0);
- bool listTasks = parser.parBool(ok, 1);
- exportASCII (listTasks, fname, false);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="exportCSV")
- {
- QString fname=parser.parString(ok,0);
- exportCSV (fname,false);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="exportHTML")
- {
- QString path=parser.parString(ok,0);
- QString fname=parser.parString(ok,1);
- exportHTML (path,fname,false);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="exportImage")
- {
- QString fname=parser.parString(ok,0);
- QString format="PNG";
- if (parser.parCount()>=2)
- format=parser.parString(ok,1);
- exportImage (fname,false,format);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="exportImpress")
- {
- QString fn=parser.parString(ok,0);
- QString cf=parser.parString(ok,1);
- exportImpress (fn,cf);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="exportLast")
- {
- exportLast ();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="exportLaTeX")
- {
- QString fname=parser.parString(ok,0);
- exportLaTeX (fname,false);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="exportOrgMode")
- {
- QString fname=parser.parString(ok,0);
- exportOrgMode (fname,false);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="exportPDF")
- {
- QString fname=parser.parString(ok,0);
- exportPDF(fname,false);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="exportSVG")
- {
- QString fname=parser.parString(ok,0);
- exportSVG(fname,false);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="exportXML")
- {
- QString dpath=parser.parString(ok,0);
- QString fpath=parser.parString(ok,1);
- exportXML (dpath,fpath,false);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="getDestPath")
- {
- returnValue=getDestPath();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="getFileDir")
- {
- returnValue=getFileDir();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="getFrameType")
- {
- BranchObj *bo=(BranchObj*)(selbi->getLMO());
- if (!bo)
- parser.setError (Aborted,"No BranchObj");
- else
- returnValue=bo->getFrame()->getFrameTypeName();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="getHeadingPlainText")
- {
- returnValue = getHeading().getTextASCII();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="getHeadingXML")
- {
- returnValue = getHeading().saveToDir();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="getMapAuthor")
- {
- returnValue=author;
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="getMapComment")
- {
- returnValue=comment;
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="getMapTitle")
- {
- returnValue=title;
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="getNotePlainText")
- {
- returnValue= getNote().getTextASCII();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="getNoteXML")
- {
- returnValue= getNote().saveToDir();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="getSelectString")
- {
- returnValue=getSelectString();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="getTaskSleepDays")
- {
- Task *task=selbi->getTask();
- if (task)
- returnValue=task->getDaysSleep();
- else
- parser.setError (Aborted,"Branch has no task set");
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="getURL")
- {
- returnValue=selti->getURL();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="getVymLink")
- {
- returnValue=selti->getVymLink();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="getXLinkColor")
- {
- returnValue=getXLinkColor().name();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="getXLinkWidth")
- {
- returnValue=getXLinkWidth();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="getXLinkPenStyle")
- {
- returnValue=penStyleToString( getXLinkPenStyle() );
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="getXLinkStyleBegin")
- {
- returnValue = getXLinkStyleBegin();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="getXLinkStyleEnd")
- {
- returnValue = getXLinkStyleEnd();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="hasActiveFlag")
- {
- s=parser.parString(ok,0);
- returnValue=selti->hasActiveStandardFlag(s);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="hasNote")
- {
- returnValue = !getNote().isEmpty();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="hasRichTextNote")
- {
- returnValue=hasRichTextNote();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="hasTask")
- {
- if (selbi && selbi->getTask() )
- returnValue=true;
- else
- returnValue=false;
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="importDir")
- {
- s=parser.parString(ok,0);
- importDirInt(s);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="isScrolled")
- {
- returnValue=selbi->isScrolled();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="loadImage")
- {
- s=parser.parString(ok,0);
- loadImage (selbi,s);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="loadNote")
- {
- s=parser.parString(ok,0);
- loadNote (s);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="moveDown")
- {
- moveDown();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="moveUp")
- {
- moveUp();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="moveSlideUp")
- {
- n = parser.parInt (ok, 0);
- if (!ok || n < 0 || n >= slideModel->count() - 1)
- parser.setError (Aborted,"Index out of range");
- else
- moveSlideUp(n);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="moveSlideDown")
- {
- n = parser.parInt (ok, 0);
- if (!ok || n < 0 || n >= slideModel->count() - 1)
- parser.setError (Aborted,"Index out of range");
- else
- moveSlideDown(n);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="move")
- {
- x=parser.parDouble (ok,0);
- y=parser.parDouble (ok,1);
- move (x,y);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="moveRel")
- {
- x=parser.parDouble (ok,0);
- y=parser.parDouble (ok,1);
- moveRel (x,y);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="nop")
- {
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="note2URLs")
- {
- note2URLs();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="parseVymText")
- {
- s = parser.parString(ok,0);
- parseVymText( s );
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="paste")
- {
- paste();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="redo")
- {
- redo();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="relinkTo")
- {
- if (!selti)
- {
- parser.setError (Aborted,"Nothing selected");
- } else if ( selbi)
- {
- if (parser.checkParCount(4))
- {
- // 0 selectstring of parent
- // 1 num in parent (for branches)
- // 2,3 x,y of mainbranch or mapcenter (for images)
- s=parser.parString(ok,0);
- TreeItem *dst=findBySelectString (s);
- if (dst)
- {
- if (dst->getType()==TreeItem::Branch )
- {
- // Get number in parent
- n=parser.parInt (ok,1);
- if (ok)
- {
- if (relinkBranch (selbi,(BranchItem*)dst,n,true))
- emitSelectionChanged();
- else
- parser.setError(Aborted,"Relinking failed");
- }
- } else if (dst->getType()==TreeItem::MapCenter)
- {
- if (relinkBranch (selbi,(BranchItem*)dst,-1,true))
- {
- // Get coordinates of mainbranch
- x=parser.parDouble(ok,2);
- if (ok)
- {
- y=parser.parDouble(ok,3);
- if (ok)
- {
- if (selbi->getLMO())
- {
- ((BranchObj*)selbi->getLMO())->move (x,y);
- ((BranchObj*)selbi->getLMO())->setRelPos();
- }
- }
- }
- reposition();
- emitSelectionChanged();
- } else
- parser.setError(Aborted,"Relinking failed");
- }
- } else
- parser.setError (Aborted,"Couldn't find destination branch");
- }
- } else if ( selti->getType() == TreeItem::Image)
- {
- if (parser.checkParCount(1))
- {
- // 0 selectstring of parent
- s=parser.parString(ok,0);
- TreeItem *dst=findBySelectString (s);
- if (dst)
- {
- if (dst->isBranchLikeType())
- if (!relinkImage ( ((ImageItem*)selti),(BranchItem*)dst))
- parser.setError(Aborted,"Relinking failed");
-
- } else
- parser.setError (Aborted,"Destination is not a branch");
- }
- } else
- parser.setError (Aborted,"Type of selection is not a floatimage or branch");
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="saveImage")
- {
- ImageItem *ii=getSelectedImage();
- s=parser.parString(ok,0);
- t=parser.parString(ok,1);
- saveImage (ii,t,s);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="saveNote")
- {
- s=parser.parString(ok,0);
- saveNote (s);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="scroll")
- {
- if (!scrollBranch (selbi))
- parser.setError (Aborted,"Could not scroll branch");
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="select")
- {
- s=parser.parString(ok,0);
- if (!select (s))
- parser.setError(Aborted,QString("Could not select \"%1\"").arg(s));
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="selectID")
- {
- s=parser.parString(ok,0);
- if (!selectID (s))
- parser.setError(Aborted,QString("Could not select ID: \"%1\"").arg(s));
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="selectLastBranch")
- {
- BranchItem *bi=selbi->getLastBranch();
- if (!bi)
- parser.setError (Aborted,"Could not select last branch");
- select (bi);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="selectLastImage")
- {
- ImageItem *ii=selbi->getLastImage();
- if (!ii)
- parser.setError (Aborted,"Could not select last image");
- select (ii);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="selectParent")
- {
- selectParent ();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="selectLatestAdded")
- {
- if (!latestAddedItem)
- {
- parser.setError (Aborted,"No latest added object");
- } else
- {
- if (!select (latestAddedItem))
- parser.setError (Aborted,"Could not select latest added object ");
- }
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setFlag")
- {
- s=parser.parString(ok,0);
- selbi->activateStandardFlag(s);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setTaskSleep")
- {
- s=parser.parString(ok,0);
- returnValue=setTaskSleep (s);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setFrameIncludeChildren")
- {
- b=parser.parBool(ok,0);
- setFrameIncludeChildren(b);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setFrameType")
- {
- s=parser.parString(ok,0);
- setFrameType (s);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setFramePenColor")
- {
- QColor c=parser.parColor(ok,0);
- setFramePenColor (c);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setFrameBrushColor")
- {
- QColor c=parser.parColor(ok,0);
- setFrameBrushColor (c);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setFramePadding")
- {
- n=parser.parInt(ok,0);
- setFramePadding(n);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setFrameBorderWidth")
- {
- n=parser.parInt(ok,0);
- setFrameBorderWidth (n);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setHeadingPlainText")
- {
- s=parser.parString (ok,0);
- setHeadingPlainText (s); // FIXME-3 what about RT? Nothing implemented.
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setHideExport")
- {
- b=parser.parBool(ok,0);
- setHideExport (b);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setIncludeImagesHorizontally")
- {
- b=parser.parBool(ok,0);
- setIncludeImagesHor(b);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setIncludeImagesVertically")
- {
- b=parser.parBool(ok,0);
- if (ok) setIncludeImagesVer(b);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setHideLinkUnselected")
- {
- b=parser.parBool(ok,0);
- setHideLinkUnselected(b);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setMapAnimCurve")
- {
- n=parser.parInt(ok,0);
- if (n<0 || n>QEasingCurve::OutInBounce)
- parser.setError (Aborted,"Unknown link style");
- else
- {
- QEasingCurve c;
- c.setType ( (QEasingCurve::Type) n);
- setMapAnimCurve(c);
- }
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setMapAnimDuration")
- {
- n=parser.parInt(ok,0);
- setMapAnimDuration(n);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setMapAuthor")
- {
- s=parser.parString(ok,0);
- setAuthor (s);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setMapComment")
- {
- s=parser.parString(ok,0);
- if (ok) setComment(s);
- break;
- }
- if (com=="setMapTitle")
- {
- s=parser.parString(ok,0);
- if (ok) setTitle(s);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setMapBackgroundColor")
- {
- QColor c=parser.parColor (ok,0);
- setMapBackgroundColor (c);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setMapDefLinkColor")
- {
- QColor c=parser.parColor (ok,0);
- setMapDefLinkColor (c);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setMapLinkStyle")
- {
- s=parser.parString (ok,0);
- if (!setMapLinkStyle(s) )
- parser.setError (Aborted,"Unknown link style");
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setMapRotation")
- {
- x=parser.parDouble (ok,0);
- setMapRotationAngle(x);
- mapEditor->setAngleTarget(x);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setMapZoom")
- {
- x=parser.parDouble (ok,0);
- setMapZoomFactor(x);
- mapEditor->setZoomFactorTarget(x);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setNotePlainText")
- {
- s=parser.parString (ok,0);
- VymNote vn;
- vn.setPlainText(s);
- setNote (vn);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setScale")
- {
- x=parser.parDouble (ok,0);
- y=parser.parDouble (ok,1);
- setScale (x,y);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setSelectionColor")
- {
- QColor c=parser.parColor (ok,0);
- setSelectionColorInt (c);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setURL")
- {
- s=parser.parString (ok,0);
- setURL(s);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setVymLink")
- {
- s=parser.parString (ok,0);
- setVymLink(s);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setXLinkColor")
- {
- s=parser.parString (ok,0);
- setXLinkColor(s);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setXLinkLineStyle")
- {
- s=parser.parString (ok,0);
- setXLinkLineStyle(s);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setXLinkStyleBegin")
- {
- s=parser.parString (ok,0);
- setXLinkStyleBegin(s);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setXLinkStyleEnd")
- {
- s=parser.parString (ok,0);
- setXLinkStyleEnd(s);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="setXLinkWidth")
- {
- n=parser.parInt (ok,0);
- setXLinkWidth(n);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="sleep")
- {
- n=parser.parInt (ok,0);
- sleep (n);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="sortChildren")
- {
- b=false;
- if (parser.parCount()==1)
- b=parser.parBool(ok,0);
- sortChildren(b);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="toggleFlag")
- {
- s=parser.parString(ok,0);
- toggleStandardFlag (s);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="toggleFrameIncludeChildren")
- {
- toggleFrameIncludeChildren();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="toggleScroll")
- {
- toggleScroll();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="toggleTarget")
- {
- toggleTarget();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="toggleTask")
- {
- toggleTask();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="undo")
- {
- undo();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="unscroll")
- {
- if (!unscrollBranch (selbi))
- parser.setError (Aborted,"Could not unscroll branch");
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="unscrollChildren")
- {
- unscrollChildren ();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="unselectAll")
- {
- unselectAll();
- break;
- }
- /////////////////////////////////////////////////////////////////////
- if (com=="unsetFlag")
- {
- s=parser.parString(ok,0);
- selbi->deactivateStandardFlag(s);
- break;
- }
- /////////////////////////////////////////////////////////////////////
- //else must be an Unknown command
- parser.setError (Aborted,"Unknown command");
- break;
-
- } while(0); // End of do{}while(0); MS VS2013 nested if bug workaround
-
- } // end check set of parameters if
- // Any errors?
- if (parser.errorLevel()==NoError)
- {
- reposition();
- errorMsg.clear();
- noErr=true;
- }
- else
- {
- // TODO Error handling
- noErr=false;
- errorMsg=parser.errorMessage();
- returnValue=errorMsg;
- }
- return returnValue;
-}
-
-QVariant VymModel::execute (const QString &script)
-{
- parser.setScript (script);
- parser.execute ();
- QVariant r;
- bool noErr=true;
- QString errMsg;
- while (parser.next() && noErr)
- {
- r=parseAtom(parser.getAtom(),noErr,errMsg);
- if (!noErr)
- {
- if (!options.isOn("batch") && !testmode )
- QMessageBox::warning(0,tr("Warning"),tr("Script aborted:\n%1").arg(errMsg));
- qWarning()<< QString("VM::execute aborted: "+errMsg + "\n" + script);
- }
- }
- return r;
-}
-
-void VymModel::setExportMode (bool b)
-{
- // should be called before and after exports
- // depending on the settings
- if (b && settings.value("/export/useHideExport","true")=="true")
- setHideTmpMode (TreeItem::HideExport);
- else
- setHideTmpMode (TreeItem::HideNone);
-}
-
-QPointF VymModel::exportImage(QString fname, bool askName, QString format)
-{
- QPointF offset; // set later, when getting image from MapEditor
-
- if (fname=="")
- {
- if (!askName)
- {
- qWarning("VymModel::exportImage called without filename (and askName==false)");
- return offset;
- }
-
- fname=lastImageDir.absolutePath() + "/" + getMapName()+".png";
- format="PNG";
- }
-
- ExportBase ex;
- ex.setName( "Image" );
- ex.setModel( this );
- ex.setFilePath( fname );
- ex.setWindowTitle ( tr("Export map as image") );
- ex.addFilter( "PNG (*.png);;All (* *.*)" ); // imageIO.getFilters().join(";;")
- ex.setLastCommand( settings.localValue(filePath,"/export/last/command","").toString() );
-
- if (askName)
- {
- if (! ex.execDialog() ) return offset;
- fname = ex.getFilePath();
- lastImageDir=dirname(fname);
- }
-
- setExportMode (true);
-
- QImage img (mapEditor->getImage(offset));
- if (!img.save(fname, format.toLocal8Bit()))
- QMessageBox::critical (0,tr("Critical Error"),tr("Couldn't save QImage %1 in format %2").arg(fname).arg(format));
- setExportMode (false);
-
- ex.completeExport();
-
- return offset;
-}
-
-void VymModel::exportPDF (QString fname, bool askName)
-{
- if (fname == "")
- {
- if (!askName)
- {
- qWarning("VymModel::exportPDF called without filename (and askName==false)");
- return;
- }
-
- fname = lastExportDir.absolutePath() + "/" + getMapName()+".pdf";
- }
-
- ExportBase ex;
- ex.setName( "PDF" );
- ex.setModel( this );
- ex.setFilePath( fname );
- ex.setWindowTitle ( tr("Export map as PDF") );
- ex.addFilter( "PDF (*.pdf);;All (* *.*)" );
- ex.setLastCommand( settings.localValue(filePath,"/export/last/command","").toString() );
-
- if (askName)
- {
- if (! ex.execDialog() ) return;
- fname = ex.getFilePath();
- }
-
- setExportMode (true);
-
- // To PDF
- QPrinter printer(QPrinter::HighResolution);
- printer.setOutputFormat(QPrinter::PdfFormat);
- printer.setOutputFileName(fname);
- printer.setPageSize(QPrinter::A3);
-
- QRectF bbox=mapEditor->getTotalBBox();
- if (bbox.width()>bbox.height())
- // recommend landscape
- printer.setOrientation (QPrinter::Landscape);
- else
- // recommend portrait
- printer.setOrientation (QPrinter::Portrait);
-
- QPainter *pdfPainter = new QPainter(&printer);
- getScene()->render(pdfPainter);
- pdfPainter->end();
- delete pdfPainter;
-
- setExportMode (false);
-
- ex.completeExport();
-}
-
-QPointF VymModel::exportSVG (QString fname, bool askName)
-{
- QPointF offset; // FIXME-3 not needed?
-
- if (fname=="")
- {
- if (!askName)
- {
- qWarning("VymModel::exportSVG called without filename (and askName==false)");
- return offset;
- }
-
- fname=lastImageDir.absolutePath() + "/" + getMapName()+".png";
- }
-
- ExportBase ex;
- ex.setName( "SVG" );
- ex.setModel( this );
- ex.setFilePath( fname );
- ex.setWindowTitle ( tr("Export map as SVG") );
- ex.addFilter( "SVG (*.svg);;All (* *.*)" );
- ex.setLastCommand( settings.localValue(filePath,"/export/last/command","").toString() );
-
- if (askName)
- {
- if (! ex.execDialog() ) return offset;
- fname = ex.getFilePath();
- lastImageDir = dirname(fname);
- }
-
- setExportMode (true);
-
- QSvgGenerator generator;
- generator.setFileName(fname);
- QSize sceneSize = getScene()->sceneRect().size().toSize();
- generator.setSize(sceneSize);
- generator.setViewBox(QRect(0, 0, sceneSize.width(), sceneSize.height()));
- QPainter *svgPainter = new QPainter(&generator);
- getScene()->render(svgPainter);
- svgPainter->end();
- delete svgPainter;
-
- setExportMode (false);
- ex.completeExport();
-
- return offset;
-}
-
-void VymModel::exportXML (QString dpath, QString fpath, bool useDialog)
-{
- ExportBase ex;
- ex.setName( "XML" );
- ex.setModel( this );
- ex.setWindowTitle ( tr("Export map as XML") );
- ex.addFilter( "XML (*.xml);;All (* *.*)" );
- ex.setLastCommand( settings.localValue(filePath,"/export/last/command","").toString() );
-
- if (useDialog)
- {
- QFileDialog fd;
- fd.setWindowTitle (vymName+ " - " + tr("Export XML to directory"));
- fd.setFileMode (QFileDialog::DirectoryOnly);
- QStringList filters;
- filters << "XML data (*.xml)";
- fd.setNameFilters (filters);
- fd.setConfirmOverwrite (false);
- fd.setAcceptMode (QFileDialog::AcceptSave);
-
- QString fn;
- if (fd.exec() != QDialog::Accepted || fd.selectedFiles().isEmpty() ) return;
-
- dpath = fd.selectedFiles().first();
- //dpath = dpath.left(dpath.lastIndexOf("/"));
- fpath = dpath + "/" + mapName + ".xml";
-
- if (!reallyWriteDirectory(dpath) ) return;
- }
- ex.setFilePath( fpath );
-
- QString mname = basename(fpath);
-
- // Hide stuff during export, if settings want this
- setExportMode (true);
-
- // Create subdirectories
- makeSubDirs (dpath);
-
- // write image and calculate offset (Remember old mapSaved setting while exporting image)
- bool mchanged = mapChanged;
- bool munsaved = mapUnsaved;
-
- QPointF offset = exportImage (dpath + "/images/" + mname + ".png",false,"PNG");
-
- mapChanged = mchanged;
- mapUnsaved = munsaved;
-
- // write to directory //FIXME-3 check totalBBox here...
- QString saveFile=saveToDir (dpath , mname + "-", true, offset, NULL);
- QFile file;
-
- file.setFileName (fpath);
- if ( !file.open( QIODevice::WriteOnly ) )
- {
- // This should neverever happen
- QMessageBox::critical (
- 0,
- tr("Critical Export Error"),
- QString("VymModel::exportXML couldn't open %1").arg(file.fileName())
- );
- return;
- }
-
- // Write it finally, and write in UTF8, no matter what
- QTextStream ts( &file );
- ts.setCodec("UTF-8");
- ts << saveFile;
- file.close();
-
- setExportMode (false);
-
- ex.completeExport( QString("\"%1\",\"%2\"").arg(dpath).arg(fpath) );
-}
-
-void VymModel::exportAO (QString fname,bool askName)
-{
- ExportAO ex;
- ex.setModel (this);
- ex.setLastCommand( settings.localValue(filePath,"/export/last/command","").toString() );
-
- if (fname=="")
- ex.setFilePath (mapName+".txt");
- else
- ex.setFilePath (fname);
-
- if (askName)
- {
- ex.setDirPath (lastExportDir.absolutePath());
- ex.execDialog();
- }
- if (!ex.canceled())
- {
- setExportMode(true);
- ex.doExport();
- setExportMode(false);
- }
-}
-
-void VymModel::exportASCII(bool listTasks, const QString &fname, bool askName)
-{
- ExportASCII ex;
- ex.setModel (this);
- ex.setListTasks(listTasks);
- ex.setLastCommand( settings.localValue(filePath,"/export/last/command","").toString() );
-
- if (fname=="")
- ex.setFilePath (mapName+".txt");
- else
- ex.setFilePath (fname);
-
- if (askName)
- {
- ex.setDirPath (lastExportDir.absolutePath());
- ex.execDialog() ;
- }
-
- if (!ex.canceled())
- {
- setExportMode(true);
- ex.doExport();
- setExportMode(false);
- }
-}
-
-void VymModel::exportCSV(const QString &fname, bool askName)
-{
- ExportCSV ex;
- ex.setModel (this);
- ex.setLastCommand( settings.localValue(filePath,"/export/last/command","").toString() );
-
- if (fname=="")
- ex.setFilePath (mapName+".csv");
- else
- ex.setFilePath (fname);
-
- if (askName)
- {
- ex.addFilter ("CSV (*.csb);;All (* *.*)");
- ex.setDirPath (lastExportDir.absolutePath());
- ex.setWindowTitle(vymName+ " -" +tr("Export as csv")+" "+tr("(still experimental)"));
- ex.execDialog() ;
- }
-
- if (!ex.canceled())
- {
- setExportMode(true);
- ex.doExport();
- setExportMode(false);
- }
-}
-
-void VymModel::exportHTML (const QString &dpath, const QString &fpath,bool useDialog)
-{
- ExportHTML ex (this);
- ex.setLastCommand( settings.localValue(filePath,"/export/last/command","").toString() );
-
- if (!dpath.isEmpty()) ex.setDirPath (dpath);
- if (!fpath.isEmpty()) ex.setFilePath (fpath);
- setExportMode(true);
- ex.doExport(useDialog);
- setExportMode(false);
-}
-
-void VymModel::exportImpress(const QString &fn, const QString &cf)
-{
- ExportOO ex;
- ex.setFilePath (fn);
- ex.setModel (this);
- ex.setLastCommand( settings.localValue(filePath,"/export/last/command","").toString() );
-
- if (ex.setConfigFile(cf))
- {
- QString lastCommand = settings.localValue(filePath,"/export/last/command","").toString();
-
- setExportMode (true);
- ex.exportPresentation();
- setExportMode (false);
-
- QString command = settings.localValue(filePath,"/export/last/command","").toString();
- if (lastCommand != command) setChanged();
- }
-}
-
-bool VymModel::exportLastAvailable(QString &description, QString &command, QString &path, QString &configFile)
-{
- command = settings.localValue(filePath,"/export/last/command","").toString();
- description = settings.localValue(filePath,"/export/last/description","").toString();
- path = settings.localValue(filePath,"/export/last/exportPath","").toString();
- configFile = settings.localValue(filePath,"/export/last/configFile","").toString();
- if (!command.isEmpty() && command.startsWith("export"))
- return true;
- else
- return false;
-}
-
-void VymModel::exportLast()
-{
- QString desc, command, path, configFile; //FIXME-3 better integrate configFile into command
- if (exportLastAvailable(desc, command, path, configFile) )
- {
- execute (command);
- /*
- if (!configFile.isEmpty() && command=="exportImpress")
- execute (QString ("%1 (\"%2\",\"%3\")").arg(command).arg(path).arg(configFile) );
- else
- execute (QString ("%1 (\"%2\")").arg(command).arg(path) );
- */
- }
-}
-
-void VymModel::exportLaTeX (const QString &fname,bool askName)
-{
- ExportLaTeX ex;
- ex.setModel (this);
- ex.setLastCommand( settings.localValue(filePath,"/export/last/command","").toString() );
-
- if (fname=="")
- ex.setFilePath (mapName+".tex");
- else
- ex.setFilePath (fname);
-
- if (askName) ex.execDialog() ;
- if (!ex.canceled())
- {
- setExportMode(true);
- ex.doExport();
- setExportMode(false);
- }
-}
-
-void VymModel::exportOrgMode (const QString &fname, bool askName)
-{
- ExportOrgMode ex;
- ex.setModel (this);
- ex.setLastCommand( settings.localValue(filePath,"/export/last/command","").toString() );
-
- if (fname=="")
- ex.setFilePath (mapName+".org");
- else
- ex.setFilePath (fname);
-
- if (askName)
- {
- ex.setDirPath (lastExportDir.absolutePath());
- ex.execDialog();
- }
-
- if (!ex.canceled())
- {
- setExportMode(true);
- ex.doExport();
- setExportMode(false);
- }
-}
-
-
-//////////////////////////////////////////////
-// View related
-//////////////////////////////////////////////
-
-void VymModel::registerEditor(QWidget *me)
-{
- mapEditor=(MapEditor*)me;
-}
-
-void VymModel::unregisterEditor(QWidget *)
-{
- mapEditor=NULL;
-}
-
-void VymModel::setMapZoomFactor (const double &d)
-{
- zoomFactor=d;
-}
-
-void VymModel::setMapRotationAngle(const double &d)
-{
- rotationAngle=d;
-}
-
-void VymModel::setMapAnimDuration(const int &d)
-{
- animDuration=d;
-}
-
-void VymModel::setMapAnimCurve(const QEasingCurve &c)
-{
- animCurve=c;
-}
-
-void VymModel::setContextPos(QPointF p)
-{
- contextPos=p;
- hasContextPos=true;
-}
-
-void VymModel::unsetContextPos()
-{
- contextPos=QPointF();
- hasContextPos=false;
-}
-
-void VymModel::updateNoteFlag()
-{
- TreeItem *selti=getSelectedItem();
- if (selti)
- {
- if (!mapChanged)
- {
- setChanged();
- updateActions();
- }
-
- if (noteEditor->isEmpty())
- selti->clearNote();
- else
- selti->setNote(noteEditor->getNote());
- emitDataChanged(selti);
- reposition();
- }
-}
-
-void VymModel::reposition() //FIXME-4 VM should have no need to reposition, but the views...
-{
- if (blockReposition) return;
-
- BranchObj *bo;
- for (int i=0;i<rootItem->branchCount(); i++)
- {
- bo=rootItem->getBranchObjNum(i);
- if (bo)
- bo->reposition(); // for positioning heading
- else
- qDebug()<<"VM::reposition bo=0";
- }
- mapEditor->getTotalBBox();
- emitSelectionChanged();
-}
-
-
-bool VymModel::setMapLinkStyle (const QString & s)
-{
- QString snow;
- switch (linkstyle)
- {
- case LinkableMapObj::Line :
- snow="StyleLine";
- break;
- case LinkableMapObj::Parabel:
- snow="StyleParabel";
- break;
- case LinkableMapObj::PolyLine:
- snow="StylePolyLine";
- break;
- case LinkableMapObj::PolyParabel:
- snow="StylePolyParabel";
- break;
- default:
- return false;
- break;
- }
-
- saveState (
- QString("setMapLinkStyle (\"%1\")").arg(s),
- QString("setMapLinkStyle (\"%1\")").arg(snow),
- QString("Set map link style (\"%1\")").arg(s)
- );
-
- if (s=="StyleLine")
- linkstyle=LinkableMapObj::Line;
- else if (s=="StyleParabel")
- linkstyle=LinkableMapObj::Parabel;
- else if (s=="StylePolyLine")
- linkstyle=LinkableMapObj::PolyLine;
- else if (s=="StylePolyParabel")
- linkstyle=LinkableMapObj::PolyParabel;
- else
- linkstyle=LinkableMapObj::UndefinedStyle;
-
- BranchItem *cur=NULL;
- BranchItem *prev=NULL;
- BranchObj *bo;
- nextBranch (cur,prev);
- while (cur)
- {
- bo=(BranchObj*)(cur->getLMO() );
- bo->setLinkStyle(bo->getDefLinkStyle(cur->parent() )); //FIXME-4 better emit dataCHanged and leave the changes to View
- nextBranch(cur,prev);
- }
- reposition();
- return true;
-}
-
-LinkableMapObj::Style VymModel::getMapLinkStyle ()
-{
- return linkstyle;
-}
-
-uint VymModel::getModelID()
-{
- return modelID;
-}
-
-void VymModel::setView (VymView *vv)
-{
- vymView=vv;
-}
-
-void VymModel::setMapDefLinkColor(QColor col)
-{
- if ( !col.isValid() ) return;
- saveState (
- QString("setMapDefLinkColor (\"%1\")").arg(getMapDefLinkColor().name()),
- QString("setMapDefLinkColor (\"%1\")").arg(col.name()),
- QString("Set map link color to %1").arg(col.name())
- );
-
- defLinkColor=col;
- BranchItem *cur=NULL;
- BranchItem *prev=NULL;
- BranchObj *bo;
- nextBranch(cur,prev);
- while (cur)
- {
- bo=(BranchObj*)(cur->getLMO() );
- bo->setLinkColor();
- nextBranch(cur,prev);
- }
- updateActions();
-}
-
-void VymModel::setMapLinkColorHintInt()
-{
- // called from setMapLinkColorHint(lch) or at end of parse
- BranchItem *cur=NULL;
- BranchItem *prev=NULL;
- BranchObj *bo;
- nextBranch(cur,prev);
- while (cur)
- {
- bo=(BranchObj*)(cur->getLMO() );
- bo->setLinkColor();
- nextBranch(cur,prev);
- }
-}
-
-void VymModel::setMapLinkColorHint(LinkableMapObj::ColorHint lch)
-{
- linkcolorhint=lch;
- setMapLinkColorHintInt();
-}
-
-void VymModel::toggleMapLinkColorHint()
-{
- if (linkcolorhint==LinkableMapObj::HeadingColor)
- linkcolorhint=LinkableMapObj::DefaultColor;
- else
- linkcolorhint=LinkableMapObj::HeadingColor;
- BranchItem *cur=NULL;
- BranchItem *prev=NULL;
- BranchObj *bo;
- nextBranch(cur,prev);
- while (cur)
- {
- bo=(BranchObj*)(cur->getLMO() );
- bo->setLinkColor();
- nextBranch(cur,prev);
- }
-}
-
-void VymModel::selectMapBackgroundImage () // FIXME-3 for using background image: view.setCacheMode(QGraphicsView::CacheBackground); Also this belongs into ME
-{
- QStringList filters;
- filters<< tr("Images") + " (*.png *.bmp *.xbm *.jpg *.png *.xpm *.gif *.pnm)";
- QFileDialog fd;
- fd.setFileMode (QFileDialog::ExistingFile);
- fd.setWindowTitle(vymName + " - " + tr("Load background image"));
- fd.setDirectory (lastImageDir);
- fd.setAcceptMode (QFileDialog::AcceptOpen);
-
- if ( fd.exec() == QDialog::Accepted &&!fd.selectedFiles().isEmpty())
- {
- // TODO selectMapBackgroundImg in QT4 use: lastImageDir=fd.directory();
- lastImageDir=QDir ( fd.directory().path() );
- setMapBackgroundImage ( fd.selectedFiles().first() );
- }
-}
-
-void VymModel::setMapBackgroundImage (const QString &fn) //FIXME-3 missing savestate, move to ME
-{
- /*
- QColor oldcol=mapEditor->getScene()->backgroundBrush().color();
- saveState(
- selection,
- QString ("setMapBackgroundImage (%1)").arg(oldcol.name()),
- selection,
- QString ("setMapBackgroundImage (%1)").arg(col.name()),
- QString("Set background color of map to %1").arg(col.name()));
- */
- QBrush brush;
- brush.setTextureImage (QImage (fn));
- mapEditor->getScene()->setBackgroundBrush(brush);
-}
-
-void VymModel::selectMapBackgroundColor()
-{
- QColor col = QColorDialog::getColor( mapEditor->getScene()->backgroundBrush().color(), NULL);
- if ( !col.isValid() ) return;
- setMapBackgroundColor( col );
-}
-
-
-void VymModel::setMapBackgroundColor(QColor col) // FIXME-4 move to ME
-{
- QColor oldcol=mapEditor->getScene()->backgroundBrush().color();
- saveState(
- QString ("setMapBackgroundColor (\"%1\")").arg(oldcol.name()),
- QString ("setMapBackgroundColor (\"%1\")").arg(col.name()),
- QString("Set background color of map to %1").arg(col.name()));
- mapEditor->getScene()->setBackgroundBrush(col);
-}
-
-QColor VymModel::getMapBackgroundColor() // FIXME-4 move to ME
-{
- return mapEditor->getScene()->backgroundBrush().color();
-}
-
-QFont VymModel::getMapDefaultFont ()
-{
- return defaultFont;
-}
-
-void VymModel::setMapDefaultFont (const QFont &f)
-{
- defaultFont=f;
-}
-
-LinkableMapObj::ColorHint VymModel::getMapLinkColorHint() // FIXME-4 move to ME
-{
- return linkcolorhint;
-}
-
-QColor VymModel::getMapDefLinkColor() // FIXME-4 move to ME
-{
- return defLinkColor;
-}
-
-void VymModel::setMapDefXLinkPen (const QPen &p) // FIXME-4 move to ME
-{
- defXLinkPen=p;
-}
-
-QPen VymModel::getMapDefXLinkPen() // FIXME-4 move to ME
-{
- return defXLinkPen;
-}
-
-void VymModel::setMapDefXLinkStyleBegin( const QString &s)
-{
- defXLinkStyleBegin = s;
-}
-
-QString VymModel::getMapDefXLinkStyleBegin()
-{
- return defXLinkStyleBegin;
-}
-
-void VymModel::setMapDefXLinkStyleEnd( const QString &s)
-{
- defXLinkStyleEnd = s;
-}
-
-QString VymModel::getMapDefXLinkStyleEnd()
-{
- return defXLinkStyleEnd;
-}
-
-void VymModel::move(const double &x, const double &y)
-{
- MapItem *seli = (MapItem*)getSelectedItem();
- if (seli && (seli->isBranchLikeType() || seli->getType()==TreeItem::Image))
- {
- LinkableMapObj *lmo=seli->getLMO();
- if (lmo)
- {
- QPointF ap(lmo->getAbsPos());
- QPointF to(x, y);
- if (ap != to)
- {
- QString ps=qpointFToString(ap);
- QString s=getSelectString(seli);
- saveState(
- s, "move "+ps,
- s, "move "+qpointFToString(to),
- QString("Move %1 to %2").arg(getObjectName(seli)).arg(ps));
- lmo->move(x,y);
- reposition();
- emitSelectionChanged();
- }
- }
- }
-}
-
-void VymModel::moveRel (const double &x, const double &y)
-{
- MapItem *seli = (MapItem*)getSelectedItem();
- if (seli && (seli->isBranchLikeType() || seli->getType()==TreeItem::Image))
- {
- LinkableMapObj *lmo=seli->getLMO();
- if (lmo)
- {
- QPointF rp(lmo->getRelPos());
- QPointF to(x, y);
- if (rp != to)
- {
- QString ps=qpointFToString (lmo->getRelPos());
- QString s=getSelectString(seli);
- saveState(
- s, "moveRel "+ps,
- s, "moveRel "+qpointFToString(to),
- QString("Move %1 to relative position %2").arg(getObjectName(seli)).arg(ps));
- ((OrnamentedObj*)lmo)->move2RelPos (x,y);
- reposition();
- lmo->updateLinkGeometry();
- emitSelectionChanged();
- }
- }
- }
-}
-
-
-void VymModel::animate()
-{
- animationTimer->stop();
- BranchObj *bo;
- int i=0;
- while (i<animObjList.size() )
- {
- bo=(BranchObj*)animObjList.at(i);
- if (!bo->animate())
- {
- if (i>=0)
- {
- animObjList.removeAt(i);
- i--;
- }
- }
- bo->reposition();
- i++;
- }
- emitSelectionChanged();
-
- if (!animObjList.isEmpty()) animationTimer->start(animationInterval);
-}
-
-
-void VymModel::startAnimation(BranchObj *bo, const QPointF &v)
-{
- if (!bo) return;
-
- if (bo->getUseRelPos())
- startAnimation (bo,bo->getRelPos(),bo->getRelPos()+v);
- else
- startAnimation (bo,bo->getAbsPos(),bo->getAbsPos()+v);
-}
-
-void VymModel::startAnimation(BranchObj *bo, const QPointF &start, const QPointF &dest)
-{
- if (start==dest) return;
- if (bo && bo->getTreeItem()->depth()>=0)
- {
- AnimPoint ap;
- ap.setStart (start);
- ap.setDest (dest);
- ap.setTicks (animationTicks);
- ap.setAnimated (true);
- bo->setAnimation (ap);
- if (!animObjList.contains(bo))
- animObjList.append( bo );
- animationTimer->setSingleShot (true);
- animationTimer->start(animationInterval);
- }
-}
-
-void VymModel::stopAnimation (MapObj *mo)
-{
- int i=animObjList.indexOf(mo);
- if (i>=0)
- animObjList.removeAt (i);
-}
-
-void VymModel::stopAllAnimation ()
-{
- BranchObj *bo;
- int i=0;
- while (i<animObjList.size() )
- {
- bo=(BranchObj*)animObjList.at(i);
- bo->stopAnimation();
- bo->requestReposition();
- i++;
- }
- reposition();
-}
-
-void VymModel::sendSelection()
-{
- if (netstate!=Server) return;
- sendData (QString("select (\"%1\")").arg(getSelectString()) );
-}
-
-void VymModel::newServer()
-{
- port=54321;
- sendCounter=0;
- tcpServer = new QTcpServer(this);
- if (!tcpServer->listen(QHostAddress::Any,port)) {
- QMessageBox::critical(NULL, "vym server",
- QString("Unable to start the server: %1.").arg(tcpServer->errorString()));
- //FIXME-3 needed? we are no widget any longer... close();
- return;
- }
- connect(tcpServer, SIGNAL(newConnection()), this, SLOT(newClient()));
- netstate=Server;
- qDebug()<<"Server is running on port "<<tcpServer->serverPort();
-}
-
-void VymModel::connectToServer()
-{
- port=54321;
- server="salam.suse.de";
- server="localhost";
- clientSocket = new QTcpSocket (this);
- clientSocket->abort();
- clientSocket->connectToHost(server ,port);
- connect(clientSocket, SIGNAL(readyRead()), this, SLOT(readData()));
- connect(clientSocket, SIGNAL(error(QAbstractSocket::SocketError)),
- this, SLOT(displayNetworkError(QAbstractSocket::SocketError)));
- netstate=Client;
- qDebug()<<"connected to "<<qPrintable (server)<<" port "<<port;
-
-
-}
-
-void VymModel::newClient()
-{
- QTcpSocket *newClient = tcpServer->nextPendingConnection();
- connect(newClient, SIGNAL(disconnected()),
- newClient, SLOT(deleteLater()));
-
- qDebug() <<"ME::newClient at "<<qPrintable( newClient->peerAddress().toString() );
-
- clientList.append (newClient);
-}
-
-
-void VymModel::sendData(const QString &s)
-{
- if (clientList.size()==0) return;
-
- // Create bytearray to send
- QByteArray block;
- QDataStream out(&block, QIODevice::WriteOnly);
- out.setVersion(QDataStream::Qt_4_0);
-
- // Reserve some space for blocksize
- out << (quint16)0;
-
- // Write sendCounter
- out << sendCounter++;
-
- // Write data
- out << s;
-
- // Go back and write blocksize so far
- out.device()->seek(0);
- quint16 bs=(quint16)(block.size() - 2*sizeof(quint16));
- out << bs;
-
- if (debug)
- qDebug() << "ME::sendData bs="<<bs<<" counter="<<sendCounter<<" s="<<qPrintable(s);
-
- for (int i=0; i<clientList.size(); ++i)
- {
- //qDebug() << "Sending \""<<qPrintable (s)<<"\" to "<<qPrintable (clientList.at(i)->peerAddress().toString());
- clientList.at(i)->write (block);
- }
-}
-
-void VymModel::readData ()
-{
- while (clientSocket->bytesAvailable() >=(int)sizeof(quint16) )
- {
- if (debug)
- qDebug() <<"readData bytesAvail="<<clientSocket->bytesAvailable();
- quint16 recCounter;
- quint16 blockSize;
-
- QDataStream in(clientSocket);
- in.setVersion(QDataStream::Qt_4_0);
-
- in >> blockSize;
- in >> recCounter;
-
- QString t;
- in >>t;
- if (debug)
- qDebug() << "VymModel::readData command="<<qPrintable (t);
- bool noErr;
- QString errMsg;
- parseAtom (t,noErr,errMsg);
-
- }
- return;
-}
-
-void VymModel::displayNetworkError(QAbstractSocket::SocketError socketError)
-{
- switch (socketError) {
- case QAbstractSocket::RemoteHostClosedError:
- break;
- case QAbstractSocket::HostNotFoundError:
- QMessageBox::information(NULL, vymName +" Network client",
- "The host was not found. Please check the "
- "host name and port settings.");
- break;
- case QAbstractSocket::ConnectionRefusedError:
- QMessageBox::information(NULL, vymName + " Network client",
- "The connection was refused by the peer. "
- "Make sure the fortune server is running, "
- "and check that the host name and port "
- "settings are correct.");
- break;
- default:
- QMessageBox::information(NULL, vymName + " Network client",
- QString("The following error occurred: %1.")
- .arg(clientSocket->errorString()));
- }
-}
-
-void VymModel::downloadImage (const QUrl &url, BranchItem *bi)
-{
- if (!bi) bi=getSelectedBranch();
- if (!bi)
- {
- qWarning ("VM::download bi==NULL");
- return;
- }
-
- // FIXME-3 download img to tmpfile and delete after running script in mainWindow
- QString script;
- script += QString("selectID(\"%1\");").arg(bi->getUuid().toString());
- script += QString("loadImage(\"$TMPFILE\");");
-
- DownloadAgent *agent = new DownloadAgent(url);
- agent->setFinishedAction (this, script);
- connect (agent, SIGNAL (downloadFinished()), mainWindow, SLOT (downloadFinished()));
- QTimer::singleShot(0, agent, SLOT(execute()));
-}
-
-void VymModel::selectMapSelectionColor()
-{
- QColor col = QColorDialog::getColor( defLinkColor, NULL);
- setSelectionColor (col);
-}
-
-void VymModel::setSelectionColorInt (QColor col)
-{
- if ( !col.isValid() ) return;
- saveState (
- QString("setSelectionColor (\"%1\")").arg(mapEditor->getSelectionColor().name()),
- QString("setSelectionColor (\"%1\")").arg(col.name()),
- QString("Set color of selection box to %1").arg(col.name())
- );
-
- mapEditor->setSelectionColor (col);
-}
-
-void VymModel::emitSelectionChanged(const QItemSelection &newsel)
-{
- emit (selectionChanged(newsel,newsel)); // needed e.g. to update geometry in editor
- sendSelection();
-}
-
-void VymModel::emitSelectionChanged()
-{
- QItemSelection newsel=selModel->selection();
- emitSelectionChanged (newsel);
-}
-
-void VymModel::setSelectionColor(QColor col)
-{
- if ( !col.isValid() ) return;
- setSelectionColorInt (col);
-}
-
-QColor VymModel::getSelectionColor()
-{
- return mapEditor->getSelectionColor();
-}
-
-void VymModel::setHideTmpMode (TreeItem::HideTmpMode mode)
-{
- hidemode=mode;
- for (int i=0;i<rootItem->branchCount();i++)
- rootItem->getBranchNum(i)->setHideTmp (mode);
- reposition();
- if (mode==TreeItem::HideExport)
- unselectAll();
- else
- reselect();
-
- qApp->processEvents();
-}
-
-//////////////////////////////////////////////
-// Selection related
-//////////////////////////////////////////////
-
-void VymModel::updateSelection(QItemSelection newsel,QItemSelection dsel)
-{
- QModelIndex ix;
- MapItem *mi;
- BranchItem *bi;
- bool do_reposition=false;
- foreach (ix, dsel.indexes() )
- {
- mi = static_cast<MapItem*>(ix.internalPointer());
- if (mi->isBranchLikeType() )
- do_reposition=do_reposition || ((BranchItem*)mi)->resetTmpUnscroll();
- if (mi->getType()==TreeItem::XLink)
- {
- Link *li=((XLinkItem*)mi)->getLink();
- XLinkObj *xlo=li->getXLinkObj();
- if (xlo)
- xlo->setSelection (XLinkObj::Unselected);
-
- do_reposition=do_reposition || li->getBeginBranch()->resetTmpUnscroll();
- do_reposition=do_reposition || li->getEndBranch()->resetTmpUnscroll();
- }
- }
-
- foreach (ix, newsel.indexes() )
- {
- mi = static_cast<MapItem*>(ix.internalPointer());
- if (mi->isBranchLikeType() )
- {
- bi=(BranchItem*)mi;
- if (bi->hasScrolledParent() )
- {
- bi->tmpUnscroll();
- do_reposition=true;
- }
- }
- if (mi->getType()==TreeItem::XLink)
- {
- ((XLinkItem*)mi)->setSelection();
-
- // begin/end branches need to be tmp unscrolled
- Link *li=((XLinkItem*)mi)->getLink();
- bi=li->getBeginBranch();
- if (bi->hasScrolledParent() )
- {
- bi->tmpUnscroll();
- do_reposition=true;
- }
- bi=li->getEndBranch();
- if (bi->hasScrolledParent() )
- {
- bi->tmpUnscroll();
- do_reposition=true;
- }
- }
- }
- if ( do_reposition ) reposition();
-}
-
-void VymModel::setSelectionModel (QItemSelectionModel *sm)
-{
- selModel=sm;
-}
-
-QItemSelectionModel* VymModel::getSelectionModel()
-{
- return selModel;
-}
-
-void VymModel::setSelectionBlocked (bool b)
-{
- selectionBlocked=b;
-}
-
-bool VymModel::isSelectionBlocked()
-{
- return selectionBlocked;
-}
-
-bool VymModel::select (const QString &s)
-{
- if (s.isEmpty()) return false;
- TreeItem *ti=findBySelectString(s);
- if (ti) return select (index(ti));
- return false;
-}
-
-bool VymModel::selectID (const QString &s)
-{
- if (s.isEmpty()) return false;
- TreeItem *ti=findUuid(QUuid(s));
- if (ti) return select (index(ti));
- return false;
-}
-
-bool VymModel::select (LinkableMapObj *lmo)
-{
- QItemSelection oldsel=selModel->selection();
-
- if (lmo)
- return select (lmo->getTreeItem() );
- else
- return false;
-}
-
-bool VymModel::selectToggle (TreeItem *ti)
-{
- if (ti)
- {
- selModel->select ( index(ti), QItemSelectionModel::Toggle);
- //appendSelection(); // FIXME-4 selection history not implemented yet for multiselections
- return true;
- }
- return false;
-}
-
-bool VymModel::select (TreeItem *ti)
-{
- if (ti)
- return select (index(ti));
- else
- return false;
-}
-
-bool VymModel::select (const QModelIndex &index)
-{
- if (index.isValid() )
- {
- TreeItem *ti=getItem (index);
- if (ti->isBranchLikeType() )
- ((BranchItem*)ti)->tmpUnscroll();
- reposition();
- selModel->select (index,QItemSelectionModel::ClearAndSelect );
- appendSelection();
- return true;
- }
- return false;
-}
-
-void VymModel::unselectAll ()
-{
- unselect (selModel->selection() );
-}
-
-void VymModel::unselect(QItemSelection desel)
-{
- if (!desel.isEmpty())
- {
- lastSelectString=getSelectString();
- selModel->clearSelection();
- }
-}
-
-bool VymModel::reselect()
-{
- bool b=select (lastSelectString);
- return b;
-}
-
-bool VymModel::canSelectPrevious()
-{
- if (currentSelection>0)
- return true;
- else
- return false;
-}
-
-bool VymModel::selectPrevious()
-{
- keepSelectionHistory=true;
- bool result=false;
- while (currentSelection>0)
- {
- currentSelection--;
- TreeItem *ti=findID (selectionHistory.at(currentSelection));
- if (ti)
- {
- result=select (ti);
- break;
- } else
- selectionHistory.removeAt (currentSelection);
- }
- keepSelectionHistory=false;
- return result;
-}
-
-bool VymModel::canSelectNext()
-{
- if (currentSelection < selectionHistory.count()-1 )
- return true;
- else
- return false;
-}
-
-bool VymModel::selectNext()
-{
- keepSelectionHistory=true;
- bool result=false;
- while (currentSelection<selectionHistory.count()-1)
- {
- currentSelection++;
- TreeItem *ti=findID (selectionHistory.at(currentSelection));
- if (ti)
- {
- result=select (ti);
- break;
- } else
- selectionHistory.removeAt (currentSelection);
- }
- keepSelectionHistory=false;
- return result;
-}
-
-void VymModel::resetSelectionHistory()
-{
- selectionHistory.clear();
- currentSelection=-1;
- keepSelectionHistory=false;
- appendSelection();
-}
-
-void VymModel::appendSelection() // FIXME-4 history unable to cope with multiple selections
-{
- uint id=0;
- TreeItem *ti=getSelectedItem();
- if (ti && !keepSelectionHistory)
- {
- if (ti->isBranchLikeType())
- ((BranchItem*)ti)->setLastSelectedBranch();
- id=ti->getID();
- selectionHistory.append (id);
- currentSelection=selectionHistory.count()-1;
- updateActions();
- }
-}
-
-void VymModel::emitShowSelection()
-{
- if (!blockReposition) emit (showSelection() );
-}
-
-void VymModel::emitNoteChanged (TreeItem *ti)
-{
- QModelIndex ix=index(ti);
- emit (noteChanged (ix) );
-}
-
-void VymModel::emitDataChanged (TreeItem *ti)
-{
- QModelIndex ix=index(ti);
- emit ( dataChanged (ix,ix) );
- if (!blockReposition)
- {
- if ( ti->isBranchLikeType() && ((BranchItem*)ti)->getTask() )
- {
- taskModel->emitDataChanged ( ((BranchItem*)ti)->getTask() );
- taskModel->recalcPriorities();
- }
- }
-}
-
-void VymModel::emitUpdateQueries ()
-{
- // Used to tell MainWindow to update query results
- if (blockReposition) return;
- emit (updateQueries (this) );
-}
-void VymModel::emitUpdateLayout()
-{
- if (settings.value("/mainwindow/autoLayout/use","true")=="true")
- emit (updateLayout());
-}
-
-bool VymModel::selectFirstBranch()
-{
- TreeItem *ti=getSelectedBranch();
- if (ti)
- {
- TreeItem *par=ti->parent();
- if (par)
- {
- TreeItem *ti2=par->getFirstBranch();
- if (ti2) return select(ti2);
- }
- }
- return false;
-}
-
-bool VymModel::selectLastBranch()
-{
- TreeItem *ti=getSelectedBranch();
- if (ti)
- {
- TreeItem *par=ti->parent();
- if (par)
- {
- TreeItem *ti2=par->getLastBranch();
- if (ti2) return select(ti2);
- }
- }
- return false;
-}
-
-bool VymModel::selectLastSelectedBranch()
-{
- BranchItem *bi=getSelectedBranch();
- if (bi)
- {
- bi=bi->getLastSelectedBranch();
- if (bi) return select (bi);
- }
- return false;
-}
-
-bool VymModel::selectLastImage()
-{
- TreeItem *ti=getSelectedBranch();
- if (ti)
- {
- TreeItem *par=ti->parent();
- if (par)
- {
- TreeItem *ti2=par->getLastImage();
- if (ti2) return select(ti2);
- }
- }
- return false;
-}
-
-bool VymModel::selectParent()
-{
- TreeItem *ti=getSelectedItem();
- TreeItem *par;
- if (ti)
- {
- par=ti->parent();
- if (par)
- return select(par);
- }
- return false;
-}
-
-TreeItem::Type VymModel::selectionType()
-{
- TreeItem *ti = getSelectedItem();
- if (ti)
- return ti->getType();
- else
- return TreeItem::Undefined;
-}
-
-LinkableMapObj* VymModel::getSelectedLMO()
-{
- QModelIndexList list=selModel->selectedIndexes();
- if (list.count()==1 )
- {
- TreeItem *ti = getItem (list.first() );
- TreeItem::Type type=ti->getType();
- if (type ==TreeItem::Branch || type==TreeItem::MapCenter || type==TreeItem::Image)
- return ((MapItem*)ti)->getLMO();
- }
- return NULL;
-}
-
-BranchObj* VymModel::getSelectedBranchObj() // convenience function
-{
- TreeItem *ti = getSelectedBranch();
- if (ti)
- return (BranchObj*)( ((MapItem*)ti)->getLMO());
- else
- return NULL;
-}
-
-BranchItem* VymModel::getSelectedBranch()
-{
- TreeItem *ti=getSelectedItem();
- if (ti)
- {
- TreeItem::Type type=ti->getType();
- if (type ==TreeItem::Branch || type==TreeItem::MapCenter)
- return (BranchItem*)ti;
- }
- return NULL;
-}
-
-QList <BranchItem*> VymModel::getSelectedBranches()
-{
- QList <BranchItem*> bis;
- foreach (TreeItem *ti,getSelectedItems() )
- {
- TreeItem::Type type=ti->getType();
- if (type ==TreeItem::Branch || type==TreeItem::MapCenter)
- bis.append ( (BranchItem*)ti );
- }
- return bis;
-}
-
-ImageItem* VymModel::getSelectedImage()
-{
- TreeItem *ti=getSelectedItem();
- if (ti && ti->getType()==TreeItem::Image)
- return (ImageItem*)ti;
- else
- return NULL;
-}
-
-Task* VymModel::getSelectedTask()
-{
- BranchItem *selbi=getSelectedBranch();
- if (selbi)
- return selbi->getTask();
- else
- return NULL;
-}
-
-Link* VymModel::getSelectedXLink()
-{
- XLinkItem *xli=getSelectedXLinkItem();
- if (xli) return xli->getLink();
- return NULL;
-}
-
-XLinkItem* VymModel::getSelectedXLinkItem()
-{
- TreeItem *ti=getSelectedItem();
- if (ti && ti->getType()==TreeItem::XLink)
- return (XLinkItem*)ti;
- else
- return NULL;
-}
-
-AttributeItem* VymModel::getSelectedAttribute()
-{
- TreeItem *ti=getSelectedItem();
- if (ti && ti->getType()==TreeItem::Attribute)
- return (AttributeItem*)ti;
- else
- return NULL;
-}
-
-TreeItem* VymModel::getSelectedItem()
-{
- if (!selModel) return NULL;
- QModelIndexList list=selModel->selectedIndexes();
- if (list.count()==1 )
- return getItem (list.first() );
- else
- return NULL;
-}
-
-QList <TreeItem*> VymModel::getSelectedItems()
-{
- QList <TreeItem*> l;
- if (!selModel) return l;
- QModelIndexList list=selModel->selectedIndexes();
- foreach (QModelIndex ix,list)
- l.append (getItem (ix) );
- return l;
-}
-
-QModelIndex VymModel::getSelectedIndex()
-{
- QModelIndexList list=selModel->selectedIndexes();
- if (list.count()==1 )
- return list.first();
- else
- return QModelIndex();
-}
-
-QList <uint> VymModel::getSelectedIDs()
-{
- QList <uint> uids;
- foreach (TreeItem* ti,getSelectedItems() )
- uids.append (ti->getID() );
- return uids;
-}
-
-bool VymModel::isSelected(TreeItem *ti)
-{
- return getSelectedItems().contains (ti);
-}
-
-QString VymModel::getSelectString ()
-{
- return getSelectString (getSelectedItem());
-}
-
-QString VymModel::getSelectString (LinkableMapObj *lmo) // only for convenience. Used in MapEditor
-{
- if (!lmo) return QString();
- return getSelectString (lmo->getTreeItem() );
-}
-
-QString VymModel::getSelectString (TreeItem *ti)
-{
- QString s;
- if (!ti || ti->depth()<0) return s;
- switch (ti->getType())
- {
- case TreeItem::MapCenter: s="mc:"; break;
- case TreeItem::Branch: s="bo:";break;
- case TreeItem::Image: s="fi:";break;
- case TreeItem::Attribute: s="ai:";break;
- case TreeItem::XLink: s="xl:";break;
- default:
- s="unknown type in VymModel::getSelectString()";
- break;
- }
- s= s + QString("%1").arg(ti->num());
- if (ti->depth() >0)
- // call myself recursively
- s= getSelectString(ti->parent()) +","+s;
- return s;
-}
-
-QString VymModel::getSelectString (BranchItem *bi)
-{
- return getSelectString ((TreeItem*)bi);
-}
-
-QString VymModel::getSelectString (const uint &i)
-{
- return getSelectString ( findID (i) );
-}
-
-SlideModel* VymModel::getSlideModel()
-{
- return slideModel;
-}
-
-int VymModel::slideCount()
-{
- return slideModel->count();
-}
-
-SlideItem* VymModel::addSlide()
-{
- SlideItem *si=slideModel->getSelectedItem();
- if (si)
- si=slideModel->addSlide (NULL,si->childNumber()+1 );
- else
- si=slideModel->addSlide();
-
- TreeItem *seli=getSelectedItem();
-
- if (si && seli)
- {
- QString inScript;
- if (!loadStringFromDisk(macroPath + "slideeditor-snapshot.vys", inScript) )
- {
- qWarning()<<"VymModel::addSlide couldn't load template for taking snapshot";
- return NULL;
- }
-
- inScript.replace("CURRENT_ZOOM", QString().setNum(getMapEditor()->getZoomFactorTarget()) );
- inScript.replace("CURRENT_ANGLE", QString().setNum(getMapEditor()->getAngleTarget()) );
- inScript.replace("CURRENT_ID", "\"" + seli->getUuid().toString() + "\"");
-
- si->setInScript(inScript);
- slideModel->setData ( slideModel->index(si), seli->getHeadingPlain() );
- }
- QString s="<vymmap>" + si->saveToDir() + "</vymmap>";
- int pos=si->childNumber();
- saveState (
- PartOfMap,
- getSelectString(), QString("deleteSlide (%1)").arg(pos),
- getSelectString(), QString("addMapInsert (\"PATH\",%1)").arg(pos),
- "Add slide",
- NULL,
- s );
- return si;
-}
-
-void VymModel::deleteSlide(SlideItem *si)
-{
- if (si)
- {
- QString s="<vymmap>" + si->saveToDir() + "</vymmap>";
- int pos=si->childNumber();
- saveState (
- PartOfMap,
- getSelectString(), QString("addMapInsert (\"PATH\",%1)").arg(pos),
- getSelectString(), QString("deleteSlide (%1)").arg(pos),
- "Delete slide",
- NULL,
- s );
- slideModel->deleteSlide (si);
- }
-}
-
-void VymModel::deleteSlide(int n)
-{
- deleteSlide (slideModel->getSlide (n));
-}
-
-void VymModel::relinkSlide(SlideItem *si, int pos)
-{
- if (si && pos>=0)
- slideModel->relinkSlide (si, si->parent(), pos);
-}
-
-void VymModel::moveSlideUp(int n)
-{
- SlideItem *si=NULL;
- if (n<0) // default if called without parameters
- {
- si=slideModel->getSelectedItem();
- if (si) n=si->childNumber();
- } else
- si=slideModel->getSlide(n);
- if (si && n>0 && n<slideModel->count())
- {
- blockSlideSelection=true;
- slideModel->relinkSlide (si, si->parent(), n-1);
- blockSlideSelection=false;
- saveState (
- getSelectString(),QString("moveSlideDown (%1)").arg(n-1),
- getSelectString(),QString("moveSlideUp (%1)").arg(n),
- QString("Move slide %1 up").arg(n));
- }
-}
-
-void VymModel::moveSlideDown(int n)
-{
- SlideItem *si=NULL;
- if (n<0) // default if called without parameters
- {
- si=slideModel->getSelectedItem();
- if (si) n=si->childNumber();
- } else
- si=slideModel->getSlide(n);
- if (si && n>=0 && n < slideModel->count()-1)
- {
- blockSlideSelection=true;
- slideModel->relinkSlide (si, si->parent(), n+1);
- blockSlideSelection=false;
- saveState (
- getSelectString(),QString("moveSlideUp (%1)").arg(n+1),
- getSelectString(),QString("moveSlideDown (%1)").arg(n),
- QString("Move slide %1 down").arg(n));
- }
-}
-
-void VymModel::updateSlideSelection (QItemSelection newsel,QItemSelection)
-{
- if (blockSlideSelection) return;
- QModelIndex ix;
- foreach (ix,newsel.indexes() )
- {
- SlideItem *si= static_cast<SlideItem*>(ix.internalPointer());
- QString inScript=si->getInScript();
-
- // show inScript in ScriptEditor
- scriptEditor->setSlideScript(modelID, si->getID(), inScript );
-
- // Execute inScript
- execute (inScript);
- }
-}