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

This commit is contained in:
2017-03-17 11:53:57 +00:00
parent 94ce83cb57
commit e45ac32c36
4 changed files with 45 additions and 1 deletions

View File

@@ -24,6 +24,11 @@ BlockItemPin::BlockItemPin(Qt::Alignment a, int bus_type_, const QString & text_
}
void BlockItemPin::resizePin(double r) {
ell_item.setRect(-r, -r, r+r, r+r);
}
void BlockItemPin::_init(bool affect_parent) {
QRectF tbr = text_item.boundingRect();
const double r = 7.;

View File

@@ -78,6 +78,8 @@ public:
bool restoreState() {if (sstate_.isEmpty()) return false; setState(sstate_.pop()); return true;}
void clearStateStack() {sstate_.clear();}
void resizePin(double r = 7.);
BlockItem * parent() const {return parent_;}
QList<BlockBusItem * > connectedBuses() const {return buses_;}

View File

@@ -58,6 +58,7 @@ void BlockView::_init() {
mm_drag = moved = new_branch = new_bus = mm_cancel = iconnect = mm_copy = m_pin_mc = mm_thumb = false;
match_bus = bus_from = 0;
mm_ci = 0;
hpin = 0;
grid_step = 10.;
grid_points = 1;
grid_pen = QPen(Qt::lightGray, 1, Qt::NoPen);
@@ -214,6 +215,7 @@ bool BlockView::eventFilter(QObject * o, QEvent * e) {
if (me->buttons().testFlag(Qt::MidButton)) btncnt++;
mm_cancel = btncnt >= 2;
match_bus = bus_from = 0;
hpin = 0;
copy_dp = QPointF();
//qDebug() << mm_cancel << mm_copy << mm_drag << new_branch << new_bus;
if (mm_copy && mm_cancel) {
@@ -318,6 +320,20 @@ bool BlockView::eventFilter(QObject * o, QEvent * e) {
mm_drag = fmm_drag = true;
} else {
if (tmp_bus.isVisible()) {
mil = scene_->items(me->scenePos());
hpin = 0;
foreach (QGraphicsItem * i, mil)
if (i->data(1004) == "pin") {
hpin = qgraphicsitem_cast<BlockItemPin*>(i);
break;
}
if (hpin) {
if (hpin->state() == BlockItemPin::Accept)
hoverAcceptedPin(hpin);
else
hpin = 0;
} else
unhoverPins();
if (new_branch) {
matchBus();
break;
@@ -963,12 +979,14 @@ void BlockView::applyGridStep() {
void BlockView::trace(QPointF scene_pos_from, QPointF scene_pos_to, BlockBusItem * bus) {
if (hpin)
scene_pos_to = hpin->scenePos();
last_trace_from = scene_pos_from;
trace_to = scene_pos_to;
QRect sr = scene_->sceneRect().toRect();
int dx = sr.left() / grid_step, dy = sr.top() / grid_step;
QPoint dp(-dx, -dy), qpt = quantize(scene_pos_to, grid_step).toPoint() / grid_step + dp;
//qDebug() << dp;
QPoint dp(-dx, -dy), qpt = quantize(scene_pos_to, grid_step).toPoint() / grid_step + dp;
QTime tm;
tm.restart();
wavetrace.resize(sr.size() / grid_step);
@@ -1142,6 +1160,7 @@ bool BlockView::connectTmpToBus(BlockBusItem * bus) {
void BlockView::markPins(int bus_type) {
unhoverPins();
QList<QGraphicsItem * > gi = scene_->items();
foreach (QGraphicsItem * i, gi) {
if (i->data(1004) == "pin") {
@@ -1160,6 +1179,7 @@ void BlockView::markPins(int bus_type) {
void BlockView::unmarkPins(bool to_normal) {
unhoverPins();
QList<QGraphicsItem * > gi = scene_->items();
foreach (QGraphicsItem * i, gi) {
if (i->data(1004) == "pin") {
@@ -1171,6 +1191,20 @@ void BlockView::unmarkPins(bool to_normal) {
}
void BlockView::hoverAcceptedPin(BlockItemPin * pin) {
if (!pin) return;
pin->resizePin(12.);
}
void BlockView::unhoverPins() {
QList<QGraphicsItem * > gi = scene_->items();
foreach (QGraphicsItem * i, gi)
if (i->data(1004) == "pin")
((BlockItemPin*)i)->resizePin();
}
void BlockView::moveBuses(const QList<QGraphicsItem * > & items, QPointF dp) {
if (dp.isNull()) return;
QList<QGraphicsItem * > gi = scene_->items();

View File

@@ -98,6 +98,8 @@ protected:
bool connectTmpToBus(BlockBusItem* bus);
void markPins(int bus_type);
void unmarkPins(bool to_normal = false);
void hoverAcceptedPin(BlockItemPin * pin);
void unhoverPins();
void moveBuses(const QList<QGraphicsItem * > & items, QPointF dp);
QList<BlockBusItem * > internalBuses(const QList<BlockItem * > & items);
QList<BlockItem * > selectedBlocks() const;
@@ -119,6 +121,7 @@ protected:
QList<BlockItem * > copy_items;
QList<BlockBusItem * > copy_buses;
BlockBusItem tmp_bus, * match_bus, * bus_from;
BlockItemPin * hpin;
BlockViewWavetrace wavetrace;
QPoint press_point, screen_point, thumb_press;
QPointF scene_point, trace_from, last_trace_from, trace_to, copy_dp;