StopperItem fertig, wird aber noch nicht in berechnung einbezogen

git-svn-id: http://svn.lsim.tuxzone.org/trunk@20 4bec179b-ab65-46ed-a5f8-55b8b5c735d0
This commit is contained in:
catdog2
2008-11-21 23:56:10 +00:00
parent f01d249e27
commit cabf7af527
18 changed files with 519 additions and 49 deletions

View File

@@ -26,6 +26,7 @@
#include "graphicsellipseitem.h"
#include "homoefielditem.h"
#include "homobfielditem.h"
#include "stopperitem.h"
#include <QRectF>
#include <QGraphicsSceneMouseEvent>
#include <QtDebug>
@@ -40,7 +41,7 @@
SimulScene::SimulScene ( QObject* parent ) : QGraphicsScene ( parent ) {
//variablen initialisieren
setTimePerStep(1e-7);
setTimePerStep(1e-10);
setSteps(300000);
//setMeterPerPx(1/1000.0);
setMeterPerPx(0.01);
@@ -51,6 +52,8 @@ SimulScene::SimulScene ( QObject* parent ) : QGraphicsScene ( parent ) {
currHomoEfieldEditItem = 0;
currHomoBfieldInsertItem = 0;
currHomoBfieldEditItem = 0;
currStopperInsertItem = 0;
currStopperEditItem = 0;
ChargePlacementInProgress = false;
createResizeRects();
@@ -61,7 +64,6 @@ SimulScene::SimulScene ( QObject* parent ) : QGraphicsScene ( parent ) {
//pathItem1->setCacheMode(QGraphicsItem::DeviceCoordinateCache);
setFlightPathVisible();
addLine(0,-298,0,298,QPen(Qt::green, 1, Qt::SolidLine) )->setCacheMode(QGraphicsItem::DeviceCoordinateCache);
addLine(-398,0,398,0,QPen(Qt::green, 1, Qt::SolidLine) )->setCacheMode(QGraphicsItem::DeviceCoordinateCache);
@@ -124,6 +126,13 @@ void SimulScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) {
addItem(currHomoEfieldInsertItem);
QApplication::setOverrideCursor(QCursor(Qt::SizeFDiagCursor));
break;
case StopperItemInsert:
if (mouseEvent->button() != Qt::LeftButton) break; //benutze nur linke maustaste
currStopperInsertItem = new StopperItem(mouseEvent->scenePos() ,mouseEvent->scenePos());
currStopperInsertItem->setZValue(getHighestZIndexFieldItems() + FieldZStep); //zValue setzen
addItem(currStopperInsertItem);
QApplication::setOverrideCursor(QCursor(Qt::SizeHorCursor));
break;
case HomoBFieldItemInsert:
if (mouseEvent->button() != Qt::LeftButton) break; //benutze nur linke maustaste
currHomoBfieldInsertItem = new HomoBFieldItem(QRectF(mouseEvent->scenePos(),mouseEvent->scenePos()));
@@ -148,6 +157,10 @@ void SimulScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) {
currHomoBfieldEditItem = qgraphicsitem_cast<HomoBFieldItem *>(selectedItems().first());
QApplication::setOverrideCursor(pressedResizeItem->cursor());
}
else if (selectedItems().first()->type() == StopperItem::Type) {
currStopperEditItem = qgraphicsitem_cast<StopperItem *>(selectedItems().first());
QApplication::setOverrideCursor(pressedResizeItem->cursor());
}
}
else {
@@ -172,6 +185,17 @@ void SimulScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent) {
}
}
if (currStopperInsertItem != 0) {
if (myMode == StopperItemInsert) {
QPointF point(currStopperInsertItem->getRectF().x(), currStopperInsertItem->getRectF().y());
update(currStopperInsertItem->getRectF());
if(point.x() <= mouseEvent->scenePos().x() && point.y() <= mouseEvent->scenePos().y()) {
currStopperInsertItem->setLine(QLineF(point, QPointF(mouseEvent->scenePos().x(),point.y() )));
}
}
}
else if (currHomoBfieldInsertItem != 0) {
if (myMode == HomoBFieldItemInsert) {
QPointF point(currHomoBfieldInsertItem->getRectF().x(), currHomoBfieldInsertItem->getRectF().y());
@@ -218,6 +242,47 @@ void SimulScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent) {
//resize rechtecke mitverschieben --> macht jetzt schon das Widget
//if(mouseEvent->scenePos() != mouseEvent->lastScenePos()) displayResizeRects(true);
}
else if (currStopperEditItem != 0 ) {
QGraphicsRectItem *pressedRectItem = qgraphicsitem_cast<QGraphicsRectItem *>(pressedResizeItem);
QRectF currRect = currStopperEditItem->getRectF();
QPointF pos = currStopperEditItem->pos();
//calculateItemResize(mouseEvent,pressedRectItem,currRect,newPos,StopperItem::MinimumWidth,StopperItem::Height);
qreal mouseDistanceX = mouseEvent->scenePos().x() - mouseEvent->lastScenePos().x();
//aenderungen uebernehmen
if (
pressedResizeItem == reRects.rightRezizeItem ||
pressedResizeItem == reRects.rightTopResizeItem ||
pressedResizeItem == reRects.rightBottomResizeItem
) {
QPointF newPos = QPointF(pos.x()+currRect.width()+mouseDistanceX , pos.y());
if (newPos.x() - pos.x() >= StopperItem::MinimumWidth) {
currRect.adjust(0,0, (mouseDistanceX),0);
currStopperEditItem->setRectF(currRect);
//currStopperEditItem->setLine(QLineF(pos, newPos ));
}
} else if (
pressedResizeItem == reRects.leftResizeItem ||
pressedResizeItem == reRects.leftTopResizeItem ||
pressedResizeItem == reRects.leftBottomResizeItem
) {
if ( pos.x() - pos.x()+currRect.width()-mouseDistanceX >= StopperItem::MinimumWidth) {
currRect.adjust(0,0,-mouseDistanceX,0);
currStopperEditItem->setPos(pos.x()+mouseDistanceX,pos.y());
currStopperEditItem->setRectF(currRect);
//currStopperEditItem->setLine(QLineF(pos, newPos ));
}
}
//resize rechtecke mitverschieben --> macht jetzt schon das Widget
//if(mouseEvent->scenePos() != mouseEvent->lastScenePos()) displayResizeRects(true);
}
else if (ChargePlacementInProgress) {
if (myMode == ProbeChargeItemPlace) {
@@ -304,6 +369,41 @@ void SimulScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent) {
}
update(); //moegliche darstellungsprobleme beseitigen
QApplication::restoreOverrideCursor();
}
else if (currStopperInsertItem != 0 && myMode == StopperItemInsert) {
if (currStopperInsertItem->getRectF().width() < StopperItem::MinimumWidth) {
//removeItem(currHomoEfieldInsertItem); //segmention fault in kombination mit delete?
delete currStopperInsertItem; //zu kleines feld loeschen
} else {
//setze Startpunkt des rechtecks auf 0,0, damit pos() richtig funktioniert
currStopperInsertItem->setVisible(false); //ausblenden, damit sich nix verschiebt
QRectF rect (currStopperInsertItem->getRectF());
QPointF posPoint(rect.x(),rect.y());
rect.setWidth(rect.width() - rect.x());
rect.setHeight(rect.height() - rect.y());
rect.setX(0);
rect.setY(0);
currStopperInsertItem->setRectF(rect);
currStopperInsertItem->setPos(posPoint);
currStopperInsertItem->setVisible(true); //und wieder einblenden
setSceneMode(FieldItemEdit);
//das neue item auswaehlen
clearSelection();
currStopperInsertItem->setSelected(true);
//die resize items aus und einblenden bei rotation
connect( currStopperInsertItem, SIGNAL(rotationChanged()), this, SLOT(displayResizeRects()));
//bei groesenanderung und verschieben resizerects mitverschieben
connect( currStopperInsertItem, SIGNAL(heightChanged(double)), this, SLOT(moveResizeRects()));
connect( currStopperInsertItem, SIGNAL(widthChanged(double)), this, SLOT(moveResizeRects()));
connect( currStopperInsertItem, SIGNAL(ScenePosChanged(QPointF)), this, SLOT(moveResizeRects()));
//item ueber sceneChange informieren
connect(this,SIGNAL(changed(QList<QRectF>)),currStopperInsertItem,SLOT(handleSceneChange(QList<QRectF>)));
}
update(); //moegliche darstellungsprobleme beseitigen
QApplication::restoreOverrideCursor();
}
else if (currHomoEfieldEditItem != 0) {
update();
@@ -313,6 +413,10 @@ void SimulScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent) {
update();
QApplication::restoreOverrideCursor();
}
else if (currStopperEditItem != 0) {
update();
QApplication::restoreOverrideCursor();
}
else if (ChargePlacementInProgress) {
ChargePlacementInProgress = false;
setSceneMode(FieldItemEdit);
@@ -322,6 +426,8 @@ void SimulScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent) {
currHomoBfieldInsertItem = 0;
currHomoEfieldEditItem = 0;
currHomoBfieldEditItem = 0;
currStopperInsertItem = 0;
currStopperEditItem = 0;
QGraphicsScene::mouseReleaseEvent(mouseEvent);
}
@@ -916,4 +1022,8 @@ void SimulScene::moveSelectedFieldItemOnTop() {
void SimulScene::moveSelectedFieldItemOnBottom() {
if (selectedItems().isEmpty()) return;
moveFieldItemOnBottom(selectedItems().first());
}
}
GraphicsEllipseItem* SimulScene::getProbeChargeItem() {
return ellipse1;
}