diff --git a/libs/blockview/blockbusitem.cpp b/libs/blockview/blockbusitem.cpp index 29d5d7f..a22e413 100644 --- a/libs/blockview/blockbusitem.cpp +++ b/libs/blockview/blockbusitem.cpp @@ -304,6 +304,14 @@ void BlockBusItem::simplify(bool full) { } +bool BlockBusItem::hasNullSegment() const { + for (int s = 0; s < segments.size(); ++s) { + if (pol[segments[s].first] == pol[segments[s].second]) return true; + } + return false; +} + + void BlockBusItem::adjustLine() {} diff --git a/libs/blockview/blockbusitem.h b/libs/blockview/blockbusitem.h index 7a5d409..ac781a0 100644 --- a/libs/blockview/blockbusitem.h +++ b/libs/blockview/blockbusitem.h @@ -91,6 +91,7 @@ public: void markAsOutput(); void unmark(); void simplify(bool full = true); + bool hasNullSegment() const; void adjustLine(); int endpointCount() const; bool isBusSelected() const { return selSegment >= 0 || selPoint >= 0; } diff --git a/libs/blockview/blockview.cpp b/libs/blockview/blockview.cpp index cc343ef..8af8435 100644 --- a/libs/blockview/blockview.cpp +++ b/libs/blockview/blockview.cpp @@ -464,9 +464,14 @@ bool BlockView::eventFilter(QObject * o, QEvent * e) { } if (!mm_mods.testFlag(Qt::ControlModifier) && !mm_mods.testFlag(Qt::ShiftModifier)) { if (!mdp.isNull()) moved = true; - foreach(QGraphicsItem * i, sel_items) - if (i->flags().testFlag(QGraphicsItem::ItemIsMovable)) i->setPos(i->pos() + mdp); - if (!me->modifiers().testFlag(Qt::AltModifier)) moveBuses(sel_items, mdp); + bool is_correct = true; + if (!me->modifiers().testFlag(Qt::AltModifier)) is_correct = moveBuses(sel_items, mdp); + if (is_correct) { + for (auto * i: sel_items) + if (i->flags().testFlag(QGraphicsItem::ItemIsMovable)) i->setPos(i->pos() + mdp); + } else { + scene_point -= mdp; + } setCursor(Qt::ClosedHandCursor); } return true; @@ -1487,28 +1492,42 @@ void BlockView::simplifyBuses() { } -void BlockView::moveBuses(const QList & items, QPointF dp) { - if (dp.isNull()) return; +bool BlockView::moveBuses(const QList & items, QPointF dp) { + if (dp.isNull()) return true; QList gi = scene_->items(); QVector pins; - QList buses; + QList buses_m_part, buses_m_all; + QMap saved_pols; // qDebug() << "move" << dp; - foreach(QGraphicsItem * i, items) + for (auto * i: items) if ((i->data(bvidType).toInt() == bvitBlock) && i->flags().testFlag(QGraphicsItem::ItemIsMovable)) pins << qgraphicsitem_cast(i)->pins(); - foreach(QGraphicsItem * i, gi) - if (i->data(bvidType).toInt() == bvitBus) buses << qgraphicsitem_cast(i); - foreach(BlockBusItem * b, buses) { - QList bpins = b->connections_.values(); - if (!bpins.isEmpty()) { - foreach(BlockItemPin * p, pins) + for (auto * i: gi) { + if (i->data(bvidType).toInt() == bvitBus) { + auto * b = qgraphicsitem_cast(i); + QList bpins = b->connectedPins(); + if (bpins.isEmpty()) continue; + bool affect = false; + for (auto * i: pins) { + if (bpins.contains(i)) { + affect = true; + break; + } + } + if (!affect) continue; + for (auto * p: pins) bpins.removeAll(p); - if (bpins.isEmpty()) { - b->movePolyline(dp); - continue; + if (bpins.isEmpty()) + buses_m_all << b; + else { + buses_m_part << b; + saved_pols[b] = b->pol; } } - foreach(BlockItemPin * p, pins) { + } + bool incorrect_move = false; + for (auto * b: buses_m_part) { + for (auto * p: pins) { QList ends = b->connections_.keys(p); for (int i = 0; i < ends.size(); ++i) { QPointF pdp = dp; @@ -1533,12 +1552,26 @@ void BlockView::moveBuses(const QList & items, QPointF dp) { default: break; } QVector epl = b->endpointLine(ends[i], ang); - foreach(int e, epl) + for (int e: epl) b->movePoint(e, pdp); b->movePoint(ends[i], dp); + if (b->hasNullSegment()) { + incorrect_move = true; + break; + } } + if (incorrect_move) break; } + if (incorrect_move) break; } + if (incorrect_move) { + for (auto * b: buses_m_part) + b->pol = saved_pols.value(b); + return false; + } + for (auto * b: buses_m_all) + b->movePolyline(dp); + return true; } diff --git a/libs/blockview/blockview.h b/libs/blockview/blockview.h index f902abd..cd80438 100644 --- a/libs/blockview/blockview.h +++ b/libs/blockview/blockview.h @@ -158,7 +158,7 @@ protected: void hoverAcceptedPin(BlockItemPin * pin, bool hover); void unhoverPins(BlockItemPin * excl_pin = 0); void simplifyBuses(); - void moveBuses(const QList & items, QPointF dp); + 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;