X-Git-Url: https://git.sven.stormbind.net/?a=blobdiff_plain;f=src%2Fvymmodel.h;fp=src%2Fvymmodel.h;h=c6d05efd2b614cca8d66559f1e13907d593d3d2d;hb=d483bd8e6523c23c6f1d8908a2e0611c2bc9ff4f;hp=0000000000000000000000000000000000000000;hpb=7dfa3fe589d1722d49681f42cdb0bf1e6efb5223;p=sven%2Fvym.git diff --git a/src/vymmodel.h b/src/vymmodel.h new file mode 100644 index 0000000..c6d05ef --- /dev/null +++ b/src/vymmodel.h @@ -0,0 +1,899 @@ +#ifndef VYMMODEL_H +#define VYMMODEL_H + +#include + +#include +#include + +#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 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 &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 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 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 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 getSelectedBranches(); + ImageItem *getSelectedImage(); + Task *getSelectedTask(); + XLinkItem *getSelectedXLinkItem(); + Link *getSelectedXLink(); + AttributeItem *getSelectedAttribute(); + TreeItem *getSelectedItem(); + QList getSelectedItems(); + QModelIndex getSelectedIndex(); + QList 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 selIterCur; + QHash selIterPrev; + QHash selIterStart; + QHash 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