]> git.sven.stormbind.net Git - sven/vym.git/blobdiff - src/vymmodel.h
New upstream version 2.9.22
[sven/vym.git] / src / vymmodel.h
diff --git a/src/vymmodel.h b/src/vymmodel.h
new file mode 100644 (file)
index 0000000..c6d05ef
--- /dev/null
@@ -0,0 +1,899 @@
+#ifndef VYMMODEL_H
+#define VYMMODEL_H
+
+#include <QtNetwork>
+
+#include <QPointF>
+#include <QTextCursor>
+
+#if defined(VYM_DBUS)
+#include "adaptormodel.h"
+#endif
+
+#include "branchitem.h"
+#include "file.h"
+#include "imageitem.h"
+#include "mapeditor.h"
+#include "treeitem.h"
+#include "treemodel.h"
+#include "vymlock.h"
+#include "vymmodelwrapper.h"
+
+class AttributeItem;
+class BranchItem;
+class FindResultModel;
+class Link;
+class MapEditor;
+class SlideItem;
+class SlideModel;
+class Task;
+class XLinkItem;
+class VymView;
+
+class QGraphicsScene;
+class QJsonObject;
+
+typedef QMap<uint, QStringList> ItemList;
+
+class VymModel : public TreeModel {
+    Q_OBJECT
+    Q_CLASSINFO("D-Bus Interface", "org.insilmaril.vym.VymModel-h")
+
+    ////////////////////////////////////////////
+    // General housekeeping
+    ////////////////////////////////////////////
+  private:
+    QString version; //!< version string saved in vym file
+    QString title;
+    QString author;
+    QString comment;
+    QDate date;
+
+    static uint idLast; //! the last used unique ID
+    uint modelID;
+    VymModelWrapper *wrapper;
+
+  public:
+    VymModel();
+    ~VymModel();
+    void clear();
+    void init();
+    void
+    makeTmpDirectories(); //!< create temporary directories e.g. for history
+    QString tmpDirPath(); //!< Return path to temporary directory
+
+    MapEditor *getMapEditor();
+    uint getModelID(); //! Return unique ID of model
+    VymModelWrapper *getWrapper();
+
+    void setView(VymView *); //! Set vymView for resizing editors after load
+  private:
+    VymView *vymView;
+
+  public:
+    bool isRepositionBlocked(); //!< While load or undo there is no need to
+                                //!< update graphicsview
+    void updateActions();       //!< Update buttons in mainwindow
+
+    bool setData(const QModelIndex &index, const QVariant &value, int role) override;
+
+    ////////////////////////////////////////////
+    // Load/save
+    ////////////////////////////////////////////
+  private:
+    bool zipped;       // should map be zipped
+    static int mapNum; // unique number for model used in save/undo
+    FileType fileType; // type of file, e.g. vym, freemind...
+    QString fileName;  // short name of file (for tab)
+                      // example.vym
+
+    QString filePath; // path to file which will be saved
+                      // /home/tux/example.vym
+
+    QString fileDir; // dir where file is saved
+                     // /home/tux/
+
+    QString destPath; // path to .vym file (needed for vymlinks)
+                      // /home/tux/example.vym
+
+    QString mapName; // fileName without ".vym"
+                     // example
+
+    QString tmpMapDirPath; // tmp directory with undo history
+
+    QTimer *autosaveTimer;
+    QTimer *fileChangedTimer;
+    QDateTime fileChangedTime;
+
+  public:
+    void resetUsedFlags(); //! Before exports or saving, reset the flags
+
+    /*! This function saves all information of the map to disc.
+    saveToDir also calls the functions for all BranchObj and other objects in
+    the map. The structure of the map itself is returned as QString and passed
+    back to Main, where saveToDir is called initially
+    */
+    QString saveToDir(const QString &tmpdir, const QString &prefix,
+                      FlagRowMaster::WriteMode flagMode, const QPointF &offset,
+                      TreeItem *saveSel);
+
+    /*! Save all data in tree*/
+    QString
+    saveTreeToDir(const QString &, const QString &, const QPointF &,
+                  QList<Link *> &tmpLinks); // Save data recursivly to tempdir
+
+    /*! \brief Sets filepath, filename and mapname
+
+     If the filepath is "/home/tux/map.xml", then the filename will be set
+     to map.xml. The destname is needed for vymLinks, pointing to another map.
+     The destname holds the real name of the file, after it has been compressed,
+     e.g. "map.vym"
+    */
+
+    /*! \brief Set File path
+
+     The destname is needed to construct the references between maps
+    */
+    void setFilePath(QString filepath, QString destname);
+    void setFilePath(QString); //!< Overloaded for convenience
+    QString getFilePath();     //!< Full path e.g. "/home/tux/map.xml"
+    QString getFileDir();      //!< e.g. "/home/tux"
+    QString getFileName();     //!< e.g. "map.xml"
+    QString getMapName();      //!< e.g. "map"
+    QString getDestPath();     //!< e.g. "/home/tux/map.vym"
+
+    bool parseVymText(const QString &s);
+
+    /*! \brief Load map
+
+    The data is read from file. Depending on LoadMode the current
+    selection gets replaced by data or the data is appended.
+    */
+    File::ErrorCode
+    loadMap(QString, //!< Path
+            const LoadMode &lmode =
+                NewMap, //!< New map, replace or add to selection
+            const FileType &ftype = VymMap, //!< VymMap or FreeMind
+            const int &contentFilter =
+                0x0000,  //!< For undo types of content can be filterd
+            int pos = -1 //!< Optionally tell position where to add data
+    );
+
+  public:
+    /*! \brief Save the map to file */
+    File::ErrorCode save(const SaveMode &);
+
+  public:
+    ImageItem* loadImage(BranchItem *dst = NULL, const QString &fn = "");
+    void saveImage(ImageItem *ii = NULL, QString fn = "");
+
+  private:
+    void importDirInt(BranchItem *, QDir);
+
+  public:
+    void importDir(const QString &);
+    void importDir();
+
+  private:
+    bool removeVymLock();
+
+  public:
+    bool tryVymLock();
+    bool renameMap(const QString &newPath); //! Rename map and change lockfile
+    void setReadOnly(bool b);
+    bool isReadOnly();
+
+  private:
+    VymLock vymLock; //! Handle lockfiles and related information
+    bool readonly;   //! if map is locked, it can be opened readonly
+
+  private slots:
+    void autosave();
+    void fileChanged();
+
+    ////////////////////////////////////////////
+    // history (undo/redo)
+    ////////////////////////////////////////////
+  private:
+    bool mapDefault; //!< Flag if map is untouched
+    bool mapChanged; //!< Flag if undo is possible
+    bool mapUnsaved; //!< Flag if map should be saved
+
+    QString histPath;       //!< Path to history file
+    SimpleSettings undoSet; //!< undo/redo commands, saved in histPath
+    int stepsTotal;         //!< total number of steps (undos+redos)
+    int curStep;            //!< Current step in history (ring buffer)
+    int curClipboard;       //!< number of history step, which is the current
+                            //!< clipboard
+    int redosAvail;         //!< Available number of redo steps
+    int undosAvail;         //!< Available number of undo steps
+    bool repositionBlocked; //!< block while load or undo
+    bool saveStateBlocked;  //!< block saving current state
+  public:
+    void blockReposition();   //! Block reposition while bigger changes, e.g. an import
+    void unblockReposition(); //! Unblock reposition and do repositon
+    bool isDefault();   //!< true, if map is still the empty default map
+    void makeDefault(); //!< Reset changelog, declare this as default map
+    bool hasChanged();  //!< true, if something has changed and is not saved yet
+    void setChanged();  //!< called from TextEditor via LinkableMapObj
+
+    /*! \brief Get name of object
+
+      Returns heading of a branch or name of an object for use in comment
+      of undo/redo history
+    */
+    QString getObjectName(LinkableMapObj *);
+    QString getObjectName(TreeItem *);
+
+    void redo();            //!< Redo last action
+    bool isRedoAvailable(); //!< True, if redo is available
+    QString lastRedoSelection();
+    QString lastRedoCommand();
+    QVariant repeatLastCommand(); //!< Repeat last command on current selection
+
+    void undo();               //!< Undo last action
+    bool isUndoAvailable();    //!< True, if undo is available
+    void gotoHistoryStep(int); //!< Goto a specifig step in history
+
+    QString getHistoryPath(); //!< Path to directory containing the history
+    void resetHistory();      //!< Initialize history
+
+    /*! \brief Save the current changes in map
+
+    Two commands and selections are saved:
+
+        - undocommand and undoselection to undo the change
+        - redocommand and redoselection to redo the action after an undo
+
+    Additionally a comment is logged.
+
+    */
+    void saveState(const SaveMode &savemode, const QString &undoSelection,
+                   const QString &undoCommand, const QString &redoSelection,
+                   const QString &redoCommand, const QString &comment,
+                   TreeItem *saveSelection, QString dataXML = "");
+
+    /*! Overloaded for convenience */
+    void saveStateChangingPart(TreeItem *undoSelection, TreeItem *redoSelection,
+                               const QString &redoCommand,
+                               const QString &comment);
+
+    /*! Overloaded for convenience */
+    void saveStateRemovingPart(TreeItem *redoSelection, const QString &comment);
+
+    /*! Overloaded for convenience */
+    void saveState(TreeItem *undoSelection, const QString &undoCommand,
+                   TreeItem *redoSelection, const QString &redoCommand,
+                   const QString &comment);
+
+    /*! Overloaded for convenience */
+    void saveState(const QString &undoSelection, const QString &undoCommand,
+                   const QString &redoSelection, const QString &redoCommand,
+                   const QString &comment);
+
+    /*! Overloaded for convenience */
+    void saveState(const QString &undoCommand, const QString &redoCommand,
+                   const QString &comment);
+
+    /*! Save a change in string and merge
+    minor sequential  changes  */
+    void saveStateMinimal(TreeItem *undoSelection, const QString &undoCommand,
+                          TreeItem *redoSelection, const QString &redoCommand,
+                          const QString &comment);
+
+    /*! Save state before loading a map */
+    void saveStateBeforeLoad(LoadMode lmode, const QString &fname);
+
+    ////////////////////////////////////////////
+    // unsorted so far
+    ////////////////////////////////////////////
+  public:
+    QGraphicsScene *getScene();
+
+    TreeItem *findBySelectString(QString s);
+    TreeItem *findID(const uint &i);    // find MapObj by unique ID
+    TreeItem *findUuid(const QUuid &i); // find MapObj by unique ID
+
+    ////////////////////////////////////////////
+    // Interface
+    ////////////////////////////////////////////
+  public:
+    void setVersion(const QString &);
+    QString getVersion();
+    void setTitle(const QString &);
+    QString getTitle();
+    void setAuthor(const QString &);
+    QString getAuthor();
+    void setComment(const QString &);
+    QString getComment();
+    QString getDate();
+    int branchCount();
+    int centerCount();
+
+    void setSortFilter(const QString &);
+    QString getSortFilter();
+
+  protected:
+    QString sortFilter;
+  signals:
+    void sortFilterChanged(QString); //!< Notify editors of new filter
+
+  public:
+    void setHeading(const VymText &vt,
+                    BranchItem *bi = NULL); //!< Set heading of item
+    void setHeadingPlainText(const QString &s,
+                             BranchItem *bi = NULL); //!< Set heading of item
+    Heading getHeading();                            //!< Get heading of item
+    void updateNoteText(
+        const VymText &); //!< Signal emmited in NoteEditor via MainWindow
+    void setNote(const VymNote &vn);  //!< Set note text
+    VymNote getNote();                //!< Get note text
+    bool hasRichTextNote();           //!< Check type of vymText used
+    void loadNote(const QString &fn); //!< Load note from file
+    void saveNote(const QString &fn); //!< Save note to file
+
+  private:
+    BranchItem *findCurrent;  // next object in find process
+    BranchItem *findPrevious; // next object in find process
+    bool EOFind;              // true, if search failed
+
+  public:
+    void findDuplicateURLs();       // find duplicate URLs, testing only so far
+    bool findAll(FindResultModel *, // Search all objects at once, also notes
+                 QString s, Qt::CaseSensitivity cs = Qt::CaseInsensitive,
+                 bool searchNotes = true);
+
+  private:
+    QString findString;
+
+  public:
+    void setURL(QString url, bool updateFromCloud = true, BranchItem *bi = nullptr);
+    QString getURL(); // returns URL of selection or ""
+    QStringList getURLs(bool ignoreScrolled = true); // returns URLs of subtree
+
+    void setFrameType(const FrameObj::FrameType &);
+    void setFrameType(const QString &);
+    void toggleFrameIncludeChildren();
+    void setFrameIncludeChildren(bool);
+    void setFramePenColor(const QColor &);
+    void setFrameBrushColor(const QColor &);
+    void setFramePadding(const int &);
+    void setFrameBorderWidth(const int &);
+    void setIncludeImagesVer(bool);
+    void setIncludeImagesHor(bool);
+    void setChildrenLayout(BranchItem::LayoutHint layoutHint);
+    void setHideLinkUnselected(bool);
+
+    /*! Should object be hidden in exports (clouded)? */
+    void setHideExport(bool, TreeItem *ti = NULL);
+
+    /*! Should object be hidden in exports (clouded)? */
+    void toggleHideExport();
+
+    /*! Toggle task for branch */
+    void toggleTask();
+
+    /*! Cycle through task states */
+    bool cycleTaskStatus(bool reverse = false);
+
+    /*! Set task to sleep for number of days or until a given date*/
+    bool setTaskSleep(const QString &s);
+
+    /*! Set manual delta for priority of task */
+    void setTaskPriorityDelta(const int &n, BranchItem *bi = nullptr);
+
+    /*! Get manual delta for priority of task */
+    int getTaskPriorityDelta();
+
+    /*! count tasks in this model */
+    int taskCount();
+
+    /*! Update task priorities */
+  private slots:
+    void updateTasksAlarm(bool force = false);
+
+  private:
+    /*! Timer to check if tasks need to be awoken */
+    QTimer *taskAlarmTimer;
+
+  public:
+    BranchItem *addTimestamp();
+
+    void copy();  //!< Copy to clipboard
+    void paste(); //!< Paste clipboard to branch and backup
+    void cut();   //!< Cut to clipboard (and copy)
+
+    bool moveUp(BranchItem *bi);   //!< Move branch up without saving state
+    void moveUp();                 //!< Move branch up with saving state
+    bool moveDown(BranchItem *bi); //!< Move branch down without saving state
+    void moveDown();               //!< Move branch down
+    void moveUpDiagonally();       //!< Move branch up diagonally: Branchs becomes child of branch above
+    void moveDownDiagonally();     //!< Move branch down diagonally: Branchs becomes sibling of parent
+    void detach();                 //!< Detach branch and use as new mapcenter
+    void sortChildren(bool inverse = false); //!< Sort children lexically
+
+    // The create methods are used to quickly parse a XML file
+    BranchItem *createMapCenter();             //!< Create MapCenter
+    BranchItem *createBranch(BranchItem *dst); //!< Create Branch
+    ImageItem *createImage(BranchItem *dst);   //!< Create image
+
+  public:
+    bool createLink(
+        Link *l); //!< Create XLink, will create MO automatically if needed
+    QColor getXLinkColor();
+    int getXLinkWidth();
+    Qt::PenStyle getXLinkStyle();
+    QString getXLinkStyleBegin();
+    QString getXLinkStyleEnd();
+
+    AttributeItem *setAttribute();
+    AttributeItem *setAttribute(BranchItem *dst, AttributeItem *);
+
+    /*! \brief Add new mapcenter
+
+    Disclaimer: Still experimental, not fully supported yet.
+    */
+    BranchItem *addMapCenter(bool saveStateFlag = true);
+    BranchItem *addMapCenter(QPointF absPos);
+
+    /*! \brief Add new branch
+
+    Depending on num the new branch is created
+
+    -3 above selection as child of selections parent
+    -2 as child of selection
+    -1 below selection as child of selections parent
+    0..n       insert at a specific position in selections parent
+    (needed for free relinking)
+    */
+
+  private:
+    BranchItem *addNewBranchInt(BranchItem *dst,
+                                int pos); // pos allows to add above/below
+                                          // selection, or as child  at pos
+  public:
+    /*! \Add new branch
+
+    // 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
+    */
+    BranchItem *addNewBranch(BranchItem *bi = NULL, int pos = -2);
+    BranchItem *
+    addNewBranchBefore(); //!< Insert branch between selection and its parent
+    /*! \brief Relink a branch to a new destination dst
+    Relinks branch to dst at branch position pos. There is no saveState
+    here, as for example moveUp or moving in MapEditor have
+    different needs to call saveState
+    Returns true if relinking was successful.
+    */
+    bool relinkBranch(BranchItem *branch, BranchItem *dst, int pos = -1,
+                      bool updateSelection = false, QPointF orgPos = QPointF());
+    bool relinkImage(ImageItem *image, BranchItem *dst);
+
+    bool relinkTo(const QString &dest, int num, QPointF pos);
+
+  private:
+    bool cleaningUpLinks; //!< True while cleaning up to avoid recursion
+  public:
+    void cleanupItems();    //!< Delete orphaned Items
+    void deleteLater(uint); //!< Delete later with new beginRemoveRow
+    void deleteSelection(); //!< Delete selection
+    void deleteKeepChildren(
+        bool saveStateFlag = true); //!< remove branch, but keep children
+  public:
+    void deleteChildren(); //!< keep branch, but remove children
+
+    TreeItem *deleteItem(
+        TreeItem *); //!< Delete item and return parent (if parent!= rootItem)
+    void deleteLink(Link *); //!< Remove Link and related LinkItems in TreeModel
+    void clearItem(TreeItem *ti); //!< Remove all children of TreeItem ti
+    bool scrollBranch(BranchItem *);
+    bool unscrollBranch(BranchItem *);
+    void toggleScroll();
+    void unscrollChildren();
+    void setScaleFactor(qreal, ImageItem *ii = nullptr);
+    void growSelectionSize();
+    void shrinkSelectionSize();
+    void resetSelectionSize();
+    void emitExpandAll();
+    void emitExpandOneLevel();
+    void emitCollapseOneLevel();
+    void emitCollapseUnselected();
+  signals:
+    void expandAll();
+    void expandOneLevel();
+    void collapseOneLevel();
+    void collapseUnselected();
+
+  public:
+    void toggleTarget();
+    ItemList getLinkedMaps();
+    ItemList getTargets();
+
+  private:
+    Flag* findFlagByName(const QString &name);
+  public:
+    void setFlagByName(const QString &name, bool useGroups = true);
+    void unsetFlagByName(const QString &name);
+    void toggleFlagByName(const QString &name, bool useGroups = true);
+    void toggleFlagByUid(const QUuid &uid, bool useGroups = true);
+    void clearFlags();
+
+    void colorBranch(QColor);
+    void colorSubtree(QColor, BranchItem *bi = NULL);
+    QColor getCurrentHeadingColor();
+
+    void note2URLs();                    // get URLs from note
+    void editHeading2URL();              // copy heading to URL
+    void getJiraData(bool subtree = true);      // get data from Jira
+
+  public slots:
+    void updateJiraData(QJsonObject);
+
+  public:
+    void setHeadingConfluencePageName(); // get page details from Confluence
+    void setVymLink(const QString &);    // Set vymLink for selection
+    void deleteVymLink();                // delete link to another map
+    QString getVymLink();                // return path to map
+    QStringList getVymLinks();           // return paths in subtree
+    void followXLink(int);
+    void editXLink();
+    void setXLinkColor(const QString &);
+    void setXLinkStyle(const QString &);
+    void setXLinkStyleBegin(const QString &);
+    void setXLinkStyleEnd(const QString &);
+    void setXLinkWidth(int);
+
+    ////////////////////////////////////////////
+    // Scripting
+    ////////////////////////////////////////////
+  public:
+    /* \brief Runs the script */
+    QVariant execute(const QString &script);
+
+    ////////////////////////////////////////////
+    // Exports
+    ////////////////////////////////////////////
+  private:
+    TreeItem::HideTmpMode hidemode; // true while exporting to hide some stuff
+
+  public:
+    /*! Set or unset temporary hiding of objects during export  */
+    void setExportMode(bool);
+
+    /*! Save as image. Returns offset to upper left corner of image */
+    QPointF exportImage(QString fname = "", bool askForName = true,
+                        QString format = "PNG");
+
+    /*! Save as PDF  . Returns offset to upper left corner of image */
+    void exportPDF(QString fname = "", bool askForName = true);
+
+    /*! Save as SVG  . Returns offset to upper left corner of image */
+    QPointF exportSVG(QString fname = "", bool askForName = true);
+
+    /*! Export as XML to directory */
+    void exportXML(QString fname = "", QString dir = "", bool useDialog = true);
+
+    /*! Export as A&O report text to file */
+    void exportAO(QString fname = "", bool askForName = true);
+
+    /*! Export as ASCII text to file */
+    void exportASCII(const QString &fname = "", bool listTasks = false,
+                     bool askForName = true);
+
+    /*! Export as CSV text to file */
+    void exportCSV(const QString &fname = "", bool askForName = true);
+
+    /*! Export as Firefox bookmarks to JSON file */
+    void exportFirefoxBookmarks(const QString &fname = "", bool askForName = true);
+
+    /*! Export as HTML to directory */
+    void exportHTML(const QString &fname = "", const QString &dir = "", 
+                    bool useDialog = true);
+
+    /*! Export as HTML to Confluence*/
+    void exportConfluence(bool createPage = true, const QString &pageURL = "", 
+                    const QString &pageName = "", 
+                    bool useDialog = true);
+
+    /*! Export as OpenOfficeOrg presentation */
+    void exportImpress(const QString &, const QString &);
+
+    /*! Returns if Export in recently used format is possible*/
+    bool exportLastAvailable(QString &description, QString &command,
+                             QString &dest);
+
+    /*! Export in recently used format (saved in map)*/
+    void exportLast();
+
+    /*! Export as LaTeX */
+    void exportLaTeX(const QString &fname = "", bool useDialog = true);
+
+    /*! Export as Markdown */
+    void exportMarkdown(const QString &fname = "", bool useDialog = true);
+
+    /*! Export as OrgMode input for emacs*/
+    void exportOrgMode(const QString &fname = "", bool useDialog = true);
+
+    ////////////////////////////////////////////
+    // View related
+    ////////////////////////////////////////////
+  public:
+    void registerMapEditor(QWidget *);
+
+    void setMapZoomFactor(const double &);
+    void setMapRotationAngle(const double &);
+    void setMapAnimDuration(const int &d);
+    void setMapAnimCurve(const QEasingCurve &c);
+    bool centerOnID(const QString &id);
+
+  private:
+    double zoomFactor;
+    double rotationAngle;
+    int animDuration;
+    QEasingCurve animCurve;
+
+    bool hasContextPos; //!< True, if we have a context pos
+    QPointF contextPos; //!< local position during context menu
+  public:
+    void setContextPos(QPointF); //!< local position during context menu
+    void unsetContextPos();      //!< forget local position after context menu
+
+    void reposition(); //!< Call reposition for all MCOs
+    void setHideTmpMode(TreeItem::HideTmpMode mode);
+
+    void emitNoteChanged(TreeItem *ti);
+    void emitDataChanged(TreeItem *ti);
+    void emitUpdateQueries(); //!< tell MainWindow to update find results...
+    void emitUpdateLayout();
+
+  signals:
+    void updateQueries(VymModel *m);
+    void updateLayout();
+    void noteChanged(QModelIndex ix);
+    void newChildObject(QModelIndex ix);
+
+  private:
+    MapEditor *mapEditor;
+
+    QColor defLinkColor;        // default color for links
+    QPen defXLinkPen;           // default pen for xlinks
+    QString defXLinkStyleBegin; // default style begin
+    QString defXLinkStyleEnd;
+    ;                                        // default style end
+    LinkableMapObj::ColorHint linkcolorhint; // use heading color or own color
+    LinkableMapObj::Style linkstyle;         // default style for links
+    QFont defaultFont;
+
+  public:
+    bool setMapLinkStyle(const QString &);   // Set style of link
+    LinkableMapObj::Style getMapLinkStyle(); // requested in LMO
+    void setMapDefLinkColor(QColor);         // default color of links
+    void setMapLinkColorHintInt();           // color of links
+    void setMapLinkColorHint(LinkableMapObj::ColorHint); // color of links
+    void toggleMapLinkColorHint(); // after changing linkStyles
+    void selectMapBackgroundImage();
+    void setMapBackgroundImage(const QString &);
+    void selectMapBackgroundColor();
+    void setMapBackgroundColor(QColor);
+    QColor getMapBackgroundColor();
+
+    QFont getMapDefaultFont();
+    void setMapDefaultFont(const QFont &);
+
+    LinkableMapObj::ColorHint getMapLinkColorHint();
+    QColor getMapDefLinkColor();
+    void setMapDefXLinkPen(const QPen &p);
+    QPen getMapDefXLinkPen();
+
+    void setMapDefXLinkStyleBegin(const QString &s);
+    QString getMapDefXLinkStyleBegin();
+    void setMapDefXLinkStyleEnd(const QString &s);
+    QString getMapDefXLinkStyleEnd();
+
+    /*!  Move absolutly to (x,y).  */
+    void move(const double &x, const double &y);
+
+    /*!  Move relativly to (x,y).  */
+    void moveRel(const double &x, const double &y);
+
+    ////////////////////////////////////////////
+    // Animation  **experimental**
+    ////////////////////////////////////////////
+  private:
+    QTimer *animationTimer;
+    bool animationUse;
+    uint animationTicks;
+    uint animationInterval;
+    int timerId;                 // animation timer
+    QList<MapObj *> animObjList; // list with animated objects
+
+  private slots:
+    void animate(); //!< Called by timer to animate stuff
+  public:
+    void startAnimation(BranchObj *bo, const QPointF &v);
+    void startAnimation(BranchObj *bo, const QPointF &start,
+                        const QPointF &dest);
+    void stopAnimation(MapObj *mo);
+    void stopAllAnimation();
+
+    ////////////////////////////////////////////
+    // Network related
+    ////////////////////////////////////////////
+  public:
+    /*! \brief Networking states
+
+    In Network modus we want to switch of saveState, autosave, ...
+    */
+    enum NetState {
+        Offline, //!< Offline
+        Client,  //!< I am the client and connected to server
+        Server   //!< I am the server
+    };
+
+  private:
+    // Network connections **Experimental**
+    NetState netstate;     // offline, client, server
+    QTcpServer *tcpServer; // Act as server in conference mode (experimental)
+    QList<QTcpSocket *> clientList; // List of connected clients
+    quint16 sendCounter;            // Increased with every sent command
+
+    QTcpSocket *clientSocket; // socket of this client
+    QString server;           // server address of this client
+    int port;                 // server port of this client
+
+  protected:
+    void sendSelection();
+
+  public:
+    void newServer();
+    void connectToServer();
+
+  private slots:
+    void newClient();
+    void sendData(const QString &s);
+    void readData();
+    void displayNetworkError(QAbstractSocket::SocketError);
+
+  public:
+    void downloadImage(const QUrl &url, BranchItem *bi = NULL);
+
+    ////////////////////////////////////////////
+    // Selection related
+    ////////////////////////////////////////////
+  private:
+    TreeItem *latestAddedItem; // latest added object, reset on setChanged()
+    QUuid lastToggledUuid;     // Latest toggled object 
+    QList<uint> selectionHistory;
+    int currentSelection;
+    bool keepSelectionHistory; // If set, selection doesn't change history
+
+  public slots:
+    void updateSelection(QItemSelection, QItemSelection); // update selection
+
+  public:
+    void setSelectionModel(QItemSelectionModel *); // Set common selectionModel
+    QItemSelectionModel *getSelectionModel();
+
+    void setSelectionBlocked(bool);
+    bool isSelectionBlocked();
+
+    bool select(const QString &);          //! Select by string
+    bool selectID(const QString &);        //! select by unique ID (QUuid)
+    bool select(LinkableMapObj *lmo);      //! Select by pointer to LMO
+    bool selectToggle(TreeItem *ti);       //! Toggle select state
+    bool selectToggle(const QString &selectString); //! Overloaded function to toggle select state
+    bool select(TreeItem *ti);             //! Select by pointer to TreeItem
+    bool select(const QModelIndex &index); //! Select by ModelIndex
+    void unselectAll();
+    void unselect(QItemSelection desel);
+    bool reselect();
+    bool canSelectPrevious();
+    bool selectPrevious();
+    bool canSelectNext();
+    bool selectNext();
+    void resetSelectionHistory();
+    void appendSelectionToHistory();
+    void emitShowSelection(bool scaled = false); //!< Show selection in all views
+
+  signals:
+    void showSelection(bool scaled);
+
+  public:
+    TreeItem *lastToggledItem();
+    bool selectFirstBranch();
+    bool selectFirstChildBranch();
+    bool selectLastBranch();
+    bool selectLastChildBranch();
+    bool selectLastSelectedBranch();
+    bool selectLastImage();
+    bool selectLatestAdded();
+    bool selectParent();
+
+  public:
+    TreeItem::Type selectionType();
+    LinkableMapObj *getSelectedLMO();
+    BranchObj *getSelectedBranchObj();
+    BranchItem *getSelectedBranch();
+    QList<BranchItem *> getSelectedBranches();
+    ImageItem *getSelectedImage();
+    Task *getSelectedTask();
+    XLinkItem *getSelectedXLinkItem();
+    Link *getSelectedXLink();
+    AttributeItem *getSelectedAttribute();
+    TreeItem *getSelectedItem();
+    QList<TreeItem *> getSelectedItems();
+    QModelIndex getSelectedIndex();
+    QList<uint> getSelectedIDs();
+    QStringList getSelectedUUIDs();
+    bool isSelected(TreeItem *);
+    QString getSelectString();
+    QString getSelectString(LinkableMapObj *lmo);
+    QString getSelectString(TreeItem *item);
+    QString getSelectString(BranchItem *item);
+    QString getSelectString(const uint &i);
+    void setLatestAddedItem(TreeItem *ti);
+    TreeItem *getLatestAddedItem();
+
+  signals:
+    void selectionChanged(const QItemSelection &newsel,
+                          const QItemSelection &oldsel);
+
+  public:
+    void emitSelectionChanged(const QItemSelection &oldsel);
+    void emitSelectionChanged();
+    void selectMapLinkColor();
+    void selectMapSelectionColor();
+
+  private:
+    QItemSelectionModel *selModel;
+    QString lastSelectString;
+    bool selectionBlocked; //! Used to block changes of selection while editing
+                           //! a heading
+
+  public:
+    void setSelectionPenColor(QColor);
+    QColor getSelectionPenColor();
+    void setSelectionPenWidth(qreal);
+    qreal getSelectionPenWidth();
+    void setSelectionBrushColor(QColor);
+    QColor getSelectionBrushColor();
+
+    ////////////////////////////////////////////
+    // Iterating and selecting branches
+    ////////////////////////////////////////////
+  public:
+    bool initIterator(const QString &iname,
+                      bool deepLevelsFirst = false); //! Named iterator
+    bool nextIterator(const QString &iname);         //! Select next iterator
+  private:
+    QHash<QString, QUuid> selIterCur;
+    QHash<QString, QUuid> selIterPrev;
+    QHash<QString, QUuid> selIterStart;
+    QHash<QString, bool> selIterActive;
+
+    ////////////////////////////////////////////
+    // Slide related
+    ////////////////////////////////////////////
+  public:
+    SlideModel *getSlideModel();
+    int slideCount();
+    SlideItem *addSlide();
+    void deleteSlide(SlideItem *si);
+    void deleteSlide(int n);
+    void relinkSlide(SlideItem *si, int pos);
+    bool moveSlideDown(int n = -1);
+    bool moveSlideUp(int n = -1);
+    SlideItem *findSlideID(uint id);
+  public slots:
+    void updateSlideSelection(QItemSelection, QItemSelection);
+
+  private:
+    SlideModel *slideModel;
+    bool blockSlideSelection;
+};
+
+#endif