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@616: #define MAX_DEPTH 999 insilmaril@0: insilmaril@721: class VymModel; insilmaril@790: class TreeItem; 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@791: class LinkableMapObj:public MapObj { 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@790: LinkableMapObj (QGraphicsScene*, TreeItem *ti=NULL); insilmaril@0: LinkableMapObj (LinkableMapObj*); insilmaril@791: virtual ~LinkableMapObj (); insilmaril@0: virtual void delLink(); insilmaril@0: virtual void init (); insilmaril@0: virtual void copy (LinkableMapObj*); insilmaril@721: 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: insilmaril@408: virtual qreal getTopPad(); insilmaril@408: virtual qreal getLeftPad(); insilmaril@408: virtual qreal getRightPad(); insilmaril@786: Style getDefLinkStyle(TreeItem *parent); insilmaril@473: void setLinkStyle(Style); insilmaril@473: Style getLinkStyle(); insilmaril@779: insilmaril@779: void setHideLinkUnselected(); insilmaril@473: void setLinkPos (Position); insilmaril@473: Position getLinkPos (); insilmaril@0: insilmaril@779: 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@779: virtual void updateVisibility(); //! hides/unhides link depending on selection insilmaril@779: insilmaril@779: /*! update parPos, childPos insilmaril@779: depending on pos insilmaril@779: redraw link with given style */ insilmaril@779: virtual void updateLinkGeometry(); insilmaril@779: insilmaril@0: LinkableMapObj* getChildObj(); // returns pointer to fromObj insilmaril@0: LinkableMapObj* getParObj(); // returns pointer to toObj insilmaril@388: virtual void setDockPos()=0; // sets childPos and parPos insilmaril@721: QPointF getChildPos(); // returns pos where children dock insilmaril@408: QPointF getParPos(); // returns pos where parents dock insilmaril@473: Orientation getOrientation(); // get orientation insilmaril@408: virtual QPointF getRandPos(); // make randomised position insilmaril@0: 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@721: virtual void calcBBoxSizeWithChildren()=0;// calc size of BBox including children recursivly insilmaril@0: insilmaril@0: protected: insilmaril@408: void parabel(QPolygonF &,double,double,double,double); // Create Parabel connecting two points insilmaril@160: insilmaril@408: QPointF childPos; insilmaril@408: QPointF parPos; insilmaril@0: bool link2ParPos; // While moving around, sometimes link to parent insilmaril@721: insilmaril@473: Orientation orientation; insilmaril@408: qreal linkwidth; // width of a link insilmaril@721: QRectF bboxTotal; // bounding box including children insilmaril@0: insilmaril@773: 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@408: qreal topPad, botPad, insilmaril@175: leftPad, rightPad; // padding within bbox insilmaril@175: insilmaril@473: QPointF relPos; // position relative to childPos of parent insilmaril@218: bool useRelPos; insilmaril@531: insilmaril@0: }; insilmaril@0: #endif