version 2.22.0

blockview small code clean
add PIValueTree to BLockItem, BlockItemPin and BlockBusItem
add QAD::CursorOverrider::restore()
fix QCodeEdit escape key while block selection
This commit is contained in:
2024-01-14 11:45:28 +03:00
parent e2a91a4fbd
commit c3dcf36a20
10 changed files with 135 additions and 48 deletions

View File

@@ -1,6 +1,7 @@
#include "blockview.h"
#include <QApplication>
#include <piqt.h>
#define BLOCKITEM_DEFAULT_PIN_MARGIN 20
@@ -59,7 +60,7 @@ 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_)
for (QGraphicsItem * d: decors_)
d->moveBy(0., -dy);
}
@@ -153,7 +154,7 @@ void BlockItem::clearDecors() {
bool pbs = false;
if (scene()) pbs = scene()->blockSignals(true);
if (scene()) {
foreach(QGraphicsItem * i, decors_)
for (QGraphicsItem * i: decors_)
scene()->sendEvent(i, new QGraphicsSceneEvent(QEvent::Close));
}
qDeleteAll(decors_);
@@ -217,12 +218,12 @@ void BlockItem::loadModel(const QByteArray & data) {
case 4: setColor(cs.getData<QColor>()); break;
case 5:
cs.get(tp);
foreach(BlockItemPin * p, tp)
for (BlockItemPin * p: tp)
addPin(p);
break;
case 6:
cs.get(dl);
foreach(QGraphicsItem * d, dl)
for (QGraphicsItem * d: dl)
addDecor(d);
break;
case 7: setPinsMargin(cs.getData<int>()); break;
@@ -240,12 +241,13 @@ void BlockItem::loadModel(const QByteArray & data) {
QByteArray BlockItem::save() const {
ChunkStream cs;
QMap<QString, QList<BlockItem::Property>> pp;
foreach(BlockItemPin * p, pins()) {
for (BlockItemPin * p: pins()) {
// qDebug() << "save pin" << p->text() << "->" << p->properties().size();
pp[p->text()] = p->properties();
}
cs.add(1, pos()).add(2, rotation()).add(3, props).add(5, pp).add(6, size());
cs.add(10, data(2000)).add(11, data(2001)).add(12, prop_bindings).add(0xFF, _blockitem_current_version_);
cs.add(13, piqSerialize(value_tree));
return cs.data();
}
@@ -254,6 +256,7 @@ void BlockItem::load(const QByteArray & data) {
if (data.isEmpty()) return;
ChunkStream cs(data);
QMap<QString, QList<BlockItem::Property>> _p;
value_tree = {};
int version = -1;
while (!cs.atEnd()) {
switch (cs.read()) {
@@ -263,7 +266,7 @@ void BlockItem::load(const QByteArray & data) {
case 5:
cs.get(_p);
// qDebug() << "load pins" << _p.size();
foreach(BlockItemPin * p, pins()) {
for (BlockItemPin * p: pins()) {
// qDebug() << "load pin" << p->text() << "->" << _p.contains(p->text());
if (_p.contains(p->text())) p->properties() = _p[p->text()];
}
@@ -272,6 +275,7 @@ void BlockItem::load(const QByteArray & data) {
case 10: setData(2000, cs.getData<QVariant>()); break;
case 11: setData(2001, cs.getData<QVariant>()); break;
case 12: prop_bindings = cs.getData<QList<QPair<QString, QString>>>(); break;
case 13: value_tree = piqDeserialize<PIValueTree>(cs.getData<QByteArray>()); break;
case 0xFF: cs.get(version); break;
}
}
@@ -290,7 +294,7 @@ BlockItem * BlockItem::copy() const {
ret->props = props;
ret->setPinsMargin(pinsMargin());
QVector<BlockItemPin *> mp = pins();
foreach(BlockItemPin * p, mp) {
for (BlockItemPin * p: mp) {
BlockItemPin * np = new BlockItemPin();
np->setBusType(p->busType());
np->setAlignment(p->alignment());
@@ -309,14 +313,14 @@ BlockItem * BlockItem::copy() const {
QList<BlockBusItem *> BlockItem::connectedBuses() const {
QList<BlockBusItem *> ret;
foreach(BlockItemPin * p, pins())
for (BlockItemPin * p: pins())
ret << p->connectedBuses();
return ret;
}
BlockItemPin * BlockItem::pinByText(const QString & t) const {
foreach(BlockItemPin * p, pins())
for (BlockItemPin * p: pins())
if (p->text() == t) return p;
return 0;
}
@@ -324,17 +328,38 @@ BlockItemPin * BlockItem::pinByText(const QString & t) const {
BlockItemPin * BlockItem::pinAtBus(BlockBusItem * bus) const {
if (bus == 0) return 0;
foreach(BlockItemPin * p, pins())
for (BlockItemPin * p: pins())
if (p->connectedBuses().contains(bus)) return p;
return 0;
}
void BlockItem::setColor(QColor c) {
col = c;
_resize(size());
}
QRectF BlockItem::sceneRect() const {
return g_main.mapRectToScene(g_main.boundingRect());
}
void BlockItem::setWidth(qreal w) {
setSize(QSizeF(w, size().height()));
}
void BlockItem::setHeight(qreal h) {
setSize(QSizeF(size().width(), h));
}
void BlockItem::setPinsMargin(int marg) {
if (marg > 1 && marg < 256) pins_margin = marg;
arrangePins();
}
QRectF BlockItem::boundingRect() const {
return g_main.mapRectToParent(g_main.boundingRect());
}
@@ -357,7 +382,7 @@ void BlockItem::hoverLeaveEvent(QGraphicsSceneHoverEvent * e) {
void BlockItem::arrangePins() {
QVector<BlockItemPin *> pl = pins();
pins_.clear();
foreach(BlockItemPin * p, pl)
for (BlockItemPin * p: pl)
pins_[p->alignment()] << p;
QVector<BlockItemPin *> cp = pins_.value(Qt::AlignBottom);
for (int i = 0; i < cp.size(); ++i)
@@ -525,3 +550,28 @@ QRectF BlockItem::selectionRect() const {
void BlockItem::setSelectionRect(const QRectF & r) {
g_selection.setRect(r);
}
QDataStream & operator<<(QDataStream & s, const BlockItemPin * p) {
ChunkStream cs;
cs.add(1, int(p->alignment())).add(2, p->busType()).add(3, p->text()).add(4, p->toolTip());
cs.add(5, piqSerialize(p->value_tree));
s << cs.data();
return s;
}
QDataStream & operator>>(QDataStream & s, BlockItemPin *& p) {
ChunkStream cs(s);
p = new BlockItemPin();
while (!cs.atEnd()) {
switch (cs.read()) {
case 1: p->setAlignment((Qt::Alignment)cs.getData<int>()); break;
case 2: p->setBusType(cs.getData<int>()); break;
case 3: p->setText(cs.getData<QString>()); break;
case 4: p->setToolTip(cs.getData<QString>()); break;
case 5: p->value_tree = piqDeserialize<PIValueTree>(cs.getData<QByteArray>()); break;
}
}
return s;
}