/* QAD - Qt ADvanced Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ #ifndef BLOCKVIEW_H #define BLOCKVIEW_H #include "blockbusitem.h" #include "blockviewwavetrace.h" #include "qad_blockview_export.h" #include #include #include #include #include #include #include #include Q_DECLARE_METATYPE(BlockItem *) Q_DECLARE_METATYPE(BlockItemPin *) Q_DECLARE_METATYPE(BlockBusItem *) class QAD_BLOCKVIEW_EXPORT BlockView: public QGraphicsView { Q_OBJECT Q_ENUMS(SelectionMode) Q_PROPERTY(bool gridVisible READ isGridVisible WRITE setGridVisible) Q_PROPERTY(bool snapToGrid READ isSnapToGrid WRITE setSnapToGrid) Q_PROPERTY(QPen gridPen READ gridPen WRITE setGridPen) Q_PROPERTY(double gridStep READ gridStep WRITE setGridStep) Q_PROPERTY(double gridPointsWidth READ gridPointsWidth WRITE setGridPointsWidth) Q_PROPERTY(SelectionMode selectionMode READ selectionMode WRITE setSelectionMode) Q_PROPERTY(bool postMoveConnect READ isPostMoveConnectEnabled WRITE setPostMoveConnectEnabled) Q_PROPERTY(bool connectByMouse READ isConnectByMouseEnabled WRITE setConnectByMouseEnabled) Q_PROPERTY(bool navigationEnabled READ isNavigationEnabled WRITE setNavigationEnabled) Q_PROPERTY(bool navigateAnimationEnabled READ isNavigateAnimationEnabled WRITE setNavigateAnimationEnabled) Q_PROPERTY(bool blockAnimationEnabled READ isBlockAnimationEnabled WRITE setBlockAnimationEnabled) Q_PROPERTY(bool traceConsiderBuses READ isTraceConsiderBuses WRITE setTraceConsiderBuses) Q_PROPERTY(bool pinMulticonnect READ isPinMulticonnectEnabled WRITE setPinMulticonnectEnabled) Q_PROPERTY(bool miniMap READ isMiniMapEnabled WRITE setMiniMapEnabled) Q_PROPERTY(bool zoomWheelOnly READ isZoomWheelOnly WRITE setZoomWheelOnly) Q_PROPERTY(bool busSquareNodes READ isBusSquareNodes WRITE setBusSquareNodes) Q_PROPERTY(double _thumb READ _thumb WRITE _setThumb DESIGNABLE false SCRIPTABLE false) Q_PROPERTY(QRectF _nav READ _nav WRITE _setNav DESIGNABLE false SCRIPTABLE false) friend class BlockBusItem; friend class BlockItemPin; public: BlockView(QWidget * parent = 0); BlockView(QGraphicsScene * scene, QWidget * parent = 0); ~BlockView(); enum SelectionMode { NoSelection, SingleSelection, MultiSelection }; QPen gridPen() const { return grid_pen; } bool isGridVisible() const { return grid_visible; } bool isSnapToGrid() const { return grid_snap; } bool isPostMoveConnectEnabled() const { return pm_connect; } bool isNavigationEnabled() const { return navigation; } bool isNavigateAnimationEnabled() const { return is_nav_anim; } bool isBlockAnimationEnabled() const { return is_block_anim; } bool isConnectByMouseEnabled() const { return m_connect; } bool isTraceConsiderBuses() const { return m_trace_with_buses; } bool isPinMulticonnectEnabled() const { return m_pin_mc; } bool isMiniMapEnabled() const { return minimap; } bool isZoomWheelOnly() const { return wheel_zoom; } bool isBusSquareNodes() const { return square_node; } double gridStep() const { return grid_step; } double gridPointsWidth() const { return grid_points; } SelectionMode selectionMode() const { return smode; } void setSelectionMode(SelectionMode mode) { smode = mode; } void addItems(QList items) { foreach(QGraphicsItem * i, items) addItem(i); } QList buses() const; QList wrongConnectedBuses() const; QList blocks() const; QList decors() const; BlockBusItem * connectionBus(BlockItem * b0, BlockItem * b1) const; QList connectionBuses(BlockItem * b0, BlockItem * b1) const; bool connectPins(BlockItemPin * p0, BlockItemPin * p1); QList selectedBlocks() const; QList selectedDecors() const; void setTransform(const QTransform & matrix, bool combine = false); void centerOn(const QPointF & pos); void centerOn(qreal x, qreal y); void centerOn(const QGraphicsItem * item); void fitInView(const QRectF & rect, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio); void fitInView(qreal x, qreal y, qreal w, qreal h, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio); void fitInView(const QGraphicsItem * item, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio); void fitInView(); QRectF itemsBoundingRect() const; protected: void _init(); void _updateBack(); bool event(QEvent * e); bool eventFilter(QObject * o, QEvent * e); void stopTimer(int & tid); void restartTimer(int & tid, int msecs); void timerEvent(QTimerEvent * e); void wheelEvent(QWheelEvent * e); void mousePressEvent(QMouseEvent * event); void mouseReleaseEvent(QMouseEvent * event); void mouseMoveEvent(QMouseEvent * event); void mouseDoubleClickEvent(QMouseEvent * event); void keyPressEvent(QKeyEvent * event); void keyReleaseEvent(QKeyEvent * e); void resizeEvent(QResizeEvent * event); void scrollContentsBy(int dx, int dy); void drawBackground(QPainter * painter, const QRectF & rect); void drawThumb(); void drawSceneThumb(); void thumbHide(); void thumbShow(); void restoreSelState(); void saveSelState(); void saveBusesState(); void restoreBusesState(); void applySelRect(QGraphicsSceneMouseEvent * me); void applyGridStep(); void trace(QPointF scene_pos_from, QPointF scene_pos_to, BlockBusItem * bus, bool primary = true); void clearBusStates(); void matchBus(); bool connectTmpToBus(BlockBusItem * bus); void markPins(int bus_type); void unmarkPins(bool to_normal = false); void hoverAcceptedPin(BlockItemPin * pin, bool hover); void unhoverPins(BlockItemPin * excl_pin = 0); void simplifyBuses(); bool moveBuses(const QList & items, QPointF dp); QList internalBuses(const QList & items); QList nearPins(BlockItemPin * pin, Qt::KeyboardModifiers km); BlockItemPin * getPin(const QList & list) const; void highlightNearPins(BlockItemPin * pin, Qt::KeyboardModifiers km); void hideTmpBuses(bool clear = true); double _thumb() const { return _talpha; } QRectF _nav() const; void animateNav(QRectF d, double scl = 0.); void scrollFromThumb(); void deleteCopyTemp(); void emitActionEvent(BlockItemBase::Action action, QList items); void setGhost(BlockItem * item); void clearGhost(); void startNewBus(int bus_type); void maybeEndNewBus(); BlockItem * ghost() const { return ghost_; } virtual void loadBus(BlockBusItem * bus) {} virtual void copyBlocks(QList items, QPointF offset) {} virtual void copyBuses(QList items, QPointF offset) {} virtual void newBusStarted(int bus_type) {} virtual void newBusCreated(BlockBusItem * bus) {} virtual void newBusFinished() {} QGraphicsScene * scene_; QGraphicsRectItem sel_rect; QGraphicsItem * mm_ci; QList sel_items; QList copy_items; QList last_multiconnect_pl; QList copy_buses, tmp_buses; BlockBusItem tmp_bus, *match_bus, *bus_from, *cur_bus; BlockItemPin * hpin; BlockItem * ghost_; BlockViewWavetrace wavetrace; QPoint press_point, screen_point, thumb_press; QPointF scene_point, trace_from, last_trace_from, trace_to, copy_dp; QRect thumb_sr, thumb_vr; QRectF nav_target, nav_rect; QSizeF thumb_size; QPen grid_pen; SelectionMode smode; QImage im_scene; QWidget widget_thumb; Qt::KeyboardModifiers mm_mods; QPropertyAnimation thumb_anim, nav_anim; int timer_thumb, thumb_hide_delay, thick; bool mm_drag, new_bus, new_branch, moved, mm_cancel, iconnect, mm_copy, mm_thumb, ae_enabled, is_nav_anim, is_block_anim, move_bus_point; bool grid_visible, grid_snap, pm_connect, navigation, m_connect, m_trace_with_buses, m_pin_mc, minimap, prev_tcb, wheel_zoom; bool nav_prev_aa, nav_prev_imaa, nav_prev_grid, square_node, block_emit_selection, new_bus_started; double grid_step, grid_points, cur_scl, _talpha, thumb_scl; double prev_app_scale; protected slots: void getPinMC(bool * v); void adjustThumb(); void newBranch(BlockBusItem * item); void newBranchTrace(BlockBusItem * item, QPointF to); void newBranchAccept(BlockBusItem * item); void newBranchCancel(); void removedBus(QObject * o); void removedBlock(QObject * o); void removeJunk(); void sceneSelectionChanged(); void updateNavRect(); void scrolled(); void _setThumb(double v); void _setNav(QRectF v); void _navFinished(); void startBusPointMove(int bus_type); void pinHoverInOut(BlockItemPin * pin); void checkPaste(bool queued); void checkPaste() { checkPaste(false); } public slots: void setGridPen(const QPen & pen) { grid_pen = pen; _updateBack(); } void setGridVisible(bool yes) { grid_visible = yes; _updateBack(); } void setSnapToGrid(bool yes) { grid_snap = yes; } void setGridStep(double step) { grid_step = step; applyGridStep(); _updateBack(); } void setGridPointsWidth(double width_) { grid_points = width_; _updateBack(); } void setPostMoveConnectEnabled(bool on) { pm_connect = on; } void setNavigationEnabled(bool on) { navigation = on; } void setNavigateAnimationEnabled(bool on) { is_nav_anim = on; } void setBlockAnimationEnabled(bool on) { is_block_anim = on; } void setConnectByMouseEnabled(bool on) { m_connect = on; } void setTraceConsiderBuses(bool on) { m_trace_with_buses = on; } void setPinMulticonnectEnabled(bool on) { m_pin_mc = on; } void setMiniMapEnabled(bool on) { minimap = on; } void setZoomWheelOnly(bool on) { wheel_zoom = on; } void setBusSquareNodes(bool yes); void zoom(double factor); void zoomIn() { zoom(1.2); } void zoomOut() { zoom(1. / 1.2); } void zoomReset(); void copyToClipboard(); void pasteFromClipboard(); void reconnectAll(); void selectNone(); void selectAll(); void removeSelected(); void removeAll(); void clearSelection(); void addItem(QGraphicsItem * item, bool emit_action = true); signals: void blockDoubleClicked(BlockItem *); void blockHoverEnter(BlockItem *); void blockHoverLeave(BlockItem *); void busDoubleClicked(BlockBusItem *); void schemeAction(BlockItemBase::Action action, QList items); void blockRemoved(BlockItem * item); void connectionsChanged(); void copyEnabledChanged(bool); void pasteEnabledChanged(bool); void selectionChanged(); }; #endif // BLOCKVIEW_H