diff options
Diffstat (limited to 'src/icndocument.h')
-rw-r--r-- | src/icndocument.h | 280 |
1 files changed, 280 insertions, 0 deletions
diff --git a/src/icndocument.h b/src/icndocument.h new file mode 100644 index 0000000..7a5b126 --- /dev/null +++ b/src/icndocument.h @@ -0,0 +1,280 @@ +/*************************************************************************** + * Copyright (C) 2005 by David Saxton * + * [email protected] * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + ***************************************************************************/ + +#ifndef ICNDOCUMENT_H +#define ICNDOCUMENT_H + +#include "itemdocument.h" + + +class Cells; +class CNItem; +class CNItemGroup; +class Connector; +class ECNode; +class FlowContainer; +class Node; +class NodeGroup; + +typedef QValueList<QGuardedPtr<Connector> > ConnectorList; +typedef QValueList<QGuardedPtr<Node> > NodeList; +typedef QValueList<NodeGroup*> NodeGroupList; +typedef QValueList<QGuardedPtr<NodeGroup> > GuardedNodeGroupList; + +/** +@author David Saxton +*/ +class ICNDocument : public ItemDocument +{ +Q_OBJECT +public: + ICNDocument( const QString &caption, KTechlab *ktechlab, const char *name ); + virtual ~ICNDocument(); + + enum hit_score + { + hs_none = 0, + hs_connector = 4, + hs_item = 1000 + }; + + virtual View *createView( ViewContainer *viewContainer, uint viewAreaId, const char *name = 0l ); + + /** + * Will attempt to create an item with the given id at position p. Some item + * (such as PIC/START) have restrictions, and can only have one instance of + * themselves on the canvas, and adds the operation to the undo list + */ + virtual Item* addItem( const QString &id, const QPoint &p, bool newItem ); + /** + * Creates a connector between two nodes, and returns a pointer to it + * and adds the operation to the undo list + */ + Connector* createConnector( const QString &startNodeId, const QString &endNodeId, QPointList *pointList = 0L ); + /** + * short for casting whatever itemWithID(id) returns + */ + CNItem* cnItemWithID( const QString &id ); + /** + * Returns a pointer to a node on the canvas with the given id, + * or NULL if no such node exists + */ + Node* nodeWithID( const QString &id ); + /** + * Returns a pointer to a Connector on the canvas with the given id, + * or NULL if no such Connector exists + */ + Connector* connectorWithID( const QString &id ); + /** + * Adds a QCanvasItem to the delete list to be deleted, + * when flushDeleteList() is called + */ + virtual void appendDeleteList( QCanvasItem *qcanvasItem ); + /** + * Permantly deletes all items that have been added to the delete list with + * the appendDeleteList( QCanvasItem *qcanvasItem ) function. + */ + virtual void flushDeleteList(); + /** + * Reinherit this function to perform special checks on whether the two + * given QCanvasItems (either nodes or connectors or both) can be + * connected together. + */ + virtual bool canConnect( QCanvasItem *qcanvasItem1, QCanvasItem *qcanvasItem2 ) const; + virtual void copy(); + virtual void selectAll(); + + + virtual bool registerItem( QCanvasItem *qcanvasItem ); + /** + * Returns a pointer to the 2-dimension array of ICNDocument cells. + */ + Cells *cells() const { return m_cells; } + /** + * Returns true if the cell-reference given by x and y is valid (i.e. + * greater than 0, but within the m_cells boundary) + */ + inline bool isValidCellReference( const uint x, const uint y ) const + { + return ( x<m_cellsX && y<m_cellsY ); + } + /** + * Adds score to the cells at the given cell referece + */ + void addCPenalty( int x, int y, int score ); + /** + * If there are two connectors joined to a node, then they can be merged + * into one connector. The node will not be removed. + * @param node The node between the two connectors + * @param noCreate If true, no new connectors will be created + * @returns true if it was successful in merging the connectors + */ + bool joinConnectors( Node *node ); + static int gridSnap( int pos ); /// Returns 'pos' when snapped to grid + static QPoint gridSnap( const QPoint &pos ); + /** + * Returns true if the CNItem is valid - e.g. will return true for a + * component in a circuit, but not in a pic program + */ + virtual bool isValidItem( Item *item ) = 0; + virtual bool isValidItem( const QString &itemId ) = 0; + ConnectorList getCommonConnectors( const ItemList &list ); + NodeList getCommonNodes( const ItemList &list ); + const NodeList & nodeList() const { return m_nodeList; } + const ConnectorList & connectorList() const { return m_connectorList; } + const GuardedNodeGroupList & nodeGroupList() const { return m_nodeGroupList; } + virtual ItemGroup *selectList() const; + /** + * Creates a connector from node1 to node2. If pointList is non-null, then the + * connector will be assigned those points + */ + Connector * createConnector( Node *node1, Node *node2, QPointList *pointList = 0L ); + /** + * Splits Connector con into two connectors at point pos2, and creates a connector from the node + * to the intersection of the two new connectors. If pointList is non-null, then the new connector + * from the node will be assigned those points + */ + Connector * createConnector( Node *node, Connector *con, const QPoint &pos2, QPointList *pointList = 0L ); + /** + * Splits con1 and con2 into two new connectors each at points pos1 and pos2, and creates a new connector + * between the two points of intersection given by pos1 and pos2. If pointList is non-null, then the new + * connector between the two points will be assigned those points + */ + Connector * createConnector( Connector *con1, Connector *con2, const QPoint &pos1, const QPoint &pos2, QPointList *pointList = 0L ); + /** + * Returns the flowcontainer at the given position at the highest level that + * is not in the current select list, or 0l if there isn't one + */ + FlowContainer *flowContainer( const QPoint &pos ); + /** + * Sets the drag (e.g. horizontal arrow) cursor for resizing a CNItem, depending on the corner clicked on + */ + void setItemResizeCursor( int cornerType ); + + void getTranslatable( const ItemList & itemList, ConnectorList * fixedConnectors = 0l, ConnectorList * translatableConnectors = 0l, NodeGroupList * translatableNodeGroups = 0l ); + /** + * Reroutes invalidated directors. You shouldn't call this function + * directly - instead use ItemDocument::requestEvent. + */ + void rerouteInvalidatedConnectors(); + /** + * Assigns the orphan nodes into NodeGroups. You shouldn't call this + * function directly - instead use ItemDocument::requestEvent. + */ + void slotAssignNodeGroups(); + +public slots: + /** + * Deletes all items in the selected item list, along with associated + * connectors, etc, and adds the operation to the undo list + */ + virtual void deleteSelection(); + /** + * This function looks at all the connectors and the nodes, determines + * which ones need rerouting, and then reroutes them + */ + void requestRerouteInvalidatedConnectors(); + /** + * Remaps the 2-dimension array of ICNDocument cells, and the various + * hitscores / etc associated with them. This is used for connector + * routing, and should be called after e.g. items have been moved + */ + void createCellMap(); + /** + * Call this to request NodeGroup reassignment. + */ + void slotRequestAssignNG(); + +signals: + /** + * Emitted when a Connector is added + */ + void connectorAdded( Connector *connector ); + /** + * Emitted when a Node is added + */ + void nodeAdded( Node *node ); + +protected: + /** + * Adds all connector points from the items (used in connector routing). + * This only needs to be called when connector(s) need routing. + */ + void addAllItemConnectorPoints(); + virtual void fillContextMenu( const QPoint &pos ); + /** + * Creates a new NodeGroup to control the node, if there does not already + * exist a NodeGroup containing the given node. The associated nodes will + * also be added to the NodeGroup. + * @returns a pointer to the NodeGroup if one was created, or a pointer to the existing one containing that node + */ + NodeGroup* createNodeGroup( Node *node ); + /** + * Finds (and deletes if found) the NodeGroup containing the given node. + * @returns true if the NodeGroup was found and deleted + */ + bool deleteNodeGroup( Node *node ); + + friend class CanvasEditor; + + Cells *m_cells; + uint m_cellsX, m_cellsY; + NodeList m_nodeList; + ConnectorList m_connectorList; + CNItemGroup *m_selectList; // Selected objects + GuardedNodeGroupList m_nodeGroupList; + +private: + QCanvasItemList m_itemDeleteList; // List of canvas items to be deleted +}; + + +/** +@author David Saxton +*/ +class DirCursor +{ +public: + static DirCursor* self(); + ~DirCursor(); + + static QPixmap leftArrow() + { + return self()->m_leftArrow; + } + + static QPixmap rightArrow() + { + return self()->m_rightArrow; + } + + static QPixmap upArrow() + { + return self()->m_upArrow; + } + + static QPixmap downArrow() + { + return self()->m_downArrow; + } + +protected: + DirCursor(); + void initCursors(); + + static DirCursor *m_self; + QPixmap m_leftArrow; + QPixmap m_rightArrow; + QPixmap m_upArrow; + QPixmap m_downArrow; +}; + + +#endif |