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() {
|
void CDSection::calculate() {
|
||||||
CDCore::instance()->k_.prepareCalculate();
|
/*CDCore::instance()->k_.*/prepareCalculate();
|
||||||
PIEvaluator e;
|
PIEvaluator e;
|
||||||
calculateRecursive(&e);
|
calculateRecursive(&e);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;}
|
||||||
|
|||||||
Reference in New Issue
Block a user