git-svn-id: svn://db.shs.com.ru/libs@244 a8b55f48-bf90-11e4-a774-851b48703e85

This commit is contained in:
2017-06-26 10:23:47 +00:00
parent 853d907725
commit 4a0663673a
7 changed files with 58 additions and 24 deletions

View File

@@ -290,7 +290,7 @@ PIStringList CDSection::index_names() const {
void CDSection::calculate() { void CDSection::calculate() {
CDCore::instance()->k_.prepareCalculate(); /*CDCore::instance()->k_.*/prepareCalculate();
PIEvaluator e; PIEvaluator e;
calculateRecursive(&e); calculateRecursive(&e);
} }

View File

@@ -25,6 +25,8 @@
/// 1011 - item is BlockItem decor ("decor") /// 1011 - item is BlockItem decor ("decor")
/// 1100 - flag for correct move (true) /// 1100 - flag for correct move (true)
static const int _blockitem_current_version_ = 1;
QDataStream & operator <<(QDataStream & s, const QGraphicsItem * item); QDataStream & operator <<(QDataStream & s, const QGraphicsItem * item);
QDataStream & operator >>(QDataStream & s, QGraphicsItem *& item); QDataStream & operator >>(QDataStream & s, QGraphicsItem *& item);

View File

@@ -123,7 +123,7 @@ BlockItem::~BlockItem() {
void BlockItem::_resize(QSizeF s) { void BlockItem::_resize(QSizeF s) {
g_main.setRect(QRectF(QPointF(), 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.setRect(enlargedRect(g_main.rect(), 0, 0, 8));
g_selection.setPos(g_main.pos()); g_selection.setPos(g_main.pos());
QRadialGradient g(g_main.rect().width() / 2., 0, qMax<qreal>(g_main.rect().width() / 2., g_main.rect().height())); QRadialGradient g(g_main.rect().width() / 2., 0, qMax<qreal>(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_) { BlockItemPin * BlockItem::addPin(BlockItemPin * pin, bool update_) {
pin->setParentItem(this); pin->setParentItem(this);
if (!pins_[pin->alignment()].contains(pin)) pins_[pin->alignment()] << pin; if (!pins_[pin->alignment()].contains(pin)) pins_[pin->alignment()] << pin;
@@ -162,7 +172,9 @@ void BlockItem::removePin(BlockItemPin * pin) {
QMutableMapIterator<Qt::Alignment, QVector<BlockItemPin * > > it(pins_); QMutableMapIterator<Qt::Alignment, QVector<BlockItemPin * > > it(pins_);
while (it.hasNext()) { while (it.hasNext()) {
it.next(); it.next();
it.value().remove(it.value().indexOf(pin)); QVector<BlockItemPin * > & pv(it.value());
if (pv.contains(pin))
pv.remove(it.value().indexOf(pin));
} }
delete pin; delete pin;
arrangePins(); arrangePins();
@@ -256,7 +268,8 @@ QByteArray BlockItem::saveModel() {
foreach (QGraphicsItem * i, decors_) foreach (QGraphicsItem * i, decors_)
s << i;*/ s << i;*/
ChunkStream cs; 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(); return cs.data();
} }
@@ -294,23 +307,27 @@ void BlockItem::loadModel(const QByteArray & data) {
ChunkStream cs(data); ChunkStream cs(data);
QVector<BlockItemPin * > tp; QVector<BlockItemPin * > tp;
QList<QGraphicsItem * > dl; QList<QGraphicsItem * > dl;
int version = -1;
while (!cs.atEnd()) { while (!cs.atEnd()) {
switch (cs.read()) { switch (cs.read()) {
case 1: /*setPos(cs.getData<QPointF>());*/ break; case 1: /*setPos(cs.getData<QPointF>());*/ break;
case 2: /*setRotation(cs.getData<qreal>());*/ break; case 2: /*setRotation(cs.getData<qreal>());*/ break;
case 3: setSize(cs.getData<QSizeF>()); break; case 3: setSize(cs.getData<QSizeF>()); break;
case 4: setColor(cs.getData<QColor>()); break; case 4: setColor(cs.getData<QColor>()); break;
case 5: case 5:
tp = cs.getData<QVector<BlockItemPin * > >(); cs.get(tp);
foreach (BlockItemPin * p, tp) addPin(p); foreach (BlockItemPin * p, tp) addPin(p);
break; break;
case 6: case 6:
dl = cs.getData<QList<QGraphicsItem * > >(); cs.get(dl);
foreach (QGraphicsItem * d, dl) addDecor(d); foreach (QGraphicsItem * d, dl) addDecor(d);
break; break;
case 7: setPinsMargin(cs.getData<int>()); break; case 7: setPinsMargin(cs.getData<int>()); 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(); 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(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(); return cs.data();
} }
@@ -330,13 +347,14 @@ void BlockItem::load(const QByteArray & data) {
if (data.isEmpty()) return; if (data.isEmpty()) return;
ChunkStream cs(data); ChunkStream cs(data);
QMap<QString, QList<BlockItem::Property> > _p; QMap<QString, QList<BlockItem::Property> > _p;
int version = -1;
while (!cs.atEnd()) { while (!cs.atEnd()) {
switch (cs.read()) { switch (cs.read()) {
case 1: setPos(cs.getData<QPointF>()); break; case 1: setPos(cs.getData<QPointF>()); break;
case 2: setRotation(cs.getData<qreal>()); break; case 2: setRotation(cs.getData<qreal>()); break;
case 3: props = cs.getData<QList<BlockItem::Property> >(); break; case 3: cs.get(props); break;
case 5: case 5:
_p = cs.getData<QMap<QString, QList<BlockItem::Property> > >(); cs.get(_p);
foreach (BlockItemPin * p, pins()) foreach (BlockItemPin * p, pins())
if (_p.contains(p->text())) if (_p.contains(p->text()))
p->properties() = _p[p->text()]; p->properties() = _p[p->text()];
@@ -344,8 +362,12 @@ void BlockItem::load(const QByteArray & data) {
case 6: setSize(cs.getData<QSizeF>()); break; case 6: setSize(cs.getData<QSizeF>()); break;
case 10: setData(2000, cs.getData<QVariant>()); break; case 10: setData(2000, cs.getData<QVariant>()); break;
case 11: setData(2001, cs.getData<QVariant>()); break; case 11: setData(2001, cs.getData<QVariant>()); break;
case 0xFF: cs.get(version); break;
} }
} }
if (version <= 0) {
_moveToTop();
}
} }
@@ -428,9 +450,9 @@ void BlockItem::arrangePins() {
cp = pins_.value(Qt::AlignTop); cp = pins_.value(Qt::AlignTop);
for (int i = 0; i < cp.size(); ++i) cp[i]->setPos(_POS(pins_margin), top()); for (int i = 0; i < cp.size(); ++i) cp[i]->setPos(_POS(pins_margin), top());
cp = pins_.value(Qt::AlignLeft); 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); 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 #undef _POS

View File

@@ -157,6 +157,7 @@ public:
protected: protected:
void _resize(QSizeF s); void _resize(QSizeF s);
void _moveToTop(bool only_decors = false);
int type() const {return Type;} int type() const {return Type;}
QRectF boundingRect() const; QRectF boundingRect() const;
void mouseMoveEvent(QGraphicsSceneMouseEvent * event); void mouseMoveEvent(QGraphicsSceneMouseEvent * event);

View File

@@ -621,7 +621,11 @@ void BlockView::mouseMoveEvent(QMouseEvent * event) {
void BlockView::keyPressEvent(QKeyEvent * e) { void BlockView::keyPressEvent(QKeyEvent * e) {
if (e->key() == Qt::Key_Shift) { if (e->key() == Qt::Key_Shift) {
if (tmp_bus.isVisible()) { 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); trace(last_trace_from, trace_to, &tmp_bus);
} }
return; return;

View File

@@ -44,6 +44,7 @@ void BlockViewWavetrace::fill(const QRect & rect, short val) {
bool BlockViewWavetrace::trace(const QPoint & start, const QPoint & finish) { bool BlockViewWavetrace::trace(const QPoint & start, const QPoint & finish) {
st = start; st = start;
fn = finish; fn = finish;
if (dir_ == NoTrace) return true;
//qDebug() << "trace" << start << finish; //qDebug() << "trace" << start << finish;
//return true; //return true;
int cx, cy; int cx, cy;
@@ -103,6 +104,10 @@ bool BlockViewWavetrace::trace(const QPoint & start, const QPoint & finish) {
void BlockViewWavetrace::gatherPath() { void BlockViewWavetrace::gatherPath() {
path_.clear(); path_.clear();
path_.push_back(fn); path_.push_back(fn);
if (dir_ == NoTrace) {
path_.push_front(st);
return;
}
int cx, cy; int cx, cy;
int pa = -1, ca = -1; int pa = -1, ca = -1;
bool first = true; bool first = true;

View File

@@ -8,7 +8,7 @@ public:
BlockViewWavetrace(int width = 1, int height = 1); BlockViewWavetrace(int width = 1, int height = 1);
enum CellState {Empty = -1, Blocked = -2}; enum CellState {Empty = -1, Blocked = -2};
enum Direction {Horizontal = 0, Vertical = 1}; enum Direction {NoTrace, Horizontal, Vertical};
int width() const {return wid;} int width() const {return wid;}
int height() const {return hei;} int height() const {return hei;}