git-svn-id: svn://db.shs.com.ru/libs@244 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
@@ -290,7 +290,7 @@ PIStringList CDSection::index_names() const {
|
||||
|
||||
|
||||
void CDSection::calculate() {
|
||||
CDCore::instance()->k_.prepareCalculate();
|
||||
/*CDCore::instance()->k_.*/prepareCalculate();
|
||||
PIEvaluator e;
|
||||
calculateRecursive(&e);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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<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_) {
|
||||
pin->setParentItem(this);
|
||||
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_);
|
||||
while (it.hasNext()) {
|
||||
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;
|
||||
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<BlockItemPin * > tp;
|
||||
QList<QGraphicsItem * > dl;
|
||||
int version = -1;
|
||||
while (!cs.atEnd()) {
|
||||
switch (cs.read()) {
|
||||
case 1: /*setPos(cs.getData<QPointF>());*/ break;
|
||||
case 2: /*setRotation(cs.getData<qreal>());*/ break;
|
||||
case 3: setSize(cs.getData<QSizeF>()); break;
|
||||
case 4: setColor(cs.getData<QColor>()); break;
|
||||
case 5:
|
||||
tp = cs.getData<QVector<BlockItemPin * > >();
|
||||
foreach (BlockItemPin * p, tp) addPin(p);
|
||||
break;
|
||||
case 6:
|
||||
dl = cs.getData<QList<QGraphicsItem * > >();
|
||||
foreach (QGraphicsItem * d, dl) addDecor(d);
|
||||
break;
|
||||
case 7: setPinsMargin(cs.getData<int>()); break;
|
||||
case 1: /*setPos(cs.getData<QPointF>());*/ break;
|
||||
case 2: /*setRotation(cs.getData<qreal>());*/ break;
|
||||
case 3: setSize(cs.getData<QSizeF>()); break;
|
||||
case 4: setColor(cs.getData<QColor>()); 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<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();
|
||||
}
|
||||
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<QString, QList<BlockItem::Property> > _p;
|
||||
int version = -1;
|
||||
while (!cs.atEnd()) {
|
||||
switch (cs.read()) {
|
||||
case 1: setPos(cs.getData<QPointF>()); 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:
|
||||
_p = cs.getData<QMap<QString, QList<BlockItem::Property> > >();
|
||||
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<QSizeF>()); break;
|
||||
case 10: setData(2000, 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);
|
||||
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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;}
|
||||
|
||||
Reference in New Issue
Block a user