insilmaril@0: #ifndef MAPEDITOR_H insilmaril@0: #define MAPEDITOR_H insilmaril@0: insilmaril@408: #include insilmaril@0: insilmaril@0: #include "mapcenterobj.h" insilmaril@175: #include "file.h" insilmaril@0: #include "misc.h" insilmaril@432: #include "parser.h" insilmaril@473: #include "ornamentedobj.h" insilmaril@366: #include "selection.h" insilmaril@366: #include "settings.h" insilmaril@0: insilmaril@119: insilmaril@486: /*! \brief Main widget in vym to display and edit a map */ insilmaril@473: insilmaril@408: class MapEditor : public QGraphicsView, public xmlObj { insilmaril@0: Q_OBJECT insilmaril@0: insilmaril@0: public: insilmaril@491: /*! \brief State of the mapeditor insilmaril@491: insilmaril@491: While a heading is edited, the state has to change, so insilmaril@491: that e.g. no other object might get selected. This is done insilmaril@491: in Main by calling setStateEditHeading insilmaril@491: */ insilmaril@491: enum State { insilmaril@491: Idle, //!< Idle, waiting for user event insilmaril@491: EditHeading //!< Editing heading (dont't select another branch now) insilmaril@491: }; insilmaril@408: MapEditor(QWidget* parent=0); insilmaril@0: ~MapEditor(); insilmaril@491: MapCenterObj* getMapCenter(); //!< Return center of map insilmaril@408: QGraphicsScene * getScene(); insilmaril@491: State getState(); //!< Return State of MapEditor insilmaril@491: void setStateEditHeading (bool); //!< If set to true, State will change to EditHeading insilmaril@491: bool isRepositionBlocked(); //!< While load or undo there is no need to update graphicsview insilmaril@491: bool isSaveStateBlocked(); //!< block while undo/redo or while running scripts insilmaril@491: void setSaveStateBlocked(bool); //!< block saving the undo/redo state insilmaril@491: bool isSelectBlocked(); //!< true, if no change of selection is possible, e.g. while editing the heading of abranch insilmaril@0: insilmaril@486: protected: insilmaril@491: /*! \brief Get name of object insilmaril@491: insilmaril@491: Returns heading of a branch or name of an object for use in comment insilmaril@491: of undo/redo history insilmaril@491: */ insilmaril@420: QString getName(const LinkableMapObj*); // Get e.g. heading or filename insilmaril@0: void makeTmpDirs(); // create temporary directories insilmaril@486: insilmaril@486: /*! This function saves all information of the map to disc. insilmaril@486: saveToDir also calls the functions for all BranchObj and other objects in the map. insilmaril@486: The structure of the map itself is returned as QString and passed back to Main, insilmaril@486: where saveToDir is called initially insilmaril@486: */ insilmaril@486: QString saveToDir (const QString &tmpdir, const QString &prefix, bool writeflags, const QPointF &offset, LinkableMapObj *saveSel); insilmaril@486: insilmaril@505: /*! \brief Get directory, where current step in history is save insilmaril@505: insilmaril@505: saveState creates a directory for each step in history. This function returns the insilmaril@505: path of the current directory insilmaril@505: */ insilmaril@505: QString getHistoryDir(); insilmaril@486: insilmaril@486: /*! \brief Save the current changes in map insilmaril@486: insilmaril@486: Two commands and selections are saved: insilmaril@486: insilmaril@486: - undocommand and undoselection to undo the change insilmaril@486: - redocommand and redoselection to redo the action after an undo insilmaril@486: insilmaril@486: Additionally a comment is logged. insilmaril@486: insilmaril@486: */ insilmaril@486: void saveState(const SaveMode& savemode, const QString &undoSelection, const QString &undoCommand, const QString &redoSelection, const QString &redoCommand, const QString &comment, LinkableMapObj *saveSelection); insilmaril@486: /*! Overloaded for convenience */ insilmaril@502: void saveStateChangingPart(LinkableMapObj *undoSelection, LinkableMapObj* redoSelection, const QString &redoCommand, const QString &comment); insilmaril@486: /*! Overloaded for convenience */ insilmaril@486: void saveStateRemovingPart(LinkableMapObj *redoSelection, const QString &comment); insilmaril@486: /*! Overloaded for convenience */ insilmaril@502: void saveState(LinkableMapObj *undoSelection, const QString &undoCommand, LinkableMapObj *redoSelection, const QString &redoCommand, const QString &comment); insilmaril@486: /*! Overloaded for convenience */ insilmaril@502: void saveState(const QString &undoSelection, const QString &undoCommand, const QString &redoSelection, const QString &redoCommand, const QString &comment) ; insilmaril@486: insilmaril@393: public: insilmaril@486: insilmaril@486: /* \brief Process one command and its parameters */ insilmaril@486: void parseAtom (const QString &atom); insilmaril@486: insilmaril@486: /* \brief Runs the script */ insilmaril@486: void runScript (QString script); insilmaril@393: private: insilmaril@395: void addFloatImageInt(const QPixmap &img); insilmaril@119: insilmaril@0: public: insilmaril@486: bool isDefault(); //!< true, if map is still the empty default map insilmaril@486: bool hasChanged(); //!< true, if something has changed and is not saved yet insilmaril@486: void setChanged(); //!< called from TextEditor via LinkableMapObj insilmaril@486: void closeMap(); //!< Closes the map insilmaril@486: insilmaril@486: /*! \brief Sets filepath, filename and mapname insilmaril@486: insilmaril@486: If the filepath is "/home/tux/map.xml", then the filename will be set insilmaril@486: to map.xml. The destname is needed for vymLinks, pointing to another map. insilmaril@486: The destname holds the real name of the file, after it has been compressed, e.g. "map.vym" insilmaril@486: */ insilmaril@491: insilmaril@491: /*! \brief Set File path insilmaril@491: insilmaril@491: The destname is needed to construct the references between maps insilmaril@491: */ insilmaril@486: void setFilePath (QString filepath,QString destname); insilmaril@486: void setFilePath (QString); //!< Overloaded for convenience insilmaril@486: QString getFilePath (); //!< Full path e.g. "/home/tux/map.xml" insilmaril@486: QString getFileName (); //!< e.g. "map.xml" insilmaril@486: QString getMapName (); //!< e.g. "map" insilmaril@486: QString getDestPath (); //!< e.g. "/home/tux/map.vym" insilmaril@491: insilmaril@491: /*! \brief Load map insilmaril@491: insilmaril@491: The data is read from file. Depending on LoadMode the current insilmaril@491: selection gets replaced by data or the data is appended. insilmaril@491: */ insilmaril@205: ErrorCode load (QString, LoadMode ); // newmap, import/replace selection insilmaril@163: public: insilmaril@491: /*! \brief Save the map to file */ insilmaril@491: int save(const SaveMode &); insilmaril@491: void setZipped(bool); //!< Set or unset compression of map with zip save map zipped insilmaril@491: bool saveZipped(); //!< True, if file will be saved zipped insilmaril@491: void print(); //!< Print the map insilmaril@491: void setAntiAlias (bool); //!< Set or unset antialiasing insilmaril@491: void setSmoothPixmap(bool); //!< Set or unset smoothing of pixmaps insilmaril@0: private: insilmaril@0: QPixmap getPixmap(); insilmaril@473: void setHideTmpMode (BranchObj::HideTmpMode); // temporary hide stuff insilmaril@473: BranchObj::HideTmpMode getHideTmpMode(); // temporary hide stuff insilmaril@0: public: insilmaril@491: void setExportMode (bool); //!< Set or unset temporary hiding of objects during export insilmaril@491: void exportImage (QString fn); //!< Export as PNG insilmaril@491: void exportImage (QString fn, QString); //!< Export in given format insilmaril@491: void exportOOPresentation(const QString &,const QString &); //!< Export as OpenOfficeOrg presentation insilmaril@491: void exportXML(const QString&); //!< Export as XML to directory insilmaril@491: void clear(); //!< Clear map insilmaril@491: void copy(); //!< Copy to clipboard insilmaril@491: void redo(); //!< Redo last action insilmaril@491: bool isRedoAvailable(); //!< True, if redo is available insilmaril@491: void undo(); //!< Undo last action insilmaril@491: bool isUndoAvailable(); //!< True, if undo is available insilmaril@491: void gotoHistoryStep (int); //!< Goto a specifig step in history insilmaril@0: private: insilmaril@394: void addMapReplaceInt(const QString & undoSel, const QString & path); insilmaril@394: void addMapInsertInt (const QString & path, int pos); insilmaril@502: void pasteNoSave(const int &n); //!< paste clipboard to branch insilmaril@0: public: insilmaril@491: void paste(); //!< Paste clipboard to branch and backup insilmaril@491: void cut(); //!< Cut to clipboard (and copy) insilmaril@491: /*! \brief Move absolutly insilmaril@491: insilmaril@491: Move absolutly to (x,y). insilmaril@491: */ insilmaril@393: void move (const int &x, const int &y); insilmaril@491: /*! \brief Move relativly insilmaril@491: insilmaril@491: Move relativly to (x,y). insilmaril@491: */ insilmaril@393: void moveRel (const int &x, const int &y); insilmaril@491: void moveBranchUp(); //!< Move branch up insilmaril@491: void moveBranchDown(); //!< Move branch down insilmaril@420: private: insilmaril@420: void linkTo(const QString &); insilmaril@420: public: insilmaril@491: QString getHeading (bool &ok,QPoint &p); //!< Get heading, ok if selection is branch insilmaril@491: void setHeading(const QString &); //!< Set heading of branch insilmaril@106: private: insilmaril@366: void setHeadingInt(const QString &); insilmaril@366: void setVymLinkInt(const QString &); // Set vymLink for selection insilmaril@491: /*! \brief Add new branch insilmaril@491: insilmaril@491: Depending on num the new branch is created insilmaril@491: insilmaril@491: -3 above selection as child of selections parent insilmaril@491: -2 as child of selection insilmaril@491: -1 below selection as child of selections parent insilmaril@491: 0..n insert at a specific position in selections parent insilmaril@491: (needed for free relinking) insilmaril@491: */ insilmaril@366: BranchObj* addNewBranchInt(int); // pos allows to add above/below selection insilmaril@106: public: insilmaril@491: /*! \Add new branch insilmaril@491: insilmaril@491: Depending on num the new branch is created insilmaril@491: -1 above selection insilmaril@491: 0 as child of selection insilmaril@491: 1 below selection insilmaril@491: */ insilmaril@491: BranchObj* addNewBranch(int pos); insilmaril@491: BranchObj* addNewBranchBefore(); //!< Insert branch between selection and its parent insilmaril@491: void deleteSelection(); //!< Delete selection insilmaril@491: LinkableMapObj* getSelection(); //!< Returns selection insilmaril@442: BranchObj* getSelectedBranch(); // returns selected branch or NULL insilmaril@442: FloatImageObj* getSelectedFloatImage(); // returns selected branch or NULL insilmaril@442: void unselect(); // before changing current noteedit insilmaril@442: void reselect(); // after changing current noteedit insilmaril@442: bool select(const QString &); // Select by string insilmaril@366: QString getSelectString(); insilmaril@0: private: insilmaril@366: void selectInt(LinkableMapObj*); insilmaril@366: void selectNextBranchInt(); // Increment number of branch insilmaril@366: void selectPrevBranchInt(); // Decrement number of branch insilmaril@0: public: insilmaril@0: void selectUpperBranch(); insilmaril@0: void selectLowerBranch(); insilmaril@0: void selectLeftBranch(); insilmaril@0: void selectRightBranch(); insilmaril@0: void selectFirstBranch(); insilmaril@0: void selectLastBranch(); insilmaril@408: void selectMapBackgroundImage(); insilmaril@408: void setMapBackgroundImage(const QString &); insilmaril@398: void selectMapBackgroundColor(); insilmaril@398: void setMapBackgroundColor(QColor); insilmaril@398: QColor getMapBackgroundColor(); insilmaril@395: QColor getCurrentHeadingColor(); insilmaril@395: void colorBranch(QColor); insilmaril@417: void colorSubtree(QColor); insilmaril@0: void toggleStandardFlag(QString); insilmaril@0: BranchObj* findText(QString,bool); // Find object insilmaril@0: void findReset(); // Reset Find insilmaril@395: void setURL(const QString &); // set the URL insilmaril@0: void editURL(); // edit the URL insilmaril@266: QString getURL(); // returns URL of selection or "" insilmaril@366: QStringList getURLs(); // returns URLs of subtree insilmaril@0: void editHeading2URL(); // copy heading to URL insilmaril@0: void editBugzilla2URL(); // create URL to Bugzilla insilmaril@175: void editFATE2URL(); // create URL to FATE insilmaril@0: void editVymLink(); // edit link to another map insilmaril@0: void deleteVymLink(); // delete link to another map insilmaril@0: QString getVymLink(); // return path to map insilmaril@366: QStringList getVymLinks(); // return paths in subtree insilmaril@395: void setHideExport(bool); // toggle the export flag insilmaril@243: void toggleHideExport(); // toggle the export flag insilmaril@395: void deleteKeepChilds(); // remove but keep childs insilmaril@395: void deleteChilds(); // remove childs insilmaril@0: void editMapInfo(); // dialog to enter author, ... insilmaril@442: void ensureSelectionVisible(); insilmaril@442: void updateSelection(); // update geometry of selection insilmaril@0: void updateActions(); // update e.g. format buttons insilmaril@160: void updateNoteFlag(); // when TextEditor changes insilmaril@398: void setMapAuthor (const QString &); insilmaril@398: void setMapComment(const QString &); insilmaril@398: void setMapLinkStyle (const QString &); // Set style of link insilmaril@473: LinkableMapObj::Style getMapLinkStyle (); // requested in LMO insilmaril@398: void setMapDefLinkColor(QColor); // default color of links insilmaril@398: void setMapLinkColorHintInt(); // color of links insilmaril@473: void setMapLinkColorHint(LinkableMapObj::ColorHint);// color of links insilmaril@473: LinkableMapObj::ColorHint getMapLinkColorHint(); insilmaril@398: QColor getMapDefLinkColor(); insilmaril@398: void setMapDefXLinkColor(QColor); insilmaril@398: QColor getMapDefXLinkColor(); insilmaril@398: void setMapDefXLinkWidth (int); insilmaril@398: int getMapDefXLinkWidth(); insilmaril@398: void toggleMapLinkColorHint(); // after changing linkStyles insilmaril@398: void selectMapLinkColor(); insilmaril@442: void selectMapSelectionColor(); insilmaril@442: private: insilmaril@442: void setSelectionColorInt(QColor); insilmaril@442: public: insilmaril@442: void setSelectionColor(QColor); insilmaril@442: QColor getSelectionColor(); insilmaril@473: bool scrollBranch(BranchObj*); insilmaril@473: bool unscrollBranch(BranchObj*); insilmaril@0: void toggleScroll(); insilmaril@428: void unscrollChilds(); insilmaril@432: private: insilmaril@432: FloatImageObj* loadFloatImageInt (QString); insilmaril@432: public: insilmaril@0: void loadFloatImage (); insilmaril@434: private: insilmaril@434: void saveFloatImageInt (FloatImageObj*, const QString &, const QString &); insilmaril@434: public: insilmaril@366: void saveFloatImage (); insilmaril@473: void setFrameType(const FrameObj::FrameType &); insilmaril@445: void setFrameType(const QString &); insilmaril@442: void setFramePenColor (const QColor &); insilmaril@442: void setFrameBrushColor (const QColor &); insilmaril@473: void setFramePadding (const int &); insilmaril@473: void setFrameBorderWidth (const int &); insilmaril@175: void setIncludeImagesVer(bool); insilmaril@175: void setIncludeImagesHor(bool); insilmaril@160: void setHideLinkUnselected (bool); insilmaril@160: bool getHideLinkUnselected (); insilmaril@0: private: insilmaril@366: void importDirInt(BranchObj *,QDir); insilmaril@491: void importDirInt(const QString&); insilmaril@0: public: insilmaril@0: void importDir(); insilmaril@95: void followXLink (int); insilmaril@95: void editXLink (int); insilmaril@366: void testFunction(); // just testing new stuff insilmaril@366: // set /mainwindo/showTestMenu=true... insilmaril@0: insilmaril@0: protected: insilmaril@408: virtual void contextMenuEvent ( QContextMenuEvent *e ); insilmaril@398: virtual void keyPressEvent(QKeyEvent*); insilmaril@398: virtual void keyReleaseEvent(QKeyEvent*); insilmaril@408: virtual void mousePressEvent(QMouseEvent*); insilmaril@473: virtual void mouseMoveEvent(QMouseEvent*); insilmaril@408: virtual void mouseReleaseEvent(QMouseEvent*); insilmaril@408: virtual void mouseDoubleClickEvent(QMouseEvent*); insilmaril@473: virtual void resizeEvent( QResizeEvent * ); insilmaril@0: insilmaril@417: void dragEnterEvent (QDragEnterEvent *); insilmaril@417: void dragMoveEvent (QDragMoveEvent *); insilmaril@417: void dragLeaveEvent (QDragLeaveEvent *); insilmaril@417: void dropEvent (QDropEvent *); insilmaril@412: insilmaril@473: void timerEvent(QTimerEvent *event); insilmaril@473: insilmaril@473: private slots: insilmaril@473: void autosave (); insilmaril@473: insilmaril@0: private: insilmaril@491: State state; // State of MapEditor insilmaril@408: QGraphicsScene *mapScene; insilmaril@0: MapCenterObj* mapCenter; insilmaril@473: QTimer *autosaveTimer; insilmaril@0: insilmaril@0: bool adjustCanvasRequested; // collect requests until end of user event insilmaril@0: BranchObj *editingBO; // entering Text into BO insilmaril@0: insilmaril@97: QColor defLinkColor; // default color for links insilmaril@97: QColor defXLinkColor; // default color for xlinks insilmaril@97: int defXLinkWidth; // default width for xlinks insilmaril@473: LinkableMapObj::ColorHint linkcolorhint;// use heading color or own color insilmaril@473: LinkableMapObj::Style linkstyle; // default style for links insilmaril@0: insilmaril@398: QCursor HandOpenCursor; // cursor while moving canvas view insilmaril@398: QCursor PickColorCursor; // cursor while picking color insilmaril@398: QCursor CopyCursor; // cursor while picking color insilmaril@398: QCursor XLinkCursor; // cursor while picking color insilmaril@83: bool pickingColor; insilmaril@83: bool drawingLink; // true while creating a link insilmaril@93: bool copyingObj; // true while creating a link insilmaril@95: XLinkObj* tmpXLink; insilmaril@366: insilmaril@424: Selection xelection; insilmaril@0: MapObj* movingObj; // moving a MapObj insilmaril@83: MapObj* linkingObj_src; // part of a link insilmaril@408: QPointF movingObj_orgPos; // org. pos of mouse before move insilmaril@408: QPointF movingObj_orgRelPos; // org. relative pos of mouse before move insilmaril@408: QPointF movingObj_start; // rel. pos of mouse to absPos insilmaril@408: QPointF movingCont_start; // inital pos of moving Content or insilmaril@408: QPointF movingVec; // how far has Content moved insilmaril@0: QPrinter* printer; // Printing insilmaril@0: insilmaril@0: bool mapDefault; // Flag if map is untouched insilmaril@0: bool mapChanged; // Flag if undo is possible insilmaril@0: bool mapUnsaved; // Flag if map should be saved insilmaril@0: insilmaril@432: Parser parser; // Parser stuff for scripting insilmaril@432: insilmaril@0: bool printFrame; // Print frame around map insilmaril@0: bool printFooter; // Print footer below map insilmaril@0: insilmaril@0: bool zipped; // should map be zipped insilmaril@393: static int mapNum; // unique number for Editor insilmaril@0: QString fileName; // short name of file (for tab) insilmaril@0: QString filePath; // path to file which will be saved insilmaril@0: QString fileDir; // dir where file is saved insilmaril@0: QString destPath; // path to .vym file (needed for vymlinks) insilmaril@0: QString mapName; // fileName without ".vym" insilmaril@0: insilmaril@377: QString tmpMapDir; // tmp directory with undo history insilmaril@366: QString histPath; // Path to history file insilmaril@502: SimpleSettings undoSet; // undo/redo commands, saved in histPath insilmaril@381: int stepsTotal; // total number of steps (undos+redos) insilmaril@502: int curStep; // Current step in history (ring buffer) insilmaril@502: int curClipboard; // number of history step, which is the current clipboard insilmaril@502: int redosAvail; // Available number of redo steps insilmaril@502: int undosAvail; // Available number of undo steps insilmaril@139: bool blockReposition; // block while load or undo insilmaril@139: bool blockSaveState; // block while load or undo insilmaril@0: insilmaril@0: BranchObj* itFind; // next object in find process insilmaril@0: bool EOFind; // true, if search failed insilmaril@0: insilmaril@0: QPoint exportOffset; // set before export, used in save insilmaril@473: BranchObj::HideTmpMode hidemode; // true while exporting to hide some stuff insilmaril@473: insilmaril@473: int timerId; // animation timer insilmaril@473: QList animObjList;// list with animated objects insilmaril@0: }; insilmaril@0: #endif insilmaril@0: