From d35be49a5761f619764bf0d8723b328d6718e70a Mon Sep 17 00:00:00 2001 From: Ivan Pelipenko Date: Thu, 10 Sep 2020 17:32:30 +0300 Subject: [PATCH] BlockView cosmetics, more enums, fixed right-click on bus point/segment move --- libs/blockview/alignedtextitem.cpp | 5 +- libs/blockview/blockbase.h | 37 ++---- libs/blockview/blockbusitem.cpp | 23 +++- libs/blockview/blockeditor.cpp | 8 +- libs/blockview/blockitem.cpp | 24 ++-- libs/blockview/blockitempin.cpp | 6 +- libs/blockview/blockview.cpp | 197 ++++++++++++++++------------- libs/blockview/blockview.h | 4 +- libs/blockview/drawtools.cpp | 17 ++- 9 files changed, 173 insertions(+), 148 deletions(-) diff --git a/libs/blockview/alignedtextitem.cpp b/libs/blockview/alignedtextitem.cpp index 5c6107c..b870517 100644 --- a/libs/blockview/alignedtextitem.cpp +++ b/libs/blockview/alignedtextitem.cpp @@ -1,4 +1,5 @@ #include "alignedtextitem.h" +#include "blockbase.h" #include #include #include @@ -6,7 +7,7 @@ AlignedTextItem::AlignedTextItem(QGraphicsItem * parent): QGraphicsItem(parent), text_(this) { align_ = Qt::AlignTop | Qt::AlignHCenter; - text_.setData(1003, true); + text_.setData(bvidVisualizeSelection, true); setFont(font()); _move(); } @@ -14,7 +15,7 @@ AlignedTextItem::AlignedTextItem(QGraphicsItem * parent): QGraphicsItem(parent), AlignedTextItem::AlignedTextItem(const QString & text, QGraphicsItem * parent): QGraphicsItem(parent), text_(this) { align_ = Qt::AlignTop | Qt::AlignHCenter; - text_.setData(1003, true); + text_.setData(bvidVisualizeSelection, true); setFont(font()); setText(text); } diff --git a/libs/blockview/blockbase.h b/libs/blockview/blockbase.h index 0d13ea4..189f4ba 100644 --- a/libs/blockview/blockbase.h +++ b/libs/blockview/blockbase.h @@ -32,42 +32,29 @@ #include "qad_blockview_export.h" -/// data: -/// 1002 - flag for move parent (true) -/// 1003 - flag for visualize selection (true) -/// 1004 - BlockItemPin ("pin") -/// 1005 - BlockBusItem ("connection") -/// 1006 - BlockItem ("item") -/// 1007 - BlockItem selection (true) -/// 1008 - item is NOT decor, ignore for function decors() (true) -/// 1009 - item is scene decor ("decor") -/// 1010 - BlockItem decor (src text for QGraphicsSimpleTextItem) -/// 1011 - item is BlockItem decor (true) -/// 1100 - flag for correct move (true) - static const int _blockitem_current_version_ = 1; enum BlockviewItemData { - bvidSelected = 1000, // bool - bvidItemPos = 1001, // QpointF - bvidMoveParent = 1002, // bool - bvidVisualizeSelection = 1003, // bool - bvidType = 1005, // BlockviewItemType - bvidInvalidItem = 1008, // bool - bvidDecorText = 1010, // QString - bvidBlockDecor = 1011, // bool - bvidDTHandle = 1012, // bool - bvidCorrectMove = 1100, // bool + bvidSelected = 1000, // bool + bvidType , // BlockviewItemType + bvidItemPos , // QPointF + bvidDecorText , // QString src text for QGraphicsSimpleTextItem + bvidMoveParent , // bool flag for move parent + bvidVisualizeSelection , // bool flag for visualize selection + bvidItemSelection , // bool BlockItem selection + bvidInvalidItem , // bool item is NOT decor, ignore for function decors + bvidBlockDecor , // bool item is BlockItem decor + bvidDTHandle , // bool + bvidCorrectMove , // bool }; enum BlockviewItemType { + bvitInvalid, bvitPin, bvitBus, bvitBlock, - bvitSelection, bvitDecor, - bvitItemText, }; QAD_BLOCKVIEW_EXPORT QDataStream & operator <<(QDataStream & s, const QGraphicsItem * item); diff --git a/libs/blockview/blockbusitem.cpp b/libs/blockview/blockbusitem.cpp index 0a7231f..e3f1bf6 100644 --- a/libs/blockview/blockbusitem.cpp +++ b/libs/blockview/blockbusitem.cpp @@ -4,7 +4,7 @@ BlockBusItem::BlockBusItem(bool temp): QGraphicsObject(), PropertyStorage() { temp_ = temp; _init(); - if (!temp) setData(1005, "connection"); + if (!temp) setData(bvidType, bvitBus); else hide(); } @@ -12,7 +12,7 @@ BlockBusItem::BlockBusItem(bool temp): QGraphicsObject(), PropertyStorage() { BlockBusItem::BlockBusItem(const BlockBusItem & other): QGraphicsObject(), PropertyStorage() { temp_ = false; _init(); - setData(1005, "connection"); + setData(bvidType, bvitBus); setPen(other.pen()); setBrush(other.brush()); setBusType(other.busType()); @@ -543,7 +543,7 @@ void BlockBusItem::hoverMoveEvent(QGraphicsSceneHoverEvent * e) { bil << this; for (int i = 0; i < il.size(); ++i) { QGraphicsItem * b = il[i]; - if (b->data(1005) == "connection" && b != this) { + if ((b->data(bvidType).toInt() == bvitBus) && b != this) { int tp = -1, ts = -1; ((BlockBusItem*)b)->testPoint(sp, &tp, &ts); if (tp >= 0 || ts >= 0) { @@ -581,14 +581,17 @@ void BlockBusItem::mousePressEvent(QGraphicsSceneMouseEvent * e) { return; } int btncnt = 0; - if (endpoints().contains(selPoint) && (e->button() == Qt::LeftButton) && e->modifiers().testFlag(Qt::ShiftModifier)) - QMetaObject::invokeMethod(scene()->views().back(), "startBusPointMove", Q_ARG(int, busType())); + if ((e->button() == Qt::LeftButton) && e->modifiers().testFlag(Qt::ShiftModifier)) { + bpol = pol; + if (endpoints().contains(selPoint)) + QMetaObject::invokeMethod(scene()->views().back(), "startBusPointMove", Q_ARG(int, busType())); + } if (e->buttons().testFlag(Qt::LeftButton)) btncnt++; if (e->buttons().testFlag(Qt::RightButton)) btncnt++; if (e->buttons().testFlag(Qt::MidButton)) btncnt++; if (btncnt > 0) mm_mods = e->modifiers(); - //qDebug() << "press" << e; if (btncnt >= 2 && e->button() == Qt::RightButton) { + //qDebug() << "bus revert"; mm_cancel = true; moved = false; QPointF lp = qp - press_pos; @@ -659,16 +662,22 @@ void BlockBusItem::mouseMoveEvent(QGraphicsSceneMouseEvent * e) { QGraphicsObject::mouseMoveEvent(e); return; } + BlockView * bv = 0; + if (!scene()->views().isEmpty()) { + bv = qobject_cast(scene()->views().back()); + } qp = quantize(e->scenePos(), grid_step); lp = qp - lp; if (e->buttons().testFlag(Qt::LeftButton) && mm_mods.testFlag(Qt::NoModifier) && new_segment) { - QMetaObject::invokeMethod(scene()->views().back(), "newBranchTrace", Q_ARG(BlockBusItem * , this), Q_ARG(QPointF, e->scenePos())); + if (bv) + QMetaObject::invokeMethod(bv, "newBranchTrace", Q_ARG(BlockBusItem * , this), Q_ARG(QPointF, e->scenePos())); return; } if (new_segment) { new_end = qp; prepareGeometryChange(); } else { + if (bv) bv->cur_bus = this; if (e->buttons().testFlag(Qt::LeftButton)) { lm_point = selPoint >= 0; if (selPoint >= 0 && selPoint <= pol.size() - 1) diff --git a/libs/blockview/blockeditor.cpp b/libs/blockview/blockeditor.cpp index 0f99020..92c5d7e 100644 --- a/libs/blockview/blockeditor.cpp +++ b/libs/blockview/blockeditor.cpp @@ -83,8 +83,8 @@ void BlockEditor::loadModel(const QByteArray &model) { pin_tli[p->alignment()]->addChild(ti); } foreach (QGraphicsItem * i, block.decors()) { - i->setData(1002, false); - i->setData(1100, true); + i->setData(bvidMoveParent, false); + i->setData(bvidCorrectMove, true); } ui->treePins->blockSignals(false); } @@ -123,8 +123,8 @@ void BlockEditor::selectionChanged() { void BlockEditor::addItem(QGraphicsItem *item) { block.addDecor(item); - item->setData(1002, false); - item->setData(1100, true); + item->setData(bvidMoveParent, false); + item->setData(bvidCorrectMove, true); } diff --git a/libs/blockview/blockitem.cpp b/libs/blockview/blockitem.cpp index 510abbb..620bdc0 100644 --- a/libs/blockview/blockitem.cpp +++ b/libs/blockview/blockitem.cpp @@ -6,16 +6,16 @@ BlockItem::BlockItem(QGraphicsItem * parent): QGraphicsObject(parent), PropertyStorage(), g_main(this), g_selection(this) { - setData(1006, "item"); + setData(bvidType, bvitBlock); setZValue(2.); setAcceptHoverEvents(true); setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsMovable); - g_main.setData(1002, true); - g_selection.setData(1007, true); + g_main.setData(bvidMoveParent, true); + g_selection.setData(bvidItemSelection, true); g_selection.setAcceptedMouseButtons(Qt::MouseButtons()); g_selection.setZValue(10.); g_selection.hide(); - g_selection.setData(1003, true); + g_selection.setData(bvidVisualizeSelection, true); col = Qt::lightGray; _resize(QSizeF(100., 60.)); QPen p(QColor(128, 128, 255), lineThickness(), Qt::DotLine); @@ -117,11 +117,11 @@ void BlockItem::addDecor(QGraphicsItem * item) { if (qgraphicsitem_cast(item)) qgraphicsitem_cast(item)->setTransformationMode(Qt::SmoothTransformation); if (qgraphicsitem_cast(item)) - qgraphicsitem_cast(item)->setData(1010, qgraphicsitem_cast(item)->text()); + qgraphicsitem_cast(item)->setData(bvidDecorText, qgraphicsitem_cast(item)->text()); if (qgraphicsitem_cast(item)) - qgraphicsitem_cast(item)->setData(1010, qgraphicsitem_cast(item)->text()); - item->setData(1002, true); - item->setData(1011, true); + qgraphicsitem_cast(item)->setData(bvidDecorText, qgraphicsitem_cast(item)->text()); + item->setData(bvidMoveParent, true); + item->setData(bvidBlockDecor, true); decors_ << item; item->setParentItem(this); } @@ -132,11 +132,11 @@ void BlockItem::addDecor(QGraphicsItem & item) { if (qgraphicsitem_cast(&item)) qgraphicsitem_cast(&item)->setTransformationMode(Qt::SmoothTransformation); if (qgraphicsitem_cast(&item)) - qgraphicsitem_cast(&item)->setData(1010, qgraphicsitem_cast(&item)->text()); + qgraphicsitem_cast(&item)->setData(bvidDecorText, qgraphicsitem_cast(&item)->text()); if (qgraphicsitem_cast(&item)) - qgraphicsitem_cast(&item)->setData(1010, qgraphicsitem_cast(&item)->text()); - item.setData(1002, true); - item.setData(1011, true); + qgraphicsitem_cast(&item)->setData(bvidDecorText, qgraphicsitem_cast(&item)->text()); + item.setData(bvidMoveParent, true); + item.setData(bvidBlockDecor, true); //decors_ << &item; item.setParentItem(this); } diff --git a/libs/blockview/blockitempin.cpp b/libs/blockview/blockitempin.cpp index 40c4320..766d4c2 100644 --- a/libs/blockview/blockitempin.cpp +++ b/libs/blockview/blockitempin.cpp @@ -4,10 +4,10 @@ BlockItemPin::BlockItemPin(Qt::Alignment a, int bus_type_, const QString & text_, QGraphicsObject * _parent): QGraphicsObject(_parent), ell_item(this), text_item(this) { parent_ = 0; - setData(1004, "pin"); + setData(bvidType, bvitPin); setAcceptHoverEvents(true); - text_item.setData(1002, true); - ell_item.setData(1003, true); + text_item.setData(bvidMoveParent, true); + ell_item.setData(bvidVisualizeSelection, true); br[Disconnected] = QBrush(Qt::lightGray); br[Connected] = QBrush(Qt::darkGreen); br[Hover] = QBrush(Qt::blue); diff --git a/libs/blockview/blockview.cpp b/libs/blockview/blockview.cpp index 8e854dc..156e74c 100644 --- a/libs/blockview/blockview.cpp +++ b/libs/blockview/blockview.cpp @@ -13,6 +13,14 @@ const QString _BlockView_Mime_ = "_BlockView_copypaste_"; +template QSet QList2QSet(const QList & l) { +#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) + return QSet(l.begin(), l.end()); +#else + return QSet::fromList(l); +#endif +} + BlockView::BlockView(QWidget * parent): QGraphicsView(parent), tmp_bus(true) { _init(); } @@ -33,7 +41,7 @@ void BlockView::_init() { qRegisterMetaType(); grid_visible = grid_snap = pm_connect = navigation = m_connect = m_trace_with_buses = prev_tcb = minimap = true; mm_drag = moved = new_branch = new_bus = mm_cancel = iconnect = mm_copy = m_pin_mc = mm_thumb = move_bus_point = wheel_zoom = false; - match_bus = bus_from = 0; + match_bus = bus_from = cur_bus = 0; mm_ci = 0; hpin = 0; ghost_ = 0; @@ -164,12 +172,12 @@ bool BlockView::eventFilter(QObject * o, QEvent * e) { case QEvent::GraphicsSceneMouseDoubleClick: mil = scene_->items(scene_point); foreach (QGraphicsItem * i, mil) { - if (i->data(1006) == "item") { + if (i->data(bvidType).toInt() == bvitBlock) { //emit blockDoubleClicked((BlockItem * )i); QMetaObject::invokeMethod(this, "blockDoubleClicked", Qt::QueuedConnection, Q_ARG(BlockItem * , (BlockItem*)i)); return true; } - if (i->data(1005) == "connection") { + if (i->data(bvidType).toInt() == bvitBus) { if (qgraphicsitem_cast(i)->isBusSelected()) { //emit busDoubleClicked(qgraphicsitem_cast(i)); QMetaObject::invokeMethod(this, "busDoubleClicked", Qt::QueuedConnection, Q_ARG(BlockBusItem * , (BlockBusItem*)i)); @@ -183,7 +191,7 @@ bool BlockView::eventFilter(QObject * o, QEvent * e) { mil = scene_->items(scene_point); mm_ci = (mil.isEmpty() ? 0 : mil.front()); if (mm_ci != 0) { - while (mm_ci->data(1005).toString() == "connection") { + while (mm_ci->data(bvidType).toInt() == bvitBus) { if (qgraphicsitem_cast(mm_ci)) if (qgraphicsitem_cast(mm_ci)->isBusSelected()) break; @@ -199,13 +207,12 @@ bool BlockView::eventFilter(QObject * o, QEvent * e) { break;*/ case QEvent::GraphicsSceneMousePress: if (mm_ci != 0) { - if (mm_ci->data(1008).toBool()) { + if (mm_ci->data(bvidInvalidItem).toBool()) { mm_ci = 0; break; } - //if (mm_ci->data(1007).toBool()) break; + //if (mm_ci->data(bvidItemSelection).toBool()) break; } - //qDebug() << "press"; if (me->buttons().testFlag(Qt::LeftButton)) btncnt++; if (me->buttons().testFlag(Qt::RightButton)) btncnt++; if (me->buttons().testFlag(Qt::MidButton)) btncnt++; @@ -218,34 +225,41 @@ bool BlockView::eventFilter(QObject * o, QEvent * e) { QList gi = scene_->items(); block_emit_selection = true; foreach (QGraphicsItem * i, gi) - i->setSelected(i->data(1000).toBool()); + i->setSelected(i->data(bvidSelected).toBool()); block_emit_selection = false; emit selectionChanged(); } - if (mm_copy && mm_cancel) { - deleteCopyTemp(); - mm_copy = moved = false; - unsetCursor(); + if (mm_cancel) { + if (cur_bus) { + cur_bus->pol = cur_bus->bpol; + cur_bus->prepareGeometryChange(); + cur_bus = 0; + } + if (mm_copy) { + deleteCopyTemp(); + mm_copy = moved = false; + unsetCursor(); + } + if (new_bus) { + new_bus = false; + unmarkPins(true); + reconnectAll(); + hideTmpBuses(); + m_trace_with_buses = prev_tcb; + } + if (new_branch) { + new_branch = false; + hideTmpBuses(); + m_trace_with_buses = prev_tcb; + } + if (moved) { + moved = false; + restoreSelState(); + hideTmpBuses(); + m_trace_with_buses = prev_tcb; + } + return true; } - if (new_bus && mm_cancel) { - new_bus = false; - unmarkPins(true); - reconnectAll(); - hideTmpBuses(); - m_trace_with_buses = prev_tcb; - } - if (new_branch && mm_cancel) { - new_branch = false; - hideTmpBuses(); - m_trace_with_buses = prev_tcb; - } - if (moved && mm_cancel) { - moved = false; - restoreSelState(); - hideTmpBuses(); - m_trace_with_buses = prev_tcb; - } - if (mm_cancel) return true; mm_mods = me->modifiers(); mm_drag = moved = false; screen_point = me->screenPos(); @@ -260,7 +274,7 @@ bool BlockView::eventFilter(QObject * o, QEvent * e) { while (!mil.isEmpty()) { mm_ci = mil.front(); if (mm_ci->data(bvidDTHandle).toBool()) return QGraphicsView::eventFilter(o, e); - if (mm_ci->data(1008).toBool() || mm_ci->data(1007).toBool()) { + if (mm_ci->data(bvidInvalidItem).toBool() || mm_ci->data(bvidItemSelection).toBool()) { mil.pop_front(); } else break; } @@ -268,7 +282,7 @@ bool BlockView::eventFilter(QObject * o, QEvent * e) { mm_ci = 0; return true; } - while (mm_ci->data(1005).toString() == "connection") { + while (mm_ci->data(bvidType).toInt() == bvitBus) { if (qgraphicsitem_cast(mm_ci)) if (qgraphicsitem_cast(mm_ci)->isBusSelected()) break; @@ -280,21 +294,21 @@ bool BlockView::eventFilter(QObject * o, QEvent * e) { break; } } - if (mm_ci->data(1003).toBool()) { + if (mm_ci->data(bvidVisualizeSelection).toBool()) { if (mil.size() > 1) { mm_ci = mil[1]; mil.pop_front(); - if (mm_ci->data(1003).toBool()) + if (mm_ci->data(bvidVisualizeSelection).toBool()) if (mil.size() > 1) mm_ci = mil[1]; } else mm_ci = 0; } - if (mm_ci->data(1002).toBool()) { + if (mm_ci->data(bvidMoveParent).toBool()) { QGraphicsItem * ti = mm_ci; while (mm_ci->parentItem() != 0) mm_ci = mm_ci->parentItem(); - if (!ti->data(1010).toString().isEmpty()) { // text item, check for rect + if (!ti->data(bvidDecorText).toString().isEmpty()) { // text item, check for rect BlockItem * bi = qgraphicsitem_cast(mm_ci); if (bi) { if (!bi->sceneRect().contains(scene_point)) { @@ -306,7 +320,7 @@ bool BlockView::eventFilter(QObject * o, QEvent * e) { return true; } if (mm_ci) { - if (mm_ci->data(1004) == "pin" && m_connect) { + if ((mm_ci->data(bvidType).toInt() == bvitPin) && m_connect) { if (qgraphicsitem_cast(mm_ci)->state() == BlockItemPin::Hover) { trace_from = mm_ci->scenePos(); qgraphicsitem_cast(mm_ci)->clearStateStack(); @@ -344,11 +358,11 @@ bool BlockView::eventFilter(QObject * o, QEvent * e) { ghost_->setPos(quantize(me->scenePos(), grid_step)); }*/ if (mm_ci) - if (mm_ci->data(1008).toBool()) { + if (mm_ci->data(bvidInvalidItem).toBool()) { mm_ci = 0; break; } - if (mm_ci->data(1007).toBool()) break; + if (mm_ci->data(bvidItemSelection).toBool()) break; if (mm_ci->data(bvidDTHandle).toBool()) break; if (mm_cancel) return true; if (me->buttons().testFlag(Qt::LeftButton)) { @@ -362,7 +376,7 @@ bool BlockView::eventFilter(QObject * o, QEvent * e) { mil = scene_->items(me->scenePos()); hpin = 0; foreach (QGraphicsItem * i, mil) - if (i->data(1004) == "pin") { + if (i->data(bvidType).toInt() == bvitPin) { hpin = qgraphicsitem_cast(i); break; } @@ -391,7 +405,7 @@ bool BlockView::eventFilter(QObject * o, QEvent * e) { if (fmm_drag) { fmm_drag = false; if (mm_ci) { - if ((mm_ci->data(1006) == "item")) { + if (mm_ci->data(bvidType).toInt() == bvitBlock) { if (!mm_ci->isSelected() && sel_items.isEmpty()) { clearSelection(); mm_ci->setSelected(true); @@ -407,7 +421,7 @@ bool BlockView::eventFilter(QObject * o, QEvent * e) { deleteCopyTemp(); QList bi; foreach (QGraphicsItem * i, sel_items) { - if (i->data(1006) == "item") { + if (i->data(bvidType).toInt() == bvitBlock) { //qDebug() << "copy"; bi << qgraphicsitem_cast(i); BlockItem * ti = bi.back()->copy(); @@ -492,7 +506,7 @@ bool BlockView::eventFilter(QObject * o, QEvent * e) { } } if (mm_ci) - if (mm_ci->data(1100).toBool()) + if (mm_ci->data(bvidBlockDecor).toBool()) return true; } if (me->modifiers().testFlag(Qt::ControlModifier) && me->buttons() != 0 && mm_ci == 0) @@ -510,11 +524,11 @@ bool BlockView::eventFilter(QObject * o, QEvent * e) { return true; } if (mm_ci) - if (mm_ci->data(1008).toBool()) { + if (mm_ci->data(bvidInvalidItem).toBool()) { mm_ci = 0; break; } - if (mm_ci->data(1007).toBool()) break; + if (mm_ci->data(bvidItemSelection).toBool()) break; if (mm_copy) { QList ai; blockSignals(true); @@ -522,7 +536,7 @@ bool BlockView::eventFilter(QObject * o, QEvent * e) { QList ci; QList bi; foreach (QGraphicsItem * b, sel_items) - if (b->data(1006) == "item") { + if (b->data(bvidType).toInt() == bvitBlock) { ci << qgraphicsitem_cast(b); ai << qgraphicsitem_cast(b); } @@ -544,7 +558,7 @@ bool BlockView::eventFilter(QObject * o, QEvent * e) { if (moved && pm_connect) { QList ci; foreach (QGraphicsItem * b, sel_items) - if (b->data(1006) == "item") + if (b->data(bvidType).toInt() == bvitBlock) ci << b; simplifyBuses(); emitActionEvent(BlockItemBase::BlockMove, ci); @@ -591,7 +605,7 @@ bool BlockView::eventFilter(QObject * o, QEvent * e) { } else { if (mm_ci != 0) { if (me->modifiers().testFlag(Qt::ControlModifier)) { - if (mm_ci->data(1006) == "item") + if (mm_ci->data(bvidType).toInt() == bvitBlock) mm_ci->setSelected(!mm_ci->isSelected()); } else mm_ci->setSelected(true); @@ -642,12 +656,20 @@ void BlockView::timerEvent(QTimerEvent * e) { void BlockView::wheelEvent(QWheelEvent * e) { if (!navigation) return; if (wheel_zoom || e->modifiers().testFlag(Qt::ControlModifier)) { +#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) + double scl = 1. - e->angleDelta().y() / 500.; +#else double scl = 1. - e->delta() / 500.; +#endif if (!is_nav_anim || (nav_anim.state() != QPropertyAnimation::Running)) nav_target = _nav(); QRectF r = nav_target; double vw = viewport()->width(), vh = viewport()->height(); +#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) + double cx = double(e->position().x()) / vw, cy = double(e->position().y()) / vh; +#else double cx = double(e->pos().x()) / vw, cy = double(e->pos().y()) / vh; +#endif double pw = r.width(), ph = r.height(); r.setWidth(r.width() * scl); r.setHeight(r.width() * vh / vw); @@ -950,7 +972,7 @@ void BlockView::clearSelection() { void BlockView::addItem(QGraphicsItem * item, bool emit_action) { scene_->addItem(item); applyGridStep(); - if (item->data(1005) == "connection") { + if (item->data(bvidType).toInt() == bvitBus) { loadBus(qgraphicsitem_cast(item)); ((BlockBusItem*)item)->setSquareNodes(square_node); connect((BlockBusItem*)item, SIGNAL(destroyed(QObject*)), this, SLOT(removedBus(QObject*)), Qt::UniqueConnection); @@ -958,14 +980,14 @@ void BlockView::addItem(QGraphicsItem * item, bool emit_action) { emit connectionsChanged(); return; } - if (item->data(1006) == "item") { + if (item->data(bvidType).toInt() == bvitBlock) { connect((BlockItem*)item, SIGNAL(destroyed(QObject*)), this, SLOT(removedBlock(QObject*)), Qt::UniqueConnection); connect((BlockItem*)item, SIGNAL(blockHoverEnter(BlockItem*)), this, SIGNAL(blockHoverEnter(BlockItem*)), Qt::UniqueConnection); connect((BlockItem*)item, SIGNAL(blockHoverLeave(BlockItem*)), this, SIGNAL(blockHoverLeave(BlockItem*)), Qt::UniqueConnection); if (emit_action) emitActionEvent(BlockItemBase::BlockAdd, QList() << item); return; } - item->setData(1009, "decor"); + item->setData(bvidType, bvitDecor); } @@ -973,7 +995,7 @@ QList BlockView::buses() const { QList ret; QList gi = scene_->items(); foreach (QGraphicsItem * i, gi) - if (i->data(1005) == "connection") + if (i->data(bvidType).toInt() == bvitBus) if (!copy_buses.contains((BlockBusItem*)i)) ret << qgraphicsitem_cast(i); return ret; @@ -1002,7 +1024,7 @@ QList BlockView::blocks() const { QList ret; QList gi = scene_->items(); foreach (QGraphicsItem * i, gi) - if (i->data(1006) == "item") + if (i->data(bvidType).toInt() == bvitBlock) ret << qgraphicsitem_cast(i); return ret; } @@ -1011,7 +1033,7 @@ QList BlockView::blocks() const { QList BlockView::decors() const { QList ret, gi = scene_->items(); foreach (QGraphicsItem * i, gi) - if ((i->data(1009) == "decor") && !i->data(1008).toBool() && !i->data(1007).toBool() && (i->parentItem() == 0) + if ((i->data(bvidType).toInt() == bvitDecor) && !i->data(bvidInvalidItem).toBool() && !i->data(bvidItemSelection).toBool() && (i->parentItem() == 0) && (i != &sel_rect) && (i != &tmp_bus) && !tmp_buses.contains((BlockBusItem*)i)) ret << i; return ret; @@ -1027,7 +1049,8 @@ BlockBusItem * BlockView::connectionBus(BlockItem * b0, BlockItem * b1) const { QList BlockView::connectionBuses(BlockItem * b0, BlockItem * b1) const { if (!b0 || !b1) return QList(); - QSet bs0 = b0->connectedBuses().toSet(), bs1 = b1->connectedBuses().toSet(); + QSet bs0 = QList2QSet(b0->connectedBuses()), + bs1 = QList2QSet(b1->connectedBuses()); return (bs0 & bs1).values(); } @@ -1037,7 +1060,7 @@ bool BlockView::connectPins(BlockItemPin * p0, BlockItemPin * p1) { if (p0 == p1) return false; if (p0->busType() != p1->busType()) return false; QList bl0 = p0->connectedBuses(), bl1 = p1->connectedBuses(); - if (!(bl0.toSet() & bl1.toSet()).isEmpty()) return true; + if (!(QList2QSet(bl0) & QList2QSet(bl1)).isEmpty()) return true; BlockBusItem * nb = new BlockBusItem(); nb->setBusType(p0->busType()); //nb->setEndpointsNumber(3); @@ -1165,7 +1188,7 @@ QRectF BlockView::itemsBoundingRect() const { QRectF ret; foreach (QGraphicsItem * i, gi) if (i->isVisible() && (i != &tmp_bus) && !tmp_buses.contains((BlockBusItem*)i)) { - if (!(i->data(1007).toBool()) && !i->data(1008).toBool()) { + if (!(i->data(bvidItemSelection).toBool()) && !i->data(bvidInvalidItem).toBool()) { QRectF br = i->mapRectToScene(i->boundingRect()); if (br.width() <= 1 || br.height() <= 1) continue; if (f) ret = br; @@ -1179,11 +1202,11 @@ QRectF BlockView::itemsBoundingRect() const { void BlockView::restoreSelState() { foreach (QGraphicsItem * i, sel_items) { - i->setPos(i->data(1001).toPointF()); + i->setPos(i->data(bvidItemPos).toPointF()); } QList gi = scene_->items(); foreach (QGraphicsItem * i, gi) - if (i->data(1005) == "connection") { + if (i->data(bvidType).toInt() == bvitBus) { BlockBusItem * bi = qgraphicsitem_cast(i); bi->pol = bi->bpol; bi->prepareGeometryChange(); @@ -1195,9 +1218,9 @@ void BlockView::saveSelState() { QList gi = scene_->items(); sel_items = scene_->selectedItems(); foreach (QGraphicsItem * i, gi) { - i->setData(1000, i->isSelected()); - i->setData(1001, i->pos()); - if (i->data(1005) == "connection") + i->setData(bvidSelected, i->isSelected()); + i->setData(bvidItemPos, i->pos()); + if (i->data(bvidType).toInt() == bvitBus) qgraphicsitem_cast(i)->bpol = qgraphicsitem_cast(i)->pol; } } @@ -1226,7 +1249,7 @@ void BlockView::applySelRect(QGraphicsSceneMouseEvent * me) { if (!add) clearSelection(); else { foreach (QGraphicsItem * i, gi) - i->setSelected(i->data(1000).toBool()); + i->setSelected(i->data(bvidSelected).toBool()); } foreach (QGraphicsItem * i, ci) { i->setSelected(!i->isSelected()); @@ -1262,7 +1285,7 @@ void BlockView::trace(QPointF scene_pos_from, QPointF scene_pos_to, BlockBusItem wavetrace.fill(BlockViewWavetrace::Empty); QList gi = scene_->items(); foreach (QGraphicsItem * i, gi) - if (i->data(1006) == "item") { + if (i->data(bvidType).toInt() == bvitBlock) { QRect ir = i->mapRectToScene(i->boundingRect()).toRect().normalized(); wavetrace.fill(QRect(ir.topLeft() / grid_step + dp, ir.bottomRight() / grid_step + dp), BlockViewWavetrace::Blocked); QVector pins = qgraphicsitem_cast(i)->pins(); @@ -1273,7 +1296,7 @@ void BlockView::trace(QPointF scene_pos_from, QPointF scene_pos_to, BlockBusItem } if (m_trace_with_buses) { foreach (QGraphicsItem * i, gi) - if (i->data(1005) == "connection") { + if (i->data(bvidType).toInt() == bvitBus) { BlockBusItem * b = qgraphicsitem_cast(i); if (!b) continue; for (int s = 0; s < b->segments.size(); ++s) { @@ -1322,7 +1345,7 @@ void BlockView::trace(QPointF scene_pos_from, QPointF scene_pos_to, BlockBusItem void BlockView::clearBusStates() { QList gi = scene_->items(); foreach (QGraphicsItem * i, gi) - if (i->data(1005) == "connection") { + if (i->data(bvidType).toInt() == bvitBus) { BlockBusItem * b = qgraphicsitem_cast(i); b->clearBusState(); // if (i != bus_from && i != match_bus) @@ -1344,9 +1367,9 @@ void BlockView::matchBus() { point = tmp_bus.pol.back(); foreach (QGraphicsItem * i, gi) { if (i != bus_from) { - if (i->data(1005) == "connection") + if (i->data(bvidType).toInt() == bvitBus) buses << qgraphicsitem_cast(i); - if (i->data(1006) == "item") + if (i->data(bvidType).toInt() == bvitBlock) blockl << qgraphicsitem_cast(i); } } @@ -1435,7 +1458,7 @@ void BlockView::markPins(int bus_type) { unhoverPins(); QList gi = scene_->items(); foreach (QGraphicsItem * i, gi) { - if (i->data(1004) == "pin") { + if (i->data(bvidType).toInt() == bvitPin) { BlockItemPin * p = qgraphicsitem_cast(i); p->saveState(); if (m_pin_mc) { @@ -1458,7 +1481,7 @@ void BlockView::unmarkPins(bool to_normal) { unhoverPins(); QList gi = scene_->items(); foreach (QGraphicsItem * i, gi) { - if (i->data(1004) == "pin") { + if (i->data(bvidType).toInt() == bvitPin) { qgraphicsitem_cast(i)->restoreState(); if (to_normal) while (qgraphicsitem_cast(i)->restoreState()); @@ -1477,7 +1500,7 @@ void BlockView::unhoverPins(BlockItemPin* excl_pin) { QList gi = scene_->items(); foreach (QGraphicsItem * i, gi) { if (excl_pin == ((BlockItemPin*)i)) continue; - if (i->data(1004) == "pin") { + if (i->data(bvidType).toInt() == bvitPin) { ((BlockItemPin*)i)->enlargePin(false); } } @@ -1498,10 +1521,10 @@ void BlockView::moveBuses(const QList & items, QPointF dp) { QList buses; //qDebug() << "move" << dp; foreach (QGraphicsItem * i, items) - if (i->data(1006) == "item" && i->flags().testFlag(QGraphicsItem::ItemIsMovable)) + if ((i->data(bvidType).toInt() == bvitBlock) && i->flags().testFlag(QGraphicsItem::ItemIsMovable)) pins << qgraphicsitem_cast(i)->pins(); foreach (QGraphicsItem * i, gi) - if (i->data(1005) == "connection") + if (i->data(bvidType).toInt() == bvitBus) buses << qgraphicsitem_cast(i); foreach (BlockBusItem * b, buses) { QList bpins = b->connections_.values(); @@ -1555,10 +1578,10 @@ QList BlockView::internalBuses(const QList & item QList ret; if (items.isEmpty()) return ret; QList sbl = buses(); - QSet sis = QSet::fromList(items); + QSet sis = QList2QSet(items); foreach (BlockBusItem * bi, sbl) { if (bi->connectedBlocks().isEmpty()) continue; - QSet bis = QSet::fromList(bi->connectedBlocks()); + QSet bis = QList2QSet(bi->connectedBlocks()); if ((bis - sis).isEmpty()) ret << bi; } @@ -1604,7 +1627,7 @@ QList BlockView::nearPins(BlockItemPin * pin, Qt::KeyboardModif BlockItemPin * BlockView::getPin(const QList & list) const { foreach (QGraphicsItem * i, list) { - if (i->data(1004) == "pin") + if (i->data(bvidType).toInt() == bvitPin) return qgraphicsitem_cast(i); } return 0; @@ -1638,7 +1661,7 @@ QList BlockView::selectedBlocks() const { QList ret; QList sil = scene()->selectedItems(); foreach (QGraphicsItem * b, sil) - if (b->data(1006) == "item") + if (b->data(bvidType).toInt() == bvitBlock) ret << qgraphicsitem_cast(b); return ret; } @@ -1833,7 +1856,7 @@ void BlockView::removedBlock(QObject * o) { void BlockView::removeJunk() { QList gi = scene_->items(); foreach (QGraphicsItem * i, gi) { - if (i->data(1005) != "connection") continue; + if (i->data(bvidType).toInt() != bvitBus) continue; BlockBusItem * b = qgraphicsitem_cast(i); if (b->pol.size() <= 1) { b->deleteLater(); @@ -1892,9 +1915,9 @@ void BlockView::reconnectAll() { QList pins; QList buses; foreach (QGraphicsItem * i, gi) { - if (i->data(1004) == "pin") + if (i->data(bvidType).toInt() == bvitPin) pins << qgraphicsitem_cast(i); - if (i->data(1005) == "connection") + if (i->data(bvidType).toInt() == bvitBus) buses << qgraphicsitem_cast(i); } foreach (BlockItemPin * p, pins) { @@ -2043,9 +2066,9 @@ void BlockView::removeSelected() { if (i->connectedBlocks().isEmpty()) dbuses << i; foreach (QGraphicsItem * i, gi) { - if (i->data(1006) == "item") + if (i->data(bvidType).toInt() == bvitBlock) ai << qgraphicsitem_cast(i); - if ((i->data(1006) == "item") || (i->data(1005) == "connection") || (i->data(1009) == "decor")) { + if ((i->data(bvidType).toInt() == bvitBlock) || (i->data(bvidType).toInt() == bvitBus) || (i->data(bvidType).toInt() == bvitDecor)) { scene_->sendEvent(i, new QGraphicsSceneEvent(QEvent::Close)); delete i; } @@ -2068,11 +2091,11 @@ void BlockView::removeAll() { QList gi = scene_->items(), ai; blockSignals(true); foreach (QGraphicsItem * i, gi) { - if (i->data(1006) == "item") + if (i->data(bvidType).toInt() == bvitBlock) ai << qgraphicsitem_cast(i); - if ((i->data(1006) == "item") || (i->data(1005) == "connection") || (i->data(1009) == "decor")) { - if ((i != &sel_rect) && (i != &tmp_bus) && (i->parentItem() == 0) && !(i->data(1008).toBool()) && !(i->data(1007).toBool())) { - //qDebug() << "delete" << i->data(1004); + if ((i->data(bvidType).toInt() == bvitBlock) || (i->data(bvidType).toInt() == bvitBus) || (i->data(bvidType).toInt() == bvitDecor)) { + if ((i != &sel_rect) && (i != &tmp_bus) && (i->parentItem() == 0) && !(i->data(bvidInvalidItem).toBool()) && !(i->data(bvidItemSelection).toBool())) { + //qDebug() << "delete" << i->data(1005).toInt(); scene_->sendEvent(i, new QGraphicsSceneEvent(QEvent::Close)); delete i; } diff --git a/libs/blockview/blockview.h b/libs/blockview/blockview.h index b83dc06..78ddcd5 100644 --- a/libs/blockview/blockview.h +++ b/libs/blockview/blockview.h @@ -63,6 +63,8 @@ class QAD_BLOCKVIEW_EXPORT 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) + friend class BlockBusItem; + public: BlockView(QWidget * parent = 0); BlockView(QGraphicsScene * scene, QWidget * parent = 0); @@ -180,7 +182,7 @@ protected: QList copy_items; QList last_multiconnect_pl; QList copy_buses, tmp_buses; - BlockBusItem tmp_bus, * match_bus, * bus_from; + BlockBusItem tmp_bus, * match_bus, * bus_from, * cur_bus; BlockItemPin * hpin; BlockItem * ghost_; BlockViewWavetrace wavetrace; diff --git a/libs/blockview/drawtools.cpp b/libs/blockview/drawtools.cpp index 275b4cd..c3cff7b 100644 --- a/libs/blockview/drawtools.cpp +++ b/libs/blockview/drawtools.cpp @@ -15,10 +15,10 @@ _DTSizeItem::_DTSizeItem(): QGraphicsObject() { cur_item = 0; grid = 10.; in_process = can_drag = false; - setData(1007, true); + setData(bvidItemSelection, true); for (int i = 0; i < 8; ++i) { //qDebug() << &(rects[i]); - rects[i].setData(1007, true); + rects[i].setData(bvidItemSelection, true); rects[i].setData(bvidDTHandle, true); rects[i].setFlag(QGraphicsItem::ItemIgnoresTransformations); rects[i].setZValue(10.); @@ -26,7 +26,7 @@ _DTSizeItem::_DTSizeItem(): QGraphicsObject() { rects[i].setRect(-5, -5, 10, 10); rects[i].setPen(QPen(Qt::darkBlue)); rects[i].setBrush(QBrush(QColor(64, 64, 255, 128))); - //rects[i].setData(1100, true); + //rects[i].setData(bvidBlockDecor, true); } } @@ -411,7 +411,7 @@ bool DrawTools::eventFilter(QObject * o, QEvent * e) { if (new_type == 1 || new_type == 2) ((QAbstractGraphicsShapeItem*)new_item)->setBrush(Qt::white); new_item->setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsMovable); - new_item->setData(1100, true); + new_item->setData(bvidBlockDecor, true); emit itemCreated(new_item); return true; } @@ -597,7 +597,10 @@ void DrawTools::emitZAvailabe(QGraphicsItem * item) { } QList dl; if (item->parentItem() == 0) dl = view->decors(); - else if (item->parentItem()->data(1006) == "item") dl = ((BlockItem*)(item->parentItem()))->decors_; + else { + if (item->parentItem()->data(bvidType).toInt() == bvitBlock) + dl = ((BlockItem*)(item->parentItem()))->decors_; + } if (dl.size() <= 1) { moveZUpAvailable(false); moveZDownAvailable(false); @@ -895,7 +898,7 @@ void DrawTools::buttonTextEdit_clicked() { void DrawTools::actionZ_triggered() { if (!cur_item) return; - if (cur_item->data(1009) == "decor") { + if (cur_item->data(bvidType).toInt() == bvitDecor) { BlockView * view = 0; if (cur_item->scene()) if (!cur_item->scene()->views().isEmpty()) view = qobject_cast(cur_item->scene()->views()[0]); @@ -913,7 +916,7 @@ void DrawTools::actionZ_triggered() { foreach (QGraphicsItem * d, dl) scene->addItem(d); scene->blockSignals(false); } - if (cur_item->data(1011).toBool()) { + if (cur_item->data(bvidBlockDecor).toBool()) { BlockItem * bi = qgraphicsitem_cast(cur_item->parentItem()); if (!bi) return; QList dl = bi->decors_;