summaryrefslogtreecommitdiffstats
path: root/src/itemdocument.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/itemdocument.h')
-rw-r--r--src/itemdocument.h449
1 files changed, 449 insertions, 0 deletions
diff --git a/src/itemdocument.h b/src/itemdocument.h
new file mode 100644
index 0000000..e9e9f6f
--- /dev/null
+++ b/src/itemdocument.h
@@ -0,0 +1,449 @@
+/***************************************************************************
+ * Copyright (C) 2005 by David Saxton *
+ * *
+ * 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 ITEMDOCUMENT_H
+#define ITEMDOCUMENT_H
+
+#include <document.h>
+#include <qcanvas.h>
+#include <qptrstack.h>
+#include <qvaluevector.h>
+
+class Canvas;
+class CanvasTip;
+class Connector;
+class CMManager;
+class ECNode;
+class Item;
+class ItemDocumentData;
+class ItemGroup;
+class KTechlab;
+class Operation;
+
+class KActionMenu;
+class QCanvasItem;
+
+typedef QPtrStack<ItemDocumentData> IDDStack;
+typedef QGuardedPtr<Item> GuardedItem;
+typedef QMap< int, GuardedItem > IntItemMap;
+typedef QValueList<GuardedItem> ItemList;
+typedef QValueList<QPoint> QPointList;
+
+/**
+@author David Saxton
+*/
+class ItemDocument : public Document
+{
+ Q_OBJECT
+ public:
+ ItemDocument( const QString &caption, KTechlab *ktechlab, const char *name = 0 );
+ ~ItemDocument();
+
+ class Z
+ {
+ public:
+ enum
+ {
+ Select = 10000000,
+ Connector = 20000000,
+ Item = 30000000,
+ RaisedItem = 40000000,
+ ResizeHandle = 50000000,
+ Tip = 60000000,
+ ConnectorCreateLine = 70000000,
+
+ // How much "Z" separates items stacked on each other
+ DeltaItem = 10000
+ };
+ };
+
+ class RTTI
+ {
+ public:
+ enum
+ {
+ None = 1000,
+ CNItem = 1001,
+ Node = 1002,
+ Connector = 1003,
+ Pin = 1004,
+ Widget = 1005,
+ MechanicsItem = 1006,
+ ResizeHandle = 1007,
+ DrawPart = 1008,
+ ConnectorLine = 1009
+ };
+ };
+
+ /**
+ * Some things (such as the canvas getting resized, connectors being
+ * invalidated, need to be done after editing operations have finished,
+ * etc, and they also need to be done in the order given in the
+ * enumeration below.
+ */
+ class ItemDocumentEvent
+ {
+ public: enum type
+ {
+ ResizeCanvasToItems = 1 << 0,
+ UpdateNodeGroups = 1 << 1,
+ RerouteInvalidatedConnectors = 1 << 2,
+ UpdateZOrdering = 1 << 3,
+ };
+ };
+
+ virtual void fileSave();
+ virtual void fileSaveAs();
+ virtual void print();
+ virtual bool openURL( const KURL &url );
+ /**
+ * Attempt to register the item, returning true iff successful
+ */
+ virtual bool registerItem( QCanvasItem *qcanvasItem );
+ /**
+ * 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 ) = 0;
+ /**
+ * @returns A pointer to the canvas
+ */
+ Canvas *canvas() const { return m_canvas; }
+ /**
+ * Attemtps to register a unique id for the canvas view of an item on the
+ * canvas. If the id does not already exist, will return true; otherwise
+ * the function will return false.
+ */
+ bool registerUID( const QString & uid );
+ /**
+ * Generates a unique id based on a possibly unique component name.
+ */
+ QString generateUID( QString name );
+ /**
+ * Unlists the given id as one that is used.
+ * @see registerUID
+ */
+ void unregisterUID( const QString & uid );
+ /**
+ * @return Whether or not the item is valid; i.e. is appropriate to the
+ * document being edited, and does not have other special restrictions
+ * on it (such as only allowing one instance of the Start part in
+ * FlowCode).
+ */
+ virtual bool isValidItem( Item *item ) = 0;
+ /**
+ * @return Whether or not the item is valid; i.e. is appropriate to the
+ * document being edited, and does not have other special restrictions
+ * on it (such as only allowing one instance of the Start part in
+ * FlowCode).
+ */
+ virtual bool isValidItem( const QString &itemId ) = 0;
+ /**
+ * Increases the "height" of the given list of items by "one".
+ */
+ void raiseZ( const ItemList & itemList );
+ /**
+ * Decreases the "height" of the given list of items by "one".
+ */
+ void lowerZ( const ItemList & itemList );
+ /**
+ * @return ItemGroup that is used as the select list for this document.
+ */
+ virtual ItemGroup *selectList() const = 0;
+ /**
+ * Deselects any currently selected items
+ */
+ void unselectAll();
+ /**
+ * Select a list of QCanvasItem's
+ */
+ void select( const QCanvasItemList & list );
+ /**
+ * Select a QCanvasItem
+ */
+ void select( QCanvasItem * item );
+ /**
+ * Unselects the item
+ */
+ void unselect( QCanvasItem *qcanvasItem );
+ /**
+ * Deletes anything waiting to be deleted.
+ */
+ virtual void flushDeleteList() = 0;
+ /**
+ * Returns a rubber-band rectangle that contains all of the items on the
+ * canvas, padded out by a small border.
+ */
+ QRect canvasBoundingRect() const;
+ /**
+ * Returns a pointer to a Item on the canvas with the given id,
+ * or NULL if no such Item exists.
+ */
+ Item* itemWithID( const QString & );
+ /**
+ * Returns true if the the user can perform an undo action
+ * (i.e. the undo stack is not empty)
+ */
+ virtual bool isUndoAvailable() const;
+ /**
+ * Returns true if the the user can perform an redo action
+ * (i.e. the redo stack is not empty)
+ */
+ virtual bool isRedoAvailable() const;
+ /**
+ * Returns the top item at point (x, y), or NULL if there is no item there
+ */
+ QCanvasItem* itemAtTop( const QPoint &pos ) const;
+ /**
+ * Called when the canvas is clicked on with the right mouse button.
+ * Popups up a menu for editing operations
+ */
+ virtual void canvasRightClick( const QPoint &pos, QCanvasItem* item );
+ /**
+ * List of items in the ItemDocument
+ */
+ ItemList itemList() const { return m_itemList; }
+ /**
+ * Set the given QCanvasItem (which will attempt to be casted to known
+ * items to be deleted.
+ */
+ virtual void appendDeleteList( QCanvasItem * ) = 0;
+ /**
+ * Save the current state of the document to the undo/redo history.
+ * @param actionTicket if this is non-negative, and the last state save
+ * also had the same actionTicket, then the next state save will
+ * overwrite the previous state save.
+ * @see getActionTicket
+ */
+ void requestStateSave( int actionTicket = -1 );
+ /**
+ * Returns a unique id, for use in requestStateSave
+ */
+ int getActionTicket() const { return m_nextActionTicket++; }
+ /**
+ * Clears the undo / redo history
+ */
+ void clearHistory();
+ /**
+ * Requests an event to be done after other stuff (editing, etc) is finished.
+ */
+ void requestEvent( ItemDocumentEvent::type type );
+ /**
+ * Called from Canvas (when QCanvas::advance is called).
+ */
+ virtual void update();
+
+ public slots:
+ virtual void undo();
+ virtual void redo();
+ virtual void cut();
+ virtual void paste();
+ /**
+ * Selects everything in the view.
+ */
+ virtual void selectAll() = 0;
+ /**
+ * Increases the "height" of the selected items.
+ */
+ void raiseZ();
+ /**
+ * Decreases the "height" of the selected items.
+ */
+ void lowerZ();
+ /**
+ * Brings up a file dialog requesting the location of the file to export
+ * to, and then exports an image of the canvas.
+ */
+ void exportToImage();
+ /**
+ * Deletes whatever is selected.
+ */
+ virtual void deleteSelection() {};
+ /**
+ * Called when the user presses Escape (or similar)
+ */
+ void cancelCurrentOperation();
+ /**
+ * Sets the y-positions of the selected items to the average of the
+ * initial y-positions.
+ */
+ void alignHorizontally();
+ /**
+ * Sets the x-positions of the selected items to the average of the
+ * initial x-positions.
+ */
+ void alignVertically();
+ /**
+ * Averages out the horizontal spacing between the selected items.
+ */
+ void distributeHorizontally();
+ /**
+ * Averages out the vertical spacing between the selected items.
+ */
+ void distributeVertically();
+ /**
+ * Adds an items not in the Z ordering to the ordering, and removes any
+ * items from the Z ordering if they have parents. Then, calls all items
+ * found in the ordering to tell them their Z position.
+ */
+ void slotUpdateZOrdering();
+ /**
+ * Call this with ItemDocument::DrawAction to start drawing the given thing
+ */
+ void slotSetDrawAction( int da );
+ /**
+ * Sets the editing mode to repeatedly creating a CNItem
+ * with the given id. Usually called when the user double-clicks on
+ * the component box.
+ */
+ void slotSetRepeatedItemId( const QString &id );
+ /**
+ * Unsets the editing mode from repeatedly creating a CNItem
+ */
+ void slotUnsetRepeatedItemId();
+ /**
+ * Called when the user changes the configuration.
+ * This, for example, will tell the CNItems on the canvas to update
+ * their configuration.
+ */
+ virtual void slotUpdateConfiguration();
+ /**
+ * Enables / disables / selects various actions depending on
+ * what is selected or not.
+ */
+ virtual void slotInitItemActions( Item *item = 0 );
+ /**
+ * Process queued events (see ItemDocument::ItemDocumentEvent).
+ */
+ void processItemDocumentEvents();
+
+ signals:
+ /**
+ * Emitted when a Item is selected
+ */
+ void itemSelected( Item *item );
+ /**
+ * Emitted when a Item is unselected
+ */
+ void itemUnselected( Item *item = 0 );
+
+ protected:
+ /**
+ * Called from registerItem when a new item is added.
+ */
+ virtual void itemAdded( Item * item );
+ virtual void handleNewView( View *view );
+ /**
+ * Set to true to remove buttons and grid and so on from the canvas, set false to put them back
+ */
+ void setSVGExport( bool svgExport );
+ void writeFile();
+ /**
+ * Reinherit this if you want to add any options to the right-click context
+ */
+ virtual void fillContextMenu( const QPoint & pos );
+ /**
+ * Reads the background settings (grid-colour, underlying colour) from the Config settings,
+ * and generates the background pixmap from those settings
+ */
+ void updateBackground();
+ /**
+ * Sets the canvas size to both (a) containing all items present on the
+ * canvas, and (b) no smaller than the smallest view of the canvas. This
+ * function should only be called by processItemDocumentEvents - a resize
+ * request must be made with requestEvent.
+ */
+ void resizeCanvasToItems();
+
+ Canvas *m_canvas;
+ KTechlab *p_ktechlab;
+ QStringList m_idList;
+ static int m_nextActionTicket;
+ uint m_nextIdNum;
+ bool m_bIsLoading;
+ QSize m_oldCanvasSize;
+ CMManager *m_cmManager;
+ ItemList m_itemDeleteList;
+ ItemList m_itemList;
+ IDDStack m_undoStack;
+ IDDStack m_redoStack;
+ ItemDocumentData * m_currentState;
+ int m_currentActionTicket;
+ ItemDocumentData * m_savedState; // Pointer to the document data that holds the state when it saved
+ QString m_fileExtensionInfo; // For displaying in the save file dialog
+ CanvasTip * m_canvasTip;
+ IntItemMap m_zOrder;
+ KActionMenu * m_pAlignmentAction;
+ QTimer * m_pEventTimer;
+ unsigned m_queuedEvents; // OR'ed together list of ItemDocumentEvent::type
+
+ friend class ICNView;
+ friend class ItemView;
+};
+
+
+/**
+@author David Saxton
+*/
+class Canvas : public QCanvas
+{
+ Q_OBJECT
+ public:
+ Canvas( ItemDocument *itemDocument, const char * name = 0 );
+
+ /**
+ * Sets a message to be displayed on the canvas for a brief period of
+ * time. If this is called with an empty message, then any existing
+ * message will be removed.
+ */
+ void setMessage( const QString & message );
+
+ virtual void update();
+
+ public slots:
+ void slotSetAllChanged() { setAllChanged(); }
+
+ protected:
+ virtual void drawBackground ( QPainter & painter, const QRect & clip );
+ virtual void drawForeground ( QPainter & painter, const QRect & clip );
+
+ ItemDocument *p_itemDocument;
+
+ QString m_message;
+ QTimer * m_pMessageTimeout;
+};
+
+
+/**
+@author David Saxton
+*/
+class CanvasTip : public QCanvasText
+{
+public:
+ CanvasTip( ItemDocument *itemDocument, QCanvas *qcanvas );
+ virtual ~CanvasTip();
+
+ void displayVI( ECNode *node, const QPoint &pos );
+ void displayVI( Connector *connector, const QPoint &pos );
+
+protected:
+ virtual void draw( QPainter &p );
+ bool updateVI();
+ void display( const QPoint &pos );
+ QString displayText( unsigned num ) const;
+
+ QValueVector<double> m_v;
+ QValueVector<double> m_i;
+ ItemDocument *p_itemDocument;
+};
+
+
+#endif