diff --git a/src/fielditem.cpp b/src/fielditem.cpp index 758dd4d..c5edbea 100644 --- a/src/fielditem.cpp +++ b/src/fielditem.cpp @@ -20,13 +20,16 @@ #include "fielditem.h" #include "homoefielditem.h" #include "homobfielditem.h" +#include "simulscene.h" #include #include +#include ; FieldItem::FieldItem() : QGraphicsItem() { myRotation = 0; myScenePos = QPointF(0,0); + mySimulScene = dynamic_cast (scene()); } @@ -131,11 +134,13 @@ void FieldItem::wheelEvent(QGraphicsSceneWheelEvent * event) { setRotation(getRotation()+( (event->delta()/abs(event->delta()))*5 )); } } +void FieldItem::contextMenuEvent ( QGraphicsSceneContextMenuEvent * event ){ + +} /*! \fn FieldItem::getRotation() */ -int FieldItem::getRotation() -{ +int FieldItem::getRotation() { return myRotation; -} +} \ No newline at end of file diff --git a/src/fielditem.h b/src/fielditem.h index 94273fa..40d4cca 100644 --- a/src/fielditem.h +++ b/src/fielditem.h @@ -29,6 +29,7 @@ */ class QPointF; class QGraphicsSceneWheelEvent; +class SimulScene; class FieldItem :public QObject, public QGraphicsItem { Q_OBJECT public: @@ -57,10 +58,11 @@ class FieldItem :public QObject, public QGraphicsItem { protected: virtual void wheelEvent(QGraphicsSceneWheelEvent * event); + virtual void contextMenuEvent ( QGraphicsSceneContextMenuEvent * event ); QPointF myScenePos; int myRotation; QRectF sizeRect; - + SimulScene* mySimulScene; public slots: virtual void handleSceneChange(const QList & region); diff --git a/src/homobfieldwidget.cpp b/src/homobfieldwidget.cpp index 16deb0a..2d94534 100644 --- a/src/homobfieldwidget.cpp +++ b/src/homobfieldwidget.cpp @@ -19,6 +19,7 @@ ***************************************************************************/ #include "homobfieldwidget.h" #include "homobfielditem.h" +#include "simulscene.h" #include "expdoublespinbox.h" #include #include @@ -27,6 +28,7 @@ #include #include #include +#include HomoBFieldWidget::HomoBFieldWidget(QWidget* parent, Qt::WindowFlags f, HomoBFieldItem* bField):QWidget(parent, f) { homoBField = bField; @@ -108,6 +110,7 @@ void HomoBFieldWidget::createWidget() { connect(homoBField ,SIGNAL(directionChanged(bool)),intoPlaneButton, SLOT(setChecked(bool)) ); connect(intoPlaneButton, SIGNAL(toggled(bool)),homoBField ,SLOT(setIsDirectionIntoPlane(bool)) ); + QButtonGroup* directionGroup = new QButtonGroup(); directionGroup->addButton(intoPlaneButton); directionGroup->addButton(outOfPlaneButton); @@ -120,14 +123,16 @@ void HomoBFieldWidget::createWidget() { QGroupBox* fieldDirectionBox = new QGroupBox(tr("Feldrichtung")); fieldDirectionBox->setLayout(directionGridLayout); - - - + //SimulScene* theScene = dynamic_cast(homoBField->scene()); + //qDebug()< addWidget(geometryBox); mainLayout -> addWidget(fieldDirectionBox); mainLayout -> addWidget(fieldConstantsBox); + //mainLayout -> addWidget(downButton); mainLayout -> addStretch(); QWidget::setTabOrder (posXBox, posYBox); diff --git a/src/homoefielditem.cpp b/src/homoefielditem.cpp index c5f33dd..7bc69b3 100644 --- a/src/homoefielditem.cpp +++ b/src/homoefielditem.cpp @@ -36,6 +36,9 @@ HomoEFieldItem::HomoEFieldItem(QRectF sizeRect) setOuterPenWidth (2); //rotateslot(66); + //QGraphicsRectItem * testItem = new QGraphicsRectItem(QRectF(-10,-10,6,6), this); + //testItem->setBrush(Qt::SolidPattern); + diff --git a/src/lsim.cpp b/src/lsim.cpp index 6ff7b41..a8fcdfd 100644 --- a/src/lsim.cpp +++ b/src/lsim.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include "expdoublespinbox.h" #include "homoefieldwidget.h" @@ -95,6 +96,13 @@ void lsim::createActions() { acts.exitAct->setStatusTip (tr ("Die Anwendung beenden")); connect (acts.exitAct, SIGNAL (triggered()), qApp, SLOT (quit())); + acts.moveItemDown = new QAction (tr ("runter"), this); + acts.moveItemDown->setStatusTip (tr ("runter")); + connect (acts.moveItemDown, SIGNAL (triggered()), simulscene, SLOT (moveSelectedFieldItemDown())); + + acts.moveItemUp = new QAction (tr ("rauf"), this); + acts.moveItemUp->setStatusTip (tr ("rauf")); + connect (acts.moveItemUp, SIGNAL (triggered()), simulscene, SLOT (moveSelectedFieldItemUp())); //Edit, insert, Modechange acts.itemEditModeAct = new QAction (tr ("Edit"), this); @@ -153,13 +161,17 @@ void lsim::createToolBars() { fileToolBar->addAction(acts.timerStart); fileToolBar->addAction(acts.timerStop); - editToolBar = addToolBar (tr ("Edit")); editToolBar->addAction(acts.itemEditModeAct); editToolBar->addAction(acts.insertEFieldItemAct); editToolBar->addAction(acts.insertBFieldItemAct); editToolBar->addAction(acts.probeChargeItemPlaceAct); + + upDownToolBar=addToolBar(tr("updown")); + upDownToolBar->addAction(acts.moveItemDown); + upDownToolBar->addAction(acts.moveItemUp); + } void lsim::createStatusBar() { @@ -253,6 +265,7 @@ void lsim::createDocks() { sceneDock = new QDockWidget(tr("Allgemeines"), this); sceneDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea); sceneDock->setWidget((allgWidget)); + //sceneDock->setFeatures(QDockWidget::NoDockWidgetFeatures); addDockWidget(Qt::LeftDockWidgetArea, sceneDock); //************************************************************************** @@ -261,6 +274,7 @@ void lsim::createDocks() { fieldItemEditDock = new QDockWidget(tr("Feldeinstellungen"), this); fieldItemEditDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea); fieldItemEditDock->setWidget(new QWidget); + //fieldItemEditDock->setFeatures(QDockWidget::NoDockWidgetFeatures); addDockWidget(Qt::LeftDockWidgetArea, fieldItemEditDock); connect (simulscene, SIGNAL(selectionChanged ()) , this, SLOT(updateDockFieldWidget())); updateDockFieldWidget(); @@ -268,6 +282,7 @@ void lsim::createDocks() { probeItemDock = new QDockWidget(tr("Probleladung"), this); probeItemDock->setWidget(simulscene->getProbeDockWidget()); + //probeItemDock->setFeatures(QDockWidget::NoDockWidgetFeatures); addDockWidget(Qt::LeftDockWidgetArea, probeItemDock); @@ -316,17 +331,11 @@ lsim::~lsim() { \fn lsim::updateDockFieldWidget() */ void lsim::updateDockFieldWidget() { - QStringListModel *model = new QStringListModel(); - QStringList list; - list << "a" << "b" << "c"; - model->setStringList(list); - QListView * lview = new QListView; - lview->setModel(model); QLabel* currLabel = new QLabel(tr("Bitte ein Feld ausw\344hlen")); currLabel->setWordWrap(true); currLabel->setAlignment(Qt::AlignCenter); - QWidget *currDockWidget =currLabel; + QWidget *currDockWidget =simulscene->getFieldListWidget(); if(simulscene->selectedItems().count() == 1) { QGraphicsItem *currItem = simulscene->selectedItems().first(); if (FieldItem::isFieldItem(currItem)) { @@ -346,3 +355,6 @@ void lsim::startTimer() { if( qApp->focusWidget() !=0) qApp->focusWidget()->clearFocus(); simulscene->startTimer(); } +void lsim::handleDockLocationChange() { + +} \ No newline at end of file diff --git a/src/lsim.h b/src/lsim.h index 9f37772..4f176a4 100644 --- a/src/lsim.h +++ b/src/lsim.h @@ -56,6 +56,7 @@ class lsim: public QMainWindow { void updateDockFieldWidget(); void startCalculation(); void startTimer(); + void handleDockLocationChange(); private: void createActions(); @@ -74,6 +75,7 @@ class lsim: public QMainWindow { QToolBar *fileToolBar; QToolBar *editToolBar; + QToolBar *upDownToolBar; struct Actions { QAction *aboutAct; @@ -85,6 +87,9 @@ class lsim: public QMainWindow { QAction *timerStart; QAction *timerStop; + QAction *moveItemDown; + QAction *moveItemUp; + QAction *itemEditModeAct; QAction *insertEFieldItemAct; QAction *insertBFieldItemAct; diff --git a/src/simulscene.cpp b/src/simulscene.cpp index 612128d..f078c4e 100644 --- a/src/simulscene.cpp +++ b/src/simulscene.cpp @@ -35,6 +35,7 @@ #include #include #include +#include SimulScene::SimulScene ( QObject* parent ) : QGraphicsScene ( parent ) { @@ -44,6 +45,8 @@ SimulScene::SimulScene ( QObject* parent ) : QGraphicsScene ( parent ) { //setMeterPerPx(1/1000.0); setMeterPerPx(0.01); + fieldListWidget = new QListWidget(); + currHomoEfieldInsertItem = 0; currHomoEfieldEditItem = 0; currHomoBfieldInsertItem = 0; @@ -100,6 +103,7 @@ SimulScene::SimulScene ( QObject* parent ) : QGraphicsScene ( parent ) { ani->setItem(ellipse1); ani->setTimeLine(timer); + } void SimulScene::startTimer() { @@ -127,6 +131,7 @@ void SimulScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) { break; case ProbeChargeItemPlace: if (mouseEvent->button() != Qt::LeftButton) break; //benutze nur linke maustaste + clearSelection(); ChargePlacementInProgress = true; ellipse1->setPos(mouseEvent->scenePos()); break; @@ -249,6 +254,7 @@ void SimulScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent) { //das neue item auswaehlen clearSelection(); currHomoEfieldInsertItem->setSelected(true); + currHomoEfieldInsertItem->setZValue(getHighestZIndexFieldItems()+FieldZStep); //die resize items aus und einblenden bei rotation connect( currHomoEfieldInsertItem, SIGNAL(rotationChanged()), this, SLOT(displayResizeRects())); @@ -285,6 +291,7 @@ void SimulScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent) { //das neue item auswaehlen clearSelection(); currHomoBfieldInsertItem->setSelected(true); + currHomoBfieldInsertItem->setZValue(getHighestZIndexFieldItems()+FieldZStep); //die resize items aus und einblenden bei rotation connect( currHomoBfieldInsertItem, SIGNAL(rotationChanged()), this, SLOT(displayResizeRects())); @@ -496,6 +503,22 @@ qreal SimulScene::getHighestZIndexVisible() { } return highestZValue; } +qreal SimulScene::getHighestZIndexFieldItems() { + bool highestZValueSet = false; + qreal highestZValue = FieldDefaultZValue; //default value + for (int i = 0; i < items().count() ; ++i ) { + if (FieldItem::isFieldItem(items().at(i))) { + if (!highestZValueSet) { + highestZValue = items().at(i)->zValue(); + highestZValueSet = true; + } + else if (highestZValue < items().at(i)->zValue()) { + highestZValue = items().at(i)->zValue(); + } + } + } + return highestZValue; +} void SimulScene::deleteSelectedFieldItems() { QList currSelectedItems = selectedItems(); @@ -619,7 +642,8 @@ void SimulScene::startCalculation() { calcBFieldList << qgraphicsitem_cast(items().at(i)); } } - + + //berechnung starten ellipse1->calculateProbePath(ellipse1->pos()); @@ -657,50 +681,10 @@ void SimulScene::setSteps(int steps) { double SimulScene::getPowerAt(QPointF point, double charge, double speedX, double speedY, char xy) { double dPower = 0; - /*for(int i = 0; i < items(point).size(); ++i) { - //HomoEFieldItems Abarbeiten - if (qgraphicsitem_cast (items(point).at(i)) != 0) { - HomoEFieldItem* myHomoEFieldItem = qgraphicsitem_cast (items(point).at(i)); - double power = (myHomoEFieldItem->getFieldPower() * charge); - double degAngle = myHomoEFieldItem->getRotation(); - double radAngle = degAngle/180.0*PI; - - if(xy == 'x') { - if (degAngle != 180.0) dPower += power * -sin(radAngle); - } - if(xy == 'y') { - if (degAngle != 90.0 && degAngle != 270.0) dPower += power * cos(radAngle); - } - } - //HomoBFieldItems Abarbeiten - if (qgraphicsitem_cast (items(point).at(i)) != 0) { - HomoBFieldItem* myHomoBFieldItem = qgraphicsitem_cast(items(point).at(i)); - double absSpeed = sqrt(speedX * speedX + speedY * speedY); // Geschwindigkeit im Betrag |v|=sqrt(vx^2+vy^2) - double absLorentzPower = (charge * absSpeed * myHomoBFieldItem->getFluxDensity() ); //Kraft im Betrag: |F| = q*v*B - double speedRadAngle = atan2(speedY,speedX); //Winkel des Geschwindigkeitsvekors zur x-Achse im Bogenmass - - double PowerRadAngle; //Winkel des Lorentzkraftvektors zur x-Achse im Bogenmass - if (myHomoBFieldItem->getIsDirectionIntoPlane()) { - PowerRadAngle = speedRadAngle + PI/2.0; - } else { - PowerRadAngle = speedRadAngle - PI/2.0; - } - //qDebug()<< PowerRadAngle; - - if (xy == 'x') { - dPower += absLorentzPower * cos(PowerRadAngle); - } - if (xy == 'y') { - dPower += absLorentzPower * sin(PowerRadAngle); - } - } - }*/ - for (int i=0; icontains(myHomoEFieldItem->mapFromScene(point))) { - double power = (myHomoEFieldItem->getFieldPower() * charge); double degAngle = myHomoEFieldItem->getRotation(); double radAngle = degAngle/180.0*PI; @@ -713,9 +697,10 @@ double SimulScene::getPowerAt(QPointF point, double charge, double speedX, doubl } } } + for (int i=0; icontains(myHomoBFieldItem->mapFromScene(point))) { double absSpeed = sqrt(speedX * speedX + speedY * speedY); // Geschwindigkeit im Betrag |v|=sqrt(vx^2+vy^2) double absLorentzPower = (charge * absSpeed * myHomoBFieldItem->getFluxDensity() ); //Kraft im Betrag: |F| = q*v*B @@ -779,4 +764,84 @@ void SimulScene::setTimeLineDuration(int duration) { int SimulScene::getTimeLineDuration() { return timer->duration(); +} +QListWidget* SimulScene::getFieldListWidget() { + return fieldListWidget; +} +QList SimulScene::getItemsInZOrder() { + QList currItems = items(); + + bool swapNeeded; + for (int i=0;i< currItems.count();++i) { + swapNeeded=false; + for (int j=0; j< currItems.count() -i -1; ++j){ + if(currItems[j]->zValue() > currItems[j+1]->zValue()) { + QGraphicsItem* swapper = currItems[j]; + currItems[j]= currItems[j+1]; + currItems[j+1] = swapper; + swapNeeded = true; + } + } + if(!swapNeeded) break; + } + return currItems; +} + +QList SimulScene::getFieldItemsInZOrder() { + QList currItems; + for (int i = 0; i< items().size();++i) { + if(FieldItem::isFieldItem(items().at(i))) currItems.append(items().at(i)); + } + + bool swapNeeded; + for (int i=0;i< currItems.count();++i) { + swapNeeded=false; + for (int j=0; j< currItems.count() -i -1; ++j){ + if(currItems[j]->zValue() > currItems[j+1]->zValue()) { + QGraphicsItem* swapper = currItems[j]; + currItems[j]= currItems[j+1]; + currItems[j+1] = swapper; + swapNeeded = true; + } + } + if(!swapNeeded) break; + } + return currItems; +} + +void SimulScene::moveFieldItemDown(QGraphicsItem* fieldItem) { + if (!FieldItem::isFieldItem(fieldItem)) return; + qreal currFieldItemZValue = fieldItem->zValue(); + QList FieldItemsInZOrder = getFieldItemsInZOrder(); + for (int i = 1; i< FieldItemsInZOrder.count();++i) { + if (FieldItemsInZOrder.at(i) == fieldItem) { + fieldItem->setZValue(FieldItemsInZOrder.at(i-1)->zValue()); + FieldItemsInZOrder.at(i-1)->setZValue(currFieldItemZValue); + return; + } + } + +} + +void SimulScene::moveFieldItemUp(QGraphicsItem* fieldItem) { + if (!FieldItem::isFieldItem(fieldItem)) return; + qreal currFieldItemZValue = fieldItem->zValue(); + QList FieldItemsInZOrder = getFieldItemsInZOrder(); + for (int i = 0; i< FieldItemsInZOrder.count()-1;++i) { + if (FieldItemsInZOrder.at(i) == fieldItem) { + fieldItem->setZValue(FieldItemsInZOrder.at(i+1)->zValue()); + FieldItemsInZOrder.at(i+1)->setZValue(currFieldItemZValue); + return; + } + } + +} + +void SimulScene::moveSelectedFieldItemDown() { + if (selectedItems().isEmpty()) return; + moveFieldItemDown(selectedItems().first()); +} +void SimulScene::moveSelectedFieldItemUp() { + if (selectedItems().isEmpty()) return; + moveFieldItemUp(selectedItems().first()); } \ No newline at end of file diff --git a/src/simulscene.h b/src/simulscene.h index 1e32828..7108e49 100644 --- a/src/simulscene.h +++ b/src/simulscene.h @@ -31,6 +31,8 @@ class GraphicsEllipseItem; class QGraphicsItemAnimation; class QGraphicsPathItem; class QPainterPath; +class QListWidget; +class FieldItem; /** @author Peter Dahlberg @@ -46,7 +48,8 @@ class SimulScene : public QGraphicsScene { }; enum ItemType {ResizeRectItem}; SimulScene ( QObject* parent = 0); - qreal getHighestZIndexVisible(); //hoechsten z-index der sichtbaren items ausgeben + qreal getHighestZIndexVisible(); //hoechsten z-index der sichtbaren items + qreal getHighestZIndexFieldItems(); //hoechsten z-index der Felder ausgeben ~SimulScene(); double getTimePerStep(); @@ -66,6 +69,9 @@ class SimulScene : public QGraphicsScene { bool isFlightPathVisible(); int getTimeLineDuration(); + QListWidget* getFieldListWidget(); + QList getItemsInZOrder(); + QList getFieldItemsInZOrder(); public slots: void setSceneMode(SceneMode mode); @@ -82,7 +88,10 @@ class SimulScene : public QGraphicsScene { void setFlightPathVisible(bool visible = true); void setTimeLineDuration(int duration); - + void moveFieldItemDown(QGraphicsItem* fieldItem); + void moveSelectedFieldItemDown(); + void moveFieldItemUp(QGraphicsItem* fieldItem); + void moveSelectedFieldItemUp(); private slots: void displayResizeRects(bool move = false); @@ -122,6 +131,7 @@ class SimulScene : public QGraphicsScene { QGraphicsItemAnimation *ani; QGraphicsPathItem *pathItem1; + QListWidget* fieldListWidget; //rechtecke zur groesenaenderung @@ -149,7 +159,11 @@ class SimulScene : public QGraphicsScene { QList calcEFieldList; QList calcBFieldList; - + + static const qreal FieldDefaultZValue = 10; //default z-value fuer Felder + static const qreal FieldZStep = 1e-50; //schritt, um den der z-index erhoeht wird + + protected: void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent);