diff --git a/qad/blockview/blockeditor.ui b/qad/blockview/blockeditor.ui index 29044fc..6ff5ad3 100644 --- a/qad/blockview/blockeditor.ui +++ b/qad/blockview/blockeditor.ui @@ -315,6 +315,12 @@ + + Qt::ScrollBarAlwaysOff + + + Qt::ScrollBarAlwaysOff + true diff --git a/qad/blockview/blockview.cpp b/qad/blockview/blockview.cpp index 498e094..950e254 100644 --- a/qad/blockview/blockview.cpp +++ b/qad/blockview/blockview.cpp @@ -70,7 +70,7 @@ void BlockView::_init() { thumb_anim.setEasingCurve(QEasingCurve::InCubic); nav_anim.setTargetObject(this); nav_anim.setPropertyName("_nav"); - nav_anim.setEasingCurve(QEasingCurve::InQuad); + nav_anim.setEasingCurve(QEasingCurve::Linear); nav_anim.setDuration(200); connect(QApplication::clipboard(), SIGNAL(dataChanged()), this, SLOT(checkPaste())); connect(&nav_anim, SIGNAL(finished()), this, SLOT(_navFinished())); @@ -79,7 +79,7 @@ void BlockView::_init() { centerOn(scene_->sceneRect().center()); setCacheMode(CacheBackground); setTransformationAnchor(QGraphicsView::AnchorUnderMouse); - setResizeAnchor(QGraphicsView::AnchorUnderMouse); + setResizeAnchor(QGraphicsView::AnchorViewCenter); setRenderHint(QPainter::Antialiasing); setRenderHint(QPainter::SmoothPixmapTransform); setMouseTracking(true); @@ -656,7 +656,6 @@ void BlockView::wheelEvent(QWheelEvent * e) { if (!navigation) return; if (wheel_zoom || e->modifiers().testFlag(Qt::ControlModifier)) { double scl = 1. - e->delta() / 500.; - //scale(scl, scl); if (!is_nav_anim || (nav_anim.state() != QPropertyAnimation::Running)) nav_target = _nav(); QRectF r = nav_target; @@ -664,11 +663,9 @@ void BlockView::wheelEvent(QWheelEvent * e) { double cx = double(e->pos().x()) / vw, cy = double(e->pos().y()) / vh; double pw = r.width(), ph = r.height(); r.setWidth(r.width() * scl); - //r.setHeight(r.height() * scl); r.setHeight(r.width() * vh / vw); r.translate(cx * (pw - r.width()), cy * (ph - r.height())); animateNav(r, scl); - //_setNav(r); return; } if (!wheel_zoom) QGraphicsView::wheelEvent(e); @@ -693,6 +690,13 @@ void BlockView::mouseReleaseEvent(QMouseEvent * event) { } +void BlockView::updateNavRect() { + QPointF t = mapToScene(viewport()->rect().topLeft()); + QPointF b = mapToScene(viewport()->rect().bottomRight()); + nav_rect = QRectF(t, b); +} + + void BlockView::mouseMoveEvent(QMouseEvent * event) { if (navigation) { if (event->buttons().testFlag(Qt::MidButton) || event->buttons().testFlag(Qt::RightButton)) { @@ -700,7 +704,10 @@ void BlockView::mouseMoveEvent(QMouseEvent * event) { horizontalScrollBar()->setValue(horizontalScrollBar()->value() + dp.x()); verticalScrollBar()->setValue(verticalScrollBar()->value() + dp.y()); press_point = event->pos(); - nav_target = _nav(); + updateNavRect(); + QRectF nr = nav_anim.endValue().toRectF(); + nr.moveCenter(_nav().center()); + nav_anim.setEndValue(nr); return; } } @@ -708,6 +715,15 @@ void BlockView::mouseMoveEvent(QMouseEvent * event) { } +void BlockView::mouseDoubleClickEvent(QMouseEvent * event) { + if (event->buttons().testFlag(Qt::MidButton) || event->buttons().testFlag(Qt::RightButton)) { + fitInView(); + return; + } + QGraphicsView::mouseDoubleClickEvent(event); +} + + void BlockView::keyPressEvent(QKeyEvent * e) { BlockItemPin * pin = getPin(items(mapFromGlobal(QCursor::pos()))); if (pin) { @@ -761,6 +777,7 @@ void BlockView::resizeEvent(QResizeEvent * event) { QGraphicsView::resizeEvent(event); thick = lineThickness(); adjustThumb(); + updateNavRect(); nav_target = _nav(); } @@ -1084,42 +1101,49 @@ bool BlockView::connectPins(BlockItemPin * p0, BlockItemPin * p1) { void BlockView::setTransform(const QTransform & matrix, bool combine) { QGraphicsView::setTransform(matrix, combine); + updateNavRect(); nav_target = _nav(); } void BlockView::centerOn(const QPointF & pos) { QGraphicsView::centerOn(pos); + updateNavRect(); nav_target = _nav(); } void BlockView::centerOn(qreal x, qreal y) { QGraphicsView::centerOn(x, y); + updateNavRect(); nav_target = _nav(); } void BlockView::centerOn(const QGraphicsItem * item) { QGraphicsView::centerOn(item); + updateNavRect(); nav_target = _nav(); } void BlockView::fitInView(const QRectF & rect, Qt::AspectRatioMode aspectRatioMode) { QGraphicsView::fitInView(rect, aspectRatioMode); + updateNavRect(); nav_target = _nav(); } void BlockView::fitInView(qreal x, qreal y, qreal w, qreal h, Qt::AspectRatioMode aspectRatioMode) { QGraphicsView::fitInView(x, y, w, h, aspectRatioMode); + updateNavRect(); nav_target = _nav(); } void BlockView::fitInView(const QGraphicsItem * item, Qt::AspectRatioMode aspectRatioMode) { QGraphicsView::fitInView(item, aspectRatioMode); + updateNavRect(); nav_target = _nav(); } @@ -1127,8 +1151,10 @@ void BlockView::fitInView(const QGraphicsItem * item, Qt::AspectRatioMode aspect void BlockView::fitInView() { QRectF r = _nav(); QGraphicsView::fitInView(itemsBoundingRect(), Qt::KeepAspectRatio); + updateNavRect(); QRectF t = _nav(); QGraphicsView::fitInView(r, Qt::KeepAspectRatio); + updateNavRect(); animateNav(t); } @@ -1142,7 +1168,6 @@ QRectF BlockView::itemsBoundingRect() const { if (i->isVisible() && (i != &tmp_bus) && !tmp_buses.contains((BlockBusItem*)i)) { if ((i->data(1007) != "item_selection") && !i->data(1008).toBool()) { QRectF br = i->mapRectToScene(i->boundingRect()); - //qDebug() << br << i; if (br.width() <= 1 || br.height() <= 1) continue; if (f) ret = br; else ret |= br; @@ -1624,13 +1649,12 @@ QList BlockView::selectedDecors() const { void BlockView::animateNav(QRectF d, double scl) { nav_target = d; if (is_nav_anim) { - if (anim_el.elapsed() < 10 || (qAbs(scl - 1.) <= 0.1)) { + if (qAbs(scl - 1.) <= 0.1) { if (nav_anim.state() == QAbstractAnimation::Running) { nav_anim.stop(); _navFinished(); } _setNav(d); - anim_el.restart(); return; } if (nav_anim.state() != QAbstractAnimation::Running) { @@ -1645,7 +1669,6 @@ void BlockView::animateNav(QRectF d, double scl) { nav_anim.setStartValue(_nav()); nav_anim.setEndValue(d); nav_anim.start(); - anim_el.restart(); } else _setNav(d); } @@ -1821,7 +1844,6 @@ void BlockView::_setThumb(double v) { void BlockView::_setNav(QRectF v) { - //QGraphicsView::fitInView(v); double vw = viewport()->width(), vh = viewport()->height(); if (vw < 1. || vh < 1. || v.isEmpty()) return; QTransform matrix; @@ -1829,14 +1851,14 @@ void BlockView::_setNav(QRectF v) { double ascl = appScale(this); scl = qMin(qMax(scl, 0.02 * ascl), 50. * ascl); matrix.scale(scl, scl); - //qDebug() << scl; + nav_rect = v; QGraphicsView::setTransform(matrix); - QGraphicsView::centerOn(v.center()); + QGraphicsView::centerOn(nav_rect.center()); } QRectF BlockView::_nav() const { - return mapToScene(viewport()->rect()).boundingRect(); + return nav_rect; } diff --git a/qad/blockview/blockview.h b/qad/blockview/blockview.h index 71e9cd0..07696d8 100644 --- a/qad/blockview/blockview.h +++ b/qad/blockview/blockview.h @@ -58,6 +58,8 @@ class BlockView: public QGraphicsView Q_PROPERTY(double _thumb READ _thumb WRITE _setThumb DESIGNABLE false SCRIPTABLE false) Q_PROPERTY(QRectF _nav READ _nav WRITE _setNav DESIGNABLE false SCRIPTABLE false) + void updateNavRect(); + public: BlockView(QWidget * parent = 0); BlockView(QGraphicsScene * scene, QWidget * parent = 0); @@ -121,6 +123,7 @@ protected: 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); @@ -180,7 +183,7 @@ protected: 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; + QRectF nav_target, nav_rect; QSizeF thumb_size; QPen grid_pen; SelectionMode smode; @@ -188,7 +191,6 @@ protected: QWidget widget_thumb; Qt::KeyboardModifiers mm_mods; QPropertyAnimation thumb_anim, nav_anim; - QTime anim_el; 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;