#ifndef LINKABLEMAPOBJ_H #define LINKABLEMAPOBJ_H #include "animpoint.h" #include "vymnote.h" #include "headingobj.h" #include "flagrowobj.h" #define MAX_DEPTH 999 class VymModel; class TreeItem; /*! \brief This class adds links to MapObj The links are connecting the branches (BranchObj) and images (FloatImageObj) in the map. */ class LinkableMapObj:public MapObj { public: /*! Orientation of an object depends on the position relative to the parent */ enum Orientation { UndefinedOrientation, //!< Undefined LeftOfCenter, //!< Object is left of center RightOfCenter //!< Object is right of center }; /*! Various drawing styles for links */ enum Style { UndefinedStyle, //!< Undefined Line, //!< Straight line Parabel, //!< Parabel PolyLine, //!< Polygon (thick line) PolyParabel //!< Thick parabel }; /*! Vertical position of link in object */ enum Position { Middle, //!< Link is drawn in the middle of object Bottom //!< Link is drawn at bottom of object }; /*! Hint if link should use the default link color or the color of heading */ enum ColorHint { DefaultColor, //!< Link uses the default color HeadingColor //!< Link uses the color of heading }; LinkableMapObj (); LinkableMapObj (QGraphicsItem*, TreeItem *ti=NULL); virtual ~LinkableMapObj (); protected: virtual void init (); virtual void createBottomLine(); public: virtual void delLink(); virtual void copy (LinkableMapObj*); void setChildObj (LinkableMapObj*); virtual void setParObj (LinkableMapObj*); virtual void setParObjTmp (LinkableMapObj*,QPointF,int); // Only for moving Obj around virtual void unsetParObjTmp(); // reuse original ParObj virtual bool hasParObjTmp(); virtual void setUseRelPos (const bool&); virtual bool getUseRelPos(); virtual void setRelPos(); // set relPos to current parentPos virtual void setRelPos(const QPointF&); virtual QPointF getRelPos(); virtual qreal getTopPad(); virtual qreal getLeftPad(); virtual qreal getRightPad(); Style getDefLinkStyle(TreeItem *parent); void setLinkStyle(Style); Style getLinkStyle(); void setLinkPos (Position); Position getLinkPos (); virtual void setLinkColor(); // sets color according to colorhint, overloaded virtual void setLinkColor(QColor); QColor getLinkColor(); virtual void setVisibility (bool); virtual void setOrientation(); virtual void updateVisibility(); //! hides/unhides link depending on selection /*! update parPos, childRefPos depending on pos redraw link with given style */ virtual void updateLinkGeometry(); virtual void setDockPos()=0; // sets childRefPos and parPos QPointF getChildRefPos(); // returns pos where children dock QPointF getFloatRefPos(); // returns pos where floats dock QPointF getParPos(); // returns pos where parents dock Orientation getOrientation(); // get orientation virtual void reposition(); virtual void requestReposition(); // do reposition after next user event virtual void forceReposition(); // to force a reposition now (outside // of mapeditor e.g. in noteeditor virtual bool repositionRequested(); virtual void calcBBoxSizeWithChildren()=0;// calc size of BBox including children recursivly protected: void parabel(QPolygonF &, qreal, qreal, qreal, qreal); // Create Parabel connecting two points QPointF childRefPos; QPointF floatRefPos; QPointF parPos; bool link2ParPos; // While moving around, sometimes link to parent Orientation orientation; qreal linkwidth; // width of a link QRectF bboxTotal; // bounding box including children LinkableMapObj* parObj; LinkableMapObj* parObjTmpBuf; // temporary buffer the original parent bool tmpParent; int thickness_start; // for StylePoly* Style style; // Current style Position linkpos; // Link at bottom of object or middle of height QColor linkcolor; // Link color QPen pen; QGraphicsLineItem* l; // line style QGraphicsPolygonItem* p; // poly styles int arcsegs; // arc: number of segments QList segment; // a part of e.g. the parabel QPolygonF pa0; // For drawing of PolyParabel and PolyLine QPolygonF pa1; // For drawing of PolyParabel QPolygonF pa2; // For drawing of PolyParabel QGraphicsLineItem* bottomline; // on bottom of BBox bool useBottomline; //! Hint if bottomline should be used qreal bottomlineY; // vertical offset of dockpos to pos bool repositionRequest; // qreal topPad, botPad, leftPad, rightPad; // padding within bbox QPointF relPos; // position relative to childRefPos of parent bool useRelPos; }; #endif