From ffdd1677f179da44cf1af5a7b096f8fe9e260733 Mon Sep 17 00:00:00 2001 From: catdog2 Date: Tue, 14 Oct 2008 19:31:02 +0000 Subject: [PATCH] HomoBField einfuegbar in die scene und editierbar git-svn-id: http://svn.lsim.tuxzone.org/trunk@5 4bec179b-ab65-46ed-a5f8-55b8b5c735d0 --- src/fielditem.cpp | 2 + src/homobfielditem.cpp | 8 +++- src/homobfielditem.h | 2 + src/lsim.cpp | 10 ++++- src/lsim.h | 1 + src/simulscene.cpp | 88 +++++++++++++++++++++++++++++++++++++++++- src/simulscene.h | 14 ++++--- 7 files changed, 117 insertions(+), 8 deletions(-) diff --git a/src/fielditem.cpp b/src/fielditem.cpp index 0206ea7..b5d1a5a 100644 --- a/src/fielditem.cpp +++ b/src/fielditem.cpp @@ -19,6 +19,7 @@ ***************************************************************************/ #include "fielditem.h" #include "homoefielditem.h" +#include "homobfielditem.h" #include FieldItem::FieldItem() @@ -41,6 +42,7 @@ bool FieldItem::isFieldItem(QGraphicsItem *item) { QList fieldItemTypes; // ---- Definiert die FieldItem typen fieldItemTypes << HomoEFieldItem::Type; + fieldItemTypes << HomoBFieldItem::Type; // ---- for (int i=0; itype() == fieldItemTypes.at(i)) { diff --git a/src/homobfielditem.cpp b/src/homobfielditem.cpp index 433e07e..4a599f0 100644 --- a/src/homobfielditem.cpp +++ b/src/homobfielditem.cpp @@ -20,8 +20,10 @@ #include "homobfielditem.h" #include #include +#include HomoBFieldItem::HomoBFieldItem(QRectF sizeRect): FieldItem() { + setRectF(sizeRect); setFieldLineDistance(10); setFlag(ItemIsMovable); setFlag(ItemIsSelectable); @@ -46,7 +48,7 @@ QRectF HomoBFieldItem::getRectF() const } void HomoBFieldItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { - Qt::GlobalColor linecolor = Qt::blue; + Qt::GlobalColor linecolor = Qt::red; painter->setPen(linecolor); if (isSelected()) painter->setBrush(Qt::Dense6Pattern); //selection deutlich machen painter->drawRect(sizeRect); @@ -105,3 +107,7 @@ double HomoBFieldItem::getOuterPenWidth() const { void HomoBFieldItem::setOuterPenWidth ( double theValue ) { outerPenWidth = theValue; } + +QWidget* HomoBFieldItem::getDockWidget() const { + return new QWidget(); +} diff --git a/src/homobfielditem.h b/src/homobfielditem.h index b853093..0cc0771 100644 --- a/src/homobfielditem.h +++ b/src/homobfielditem.h @@ -25,6 +25,7 @@ /** @author Peter Dahlberg */ +class QWidget; class HomoBFieldItem : public FieldItem { Q_OBJECT public: @@ -42,6 +43,7 @@ class HomoBFieldItem : public FieldItem { int type() const; int getFieldLineDistance() const; + QWidget* getDockWidget() const; double getOuterPenWidth() const; public slots: diff --git a/src/lsim.cpp b/src/lsim.cpp index e16b282..c67fdf2 100644 --- a/src/lsim.cpp +++ b/src/lsim.cpp @@ -97,10 +97,16 @@ void lsim::createActions() { acts.insertEFieldItemAct->setStatusTip (tr ("E-Feld Einfuegen")); acts.insertEFieldItemAct->setCheckable(true); acts.insertEFieldItemAct->setData(QVariant(SimulScene::HomoEFieldItemInsert)); + + acts.insertBFieldItemAct = new QAction (tr ("B-Feld"), this); + acts.insertBFieldItemAct->setStatusTip (tr ("B-Feld Einfuegen")); + acts.insertBFieldItemAct->setCheckable(true); + acts.insertBFieldItemAct->setData(QVariant(SimulScene::HomoBFieldItemInsert)); modeChangeActGroup = new QActionGroup(this); modeChangeActGroup->addAction(acts.itemEditModeAct); modeChangeActGroup->addAction(acts.insertEFieldItemAct); + modeChangeActGroup->addAction(acts.insertBFieldItemAct); connect (modeChangeActGroup, SIGNAL (triggered(QAction*)), this, SLOT (actModeSwitcher(QAction*))); connect (simulscene, SIGNAL(sceneModeChanged(int)) , this, SLOT(setSceneMode(int))); @@ -133,6 +139,7 @@ void lsim::createToolBars() { editToolBar->addSeparator(); editToolBar->addAction(acts.itemEditModeAct); editToolBar->addAction(acts.insertEFieldItemAct); + editToolBar->addAction(acts.insertBFieldItemAct); } void lsim::createStatusBar() { @@ -214,10 +221,11 @@ void lsim::createDocks() { void lsim::actModeSwitcher(QAction *action) { if (action->data().toInt() == SimulScene::FieldItemEdit) simulscene->setSceneMode(SimulScene::FieldItemEdit); if (action->data().toInt() == SimulScene::HomoEFieldItemInsert) simulscene->setSceneMode(SimulScene::HomoEFieldItemInsert); + if (action->data().toInt() == SimulScene::HomoBFieldItemInsert) simulscene->setSceneMode(SimulScene::HomoBFieldItemInsert); } void lsim::setSceneMode(int mode) { - for (int i=0;i < modeChangeActGroup->actions().count();++i){ + for (int i=0;i < modeChangeActGroup->actions().count();++i){ //nur das aktuelle checked setzen if(modeChangeActGroup->actions().at(i)->data().toInt() == mode) { modeChangeActGroup->actions().at(i)->setChecked(true); } diff --git a/src/lsim.h b/src/lsim.h index 86ee8ad..4ad65c7 100644 --- a/src/lsim.h +++ b/src/lsim.h @@ -82,6 +82,7 @@ class lsim: public QMainWindow { QAction *itemEditModeAct; QAction *insertEFieldItemAct; + QAction *insertBFieldItemAct; }; Actions acts; diff --git a/src/simulscene.cpp b/src/simulscene.cpp index 0164cba..f93c9c1 100644 --- a/src/simulscene.cpp +++ b/src/simulscene.cpp @@ -25,6 +25,7 @@ #include #include "graphicsellipseitem.h" #include "homoefielditem.h" +#include "homobfielditem.h" #include #include #include @@ -41,8 +42,12 @@ SimulScene::SimulScene ( QObject* parent ) : QGraphicsScene ( parent ) { setSteps(1000); //setMeterPerPx(1/1000.0); setMeterPerPx(1); + currHomoEfieldInsertItem = 0; currHomoEfieldEditItem = 0; + currHomoBfieldInsertItem = 0; + currHomoBfieldEditItem = 0; + createResizeRects(); addLine(0,-298,0,298,QPen(Qt::green, 1, Qt::SolidLine) )->setCacheMode(QGraphicsItem::DeviceCoordinateCache); @@ -104,6 +109,12 @@ void SimulScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) { addItem(currHomoEfieldInsertItem); QApplication::setOverrideCursor(QCursor(Qt::SizeFDiagCursor)); break; + case HomoBFieldItemInsert: + if (mouseEvent->button() != Qt::LeftButton) break; //benutze nur linke maustaste + currHomoBfieldInsertItem = new HomoBFieldItem(QRectF(mouseEvent->scenePos(),mouseEvent->scenePos())); + addItem(currHomoBfieldInsertItem); + QApplication::setOverrideCursor(QCursor(Qt::SizeFDiagCursor)); + break; default: if (itemAt(mouseEvent->scenePos())->data(0) == ResizeRectItem && mouseEvent->button()==Qt::LeftButton) { pressedResizeItem = itemAt(mouseEvent->scenePos()); @@ -111,6 +122,10 @@ void SimulScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) { currHomoEfieldEditItem = qgraphicsitem_cast(selectedItems().first()); QApplication::setOverrideCursor(pressedResizeItem->cursor()); } + else if (selectedItems().first()->type() == HomoBFieldItem::Type) { + currHomoBfieldEditItem = qgraphicsitem_cast(selectedItems().first()); + QApplication::setOverrideCursor(pressedResizeItem->cursor()); + } } else { @@ -135,6 +150,19 @@ void SimulScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent) { } } + else if (currHomoBfieldInsertItem != 0) { + if (myMode == HomoBFieldItemInsert) { + QPointF point(currHomoBfieldInsertItem->getRectF().x(), currHomoBfieldInsertItem->getRectF().y()); + update(currHomoBfieldInsertItem->getRectF()); + if(point.x() <= mouseEvent->scenePos().x() && point.y() <= mouseEvent->scenePos().y()) { + QRectF rect(point,mouseEvent->scenePos()); + currHomoBfieldInsertItem->setRectF(rect); + //update(QRectF(point,mouseEvent->lastScenePos())); + + } + + } + } else if (currHomoEfieldEditItem != 0 ) { QGraphicsRectItem *pressedRectItem = qgraphicsitem_cast(pressedResizeItem); @@ -151,6 +179,23 @@ void SimulScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent) { //resize rechtecke mitverschieben --> macht jetzt schon das Widget //if(mouseEvent->scenePos() != mouseEvent->lastScenePos()) displayResizeRects(true); + } + else if (currHomoBfieldEditItem != 0 ) { + + QGraphicsRectItem *pressedRectItem = qgraphicsitem_cast(pressedResizeItem); + QRectF currRect = currHomoBfieldEditItem->getRectF(); + QPointF newPos = currHomoBfieldEditItem->pos(); + + calculateItemResize(mouseEvent,pressedRectItem,currRect,newPos,HomoBFieldItem::MinimumWidth,HomoBFieldItem::MinimumHeight); + + //aenderungen uebernehmen + currHomoBfieldEditItem->setPos(newPos); + if (currRect != currHomoBfieldEditItem->getRectF()) { + currHomoBfieldEditItem->setRectF(currRect); + } + //resize rechtecke mitverschieben --> macht jetzt schon das Widget + //if(mouseEvent->scenePos() != mouseEvent->lastScenePos()) displayResizeRects(true); + } else { QGraphicsScene::mouseMoveEvent(mouseEvent); @@ -197,14 +242,55 @@ void SimulScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent) { update(); //moegliche darstellungsprobleme beseitigen QApplication::restoreOverrideCursor(); } + else if (currHomoBfieldInsertItem != 0 && myMode == HomoBFieldItemInsert) { + if (currHomoBfieldInsertItem->getRectF().width() < HomoBFieldItem::MinimumWidth || currHomoBfieldInsertItem->getRectF().height() setVisible(false); //ausblenden, damit sich nix verschiebt + QRectF rect (currHomoBfieldInsertItem->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); + currHomoBfieldInsertItem->setRectF(rect); + currHomoBfieldInsertItem->setPos(posPoint); + currHomoBfieldInsertItem->setVisible(true); //und wieder einblenden + + + setSceneMode(FieldItemEdit); + //das neue item auswaehlen + clearSelection(); + currHomoBfieldInsertItem->setSelected(true); + + //die resize items aus und einblenden bei rotation + connect( currHomoBfieldInsertItem, SIGNAL(rotationChanged()), this, SLOT(displayResizeRects())); + //bei groesenanderung und verschieben resizerects mitverschieben + connect( currHomoBfieldInsertItem, SIGNAL(heightChanged(double)), this, SLOT(moveResizeRects())); + connect( currHomoBfieldInsertItem, SIGNAL(widthChanged(double)), this, SLOT(moveResizeRects())); + connect( currHomoBfieldInsertItem, SIGNAL(ScenePosChanged(QPointF)), this, SLOT(moveResizeRects())); + //item ueber sceneChange informieren + connect(this,SIGNAL(changed(QList)),currHomoBfieldInsertItem,SLOT(handleSceneChange(QList))); + } + update(); //moegliche darstellungsprobleme beseitigen + QApplication::restoreOverrideCursor(); + } else if (currHomoEfieldEditItem != 0) { update(); QApplication::restoreOverrideCursor(); - + } + else if (currHomoBfieldEditItem != 0) { + update(); + QApplication::restoreOverrideCursor(); } pressedResizeItem = 0; currHomoEfieldInsertItem = 0; + currHomoBfieldInsertItem = 0; currHomoEfieldEditItem = 0; + currHomoBfieldEditItem = 0; QGraphicsScene::mouseReleaseEvent(mouseEvent); } diff --git a/src/simulscene.h b/src/simulscene.h index 5c71502..13ed994 100644 --- a/src/simulscene.h +++ b/src/simulscene.h @@ -24,6 +24,7 @@ class QTimeLine; class HomoEFieldItem; +class HomoBFieldItem; class QGraphicsRectItem; class QGraphicsItemGroup; class GraphicsEllipseItem; @@ -35,7 +36,7 @@ class QGraphicsItemAnimation; class SimulScene : public QGraphicsScene { Q_OBJECT public: - enum SceneMode {HomoEFieldItemInsert, FieldItemEdit }; + enum SceneMode {HomoEFieldItemInsert, FieldItemEdit, HomoBFieldItemInsert }; enum ItemType {ResizeRectItem}; SimulScene ( QObject* parent = 0); qreal getHighestZIndexVisible(); //hoechsten z-index der sichtbaren items ausgeben @@ -62,10 +63,8 @@ class SimulScene : public QGraphicsScene { void startCalculation(); void setSteps(int steps); - void setMeterPerPx ( double theValue ); - - - double getMeterPerPx() const; + void setMeterPerPx ( double theValue ); + double getMeterPerPx() const; private slots: void displayResizeRects(bool move = false); @@ -87,8 +86,13 @@ class SimulScene : public QGraphicsScene { int steps; ///ein Pixel entspricht so viel meter double meterPerPx; + HomoEFieldItem *currHomoEfieldInsertItem; //Aktuell erstelltes Item HomoEFieldItem *currHomoEfieldEditItem; + + HomoBFieldItem *currHomoBfieldInsertItem; //Aktuell erstelltes Item + HomoBFieldItem *currHomoBfieldEditItem; + QGraphicsItem *pressedResizeItem; GraphicsEllipseItem *ellipse1;