void WorkPlaceWidget::mouseMoveEvent(QMouseEvent* pe){ int deltaX = this->curX - (pe->x()); int deltaY = this->curY - (pe->y()); if(this->currentMoved!=-1 && this->selected){ Entitie* e = this->core->getEntitieAt(this->currentMoved); ((IntField*)e->fieldByID("X"))->setValue(((IntField*)e->fieldByID("X"))->getValue()-deltaX); ((IntField*)e->fieldByID("Y"))->setValue(((IntField*)e->fieldByID("Y"))->getValue()-deltaY); } this->curX=pe->x(); this->curY=pe->y(); this->repaint(); }
void WorkPlaceWidget::mousePressEvent(QMouseEvent* pe){ if(this->core->getState()==0){ // Добавление сущности //===================================================== string name; int num = this->core->getCounter(); char str[255]; sprintf(str, "Entitie № %d", num); name = (const char*)str; Entitie* e0 = EntitieFactory::entitieFactory()->createEntitie(this->core->getEntitieType()); ((IntField*)e0->fieldByID("X"))->setValue(pe->x()); ((IntField*)e0->fieldByID("Y"))->setValue(pe->y()); calculateEntitie(e0); //===================================================== bool add = true; for(int i=0; i<this->core->getEntitieCount(); i++){ Entitie* e = this->core->getEntitieAt(i); int x = ((IntField*)e->fieldByID("X"))->getValue(); int y = ((IntField*)e->fieldByID("Y"))->getValue(); int w = ((IntField*)e->fieldByID("W"))->getValue(); int h = ((IntField*)e->fieldByID("H"))->getValue(); int w0 =((IntField*)e0->fieldByID("W"))->getValue(); int h0 =((IntField*)e0->fieldByID("H"))->getValue(); if((x-w0-15<pe->x())&&(y-h0-15<pe->y())&&(w+x+15>pe->x())&&(h+y+15>pe->y())){ add = false; } } if(add){ this->core->Changed(true); core->addEntitieTo(e0); core->setFocus(core->getIndexEntitieByID(e0->getID())); this->repaint(); }else{ delete(e0); } } if(this->core->getState()==1){ // Добавление связи //if(core->getFocusObj()) int focus = -1; for(int i=0; i<this->core->getEntitieCount(); i++){ Entitie* e = this->core->getEntitieAt(i); int x =((IntField*)e->fieldByID("X"))->getValue(); int y = ((IntField*)e->fieldByID("Y"))->getValue(); int w = ((IntField*)e->fieldByID("W"))->getValue(); int h = ((IntField*)e->fieldByID("H"))->getValue(); if((x<pe->x())&&(y<pe->y())&&(w+x>pe->x())&&(h+y>pe->y())){ focus = i; } } if(core->getFocus()==-1 || !core->getFocusObj()){ //core->e= this->core->getEntitieCount(focus); core->setFocus(focus); core->setFocusObj(true); }else{ if(focus!=this->core->getFocus() && focus!=-1){ string name; int num = this->core->getCounter0(); char str[255]; sprintf(str, "Relation %d", num); name = (const char*)str; Entitie* e1 = this->core->getEntitieAt(this->core->getFocus()); Entitie* e2 = this->core->getEntitieAt(focus); core->addRelation(e1,e2,name,"W"); this->core->Changed(true); } this->core->setFocus(core->getRelationCount()-1); //core->setFocus(-1); core->setFocusObj(false); } core->spotFocus(); this->repaint(); } if(this->core->getState()==2 || this->core->getState()==10){ // Выделение объектов this->selected = true; core->setFocus(-1); for(int i=0; i<this->core->getEntitieCount(); i++){ Entitie* e = this->core->getEntitieAt(i); int x =((IntField*)e->fieldByID("X"))->getValue(); int y = ((IntField*)e->fieldByID("Y"))->getValue(); int w = ((IntField*)e->fieldByID("W"))->getValue(); int h = ((IntField*)e->fieldByID("H"))->getValue(); if((x<pe->x())&&(y<pe->y())&&(w+x>pe->x())&&(h+y>pe->y())){ if(this->currentMoved==-1){this->currentMoved=i;} core->setFocus(i); core->setFocusObj(true); } } for(int i=0; i<this->core->getRelationCount(); i++){ Relation* r = this->core->getRelationAt(i); Entitie* eR = r->getEntR(); Entitie* eL = r->getEntL(); int indexR = 0; int indexL = 0; for(int j=0; j<eR->fieldCount() && indexR==0; j++){ if(eR->fieldAt(j)->getID()==r->getKey()){ indexR = j; } } for(int j=0; j<eL->fieldCount() && indexL==0; j++){ if(eL->fieldAt(j)->getID()==r->getKey()){ indexL = j; } } if(indexR<work_count-1){ indexR=work_count-1; } if(indexL<work_count-1){ indexL=work_count-1; } //this->calculateEntitie(eR); //this->calculateEntitie(eL); int x1 = ((IntField*)eR->fieldByID("X"))->getValue(); int y1 = ((IntField*)eR->fieldByID("Y"))->getValue(); int w1 = ((IntField*)eR->fieldByID("W"))->getValue(); int h1 = ((IntField*)eR->fieldByID("H"))->getValue(); int x2 = ((IntField*)eL->fieldByID("X"))->getValue(); int y2 = ((IntField*)eL->fieldByID("Y"))->getValue(); int w2 = ((IntField*)eL->fieldByID("W"))->getValue(); int h2 = ((IntField*)eL->fieldByID("H"))->getValue(); int x01=0; int x02=0; int y01=0; int y02=0; if(qAbs(x1-x2)>w2 && qAbs(x1-x2)>w1){ if(x1>x2){ x01=x1; x02=x2+w2; }else{ x02=x2-5; x01=x1+w1; } y01 = y1+(indexR+1-work_count)*24+((indexR+1-(work_count-1))*24-(indexR+1-work_count)*24)/2; y02 = y2+(indexL+1-work_count)*24+((indexL+1-(work_count-1))*24-(indexL+1-work_count)*24)/2; }else{ if(y1>y2){ y01=y1; y02=y2+h2; }else{ y02=y2; y01=y1+h1; } x01=x1+w1/2; x02=x2+w2/2; } int x = pe->x(); int y = pe->y(); int x0 = 0; int y0 = 0; if(x01>x02){ x0 = x02 + (x01 - x02)/2; }else{ x0 = x01 + (x02 - x01)/2; } if(y01>y02){ y0 = y02 + (y01 - y02)/2; }else{ y0 = y01 + (y02 - y01)/2; } if(x<x0+10 && x>x0-10 && y>y0-10 && y<y0+10){ core->setFocus(i); core->setFocusObj(false); } } core->spotFocus(); this->repaint(); } }
void WorkPlaceWidget::drawRelation(Relation* r, bool focus){ Entitie* eR = r->getEntR(); Entitie* eL = r->getEntL(); this->calculateEntitie(eL); this->calculateEntitie(eR); int x1 = ((IntField*)eR->fieldByID("X"))->getValue(); int y1 = ((IntField*)eR->fieldByID("Y"))->getValue(); int w1 = ((IntField*)eR->fieldByID("W"))->getValue(); int h1 = ((IntField*)eR->fieldByID("H"))->getValue(); int t1 = ((IntField*)eR->fieldByID("T"))->getValue(); int x2 = ((IntField*)eL->fieldByID("X"))->getValue(); int y2 = ((IntField*)eL->fieldByID("Y"))->getValue(); int w2 = ((IntField*)eL->fieldByID("W"))->getValue(); int h2 = ((IntField*)eL->fieldByID("H"))->getValue(); int t2 = ((IntField*)eL->fieldByID("T"))->getValue(); int alpha = 250; int alpha0 = 25; int alpha1 = 100; int alpha2 = 250; if((x1-w2-15<x2)&&(y1-h2-15<y2)&&(w1+x1+15>x2)&&(h1+y1+15>y2)){ alpha = 0; alpha0 = 0; alpha1 = 0; alpha2 = 0; } QPainter painter(this); QColor color(90,185,255,alpha); QColor colorGreenAlpha(55,155,55,alpha0); QColor colorBlackAlpha(0,0,0,alpha1); QColor colorBlack(0,0,0,alpha2); QPen penf = QPen(colorBlackAlpha, 1, Qt::SolidLine); painter.setBrush(QBrush(color)); int indexR = 0; int indexL = 0; for(int j=0; j<eR->fieldCount() && indexR==0; j++){ if(eR->fieldAt(j)->getID()==r->getKey()){ indexR = j; } } for(int j=0; j<eL->fieldCount() && indexL==0; j++){ if(eL->fieldAt(j)->getID()==r->getKey()){ indexL = j; } } if(indexR<work_count-1){ indexR=work_count-1; } if(indexL<work_count-1){ indexL=work_count-1; } int x01=0; int x02=0; int y01=0; int y02=0; if(qAbs(x1-x2)>=w2 && qAbs(x1-x2)>=w1){ if(x1>x2){ x01=x1; x02=x2+w2+1; }else{ x02=x2; x01=x1+w1+1; } y01 = y1+(indexR+1-work_count)*24+((indexR+1-(work_count-1))*24-(indexR+1-work_count)*24)/2; y02 = y2+(indexL+1-work_count)*24+((indexL+1-(work_count-1))*24-(indexL+1-work_count)*24)/2; }else{ if(y1>y2){ y01=y1; y02=y2+h2+1; }else{ y02=y2; y01=y1+h1+1; } x01=x1+w1/2; x02=x2+w2/2; } int x0 = 0; int y0 = 0; QPointF p1(x01,y01); QPointF p2(x02,y02); if(x01>x02){ x0 = x02 + (x01 - x02)/2; }else{ x0 = x01 + (x02 - x01)/2; } if(y01>y02){ y0 = y02 + (y01 - y02)/2; }else{ y0 = y01 + (y02 - y01)/2; } QPointF p0(x0,y0); QPen pen1 = QPen(colorBlack, 1, Qt::DotLine); QPen pen2 = QPen(colorBlack, 1, Qt::SolidLine); QPen pen3 = QPen(colorBlack, 2, Qt::SolidLine); QPen pen4 = QPen(colorBlack, 2, Qt::DotLine); if(r->getAbsL()){ if(focus){ painter.setPen(pen4); }else{ painter.setPen(pen1); } }else{ if(focus){ painter.setPen(pen3); }else{ painter.setPen(pen2); } } painter.drawLine(p1,p0); if(r->getAbsR()){ if(focus){ painter.setPen(pen4); }else{ painter.setPen(pen1); } }else{ if(focus){ painter.setPen(pen3); }else{ painter.setPen(pen2); } } painter.drawLine(p0,p2); if(focus){ painter.setPen(pen3); }else{ painter.setPen(pen2); } painter.drawEllipse(p0, 10, 10); if(r->getMulL()){ QRect tr(p0.x()-7,p0.y()-7,12,12); painter.drawText(tr,"n"); } if(r->getMulR()){ QRect tr(p0.x()+3,p0.y()-7,12,12); painter.drawText(tr,"n"); } painter.setPen(pen2); painter.drawLine(QPointF(p0.x(),p0.y()-10),QPointF(p0.x(),p0.y()+10)); if(focus){ if(t1!=1){ double distance = this->core->getDistanceOf(eR); painter.setBrush(QBrush(colorGreenAlpha)); painter.setPen(penf); painter.drawEllipse(QPoint(x1-1,y1-1), (int)qRound(distance), (int)qRound(distance)); } if(t2!=1){ double distance = this->core->getDistanceOf(eL); painter.setBrush(QBrush(colorGreenAlpha)); painter.setPen(penf); painter.drawEllipse(QPoint(x2-1,y2-1), (int)qRound(distance), (int)qRound(distance)); } } }