vymmodel.h
author insilmaril
Thu, 01 Oct 2009 13:23:20 +0000
changeset 800 959bd133cd1a
parent 796 cf634bbf9e04
child 804 14f2b1b15242
permissions -rw-r--r--
preparing sortFilter
     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 
   258 private:
   259 	BranchItem* findCurrent;				// next object in find process
   260 	BranchItem* findPrevious;				// next object in find process
   261 	bool EOFind;							// true, if search failed
   262 public:
   263     BranchItem* findText(QString,bool);		// Find object
   264     void findReset();						// Reset Search
   265 
   266 	void setURL(const QString &url);
   267 	QString getURL();						// returns URL of selection or ""
   268 	QStringList getURLs();					// returns URLs of subtree
   269 
   270 
   271 	void setFrameType(const FrameObj::FrameType &);
   272 	void setFrameType(const QString &);
   273 	void setFramePenColor (const QColor &);
   274 	void setFrameBrushColor (const QColor &);
   275 	void setFramePadding (const int &);
   276 	void setFrameBorderWidth (const int &);
   277 	void setIncludeImagesVer(bool);
   278 	void setIncludeImagesHor(bool);
   279 	void setHideLinkUnselected (bool);
   280 
   281 	/*! Should object be hidden in exports (clouded)? */
   282 	void setHideExport(bool);			
   283 
   284 	/*! Should object be hidden in exports (clouded)? */
   285 	void toggleHideExport();		
   286 
   287     void copy();						//!< Copy to clipboard
   288 private:	
   289     void pasteNoSave(const int &n);		//!< paste clipboard to branch
   290 public:	
   291     void paste();			//!< Paste clipboard to branch and backup
   292     void cut();				//!< Cut to clipboard (and copy)
   293 
   294     bool moveUp(BranchItem *bi);	//!< Move branch up without saving state
   295     void moveUp();					//!< Move branch up with saving state
   296     bool moveDown(BranchItem *bi);	//!< Move branch down without saving state
   297     void moveDown();		//!< Move branch down
   298 	void detach();					//!< Detach branch and use as new mapcenter
   299 	void sortChildren();	//!< Sort children lexically
   300 
   301 	// The create methods are used to quickly parse a XML file
   302 	BranchItem* createMapCenter();				//!< Create MapCenter 
   303 	BranchItem* createBranch(BranchItem *dst);	//!< Create Branch
   304 	ImageItem* createImage(BranchItem *dst);	//!< Create image
   305 	XLinkItem* createXLink(BranchItem *dst,bool createMO=false);	//!< Create XLink starting at dst
   306 
   307 	AttributeItem* addAttribute();
   308 
   309 	/*! \brief Add new mapcenter
   310 
   311 	    Disclaimer: Still experimental, not fully supported yet.
   312 	*/	
   313 	BranchItem* addMapCenter();
   314 private:	
   315 	BranchItem* addMapCenter(QPointF absPos);
   316 
   317 	/*! \brief Add new branch
   318 
   319 		Depending on num the new branch is created
   320 
   321 		-3 above selection as child of selections parent
   322 		-2 as child of selection
   323 		-1 below selection as child of selections parent
   324 		0..n	insert at a specific position in selections parent
   325 		(needed for free relinking)
   326 	*/	
   327 
   328 private:	
   329     BranchItem* addNewBranchInt(BranchItem *dst, int pos);	// pos allows to add above/below selection
   330 public:	
   331 	/*! \Add new branch
   332 		
   333 		Depending on num the new branch is created
   334 		-1 above selection
   335 		 0 as child of selection
   336 		 1 below selection
   337 	*/
   338     BranchItem* addNewBranch(int pos=0);		
   339     BranchItem* addNewBranchBefore();		//!< Insert branch between selection and its parent
   340 	/*! \brief Relink a branch to a new destination dst 
   341 	    Relinks branch to dst at branch position pos. There is no saveState
   342 		here, as for example moveUp or moving in MapEditor have
   343 		different needs to call saveState
   344 		Returns true if relinking was successful.
   345 	*/	
   346 	bool relinkBranch (BranchItem* branch, BranchItem* dst, int pos =-1);	
   347 	bool relinkImage  (ImageItem* image, BranchItem* dst);	
   348 
   349     void deleteSelection();				//!< Delete selection
   350 	void deleteKeepChildren();			//!< remove branch, but keep children
   351 	void deleteChildren();				//!< keep branch, but remove children
   352 
   353 	TreeItem* deleteItem(TreeItem*);	//!< Delete item and return parent (if parent!= rootItem)
   354 	void clearItem (TreeItem* ti);		//!< Remove all children of TreeItem ti
   355 	bool scrollBranch(BranchItem *);
   356 	bool unscrollBranch(BranchItem *);
   357 public:	
   358     void toggleScroll();
   359     void unscrollChildren();
   360 	void emitExpandAll();
   361 signals:	
   362 	void expandAll();
   363 
   364 public:	
   365 	void toggleStandardFlag (const QString &name, FlagRow *master=NULL);
   366     void addFloatImage(const QPixmap &img);
   367 
   368     void colorBranch(QColor);
   369     void colorSubtree(QColor);
   370 	QColor getCurrentHeadingColor();
   371 
   372 
   373 	void editURL();							// edit URL
   374 	void editLocalURL();					// edit URL to local file
   375 	void editHeading2URL();					// copy heading to URL
   376 	void editBugzilla2URL();				// create URL to Bugzilla
   377 	void editFATE2URL();					// create URL to FATE
   378 	void editVymLink();						// edit link to another map
   379 	void setVymLink (const QString &);	// Set vymLink for selection
   380 	void deleteVymLink();					// delete link to another map
   381 	QString getVymLink();					// return path to map
   382 	QStringList getVymLinks();				// return paths in subtree
   383 	void followXLink (int);
   384 	void editXLink (int);
   385 
   386 
   387 
   388 
   389 ////////////////////////////////////////////
   390 // Scripting
   391 ////////////////////////////////////////////
   392 public:	
   393 
   394 	/* \brief Process one command and its parameters */
   395     void parseAtom (const QString &atom);	
   396 
   397 	/* \brief Runs the script */
   398 	void runScript (QString script);
   399 
   400 private:
   401 	Parser parser;
   402 
   403 ////////////////////////////////////////////
   404 // Exports
   405 ////////////////////////////////////////////
   406 private:
   407 	TreeItem::HideTmpMode hidemode;	// true while exporting to hide some stuff
   408 
   409 public:
   410 	/*! Set or unset temporary hiding of objects during export  */
   411 	void setExportMode (bool);
   412 
   413 	/*! Save as image */
   414     void exportImage (QString fname="",bool askForName=true,QString format="PNG");
   415 
   416 
   417 	/*! Export as XTML to directory */
   418     void exportXML(QString dir="", bool askForName=true);
   419 
   420 	/*! Export as ASCII text to file */
   421 	void exportASCII (QString fname="",bool askForName=true);  
   422 
   423 	/*! Export as XHTML to directory */
   424     void exportXHTML(const QString& dir="", bool askForName=true);	
   425 
   426     /*! Export as OpenOfficeOrg presentation */
   427     void exportOOPresentation(const QString &,const QString &);	
   428 
   429 
   430 ////////////////////////////////////////////
   431 // View related
   432 ////////////////////////////////////////////
   433 public:
   434 	void registerEditor (QWidget *);
   435 	void unregisterEditor (QWidget *);
   436 
   437 private: 
   438 	QPointF contextPos;					//!< local position during context menu
   439 public:
   440 	void setContextPos (QPointF);		//!< local position during context menu
   441 	void unsetContextPos ();			//!< forget local position after context menu
   442 
   443 	void updateNoteFlag();				//!< Signal origination in TextEditor
   444 	void reposition();					//!< Call reposition for all MCOs
   445 	void setHideTmpMode (TreeItem::HideTmpMode mode);	
   446 
   447 	void emitNoteHasChanged (TreeItem *ti);
   448 	void emitDataHasChanged (TreeItem *ti);
   449 
   450 signals:
   451 	void noteHasChanged (QModelIndex ix);
   452 	void newChildObject(QModelIndex ix);
   453 
   454 private:
   455 	MapEditor *mapEditor;
   456 
   457 	QColor defLinkColor;		// default color for links
   458 	QColor defXLinkColor;		// default color for xlinks
   459 	int defXLinkWidth;			// default width for xlinks
   460 	LinkableMapObj::ColorHint linkcolorhint;// use heading color or own color
   461 	LinkableMapObj::Style linkstyle;		// default style for links
   462 
   463 public:
   464 	void setMapLinkStyle (const QString &);	// Set style of link
   465 	LinkableMapObj::Style getMapLinkStyle ();	// requested in LMO
   466 	void setMapDefLinkColor(QColor);		// default color of links
   467 	void setMapLinkColorHintInt();			// color of links
   468 	void setMapLinkColorHint(LinkableMapObj::ColorHint);// color of links
   469 	void toggleMapLinkColorHint();			// after changing linkStyles
   470     void selectMapBackgroundImage();
   471     void setMapBackgroundImage(const QString &);
   472     void selectMapBackgroundColor();
   473     void setMapBackgroundColor(QColor);
   474     QColor getMapBackgroundColor();
   475 
   476 
   477 	LinkableMapObj::ColorHint getMapLinkColorHint();
   478 	QColor getMapDefLinkColor();
   479 	void setMapDefXLinkColor(QColor);
   480 	QColor getMapDefXLinkColor();
   481 	void setMapDefXLinkWidth (int);
   482 	int getMapDefXLinkWidth();
   483 
   484 	/*!  Move absolutly to (x,y).  */	
   485     void move    (const double &x, const double &y);
   486 
   487 	/*!  Move relativly to (x,y).  */	
   488     void moveRel (const double &x, const double &y);
   489 
   490 ////////////////////////////////////////////
   491 // Animation  **experimental**
   492 ////////////////////////////////////////////
   493 private:	
   494 	QTimer *animationTimer;
   495 	bool animationUse;
   496 	uint animationTicks;
   497 	uint animationInterval;
   498 	int timerId;				// animation timer
   499 	QList <MapObj*> animObjList;// list with animated objects //FIXME-2 should go to MapEditor
   500 
   501 private slots:
   502 	void animate();						//!< Called by timer to animate stuff
   503 public:
   504 	void startAnimation(BranchObj *bo, const QPointF &start, const QPointF &dest);
   505 	void stopAnimation(MapObj *mo);
   506 
   507 ////////////////////////////////////////////
   508 // Network related 
   509 ////////////////////////////////////////////
   510 public:
   511     /*! \brief Networking states
   512 		
   513 		In Network modus we want to switch of saveState, autosave, ...
   514 	*/
   515 	enum NetState {
   516 		Offline,			//!< Offline
   517 		Client,				//!< I am the client and connected to server
   518 		Server				//!< I am the server
   519 	};
   520 
   521 private:
   522 	// Network connections **Experimental**
   523 	NetState netstate;			// offline, client, server
   524 	QTcpServer *tcpServer;		// Act as server in conference mode (experimental)
   525 	QList <QTcpSocket*> clientList;		// List of connected clients
   526 	quint16 sendCounter;		// Increased with every sent command
   527 
   528 	QTcpSocket	*clientSocket;	// socket of this client
   529 	QString server;				// server address of this client
   530 	int port;					// server port of this client
   531 
   532 
   533 
   534 protected:
   535 	void sendSelection();
   536 
   537 public:
   538 	void newServer();
   539 	void connectToServer();
   540 
   541 private slots:	
   542 	void newClient();
   543 	void sendData(const QString &s);
   544 	void readData();
   545 	void displayNetworkError (QAbstractSocket::SocketError);
   546 
   547 ////////////////////////////////////////////
   548 // DBUS related 
   549 ////////////////////////////////////////////
   550 
   551 private:
   552 AdaptorModel *adaptorModel; //FIXME-3
   553 
   554 public slots:
   555 	void testslot();
   556 
   557 ////////////////////////////////////////////
   558 // Selection related 
   559 ////////////////////////////////////////////
   560 private:
   561 	TreeItem *latestAddedItem;				// latest added object, reset on setChanged()
   562 
   563 public:
   564 	void setSelectionModel(QItemSelectionModel *);		// Set common selectionModel
   565 	QItemSelectionModel* getSelectionModel();
   566 
   567 	void setSelectionBlocked(bool);
   568 	bool isSelectionBlocked();
   569 
   570 	bool select ();							//! select by using common QItemSelectionModel
   571 	bool select (const QString &);			//! Select by string
   572 	bool select (LinkableMapObj *lmo);		//! Select by pointer to LMO
   573 	bool select (TreeItem *ti );			//! Select by pointer to TreeItem
   574 	bool select (const QModelIndex &index);	//! Select by ModelIndex
   575 	void unselect();
   576 	bool reselect();
   577 
   578 	void emitShowSelection();				//!< Show selection in all views
   579 signals:
   580 	void showSelection();
   581 
   582 public:	
   583     bool selectFirstBranch();
   584     bool selectLastBranch();
   585 	bool selectLastSelectedBranch();
   586 	bool selectParent();
   587 
   588 public:
   589 	TreeItem::Type selectionType();
   590 	LinkableMapObj* getSelectedLMO();
   591 	BranchObj* getSelectedBranchObj();	// FIXME-3 replace by item...
   592 	BranchItem* getSelectedBranch();
   593 	ImageItem* getSelectedImage();
   594 	AttributeItem* getSelectedAttribute();
   595 	TreeItem* getSelectedItem();
   596 	QModelIndex getSelectedIndex();
   597 	QString getSelectString ();
   598 	QString getSelectString (LinkableMapObj *lmo);
   599 	QString getSelectString (TreeItem *item);
   600 	
   601 	
   602 signals:
   603 	void selectionChanged(const QItemSelection &newsel, const QItemSelection &oldsel);
   604 
   605 public:
   606 	void emitSelectionChanged(const QItemSelection &oldsel);
   607 	void emitSelectionChanged();
   608 	void selectMapLinkColor();
   609     void selectMapSelectionColor();
   610 private:	
   611     void setSelectionColorInt(QColor);
   612 	QItemSelectionModel *selModel;
   613 	QString lastSelectString;
   614 	bool selectionBlocked;		//! Used to block changes of selection while editing a heading
   615 
   616 public:	
   617     void setSelectionColor(QColor);
   618     QColor getSelectionColor();
   619 };
   620 
   621 #endif