vymmodel.h
author insilmaril
Wed, 25 Nov 2009 15:27:22 +0000
changeset 808 b163492fda17
parent 807 f9f7922989d8
child 811 c79486b7cb4b
permissions -rw-r--r--
First version of new FindWidget instead of extra floating dialog
     1 #ifndef VYMMODEL_H
     2 #define VYMMODEL_H
     3 
     4 #include <QGraphicsScene>
     5 #include <QtNetwork>
     6 
     7 #include <QtDBus/QDBusAbstractAdaptor>
     8 #include <QtDBus/QDBusVariant>
     9 
    10 #include "adaptormodel.h"
    11 #include "file.h"
    12 #include "imageitem.h"
    13 #include "mapeditor.h"
    14 #include "parser.h"
    15 #include "treeitem.h"
    16 #include "treemodel.h"
    17 
    18 class AttributeItem;
    19 class BranchItem;
    20 class MapEditor;
    21 class XLinkItem;
    22 
    23 class VymModel :  public TreeModel {		
    24 	Q_OBJECT
    25 	Q_CLASSINFO("D-Bus Interface", "org.insilmaril.vym.VymModel-h")
    26 
    27 
    28 ////////////////////////////////////////////
    29 // General housekeeping
    30 ////////////////////////////////////////////
    31 private:
    32 	QString version;	//!< version string saved in vym file
    33 	QString author;
    34 	QString comment;
    35 	QDate date;
    36 
    37 public:
    38 	VymModel();
    39 	~VymModel ();
    40     void clear();
    41     void init();
    42 	void makeTmpDirectories();		//!< create temporary directories e.g. for history
    43 
    44 	MapEditor* getMapEditor();			// FIXME-2 still necessary?
    45 
    46 	bool isRepositionBlocked();		//!< While load or undo there is no need to update graphicsview
    47 
    48 	void updateActions();			//!< Update buttons in mainwindow
    49 
    50 
    51 ////////////////////////////////////////////
    52 // Load/save 
    53 ////////////////////////////////////////////
    54 private:
    55 
    56 	bool zipped;				// should map be zipped
    57 	static	int mapNum;			// unique number for model used in save/undo
    58 	FileType fileType;			// type of file, e.g. vym, freemind...
    59 	QString fileName;			// short name of file (for tab)
    60 	QString filePath;			// path to file which will be saved
    61 	QString fileDir;			// dir where file is saved
    62 	QString destPath;			// path to .vym file (needed for vymlinks)
    63 	QString mapName;			// fileName without ".vym"
    64 
    65 	QString tmpMapDir;			// tmp directory with undo history
    66 
    67 	QTimer *autosaveTimer;
    68 	QTimer *fileChangedTimer;
    69 	QDateTime fileChangedTime;
    70 
    71 public:
    72 	/*! This function saves all information of the map to disc.
    73 	    saveToDir also calls the functions for all BranchObj and other objects in the map.
    74 		The structure of the map itself is returned as QString and passed back to Main, 
    75 		where saveToDir is called initially
    76 	*/	
    77     QString saveToDir (const QString &tmpdir, const QString &prefix, bool writeflags, const QPointF &offset, TreeItem *saveSel);
    78 
    79 	/*! Save all data in tree*/
    80 	QString saveTreeToDir (const QString&,const QString&,int, const QPointF&);// Save data recursivly to tempdir
    81 
    82 
    83 	/*! \brief Sets filepath, filename and mapname
    84 
    85 	     If the filepath is "/home/tux/map.xml", then the filename will be set
    86 		 to map.xml. The destname is needed for vymLinks, pointing to another map. 
    87 		 The destname holds the real name of the file, after it has been compressed, e.g. "map.vym"
    88 	*/	 
    89 
    90 
    91 	/*! \brief Set File path
    92 
    93 	     The destname is needed to construct the references between maps
    94 	*/	 
    95 	void setFilePath (QString filepath,QString destname);	
    96 	void setFilePath (QString);	//!< Overloaded for convenience
    97 	QString getFilePath ();	//!< Full path e.g. "/home/tux/map.xml"
    98 	QString getFileName ();	//!< e.g. "map.xml"
    99 	QString getMapName ();	//!< e.g. "map"
   100 	QString getDestPath (); //!< e.g. "/home/tux/map.vym"
   101 
   102 	/*! \brief Load map
   103 
   104 		The data is read from file. Depending on LoadMode the current
   105 		selection gets replaced by data or the data is appended.
   106 	*/	
   107     ErrorCode load (QString, const LoadMode &, const FileType& );	// newmap, import/replace selection
   108 
   109 public:
   110 	/*! \brief Save the map to file */
   111     ErrorCode save(const SaveMode &);	
   112 
   113 private:
   114     void addMapReplaceInt(const QString & undoSel, const QString & path);
   115     bool addMapInsertInt (const QString & path);
   116     bool addMapInsertInt (const QString & path, int pos);
   117 
   118 	ImageItem* loadFloatImageInt (BranchItem *dst,QString);
   119 	void saveFloatImageInt (ImageItem*, const QString &, const QString &);
   120 public:	
   121 	void loadFloatImage ();
   122 	void saveFloatImage ();
   123 
   124 private:	
   125     void importDirInt(BranchItem *,QDir);
   126     void importDirInt(const QString&);
   127 public:	
   128     void importDir();
   129 
   130 private slots:
   131 	void autosave ();
   132 	void fileChanged();
   133 
   134 ////////////////////////////////////////////
   135 // history (undo/redo)
   136 ////////////////////////////////////////////
   137 private:
   138     bool mapDefault;			//!< Flag if map is untouched
   139     bool mapChanged;			//!< Flag if undo is possible
   140 	bool mapUnsaved;			//!< Flag if map should be saved
   141 
   142 	QString histPath;			//!< Path to history file
   143 	SimpleSettings undoSet;		//!< undo/redo commands, saved in histPath
   144 	int stepsTotal;				//!< total number of steps (undos+redos) 
   145 	int curStep;				//!< Current step in history (ring buffer)
   146 	int curClipboard;			//!< number of history step, which is the current clipboard
   147 	int redosAvail;				//!< Available number of redo steps
   148 	int undosAvail;				//!< Available number of undo steps
   149 	bool blockReposition;		//!< block while load or undo
   150 	bool blockSaveState;		//!< block while load or undo
   151 public:
   152 	bool isDefault();			//!< true, if map is still the empty default map
   153 	void makeDefault();			//!< Reset changelog, declare this as default map
   154     bool hasChanged()	;		//!< true, if something has changed and is not saved yet
   155 	void setChanged();			//!< called from TextEditor via LinkableMapObj
   156 
   157 	/*! \brief Get name of object
   158 	  
   159 	  Returns heading of a branch or name of an object for use in comment
   160 	  of undo/redo history
   161 	*/ 
   162 	QString getObjectName(LinkableMapObj*);	
   163 	QString getObjectName(TreeItem*);	
   164 
   165     void redo();						//!< Redo last action
   166 	bool isRedoAvailable();				//!< True, if redo is available
   167     void undo();						//!< Undo last action
   168 	bool isUndoAvailable();				//!< True, if undo is available
   169 	void gotoHistoryStep (int);			//!< Goto a specifig step in history
   170 
   171 
   172 	QString getHistoryPath();			//!< Path to directory containing the history
   173 
   174 	/*! \brief Save the current changes in map 
   175 
   176 		Two commands and selections are saved:
   177 
   178 			- undocommand and undoselection to undo the change
   179 			- redocommand and redoselection to redo the action after an undo
   180 
   181 		Additionally a comment is logged. 
   182 
   183 	*/	
   184     void saveState(
   185 		const SaveMode& savemode, 
   186 		const QString &undoSelection, 
   187 		const QString &undoCommand, 
   188 		const QString &redoSelection, 
   189 		const QString &redoCommand, 
   190 		const QString &comment, 
   191 		TreeItem *saveSelection);
   192 	/*! Overloaded for convenience */
   193     void saveStateChangingPart(
   194 		TreeItem *undoSelection, 
   195 		TreeItem* redoSelection, 
   196 		const QString &redoCommand, 
   197 		const QString &comment);
   198 	/*! Overloaded for convenience */
   199     void saveStateRemovingPart(
   200 		TreeItem *redoSelection, 
   201 		const QString &comment);
   202 	/*! Overloaded for convenience */
   203     void saveState(
   204 		TreeItem *undoSelection, 
   205 		const QString &undoCommand, 
   206 		TreeItem *redoSelection, 
   207 		const QString &redoCommand, 
   208 		const QString &comment); 
   209 	/*! Overloaded for convenience */
   210     void saveState(
   211 		const QString &undoSelection, 
   212 		const QString &undoCommand, 
   213 		const QString &redoSelection, 
   214 		const QString &redoCommand, 
   215 		const QString &comment) ;
   216     void saveState(
   217 		const QString &undoCommand, 
   218 		const QString &redoCommand, 
   219 		const QString &comment) ;
   220 
   221 
   222 ////////////////////////////////////////////
   223 // unsorted so far
   224 ////////////////////////////////////////////
   225 private:
   226 	QGraphicsScene *mapScene;
   227 public:
   228 	void setScene(QGraphicsScene *s);
   229 	QGraphicsScene *getScene();
   230 
   231     TreeItem* findBySelectString (QString s);		
   232     TreeItem* findID (const QString &s);				// find MapObj by previously set ID
   233 
   234 
   235 ////////////////////////////////////////////
   236 // Interface 
   237 ////////////////////////////////////////////
   238 public:
   239 	void setVersion(const  QString &);
   240 	void setAuthor  (const QString &);
   241 	QString getAuthor ();
   242 	void setComment (const QString &);
   243 	QString getComment ();
   244 	QString getDate();
   245 	int branchCount();
   246 
   247 	void setSortFilter (const QString &);
   248 	QString getSortFilter ();
   249 protected:	
   250 	QString sortFilter;
   251 signals:
   252 	void sortFilterChanged (QString );		//!< Notify editors of new filter
   253 
   254 public:
   255 	void setHeading(const QString &);		//!< Set heading of item	
   256 	QString getHeading ();					//!< Get heading of item
   257 	void setNote(const QString &s);			//!< Set note text
   258 	QString getNote();						//!< Get note text
   259 
   260 private:
   261 	BranchItem* findCurrent;				// next object in find process
   262 	BranchItem* findPrevious;				// next object in find process
   263 	bool EOFind;							// true, if search failed
   264 
   265 public:
   266     BranchItem* findText(QString,bool);		// Find object
   267     void findReset();						// Reset Search
   268 	void emitShowFindWidget();				// Tell views to show FindWidget
   269 signals:
   270 	void showFindWidget();				
   271 
   272 public:
   273 	void setURL(const QString &url);
   274 	QString getURL();						// returns URL of selection or ""
   275 	QStringList getURLs();					// returns URLs of subtree
   276 
   277 
   278 	void setFrameType(const FrameObj::FrameType &);
   279 	void setFrameType(const QString &);
   280 	void setFramePenColor (const QColor &);
   281 	void setFrameBrushColor (const QColor &);
   282 	void setFramePadding (const int &);
   283 	void setFrameBorderWidth (const int &);
   284 	void setIncludeImagesVer(bool);
   285 	void setIncludeImagesHor(bool);
   286 	void setHideLinkUnselected (bool);
   287 
   288 	/*! Should object be hidden in exports (clouded)? */
   289 	void setHideExport(bool);			
   290 
   291 	/*! Should object be hidden in exports (clouded)? */
   292 	void toggleHideExport();		
   293 
   294 	void addTimestamp();		
   295 
   296     void copy();						//!< Copy to clipboard
   297 private:	
   298     void pasteNoSave(const int &n);		//!< paste clipboard to branch
   299 public:	
   300     void paste();			//!< Paste clipboard to branch and backup
   301     void cut();				//!< Cut to clipboard (and copy)
   302 
   303     bool moveUp(BranchItem *bi);	//!< Move branch up without saving state
   304     void moveUp();					//!< Move branch up with saving state
   305     bool moveDown(BranchItem *bi);	//!< Move branch down without saving state
   306     void moveDown();		//!< Move branch down
   307 	void detach();					//!< Detach branch and use as new mapcenter
   308 	void sortChildren();	//!< Sort children lexically
   309 
   310 	// The create methods are used to quickly parse a XML file
   311 	BranchItem* createMapCenter();				//!< Create MapCenter 
   312 	BranchItem* createBranch(BranchItem *dst);	//!< Create Branch
   313 	ImageItem* createImage(BranchItem *dst);	//!< Create image
   314 	XLinkItem* createXLink(BranchItem *dst,bool createMO=false);	//!< Create XLink starting at dst
   315 
   316 	AttributeItem* addAttribute();
   317 
   318 	/*! \brief Add new mapcenter
   319 
   320 	    Disclaimer: Still experimental, not fully supported yet.
   321 	*/	
   322 	BranchItem* addMapCenter();
   323 private:	
   324 	BranchItem* addMapCenter(QPointF absPos);
   325 
   326 	/*! \brief Add new branch
   327 
   328 		Depending on num the new branch is created
   329 
   330 		-3 above selection as child of selections parent
   331 		-2 as child of selection
   332 		-1 below selection as child of selections parent
   333 		0..n	insert at a specific position in selections parent
   334 		(needed for free relinking)
   335 	*/	
   336 
   337 private:	
   338     BranchItem* addNewBranchInt(BranchItem *dst, int pos);	// pos allows to add above/below selection
   339 public:	
   340 	/*! \Add new branch
   341 		
   342 		Depending on num the new branch is created
   343 		-1 above selection
   344 		 0 as child of selection
   345 		 1 below selection
   346 	*/
   347     BranchItem* addNewBranch(int pos=0);		
   348     BranchItem* addNewBranchBefore();		//!< Insert branch between selection and its parent
   349 	/*! \brief Relink a branch to a new destination dst 
   350 	    Relinks branch to dst at branch position pos. There is no saveState
   351 		here, as for example moveUp or moving in MapEditor have
   352 		different needs to call saveState
   353 		Returns true if relinking was successful.
   354 	*/	
   355 	bool relinkBranch (BranchItem* branch, BranchItem* dst, int pos =-1);	
   356 	bool relinkImage  (ImageItem* image, BranchItem* dst);	
   357 
   358     void deleteSelection();				//!< Delete selection
   359 	void deleteKeepChildren();			//!< remove branch, but keep children
   360 	void deleteChildren();				//!< keep branch, but remove children
   361 
   362 	TreeItem* deleteItem(TreeItem*);	//!< Delete item and return parent (if parent!= rootItem)
   363 	void clearItem (TreeItem* ti);		//!< Remove all children of TreeItem ti
   364 	bool scrollBranch(BranchItem *);
   365 	bool unscrollBranch(BranchItem *);
   366 public:	
   367     void toggleScroll();
   368     void unscrollChildren();
   369 	void emitExpandAll();
   370 	void emitExpandOneLevel();
   371 	void emitCollapseOneLevel();
   372 signals:	
   373 	void expandAll();
   374 	void expandOneLevel();
   375 	void collapseOneLevel();
   376 
   377 public:	
   378 	void toggleStandardFlag (const QString &name, FlagRow *master=NULL);
   379     void addFloatImage(const QPixmap &img);
   380 
   381     void colorBranch(QColor);
   382     void colorSubtree(QColor);
   383 	QColor getCurrentHeadingColor();
   384 
   385 
   386 	void editURL();							// edit URL
   387 	void editLocalURL();					// edit URL to local file
   388 	void editHeading2URL();					// copy heading to URL
   389 	void editBugzilla2URL();				// create URL to Bugzilla
   390 	void editFATE2URL();					// create URL to FATE
   391 	void editVymLink();						// edit link to another map
   392 	void setVymLink (const QString &);	// Set vymLink for selection
   393 	void deleteVymLink();					// delete link to another map
   394 	QString getVymLink();					// return path to map
   395 	QStringList getVymLinks();				// return paths in subtree
   396 	void followXLink (int);
   397 	void editXLink (int);
   398 
   399 
   400 
   401 
   402 ////////////////////////////////////////////
   403 // Scripting
   404 ////////////////////////////////////////////
   405 public:	
   406 
   407 	/* \brief Process one command and its parameters */
   408     QVariant parseAtom (const QString &atom, bool &noError, QString &errorMsg);	
   409 
   410 	/* \brief Runs the script */
   411 	QVariant runScript (const QString &script);
   412 
   413 private:
   414 	Parser parser;
   415 
   416 ////////////////////////////////////////////
   417 // Exports
   418 ////////////////////////////////////////////
   419 private:
   420 	TreeItem::HideTmpMode hidemode;	// true while exporting to hide some stuff
   421 
   422 public:
   423 	/*! Set or unset temporary hiding of objects during export  */
   424 	void setExportMode (bool);
   425 
   426 	/*! Save as image */
   427     void exportImage (QString fname="",bool askForName=true,QString format="PNG");
   428 
   429 
   430 	/*! Export as XTML to directory */
   431     void exportXML(QString dir="", bool askForName=true);
   432 
   433 	/*! Export as A&O report text to file */
   434 	void exportAO (QString fname="",bool askForName=true);  
   435 
   436 	/*! Export as ASCII text to file */
   437 	void exportASCII (QString fname="",bool askForName=true);  
   438 
   439 	/*! Export as XHTML to directory */
   440     void exportXHTML(const QString& dir="", bool askForName=true);	
   441 
   442     /*! Export as OpenOfficeOrg presentation */
   443     void exportOOPresentation(const QString &,const QString &);	
   444 
   445 
   446 ////////////////////////////////////////////
   447 // View related
   448 ////////////////////////////////////////////
   449 public:
   450 	void registerEditor (QWidget *);
   451 	void unregisterEditor (QWidget *);
   452 
   453 private: 
   454 	QPointF contextPos;					//!< local position during context menu
   455 public:
   456 	void setContextPos (QPointF);		//!< local position during context menu
   457 	void unsetContextPos ();			//!< forget local position after context menu
   458 
   459 	void updateNoteFlag();				//!< Signal origination in TextEditor
   460 	void reposition();					//!< Call reposition for all MCOs
   461 	void setHideTmpMode (TreeItem::HideTmpMode mode);	
   462 
   463 	void emitNoteHasChanged (TreeItem *ti);
   464 	void emitDataHasChanged (TreeItem *ti);
   465 
   466 signals:
   467 	void noteHasChanged (QModelIndex ix);
   468 	void newChildObject(QModelIndex ix);
   469 
   470 private:
   471 	MapEditor *mapEditor;
   472 
   473 	QColor defLinkColor;		// default color for links
   474 	QColor defXLinkColor;		// default color for xlinks
   475 	int defXLinkWidth;			// default width for xlinks
   476 	LinkableMapObj::ColorHint linkcolorhint;// use heading color or own color
   477 	LinkableMapObj::Style linkstyle;		// default style for links
   478 
   479 public:
   480 	void setMapLinkStyle (const QString &);	// Set style of link
   481 	LinkableMapObj::Style getMapLinkStyle ();	// requested in LMO
   482 	void setMapDefLinkColor(QColor);		// default color of links
   483 	void setMapLinkColorHintInt();			// color of links
   484 	void setMapLinkColorHint(LinkableMapObj::ColorHint);// color of links
   485 	void toggleMapLinkColorHint();			// after changing linkStyles
   486     void selectMapBackgroundImage();
   487     void setMapBackgroundImage(const QString &);
   488     void selectMapBackgroundColor();
   489     void setMapBackgroundColor(QColor);
   490     QColor getMapBackgroundColor();
   491 
   492 
   493 	LinkableMapObj::ColorHint getMapLinkColorHint();
   494 	QColor getMapDefLinkColor();
   495 	void setMapDefXLinkColor(QColor);
   496 	QColor getMapDefXLinkColor();
   497 	void setMapDefXLinkWidth (int);
   498 	int getMapDefXLinkWidth();
   499 
   500 	/*!  Move absolutly to (x,y).  */	
   501     void move    (const double &x, const double &y);
   502 
   503 	/*!  Move relativly to (x,y).  */	
   504     void moveRel (const double &x, const double &y);
   505 
   506 ////////////////////////////////////////////
   507 // Animation  **experimental**
   508 ////////////////////////////////////////////
   509 private:	
   510 	QTimer *animationTimer;
   511 	bool animationUse;
   512 	uint animationTicks;
   513 	uint animationInterval;
   514 	int timerId;				// animation timer
   515 	QList <MapObj*> animObjList;// list with animated objects //FIXME-2 should go to MapEditor
   516 
   517 private slots:
   518 	void animate();						//!< Called by timer to animate stuff
   519 public:
   520 	void startAnimation(BranchObj *bo, const QPointF &start, const QPointF &dest);
   521 	void stopAnimation(MapObj *mo);
   522 
   523 ////////////////////////////////////////////
   524 // Network related 
   525 ////////////////////////////////////////////
   526 public:
   527     /*! \brief Networking states
   528 		
   529 		In Network modus we want to switch of saveState, autosave, ...
   530 	*/
   531 	enum NetState {
   532 		Offline,			//!< Offline
   533 		Client,				//!< I am the client and connected to server
   534 		Server				//!< I am the server
   535 	};
   536 
   537 private:
   538 	// Network connections **Experimental**
   539 	NetState netstate;			// offline, client, server
   540 	QTcpServer *tcpServer;		// Act as server in conference mode (experimental)
   541 	QList <QTcpSocket*> clientList;		// List of connected clients
   542 	quint16 sendCounter;		// Increased with every sent command
   543 
   544 	QTcpSocket	*clientSocket;	// socket of this client
   545 	QString server;				// server address of this client
   546 	int port;					// server port of this client
   547 
   548 
   549 
   550 protected:
   551 	void sendSelection();
   552 
   553 public:
   554 	void newServer();
   555 	void connectToServer();
   556 
   557 private slots:	
   558 	void newClient();
   559 	void sendData(const QString &s);
   560 	void readData();
   561 	void displayNetworkError (QAbstractSocket::SocketError);
   562 
   563 ////////////////////////////////////////////
   564 // DBUS related 
   565 ////////////////////////////////////////////
   566 
   567 private:
   568 AdaptorModel *adaptorModel; //FIXME-3
   569 
   570 public slots:
   571 	void testslot();
   572 
   573 ////////////////////////////////////////////
   574 // Selection related 
   575 ////////////////////////////////////////////
   576 private:
   577 	TreeItem *latestAddedItem;				// latest added object, reset on setChanged()
   578 
   579 public:
   580 	void setSelectionModel(QItemSelectionModel *);		// Set common selectionModel
   581 	QItemSelectionModel* getSelectionModel();
   582 
   583 	void setSelectionBlocked(bool);
   584 	bool isSelectionBlocked();
   585 
   586 	bool select ();							//! select by using common QItemSelectionModel
   587 	bool select (const QString &);			//! Select by string
   588 	bool select (LinkableMapObj *lmo);		//! Select by pointer to LMO
   589 	bool select (TreeItem *ti );			//! Select by pointer to TreeItem
   590 	bool select (const QModelIndex &index);	//! Select by ModelIndex
   591 	void unselect();
   592 	bool reselect();
   593 
   594 	void emitShowSelection();				//!< Show selection in all views
   595 signals:
   596 	void showSelection();
   597 
   598 public:	
   599     bool selectFirstBranch();
   600     bool selectLastBranch();
   601 	bool selectLastSelectedBranch();
   602 	bool selectParent();
   603 
   604 public:
   605 	TreeItem::Type selectionType();
   606 	LinkableMapObj* getSelectedLMO();
   607 	BranchObj* getSelectedBranchObj();	// FIXME-3 replace by item...
   608 	BranchItem* getSelectedBranch();
   609 	ImageItem* getSelectedImage();
   610 	AttributeItem* getSelectedAttribute();
   611 	TreeItem* getSelectedItem();
   612 	QModelIndex getSelectedIndex();
   613 	QString getSelectString ();
   614 	QString getSelectString (LinkableMapObj *lmo);
   615 	QString getSelectString (TreeItem *item);
   616 	
   617 	
   618 signals:
   619 	void selectionChanged(const QItemSelection &newsel, const QItemSelection &oldsel);
   620 
   621 public:
   622 	void emitSelectionChanged(const QItemSelection &oldsel);
   623 	void emitSelectionChanged();
   624 	void selectMapLinkColor();
   625     void selectMapSelectionColor();
   626 private:	
   627     void setSelectionColorInt(QColor);
   628 	QItemSelectionModel *selModel;
   629 	QString lastSelectString;
   630 	bool selectionBlocked;		//! Used to block changes of selection while editing a heading
   631 
   632 public:	
   633     void setSelectionColor(QColor);
   634     QColor getSelectionColor();
   635 };
   636 
   637 #endif