diff --git a/cd_utils/cdutils_types.cpp b/cd_utils/cdutils_types.cpp index 69bd7fa..71bdc2a 100644 --- a/cd_utils/cdutils_types.cpp +++ b/cd_utils/cdutils_types.cpp @@ -290,7 +290,7 @@ PIStringList CDSection::index_names() const { void CDSection::calculate() { - CDCore::instance()->k_.prepareCalculate(); + /*CDCore::instance()->k_.*/prepareCalculate(); PIEvaluator e; calculateRecursive(&e); } diff --git a/qad/blockview/blockbase.h b/qad/blockview/blockbase.h index 7b19ef7..bc45151 100644 --- a/qad/blockview/blockbase.h +++ b/qad/blockview/blockbase.h @@ -25,6 +25,8 @@ /// 1011 - item is BlockItem decor ("decor") /// 1100 - flag for correct move (true) +static const int _blockitem_current_version_ = 1; + QDataStream & operator <<(QDataStream & s, const QGraphicsItem * item); QDataStream & operator >>(QDataStream & s, QGraphicsItem *& item); diff --git a/qad/blockview/blockitem.cpp b/qad/blockview/blockitem.cpp index e5ae0b3..eb7de4b 100644 --- a/qad/blockview/blockitem.cpp +++ b/qad/blockview/blockitem.cpp @@ -123,7 +123,7 @@ BlockItem::~BlockItem() { void BlockItem::_resize(QSizeF s) { g_main.setRect(QRectF(QPointF(), s)); - g_main.setPos(-g_main.rect().center()); + g_main.setPos(QPointF(-g_main.rect().center().x(), -10.)); g_selection.setRect(enlargedRect(g_main.rect(), 0, 0, 8)); g_selection.setPos(g_main.pos()); QRadialGradient g(g_main.rect().width() / 2., 0, qMax(g_main.rect().width() / 2., g_main.rect().height())); @@ -137,6 +137,16 @@ void BlockItem::_resize(QSizeF s) { } +void BlockItem::_moveToTop(bool only_decors) { + qreal dy = -g_main.rect().center().y() + 10; + if (!only_decors) + moveBy(0., dy); + foreach (QGraphicsItem * d, decors_) + d->moveBy(0., -dy); + +} + + BlockItemPin * BlockItem::addPin(BlockItemPin * pin, bool update_) { pin->setParentItem(this); if (!pins_[pin->alignment()].contains(pin)) pins_[pin->alignment()] << pin; @@ -162,7 +172,9 @@ void BlockItem::removePin(BlockItemPin * pin) { QMutableMapIterator > it(pins_); while (it.hasNext()) { it.next(); - it.value().remove(it.value().indexOf(pin)); + QVector & pv(it.value()); + if (pv.contains(pin)) + pv.remove(it.value().indexOf(pin)); } delete pin; arrangePins(); @@ -256,7 +268,8 @@ QByteArray BlockItem::saveModel() { foreach (QGraphicsItem * i, decors_) s << i;*/ ChunkStream cs; - cs << cs.chunk(1, pos()) << cs.chunk(2, rotation()) << cs.chunk(3, size()) << cs.chunk(4, color()) << cs.chunk(5, pins()) << cs.chunk(6, decors_) << cs.chunk(7, pins_margin); + cs << cs.chunk(1, pos()) << cs.chunk(2, rotation()) << cs.chunk(3, size()) << cs.chunk(4, color()) << cs.chunk(5, pins()) + << cs.chunk(6, decors_) << cs.chunk(7, pins_margin) << cs.chunk(0xFF, _blockitem_current_version_); return cs.data(); } @@ -294,23 +307,27 @@ void BlockItem::loadModel(const QByteArray & data) { ChunkStream cs(data); QVector tp; QList dl; + int version = -1; while (!cs.atEnd()) { switch (cs.read()) { - case 1: /*setPos(cs.getData());*/ break; - case 2: /*setRotation(cs.getData());*/ break; - case 3: setSize(cs.getData()); break; - case 4: setColor(cs.getData()); break; - case 5: - tp = cs.getData >(); - foreach (BlockItemPin * p, tp) addPin(p); - break; - case 6: - dl = cs.getData >(); - foreach (QGraphicsItem * d, dl) addDecor(d); - break; - case 7: setPinsMargin(cs.getData()); break; + case 1: /*setPos(cs.getData());*/ break; + case 2: /*setRotation(cs.getData());*/ break; + case 3: setSize(cs.getData()); break; + case 4: setColor(cs.getData()); break; + case 5: + cs.get(tp); + foreach (BlockItemPin * p, tp) addPin(p); + break; + case 6: + cs.get(dl); + foreach (QGraphicsItem * d, dl) addDecor(d); + break; + case 7: setPinsMargin(cs.getData()); break; + case 0xFF: cs.get(version); break; } } + if (version <= 0) + _moveToTop(true); } @@ -321,7 +338,7 @@ QByteArray BlockItem::save() const { pp[p->text()] = p->properties(); } cs << cs.chunk(1, pos()) << cs.chunk(2, rotation()) << cs.chunk(3, props) << cs.chunk(5, pp) << cs.chunk(6, size()); - cs << cs.chunk(10, data(2000)) << cs.chunk(11, data(2001)); + cs << cs.chunk(10, data(2000)) << cs.chunk(11, data(2001)) << cs.chunk(0xFF, _blockitem_current_version_); return cs.data(); } @@ -330,13 +347,14 @@ void BlockItem::load(const QByteArray & data) { if (data.isEmpty()) return; ChunkStream cs(data); QMap > _p; + int version = -1; while (!cs.atEnd()) { switch (cs.read()) { case 1: setPos(cs.getData()); break; case 2: setRotation(cs.getData()); break; - case 3: props = cs.getData >(); break; + case 3: cs.get(props); break; case 5: - _p = cs.getData > >(); + cs.get(_p); foreach (BlockItemPin * p, pins()) if (_p.contains(p->text())) p->properties() = _p[p->text()]; @@ -344,8 +362,12 @@ void BlockItem::load(const QByteArray & data) { case 6: setSize(cs.getData()); break; case 10: setData(2000, cs.getData()); break; case 11: setData(2001, cs.getData()); break; + case 0xFF: cs.get(version); break; } } + if (version <= 0) { + _moveToTop(); + } } @@ -428,9 +450,9 @@ void BlockItem::arrangePins() { cp = pins_.value(Qt::AlignTop); for (int i = 0; i < cp.size(); ++i) cp[i]->setPos(_POS(pins_margin), top()); cp = pins_.value(Qt::AlignLeft); - for (int i = 0; i < cp.size(); ++i) cp[i]->setPos(left(), _POS(pins_margin)); + for (int i = 0; i < cp.size(); ++i) cp[i]->setPos(left(), i * pins_margin); cp = pins_.value(Qt::AlignRight); - for (int i = 0; i < cp.size(); ++i) cp[i]->setPos(right(), _POS(pins_margin)); + for (int i = 0; i < cp.size(); ++i) cp[i]->setPos(right(), i * pins_margin); } #undef _POS diff --git a/qad/blockview/blockitem.h b/qad/blockview/blockitem.h index aa2e763..5cd39ea 100644 --- a/qad/blockview/blockitem.h +++ b/qad/blockview/blockitem.h @@ -157,6 +157,7 @@ public: protected: void _resize(QSizeF s); + void _moveToTop(bool only_decors = false); int type() const {return Type;} QRectF boundingRect() const; void mouseMoveEvent(QGraphicsSceneMouseEvent * event); diff --git a/qad/blockview/blockview.cpp b/qad/blockview/blockview.cpp index 92b7ac2..77173c4 100644 --- a/qad/blockview/blockview.cpp +++ b/qad/blockview/blockview.cpp @@ -621,7 +621,11 @@ void BlockView::mouseMoveEvent(QMouseEvent * event) { void BlockView::keyPressEvent(QKeyEvent * e) { if (e->key() == Qt::Key_Shift) { if (tmp_bus.isVisible()) { - wavetrace.setPreferredDirection((BlockViewWavetrace::Direction)(1 - wavetrace.preferredDirection())); + switch (wavetrace.preferredDirection()) { + case BlockViewWavetrace::NoTrace: wavetrace.setPreferredDirection(BlockViewWavetrace::Horizontal); break; + case BlockViewWavetrace::Horizontal: wavetrace.setPreferredDirection(BlockViewWavetrace::Vertical); break; + case BlockViewWavetrace::Vertical: wavetrace.setPreferredDirection(BlockViewWavetrace::NoTrace); break; + } trace(last_trace_from, trace_to, &tmp_bus); } return; diff --git a/qad/blockview/blockviewwavetrace.cpp b/qad/blockview/blockviewwavetrace.cpp index c070555..867631a 100644 --- a/qad/blockview/blockviewwavetrace.cpp +++ b/qad/blockview/blockviewwavetrace.cpp @@ -44,6 +44,7 @@ void BlockViewWavetrace::fill(const QRect & rect, short val) { bool BlockViewWavetrace::trace(const QPoint & start, const QPoint & finish) { st = start; fn = finish; + if (dir_ == NoTrace) return true; //qDebug() << "trace" << start << finish; //return true; int cx, cy; @@ -103,6 +104,10 @@ bool BlockViewWavetrace::trace(const QPoint & start, const QPoint & finish) { void BlockViewWavetrace::gatherPath() { path_.clear(); path_.push_back(fn); + if (dir_ == NoTrace) { + path_.push_front(st); + return; + } int cx, cy; int pa = -1, ca = -1; bool first = true; diff --git a/qad/blockview/blockviewwavetrace.h b/qad/blockview/blockviewwavetrace.h index 41f453e..7592f57 100644 --- a/qad/blockview/blockviewwavetrace.h +++ b/qad/blockview/blockviewwavetrace.h @@ -8,7 +8,7 @@ public: BlockViewWavetrace(int width = 1, int height = 1); enum CellState {Empty = -1, Blocked = -2}; - enum Direction {Horizontal = 0, Vertical = 1}; + enum Direction {NoTrace, Horizontal, Vertical}; int width() const {return wid;} int height() const {return hei;}