/*******************************************************************
Part of the Fritzing project - http://fritzing.org
Copyright (c) 2007-2015 Fachhochschule Potsdam - http://fh-potsdam.de
Fritzing 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 3 of the License, or
(at your option) any later version.
Fritzing is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Fritzing. If not, see .
********************************************************************
$Revision: 6999 $:
$Author: irascibl@gmail.com $:
$Date: 2013-04-28 14:14:07 +0200 (So, 28. Apr 2013) $
********************************************************************/
#ifndef SKETCHWIDGET_H
#define SKETCHWIDGET_H
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "../items/paletteitem.h"
#include "../referencemodel/referencemodel.h"
#include "../model/sketchmodel.h"
#include "../viewgeometry.h"
#include "infographicsview.h"
#include "../viewlayer.h"
#include "../utils/misc.h"
#include "../commands.h"
struct ItemCount {
int selCount;
int hasLabelCount;
int visLabelCount;
int itemsCount;
int selRotatable;
int sel45Rotatable;
int selHFlipable;
int selVFlipable;
int obsoleteCount;
int moveLockCount;
int wireCount;
};
struct SwapThing {
bool firstTime;
long newID;
ItemBase * itemBase;
long newModelIndex;
QString newModuleID;
ViewLayer::ViewLayerPlacement viewLayerPlacement;
QList wiresToDelete;
QUndoCommand * parentCommand;
QHash reconnections;
QHash byWire;
QHash toConnectorItems;
QHash swappedGender;
SketchWidget * bbView;
QMap propsMap;
};
struct RenderThing {
bool selectedItems;
double printerScale;
bool blackOnly;
QRectF imageRect;
QRectF offsetRect;
double dpi;
bool renderBlocker;
QRectF itemsBoundingRect;
QGraphicsItem * board;
bool empty;
bool hideTerminalPoints;
};
class SizeItem : public QObject, public QGraphicsLineItem
{
Q_OBJECT
public:
SizeItem();
~SizeItem();
};
class SketchWidget : public InfoGraphicsView
{
Q_OBJECT
Q_PROPERTY(QColor gridColor READ gridColor WRITE setGridColor DESIGNABLE true)
Q_PROPERTY(double ratsnestWidth READ ratsnestWidth WRITE setRatsnestWidth DESIGNABLE true)
Q_PROPERTY(double ratsnestOpacity READ ratsnestOpacity WRITE setRatsnestOpacity DESIGNABLE true)
public:
SketchWidget(ViewLayer::ViewID, QWidget *parent=0, int size=400, int minSize=300);
~SketchWidget();
void pushCommand(QUndoCommand *, QObject * signalTarget);
class WaitPushUndoStack * undoStack();
ItemBase * addItem(ModelPart *, ViewLayer::ViewLayerPlacement, BaseCommand::CrossViewType, const ViewGeometry &, long id, long modelIndex, AddDeleteItemCommand * originatingCommand);
ItemBase * addItem(const QString & moduleID, ViewLayer::ViewLayerPlacement, BaseCommand::CrossViewType, const ViewGeometry &, long id, long modelIndex, AddDeleteItemCommand * originatingCommand);
void deleteItem(long id, bool deleteModelPart, bool doEmit, bool later);
virtual void deleteItem(ItemBase *, bool deleteModelPart, bool doEmit, bool later);
void simpleMoveItem(long id, QPointF);
void moveItem(long id, ViewGeometry &, bool updateRatsnest);
void moveItem(long id, const QPointF & p, bool updateRatsnest);
void updateWire(long id, const QString & connectorID, bool updateRatsnest);
void rotateItem(long id, double degrees);
void transformItem(long id, const QMatrix &);
void flipItem(long id, Qt::Orientations orientation);
void selectItem(long id, bool state, bool updateInfoView, bool doEmit);
void selectItem(ItemBase * itemBase);
void selectItems(QList);
void selectItemsWithModuleID(ModelPart *);
void addToSketch(QList &);
void selectDeselectAllCommand(bool state);
void changeWire(long fromID, QLineF line, QPointF pos, bool updateConnections, bool updateRatsnest);
void changeLeg(long fromID, const QString & connectorID, const QPolygonF &, bool relative, const QString & why);
void recalcLeg(long fromID, const QString & connectorID, const QPolygonF &, bool relative, bool active, const QString & why);
void rotateLeg(long fromID, const QString & connectorID, const QPolygonF &, bool active);
void cut();
void copy();
void setReferenceModel(class ReferenceModel *referenceModel);
class ReferenceModel * referenceModel();
void setSketchModel(SketchModel *);
void setUndoStack(class WaitPushUndoStack *);
void clearSelection();
virtual void loadFromModelParts(QList & modelParts, BaseCommand::CrossViewType, QUndoCommand * parentCommand,
bool offsetPaste, const QRectF * boundingRect, bool seekOutsideConnections, QList & newIDs);
void changeZ(QHash, double (*pairAccessor)(RealPair *) );
void sendToBack();
void sendBackward();
void bringForward();
void bringToFront();
void alignItems(Qt::Alignment);
double fitInWindow();
void rotateX(double degrees, bool rubberBandLegEnabled, ItemBase * originatingItem);
void flipX(Qt::Orientations orientation, bool rubberBandLegEnabled);
void addBendpoint(ItemBase * lastHoverEnterItem, ConnectorItem * lastHoverEnterConnectorItem, QPointF lastLocation);
void flattenCurve(ItemBase * lastHoverEnterItem, ConnectorItem * lastHoverEnterConnectorItem, QPointF lastLocation);
void deleteSelected(Wire *, bool minus);
PaletteItem *getSelectedPart();
void addViewLayer(ViewLayer *);
void setAllLayersVisible(bool visible);
void setLayerVisible(ViewLayer * viewLayer, bool visible, bool doChildLayers);
void setLayerVisible(ViewLayer::ViewLayerID viewLayerID, bool visible, bool doChildLayers);
void setLayerActive(ViewLayer * viewLayer, bool active);
void setLayerActive(ViewLayer::ViewLayerID viewLayerID, bool active);
bool layerIsVisible(ViewLayer::ViewLayerID);
bool layerIsActive(ViewLayer::ViewLayerID);
void sortAnyByZ(const QList & items, QList & bases);
void mousePressConnectorEvent(ConnectorItem *, QGraphicsSceneMouseEvent *);
void setBackground(QColor);
void setBackgroundColor(QColor, bool setPref);
const QColor& background();
QColor standardBackground();
void setItemMenu(QMenu*);
void setWireMenu(QMenu*);
virtual void changeConnection(long fromID,
const QString & fromConnectorID,
long toID, const QString & toConnectorID,
ViewLayer::ViewLayerPlacement,
bool connect, bool doEmit,
bool updateConnections);
ItemCount calcItemCount();
ViewLayer::ViewID viewID();
void setViewLayerIDs(ViewLayer::ViewLayerID part, ViewLayer::ViewLayerID wire, ViewLayer::ViewLayerID connector, ViewLayer::ViewLayerID ruler, ViewLayer::ViewLayerID note);
void stickem(long stickTargetID, long stickSourceID, bool stick);
void stickyScoop(ItemBase * stickyOne, bool checkCurrent, CheckStickyCommand *);
void setChainDrag(bool);
void hoverEnterItem(QGraphicsSceneHoverEvent * event, ItemBase * item);
void hoverLeaveItem(QGraphicsSceneHoverEvent * event, ItemBase * item);
void hoverEnterConnectorItem(QGraphicsSceneHoverEvent * event, ConnectorItem * item);
void hoverLeaveConnectorItem(QGraphicsSceneHoverEvent * event, ConnectorItem * item);
void cleanUpWires(bool doEmit, class CleanUpWiresCommand *);
void partLabelChanged(ItemBase *, const QString & oldText, const QString &newtext);
void noteChanged(ItemBase *, const QString & oldText, const QString &newtext, QSizeF oldSize, QSizeF newSize);
void setInfoViewOnHover(bool infoViewOnHover);
virtual ItemBase * addItemAux(ModelPart *, ViewLayer::ViewLayerPlacement, const ViewGeometry &, long id, bool doConnectors, ViewLayer::ViewID, bool temporary);
ItemBase * addItemAuxTemp(ModelPart *, ViewLayer::ViewLayerPlacement, const ViewGeometry &, long id, bool doConnectors, ViewLayer::ViewID, bool temporary);
bool swappingEnabled(ItemBase *);
virtual void addViewLayers();
void changeWireColor(long wireId, const QString& color, double opacity);
void changeWireWidth(long wireId, double width);
void changeWireFlags(long wireId, ViewGeometry::WireFlags wireFlags);
void setIgnoreSelectionChangeEvents(bool);
void hideConnectors(bool hide);
void saveLayerVisibility();
void restoreLayerVisibility();
void updateRoutingStatus(CleanUpWiresCommand*, RoutingStatus &, bool manual);
void updateRoutingStatus(RoutingStatus &, bool manual);
virtual bool hasAnyNets();
void ensureLayerVisible(ViewLayer::ViewLayerID);
const QString &selectedModuleID();
virtual bool canDeleteItem(QGraphicsItem * item, int count);
virtual bool canCopyItem(QGraphicsItem * item, int count);
const QString & viewName();
void makeDeleteItemCommand(ItemBase * itemBase, BaseCommand::CrossViewType, QUndoCommand * parentCommand);
virtual void forwardRoutingStatus(const RoutingStatus &);
void collectParts(QList & partList);
void movePartLabel(long itemID, QPointF newPos, QPointF newOffset);
void updateInfoView();
virtual void setCurrent(bool current);
void partLabelMoved(ItemBase *, QPointF oldPos, QPointF oldOffset, QPointF newPos, QPointF newOffset);
void rotateFlipPartLabel(ItemBase *, double degrees, Qt::Orientations flipDirection);
void rotateFlipPartLabel(long itemID, double degrees, Qt::Orientations flipDirection);
void showPartLabels(bool show);
void hidePartLabel(ItemBase * item);
void noteSizeChanged(ItemBase * itemBase, const QSizeF & oldSize, const QSizeF & newSize);
void resizeNote(long itemID, const QSizeF & );
class SelectItemCommand* stackSelectionState(bool pushIt, QUndoCommand * parentCommand);
QString renderToSVG(RenderThing &, QGraphicsItem * board, const LayerList &);
bool spaceBarIsPressed();
virtual long setUpSwap(SwapThing &, bool master);
ConnectorItem * lastHoverEnterConnectorItem();
ItemBase * lastHoverEnterItem();
LayerHash & viewLayers();
virtual void createTrace(Wire*, bool useLastWireColor);
virtual void selectAllWires(ViewGeometry::WireFlag);
virtual void tidyWires();
const QString & getShortName();
virtual void setClipEnds(class ClipableWire *, bool);
void getBendpointWidths(class Wire *, double w, double & w1, double & w2, bool & negativeOffsetRect);
virtual bool includeSymbols();
void disconnectAll();
virtual bool canDisconnectAll();
virtual bool ignoreFemale();
virtual ViewLayer::ViewLayerID getWireViewLayerID(const ViewGeometry & viewGeometry, ViewLayer::ViewLayerPlacement);
ItemBase * findItem(long id);
long createWire(ConnectorItem * from, ConnectorItem * to, ViewGeometry::WireFlags, bool dontUpdate, BaseCommand::CrossViewType, QUndoCommand * parentCommand);
QList selectAllObsolete();
int selectAllMoveLock();
void setMoveLock(long id, bool lock);
bool partLabelsVisible();
void restorePartLabel(long itemID, QDomElement & element);
void loadLogoImage(ItemBase *, const QString & oldSvg, const QSizeF oldAspectRatio, const QString & oldFilename, const QString & newFilename, bool addName);
void loadLogoImage(long itemID, const QString & oldSvg, const QSizeF oldAspectRatio, const QString & oldFilename);
void loadLogoImage(long itemID, const QString & newFilename, bool addName);
void setNoteFocus(QGraphicsItem *, bool inFocus);
void alignToGrid(bool);
bool alignedToGrid();
void showGrid(bool);
bool showingGrid();
void setGridSize(const QString &);
QString gridSizeText();
void saveZoom(double);
double retrieveZoom();
void initGrid();
virtual double defaultGridSizeInches();
void clearPasteOffset();
virtual ViewLayer::ViewLayerPlacement defaultViewLayerPlacement(ModelPart *);
void collectAllNets(QHash & indexer, QList< QList* > & allPartConnectorItems, bool includeSingletons, bool bothSides);
virtual bool routeBothSides();
virtual void changeLayer(long id, double z, ViewLayer::ViewLayerID viewLayerID);
void ratsnestConnect(ConnectorItem * connectorItem, bool connect);
void ratsnestConnect(ItemBase *, bool connect);
void ratsnestConnect(ConnectorItem * c1, ConnectorItem * c2, bool connect, bool wait);
virtual void addDefaultParts();
float getTopZ();
QGraphicsItem * addWatermark(const QString & filename);
void copyHeart(QList & bases, bool saveBoundingRects, QByteArray & itemData, QList & modelIndexes);
void pasteHeart(QByteArray & itemData, bool seekOutsideConnections);
ViewGeometry::WireFlag getTraceFlag();
void changeBus(ItemBase *, bool connec, const QString & oldBus, const QString & newBus, QList &, const QString & message, const QString & oldLayout, const QString & newLayout);
const QString & filenameIf();
void setItemDropOffset(long id, QPointF offset);
void prepLegBendpointMove(ConnectorItem * from, int index, QPointF oldPos, QPointF newPos, ConnectorItem * to, bool changeConnections);
void prepLegCurveChange(ConnectorItem * from, int index, const class Bezier * oldB, const class Bezier * newB, bool triggerFirstTime);
void prepLegBendpointChange(ConnectorItem * from, int oldCount, int newCount, int index, QPointF pos, const class Bezier *, const class Bezier *, const class Bezier *, bool triggerFirstTime);
void prepLegSelection(ItemBase *);
void changeWireCurve(long id, const Bezier *, bool autoroutable);
void changeLegCurve(long id, const QString & connectorID, int index, const Bezier *);
void addLegBendpoint(long id, const QString & connectorID, int index, QPointF, const class Bezier *, const class Bezier *);
void removeLegBendpoint(long id, const QString & connectorID, int index, const class Bezier *);
void moveLegBendpoint(long id, const QString & connectorID, int index, QPointF);
bool curvyWires();
void setCurvyWires(bool);
bool curvyWiresIndicated(Qt::KeyboardModifiers);
void triggerRotate(ItemBase *, double degrees);
void makeWiresChangeConnectionCommands(const QList & wires, QUndoCommand * parentCommand);
void renamePins(ItemBase *, const QStringList & oldLabels, const QStringList & newLabels, bool singleRow);
void renamePins(long itemID, const QStringList & labels, bool singleRow);
void getRatsnestColor(QColor &);
VirtualWire * makeOneRatsnestWire(ConnectorItem * source, ConnectorItem * dest, bool routed, QColor color, bool force);
double ratsnestOpacity();
void setRatsnestOpacity(double);
double ratsnestWidth();
void setRatsnestWidth(double);
void setAnyInRotation();
ConnectorItem * findConnectorItem(ConnectorItem * foreignConnectorItem);
void setGroundFillSeed(long id, const QString & connectorID, bool seed);
void setWireExtras(long id, QDomElement &);
void resolveTemporary(bool, ItemBase *);
virtual bool sameElectricalLayer2(ViewLayer::ViewLayerID, ViewLayer::ViewLayerID);
void deleteMiddle(QSet & deletedItems, QUndoCommand * parentCommand);
void setPasting(bool);
void showUnrouted();
QPointF alignOneToGrid(ItemBase * itemBase);
void showEvent(QShowEvent * event);
void blockUI(bool);
void viewItemInfo(ItemBase * item);
virtual QHash getAutorouterSettings();
virtual void setAutorouterSettings(QHash &);
void hidePartLayer(long id, ViewLayer::ViewLayerID, bool hide);
void hidePartLayer(ItemBase *, ViewLayer::ViewLayerID, bool hide);
void moveItem(ItemBase *, double x, double y);
QColor gridColor() const;
void setGridColor(QColor);
bool everZoomed() const;
void setEverZoomed(bool);
void testConnectors();
void updateWires();
protected:
void dragEnterEvent(QDragEnterEvent *);
bool dragEnterEventAux(QDragEnterEvent *);
virtual bool canDropModelPart(ModelPart *);
void dragLeaveEvent(QDragLeaveEvent *);
void dragMoveEvent(QDragMoveEvent *);
void dropEvent(QDropEvent *);
virtual void mousePressEvent(QMouseEvent *);
void mouseMoveEvent(QMouseEvent *);
void mouseReleaseEvent(QMouseEvent *);
void mouseDoubleClickEvent (QMouseEvent *);
void contextMenuEvent(QContextMenuEvent *);
bool viewportEvent(QEvent *);
void paintEvent(QPaintEvent *);
virtual PaletteItem* addPartItem(ModelPart * , ViewLayer::ViewLayerPlacement, PaletteItem *, bool doConnectors, bool & ok, ViewLayer::ViewID, bool temporary);
void clearHoldingSelectItem();
bool startZChange(QList & bases);
void continueZChange(QList & bases, int start, int end, bool (*test)(int current, int start), int inc, const QString & text);
void continueZChangeMax(QList & bases, int start, int end, bool (*test)(int current, int start), int inc, const QString & text);
void continueZChangeAux(QList & bases, const QString & text);
virtual ViewLayer::ViewLayerID getDragWireViewLayerID(ConnectorItem *);
ViewLayer::ViewLayerID getPartViewLayerID();
ViewLayer::ViewLayerID getRulerViewLayerID();
ViewLayer::ViewLayerID getConnectorViewLayerID();
virtual ViewLayer::ViewLayerID getLabelViewLayerID(ItemBase *);
ViewLayer::ViewLayerID getNoteViewLayerID();
void dragMoveHighlightConnector(QPoint eventPos);
void addToScene(ItemBase * item, ViewLayer::ViewLayerID viewLayerID);
ConnectorItem * findConnectorItem(ItemBase * item, const QString & connectorID, ViewLayer::ViewLayerPlacement);
bool checkMoved(bool wait);
void changeConnectionAux(long fromID, const QString & fromConnectorID,
long toID, const QString & toConnectorID,
ViewLayer::ViewLayerPlacement,
bool connect, bool updateConnections);
void cutDeleteAux(QString undoStackMessage, bool minus, Wire * wire);
void deleteAux(QSet & deletedItems, QUndoCommand * parentCommand, bool doPush);
ChangeConnectionCommand * extendChangeConnectionCommand(BaseCommand::CrossViewType, long fromID, const QString & fromConnectorID,
long toID, const QString & toConnectorID,
ViewLayer::ViewLayerPlacement,
bool connect, QUndoCommand * parent);
ChangeConnectionCommand * extendChangeConnectionCommand(BaseCommand::CrossViewType, ConnectorItem * fromConnectorItem, ConnectorItem * toConnectorItem,
ViewLayer::ViewLayerPlacement,
bool connect, QUndoCommand * parentCommand);
void keyPressEvent(QKeyEvent *);
void keyReleaseEvent(QKeyEvent *);
void clearTemporaries();
void dragWireChanged(class Wire* wire, ConnectorItem * from, ConnectorItem * to);
void dragRatsnestChanged();
void killDroppingItem();
ViewLayer::ViewLayerID getViewLayerID(ModelPart *, ViewLayer::ViewID, ViewLayer::ViewLayerPlacement);
ItemBase * overSticky(ItemBase *);
virtual void setNewPartVisible(ItemBase *);
virtual bool collectFemaleConnectees(ItemBase *, QSet &);
virtual bool checkUnder();
virtual void findConnectorsUnder(ItemBase * item);
bool currentlyInfoviewed(ItemBase *item);
void resizeEvent(QResizeEvent *);
void addViewLayersAux(const LayerList &, const LayerList & layersFromBelow, float startZ = 1.5);
virtual bool disconnectFromFemale(ItemBase * item, QHash & savedItems, ConnectorPairHash &, bool doCommand, bool rubberBandLegEnabled, QUndoCommand * parentCommand);
void clearDragWireTempCommand();
bool draggingWireEnd();
void moveItems(QPoint globalPos, bool checkAutoScroll, bool rubberBandLegEnabled);
virtual ViewLayer::ViewLayerID multiLayerGetViewLayerID(ModelPart * modelPart, ViewLayer::ViewID, ViewLayer::ViewLayerPlacement, LayerList &);
virtual BaseCommand::CrossViewType wireSplitCrossView();
virtual bool canChainMultiple();
virtual bool canChainWire(Wire *);
virtual bool canDragWire(Wire *);
virtual bool canCreateWire(Wire * dragWire, ConnectorItem * from, ConnectorItem * to);
//virtual bool modifyNewWireConnections(Wire * dragWire, ConnectorItem * fromOnWire, ConnectorItem * from, ConnectorItem * to, QUndoCommand * parentCommand);
virtual void setUpColor(ConnectorItem * fromConnectorItem, ConnectorItem * toConnectorItem, Wire * wire, QUndoCommand * parentCommand);
void setupAutoscroll(bool moving);
void turnOffAutoscroll();
bool checkAutoscroll(QPoint globalPos);
virtual void setWireVisible(Wire *);
bool matchesLayer(ModelPart * modelPart);
QByteArray removeOutsideConnections(const QByteArray & itemData, QList & modelIndexes);
void addWireExtras(long newID, QDomElement & view, QUndoCommand * parentCommand);
virtual const QString & hoverEnterWireConnectorMessage(QGraphicsSceneHoverEvent * event, ConnectorItem * item);
virtual const QString & hoverEnterPartConnectorMessage(QGraphicsSceneHoverEvent * event, ConnectorItem * item);
void partLabelChangedAux(ItemBase * pitem,const QString & oldText, const QString &newText);
void drawBackground( QPainter * painter, const QRectF & rect );
void handleConnect(QDomElement & connect, ModelPart *, const QString & fromConnectorID, ViewLayer::ViewLayerID, QStringList & alreadyConnected,
QHash & newItems, QUndoCommand * parentCommand, bool seekOutsideConnections);
void setUpSwapReconnect(SwapThing &, ItemBase * itemBase, long newID, bool master);
void makeSwapWire(SketchWidget *, ItemBase *, long newID, ConnectorItem * fromConnectorItem, ConnectorItem * toConnectorItem, Connector * newConnector, QUndoCommand * parentCommand);
bool swappedGender(ConnectorItem * originalConnectorItem, Connector * newConnector);
void setLastPaletteItemSelected(PaletteItem * paletteItem);
void setLastPaletteItemSelectedIf(ItemBase * itemBase);
void prepDragBendpoint(Wire *, QPoint eventPos, bool dragCurve);
void prepDragWire(Wire *);
void clickBackground(QMouseEvent *);
void categorizeDragWires(QSet & wires, QList & freeWires);
void categorizeDragLegs(bool rubberBandLegEnabled);
void prepMove(ItemBase * originatingItem, bool rubberBandLegEnabled, bool includeRatsnest);
void initBackgroundColor();
QPointF calcNewLoc(ItemBase * moveBase, ItemBase * detachFrom);
long findPartOrWire(long itemID);
AddItemCommand * newAddItemCommand(BaseCommand::CrossViewType crossViewType, ModelPart *,
QString moduleID, ViewLayer::ViewLayerPlacement, ViewGeometry & viewGeometry, qint64 id,
bool updateInfoView, long modelIndex, bool addSubparts, QUndoCommand *parent);
int selectAllItems(QSet & itemBases, const QString & msg);
bool moveByArrow(double dx, double dy, QKeyEvent * );
double gridSizeInches();
virtual bool canAlignToTopLeft(ItemBase *);
virtual bool canAlignToCenter(ItemBase *);
virtual void findAlignmentAnchor(ItemBase * originatingItem, QHash & savedItems, QHash & savedWires);
void alignLoc(QPointF & loc, const QPointF startPoint, const QPointF newLoc, const QPointF originalLoc);
void copyAux(QList & bases, bool saveBoundingRects);
void copyDrop();
void dropItemEvent(QDropEvent *event);
virtual QString checkDroppedModuleID(const QString & moduleID);
QString makeWireSVG(Wire * wire, QPointF offset, double dpi, double printerscale, bool blackOnly);
QString makeWireSVGAux(Wire * wire, double width, const QString & color, QPointF offset, double dpi, double printerScale, bool blackOnly, bool dashed);
QString makeMoveSVG(double printerScale, double dpi, QPointF & offset);
void prepDeleteProps(ItemBase * itemBase, long id, const QString & newModuleID, QMap & propsMap, QUndoCommand * parentCommand);
void prepDeleteOtherProps(ItemBase * itemBase, long id, const QString & newModuleID, QMap & propsMap, QUndoCommand * parentCommand);
virtual ViewLayer::ViewLayerPlacement getViewLayerPlacement(ModelPart *, QDomElement & instance, QDomElement & view, ViewGeometry &);
virtual ViewLayer::ViewLayerPlacement wireViewLayerPlacement(ConnectorItem *);
virtual bool resizingJumperItemPress(ItemBase *);
virtual bool resizingJumperItemRelease();
bool resizingBoardPress(ItemBase *);
bool resizingBoardRelease();
void resizeBoard();
void resizeWithHandle(ItemBase * itemBase, double mmW, double mmH);
virtual bool acceptsTrace(const ViewGeometry &);
virtual ItemBase * placePartDroppedInOtherView(ModelPart *, ViewLayer::ViewLayerPlacement, const ViewGeometry & viewGeometry, long id, SketchWidget * dropOrigin);
void showPartLabelsAux(bool show, QList & itemBases);
virtual void extraRenderSvgStep(ItemBase *, QPointF offset, double dpi, double printerScale, QString & outputSvg);
virtual ViewLayer::ViewLayerPlacement createWireViewLayerPlacement(ConnectorItem * from, ConnectorItem * to);
virtual Wire * createTempWireForDragging(Wire * fromWire, ModelPart * wireModel, ConnectorItem * connectorItem, ViewGeometry & viewGeometry, ViewLayer::ViewLayerPlacement);
virtual void prereleaseTempWireForDragging(Wire*);
void checkFit(ModelPart * newModelPart, ItemBase * itemBase, long newID,
QHash & found, QList & notFound,
QHash & m2f, QHash & byWire,
QHash & legs, QHash & formerLegs, QUndoCommand * parentCommand);
void checkFitAux(ItemBase * tempItemBase, ItemBase * itemBase, long newID,
QHash & found, QList & notFound,
QHash & m2f, QHash & byWire,
QHash & legs, QHash & formerLegs, QUndoCommand * parentCommand);
void changeLegAux(long fromID, const QString & fromConnectorID, const QPolygonF &, bool reset, bool relative, bool active, const QString & why);
void moveLegBendpoints(bool undoOnly, QUndoCommand * parentCommand);
void moveLegBendpointsAux(ConnectorItem * connectorItem, bool undoOnly, QUndoCommand * parentCommand);
virtual void rotatePartLabels(double degrees, QTransform &, QPointF center, QUndoCommand * parentCommand);
bool checkUpdateRatsnest(QList & connectorItems);
void makeRatsnestViewGeometry(ViewGeometry & viewGeometry, ConnectorItem * source, ConnectorItem * dest);
virtual double getTraceWidth();
virtual const QString & traceColor(ViewLayer::ViewLayerPlacement);
void createTrace(Wire * fromWire, const QString & commandString, ViewGeometry::WireFlag, bool useLastWireColor);
bool createOneTrace(Wire * wire, ViewGeometry::WireFlag flag, bool allowAny, QList & done, bool useLastWireColor, QUndoCommand * parentCommand);
void removeWire(Wire * w, QList & ends, QList & done, QUndoCommand * parentCommand);
void selectAllWiresFrom(ViewGeometry::WireFlag flag, QList & items);
bool canConnect(ItemBase * from, ItemBase * to);
virtual bool canConnect(Wire * from, ItemBase * to);
void removeDragWire();
QGraphicsItem * getClickedItem(QList & items);
void cleanupRatsnests(QList< QPointer > & connectorItems, bool connect);
void rotateWire(Wire *, QTransform & rotation, QPointF center, bool undoOnly, QUndoCommand * parentCommand);
QString renderToSVG(RenderThing &, const LayerList &);
QString renderToSVG(RenderThing &, QList & itemsAndLabels);
QList collectSuperSubs(ItemBase *);
void squashShapes(QPointF scenePos);
void unsquashShapes();
virtual bool updateOK(ConnectorItem *, ConnectorItem *);
virtual void viewGeometryConversionHack(ViewGeometry &, ModelPart *);
protected:
static bool lessThan(int a, int b);
static bool greaterThan(int a, int b);
signals:
void itemAddedSignal(ModelPart *, ItemBase *, ViewLayer::ViewLayerPlacement, const ViewGeometry &, long id, SketchWidget * dropOrigin);
void itemDeletedSignal(long id);
void clearSelectionSignal();
void itemSelectedSignal(long id, bool state);
void itemMovedSignal(ItemBase *);
void wireDisconnectedSignal(long fromID, QString fromConnectorID);
void wireConnectedSignal(long fromID, QString fromConnectorID, long toID, QString toConnectorID);
void changeConnectionSignal(long fromID, QString fromConnectorID,
long toID, QString toConnectorID,
ViewLayer::ViewLayerPlacement,
bool connect, bool updateConnections);
void copyBoundingRectsSignal(QHash &);
void cleanUpWiresSignal(CleanUpWiresCommand *);
void selectionChangedSignal();
void resizeSignal();
void dropSignal(const QPoint &pos);
void routingStatusSignal(SketchWidget *, const RoutingStatus &);
void movingSignal(SketchWidget *, QUndoCommand * parentCommand);
void selectAllItemsSignal(bool state, bool doEmit);
void checkStickySignal(long id, bool doEmit, bool checkCurrent, CheckStickyCommand *);
void disconnectAllSignal(QList, QHash & itemsToDelete, QUndoCommand * parentCommand);
void setResistanceSignal(long itemID, QString resistance, QString pinSpacing, bool doEmit);
void setPropSignal(long itemID, const QString & prop, const QString & value, bool doRedraw, bool doEmit);
void setInstanceTitleSignal(long id, const QString & oldTitle, const QString & newTitle, bool isUndoable, bool doEmit);
void statusMessageSignal(QString, int timeout);
void showLabelFirstTimeSignal(long itemID, bool show, bool doEmit);
void dropPasteSignal(SketchWidget *);
void changeBoardLayersSignal(int, bool doEmit);
void deleteTracesSignal(QSet & deletedItems, QHash & otherDeletedItems, QList & deletedIDs, bool isForeign, QUndoCommand * parentCommand);
void makeDeleteItemCommandPrepSignal(ItemBase * itemBase, bool foreign, QUndoCommand * parentCommand);
void makeDeleteItemCommandFinalSignal(ItemBase * itemBase, bool foreign, QUndoCommand * parentCommand);
void cursorLocationSignal(double xinches, double yinches, double width=0.0, double height=0.0);
void ratsnestConnectSignal(long id, const QString & connectorID, bool connect, bool doEmit);
void updatePartLabelInstanceTitleSignal(long itemID);
void filenameIfSignal(QString & filename);
void collectRatsnestSignal(QList & foreignSketchWidgets);
void removeRatsnestSignal(QList & cutSet, QUndoCommand * parentCommand);
void updateLayerMenuSignal();
void swapBoardImageSignal(SketchWidget * sketchWidget, ItemBase * itemBase, const QString & filename, const QString & moduleID, bool addName);
void canConnectSignal(Wire * from, ItemBase * to, bool & connect);
void swapStartSignal(SwapThing & swapThing, bool master);
void showing(SketchWidget *);
void clickedItemCandidateSignal(QGraphicsItem *, bool & ok);
void resizedSignal(ItemBase *);
void cleanupRatsnestsSignal(bool doEmit);
void addSubpartSignal(long id, long subpartID, bool doEmit);
void getDroppedItemViewLayerPlacementSignal(ModelPart * modelPart, ViewLayer::ViewLayerPlacement &);
void packItemsSignal(int columns, const QList & ids, QUndoCommand *parent, bool doEmit);
protected slots:
void itemAddedSlot(ModelPart *, ItemBase *, ViewLayer::ViewLayerPlacement, const ViewGeometry &, long id, SketchWidget * dropOrigin);
void itemDeletedSlot(long id);
void clearSelectionSlot();
void itemSelectedSlot(long id, bool state);
void selectionChangedSlot();
void wireChangedSlot(class Wire*, const QLineF & oldLine, const QLineF & newLine, QPointF oldPos, QPointF newPos, ConnectorItem * from, ConnectorItem * to);
void wireChangedCurveSlot(class Wire*, const Bezier * oldB, const Bezier * newB, bool triggerFirstTime);
virtual void wireSplitSlot(class Wire*, QPointF newPos, QPointF oldPos, const QLineF & oldLine);
void wireJoinSlot(class Wire*, ConnectorItem * clickedConnectorItem);
void toggleLayerVisibility();
void wireConnectedSlot(long fromID, QString fromConnectorID, long toID, QString toConnectorID);
void wireDisconnectedSlot(long fromID, QString fromConnectorID);
void changeConnectionSlot(long fromID, QString fromConnectorID, long toID, QString toConnectorID, ViewLayer::ViewLayerPlacement, bool connect, bool updateConnections);
void restartPasteCount();
void dragIsDoneSlot(class ItemDrag *);
void statusMessage(QString message, int timeout = 0);
void cleanUpWiresSlot(CleanUpWiresCommand *);
void updateInfoViewSlot();
void spaceBarIsPressedSlot(bool);
void autoScrollTimeout();
void dragAutoScrollTimeout();
void moveAutoScrollTimeout();
void rememberSticky(long id, QUndoCommand * parentCommand);
void rememberSticky(ItemBase *, QUndoCommand * parentCommand);
void copyBoundingRectsSlot(QHash &);
void deleteRatsnest(Wire *, QUndoCommand * parentCommand);
void deleteTracesSlot(QSet & deletedItems, QHash & otherDeletedItems, QList & deletedIDs, bool isForeign, QUndoCommand * parentCommand);
void vScrollToZero();
void arrowTimerTimeout();
void makeDeleteItemCommandPrepSlot(ItemBase * itemBase, bool foreign, QUndoCommand * parentCommand);
void makeDeleteItemCommandFinalSlot(ItemBase * itemBase, bool foreign, QUndoCommand * parentCommand);
void updatePartLabelInstanceTitleSlot(long itemID);
void changePinLabelsSlot(ItemBase * itemBase, bool singleRow);
void changePinLabels(ItemBase *, bool singleRow);
void collectRatsnestSlot(QList & foreignSketchWidgets);
void removeRatsnestSlot(QList & cutSet, QUndoCommand * parentCommand);
void deleteTemporary();
void canConnect(Wire * from, ItemBase * to, bool & connect);
long swapStart(SwapThing & swapThing, bool master);
virtual void getDroppedItemViewLayerPlacement(ModelPart * modelPart, ViewLayer::ViewLayerPlacement &);
public slots:
void changeWireColor(const QString newColor);
void changeWireWidthMils(const QString newWidth);
void selectAllItems(bool state, bool doEmit);
void setNoteText(long itemID, const QString & newText);
void setInstanceTitle(long id, const QString & oldTitle, const QString & newTitle, bool isUndoable, bool doEmit);
void incInstanceTitle(long id);
void showPartLabel(long id, bool showIt);
void checkSticky(long id, bool doEmit, bool checkCurrent, CheckStickyCommand *);
virtual ItemBase * resizeBoard(long id, double w, double h);
void resizeJumperItem(long id, QPointF pos, QPointF c0, QPointF c1);
void disconnectAllSlot(QList, QHash & itemsToDelete, QUndoCommand * parentCommand);
void setResistance(long itemID, QString resistance, QString pinSpacing, bool doEmit);
void setResistance(QString resistance, QString pinSpacing);
void setProp(long itemID, const QString & prop, const QString & value, bool redraw, bool doEmit);
virtual void setProp(ItemBase *, const QString & propName, const QString & translatedPropName, const QString & oldValue, const QString & newValue, bool redraw);
void setHoleSize(ItemBase *, const QString & propName, const QString & translatedPropName, const QString & oldValue, const QString & newValue, QRectF & oldRect, QRectF & newRect, bool redraw);
virtual void showLabelFirstTime(long itemID, bool show, bool doEmit);
void resizeBoard(double w, double h, bool doEmit);
virtual void changeBoardLayers(int layers, bool doEmit);
void updateConnectors();
void ratsnestConnect(long id, const QString & connectorID, bool connect, bool doEmit);
void cleanupRatsnests(bool doEmit);
void addSubpart(long id, long subpartid, bool doEmit);
void packItems(int columns, const QList & ids, QUndoCommand *parent, bool doEmit);
protected:
enum StatusConnectStatus {
StatusConnectNotTried,
StatusConnectSucceeded,
StatusConnectFailed
};
protected:
QPointer m_referenceModel;
QPointer m_sketchModel;
ViewLayer::ViewID m_viewID;
class WaitPushUndoStack * m_undoStack;
class SelectItemCommand * m_holdingSelectItemCommand;
class SelectItemCommand * m_tempDragWireCommand;
LayerHash m_viewLayers;
QHash m_viewLayerVisibility;
QPointer m_connectorDragWire;
QPointer m_bendpointWire;
ViewGeometry m_bendpointVG;
QPointer m_connectorDragConnector;
bool m_droppingWire;
QPointF m_droppingOffset;
QPointer m_droppingItem;
int m_moveEventCount;
//QList m_lastSelected; hack for 4.5.something
ViewLayer::ViewLayerID m_wireViewLayerID;
ViewLayer::ViewLayerID m_partViewLayerID;
ViewLayer::ViewLayerID m_rulerViewLayerID;
ViewLayer::ViewLayerID m_connectorViewLayerID;
ViewLayer::ViewLayerID m_noteViewLayerID;
QList m_temporaries;
bool m_chainDrag;
QPointF m_mousePressScenePos;
QPointF m_mousePressGlobalPos;
QTimer m_autoScrollTimer;
volatile int m_autoScrollX;
volatile int m_autoScrollY;
volatile int m_autoScrollCount;
QPoint m_globalPos;
QPointer m_lastPaletteItemSelected;
int m_pasteCount;
QPointF m_pasteOffset;
// Part Menu
QMenu *m_itemMenu;
QMenu *m_wireMenu;
bool m_infoViewOnHover;
QHash m_savedItems;
QHash m_savedWires;
QList m_additionalSavedItems;
int m_ignoreSelectionChangeEvents;
bool m_current;
QString m_lastColorSelected;
ConnectorPairHash m_moveDisconnectedFromFemale;
bool m_spaceBarIsPressed;
bool m_spaceBarWasPressed;
QPointer m_lastHoverEnterConnectorItem;
QPointer m_lastHoverEnterItem;
QString m_shortName;
QPointer m_dragBendpointWire;
bool m_dragCurve;
QPoint m_dragBendpointPos;
StatusConnectStatus m_statusConnectState;
QList m_inFocus;
QString m_viewName;
bool m_movingByArrow;
double m_arrowTotalX;
double m_arrowTotalY;
bool m_movingByMouse;
bool m_alignToGrid;
bool m_showGrid;
double m_gridSizeInches;
QString m_gridSizeText;
QPointer m_alignmentItem;
QPointer m_originatingItem;
QPointF m_alignmentStartPoint;
double m_zoom;
bool m_draggingBendpoint;
QPointer m_sizeItem;
int m_autoScrollThreshold;
bool m_clearSceneRect;
QPointer m_moveReferenceItem;
QPointer m_movingSVGRenderer;
QPointF m_movingSVGOffset;
QPointer m_movingItem;
QList< QPointer > m_ratsnestUpdateDisconnect;
QList< QPointer > m_ratsnestUpdateConnect;
QList< QPointer > m_ratsnestCacheDisconnect;
QList< QPointer > m_ratsnestCacheConnect;
QList m_checkUnder;
bool m_addDefaultParts;
QPointer m_addedDefaultPart;
float m_z;
QTimer m_arrowTimer;
bool m_middleMouseIsPressed;
QMultiHash m_stretchingLegs;
bool m_curvyWires;
bool m_rubberBandLegWasEnabled;
RoutingStatus m_routingStatus;
bool m_anyInRotation;
bool m_pasting;
QPointer m_resizingBoard;
QList< QPointer > m_squashShapes;
QColor m_gridColor;
bool m_everZoomed;
double m_ratsnestOpacity;
double m_ratsnestWidth;
public:
static ViewLayer::ViewLayerID defaultConnectorLayer(ViewLayer::ViewID viewId);
static const int PropChangeDelay;
static bool m_blockUI;
protected:
static const int MoveAutoScrollThreshold;
static const int DragAutoScrollThreshold;
};
#endif