insilmaril@0: #ifndef LINKABLEMAPOBJ_H insilmaril@0: #define LINKABLEMAPOBJ_H insilmaril@0: insilmaril@473: #include "animpoint.h" insilmaril@0: #include "noteobj.h" insilmaril@0: #include "headingobj.h" insilmaril@0: #include "flagrowobj.h" insilmaril@408: insilmaril@0: insilmaril@0: #define MAX_DEPTH 999 insilmaril@0: insilmaril@473: insilmaril@473: /*! \brief This class adds links to MapObj insilmaril@473: insilmaril@473: The links are connecting the branches (BranchObj) and images (FloatImageObj) in the map. insilmaril@473: */ insilmaril@0: insilmaril@0: class LinkableMapObj:public QObject, public MapObj { insilmaril@0: Q_OBJECT insilmaril@0: public: insilmaril@486: /*! Orientation of an object depends on the position relative to the parent */ insilmaril@473: enum Orientation { insilmaril@473: UndefinedOrientation, //!< Undefined insilmaril@473: LeftOfCenter, //!< Object is left of center insilmaril@473: RightOfCenter //!< Object is right of center insilmaril@473: }; insilmaril@473: insilmaril@473: /*! Various drawing styles for links */ insilmaril@473: enum Style { insilmaril@473: UndefinedStyle, //!< Undefined insilmaril@473: Line, //!< Straight line insilmaril@473: Parabel, //!< Parabel insilmaril@473: PolyLine, //!< Polygon (thick line) insilmaril@473: PolyParabel //!< Thick parabel insilmaril@473: }; insilmaril@473: insilmaril@473: /*! Vertical position of link in object */ insilmaril@473: enum Position { insilmaril@473: Middle, //!< Link is drawn in the middle of object insilmaril@473: Bottom //!< Link is drawn at bottom of object insilmaril@473: }; insilmaril@473: insilmaril@473: /*! Hint if link should use the default link color or the color of heading */ insilmaril@473: enum ColorHint { insilmaril@473: DefaultColor, //!< Link uses the default color insilmaril@473: HeadingColor //!< Link uses the color of heading insilmaril@473: }; insilmaril@473: insilmaril@0: LinkableMapObj (); insilmaril@408: LinkableMapObj (QGraphicsScene*); insilmaril@0: LinkableMapObj (LinkableMapObj*); insilmaril@0: ~LinkableMapObj (); insilmaril@0: virtual void delLink(); insilmaril@0: virtual void init (); insilmaril@0: virtual void copy (LinkableMapObj*); insilmaril@0: void setChildObj (LinkableMapObj*); insilmaril@0: virtual void setParObj (LinkableMapObj*); insilmaril@408: virtual void setParObjTmp (LinkableMapObj*,QPointF,int); // Only for moving Obj around insilmaril@0: virtual void unsetParObjTmp(); // reuse original ParObj insilmaril@164: virtual bool hasParObjTmp(); insilmaril@218: insilmaril@218: virtual void setUseRelPos (const bool&); insilmaril@218: virtual void setRelPos(); // set relPos to current parentPos insilmaril@408: virtual void setRelPos(const QPointF&); insilmaril@408: virtual QPointF getRelPos(); insilmaril@218: virtual void setUseOrientation (const bool &); insilmaril@218: insilmaril@218: insilmaril@408: virtual qreal getTopPad(); insilmaril@408: virtual qreal getLeftPad(); insilmaril@408: virtual qreal getRightPad(); insilmaril@473: Style getDefLinkStyle(); insilmaril@473: void setLinkStyle(Style); insilmaril@473: Style getLinkStyle(); insilmaril@160: void setHideLinkUnselected(bool); insilmaril@160: bool getHideLinkUnselected(); insilmaril@473: void setLinkPos (Position); insilmaril@473: Position getLinkPos (); insilmaril@0: insilmaril@531: virtual void setID (const QString &s); insilmaril@531: virtual QString getID (); insilmaril@531: insilmaril@0: virtual void setLinkColor(); // sets color according to colorhint, overloaded insilmaril@0: virtual void setLinkColor(QColor); insilmaril@0: QColor getLinkColor(); insilmaril@0: virtual void setVisibility (bool); insilmaril@388: virtual void setOrientation(); insilmaril@0: virtual void updateLink(); // update parPos and childPos insilmaril@0: // depending on pos insilmaril@0: // redraw link with given style insilmaril@0: LinkableMapObj* getChildObj(); // returns pointer to fromObj insilmaril@0: LinkableMapObj* getParObj(); // returns pointer to toObj insilmaril@106: virtual LinkableMapObj* findObjBySelect(QString s); // find obj by selectstring insilmaril@388: virtual void setDockPos()=0; // sets childPos and parPos insilmaril@408: QPointF getChildPos(); // returns pos where childs dock insilmaril@408: QPointF getParPos(); // returns pos where parents dock insilmaril@473: Orientation getOrientation(); // get orientation insilmaril@0: virtual int getDepth(); // return depth insilmaril@0: virtual void setMapEditor(MapEditor*); // set MapEditor (needed in LMO::updateNoteFlag) insilmaril@0: virtual MapEditor* getMapEditor(); // get MapEditor (usually from parent); insilmaril@408: virtual QPointF getRandPos(); // make randomised position insilmaril@0: insilmaril@408: //virtual void alignRelativeTo(const QPointF ); insilmaril@0: virtual void reposition(); insilmaril@0: virtual void requestReposition(); // do reposition after next user event insilmaril@0: virtual void forceReposition(); // to force a reposition now (outside insilmaril@0: // of mapeditor e.g. in noteeditor insilmaril@0: virtual bool repositionRequested(); insilmaril@0: insilmaril@408: //virtual QRectF getTotalBBox(); // return BBox including childs insilmaril@408: //virtual QRectF getBBoxSizeWithChilds();// return size of BBox including childs insilmaril@0: virtual void calcBBoxSizeWithChilds()=0;// calc size of BBox including childs recursivly insilmaril@0: insilmaril@0: virtual void select(); insilmaril@0: virtual void unselect(); insilmaril@0: virtual QString getSelectString()=0; insilmaril@408: //virtual QString saveToDir (const QString&,const QString&, const QPointF&);// Save data to XML insilmaril@0: insilmaril@0: protected: insilmaril@408: void parabel(QPolygonF &,double,double,double,double); // Create Parabel connecting two points insilmaril@160: QString getLinkAttr(); insilmaril@160: insilmaril@408: QPointF childPos; insilmaril@408: QPointF parPos; insilmaril@0: bool link2ParPos; // While moving around, sometimes link to parent insilmaril@442: MapEditor* mapEditor; // for and toggleScroll(), get default styles insilmaril@442: // and mapEditor->updateActions() insilmaril@442: // and mapEditor->updateSelection() insilmaril@473: Orientation orientation; insilmaril@408: qreal linkwidth; // width of a link insilmaril@0: int depth; // depth: undef=-1 mapCenter=0 branch=1..n insilmaril@408: QRectF bboxTotal; // bounding box including childs insilmaril@0: insilmaril@0: LinkableMapObj* childObj; insilmaril@0: LinkableMapObj* parObj; insilmaril@0: LinkableMapObj* parObjTmpBuf; // temporary buffer the original parent insilmaril@408: qreal bottomlineY; // vertical offset of dockpos to pos insilmaril@0: insilmaril@0: int thickness_start; // for StylePoly* insilmaril@473: Style style; // Current style insilmaril@473: Position linkpos; // Link at bottom of object or middle of height insilmaril@0: QColor linkcolor; // Link color insilmaril@408: QPen pen; insilmaril@408: QGraphicsLineItem* l; // line style insilmaril@408: QGraphicsPolygonItem* p; // poly styles insilmaril@0: int arcsegs; // arc: number of segments insilmaril@408: QList segment; // a part of e.g. the parabel insilmaril@408: QPolygonF pa0; // For drawing of PolyParabel and PolyLine insilmaril@408: QPolygonF pa1; // For drawing of PolyParabel insilmaril@408: QPolygonF pa2; // For drawing of PolyParabel insilmaril@408: QGraphicsLineItem* bottomline; // on bottom of BBox insilmaril@0: bool repositionRequest; // insilmaril@0: insilmaril@0: bool selected; // Used for marking the selection insilmaril@160: bool hideLinkUnselected; // to hide links if unselected insilmaril@408: qreal topPad, botPad, insilmaril@175: leftPad, rightPad; // padding within bbox insilmaril@175: insilmaril@473: QPointF relPos; // position relative to childPos of parent insilmaril@473: //AnimPoint relPos; // position relative to childPos of parent insilmaril@218: bool useRelPos; insilmaril@218: bool useOrientation; insilmaril@531: insilmaril@531: QString id; // id set during load/save currently used for xLinks insilmaril@0: }; insilmaril@0: #endif