HomoBField einfuegbar in die scene und editierbar

git-svn-id: http://svn.lsim.tuxzone.org/trunk@5 4bec179b-ab65-46ed-a5f8-55b8b5c735d0
This commit is contained in:
catdog2
2008-10-14 19:31:02 +00:00
parent c00072302f
commit ffdd1677f1
7 changed files with 117 additions and 8 deletions

View File

@@ -19,6 +19,7 @@
***************************************************************************/ ***************************************************************************/
#include "fielditem.h" #include "fielditem.h"
#include "homoefielditem.h" #include "homoefielditem.h"
#include "homobfielditem.h"
#include <QDebug> #include <QDebug>
FieldItem::FieldItem() FieldItem::FieldItem()
@@ -41,6 +42,7 @@ bool FieldItem::isFieldItem(QGraphicsItem *item) {
QList<int> fieldItemTypes; QList<int> fieldItemTypes;
// ---- Definiert die FieldItem typen // ---- Definiert die FieldItem typen
fieldItemTypes << HomoEFieldItem::Type; fieldItemTypes << HomoEFieldItem::Type;
fieldItemTypes << HomoBFieldItem::Type;
// ---- // ----
for (int i=0; i<fieldItemTypes.count();++i) { for (int i=0; i<fieldItemTypes.count();++i) {
if (item->type() == fieldItemTypes.at(i)) { if (item->type() == fieldItemTypes.at(i)) {

View File

@@ -20,8 +20,10 @@
#include "homobfielditem.h" #include "homobfielditem.h"
#include <cmath> #include <cmath>
#include <QPainter> #include <QPainter>
#include <QWidget>
HomoBFieldItem::HomoBFieldItem(QRectF sizeRect): FieldItem() { HomoBFieldItem::HomoBFieldItem(QRectF sizeRect): FieldItem() {
setRectF(sizeRect);
setFieldLineDistance(10); setFieldLineDistance(10);
setFlag(ItemIsMovable); setFlag(ItemIsMovable);
setFlag(ItemIsSelectable); setFlag(ItemIsSelectable);
@@ -46,7 +48,7 @@ QRectF HomoBFieldItem::getRectF() const
} }
void HomoBFieldItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { void HomoBFieldItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) {
Qt::GlobalColor linecolor = Qt::blue; Qt::GlobalColor linecolor = Qt::red;
painter->setPen(linecolor); painter->setPen(linecolor);
if (isSelected()) painter->setBrush(Qt::Dense6Pattern); //selection deutlich machen if (isSelected()) painter->setBrush(Qt::Dense6Pattern); //selection deutlich machen
painter->drawRect(sizeRect); painter->drawRect(sizeRect);
@@ -105,3 +107,7 @@ double HomoBFieldItem::getOuterPenWidth() const {
void HomoBFieldItem::setOuterPenWidth ( double theValue ) { void HomoBFieldItem::setOuterPenWidth ( double theValue ) {
outerPenWidth = theValue; outerPenWidth = theValue;
} }
QWidget* HomoBFieldItem::getDockWidget() const {
return new QWidget();
}

View File

@@ -25,6 +25,7 @@
/** /**
@author Peter Dahlberg <pdahlberg@gmail.com> @author Peter Dahlberg <pdahlberg@gmail.com>
*/ */
class QWidget;
class HomoBFieldItem : public FieldItem { class HomoBFieldItem : public FieldItem {
Q_OBJECT Q_OBJECT
public: public:
@@ -42,6 +43,7 @@ class HomoBFieldItem : public FieldItem {
int type() const; int type() const;
int getFieldLineDistance() const; int getFieldLineDistance() const;
QWidget* getDockWidget() const;
double getOuterPenWidth() const; double getOuterPenWidth() const;
public slots: public slots:

View File

@@ -98,9 +98,15 @@ void lsim::createActions() {
acts.insertEFieldItemAct->setCheckable(true); acts.insertEFieldItemAct->setCheckable(true);
acts.insertEFieldItemAct->setData(QVariant(SimulScene::HomoEFieldItemInsert)); 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 = new QActionGroup(this);
modeChangeActGroup->addAction(acts.itemEditModeAct); modeChangeActGroup->addAction(acts.itemEditModeAct);
modeChangeActGroup->addAction(acts.insertEFieldItemAct); modeChangeActGroup->addAction(acts.insertEFieldItemAct);
modeChangeActGroup->addAction(acts.insertBFieldItemAct);
connect (modeChangeActGroup, SIGNAL (triggered(QAction*)), this, SLOT (actModeSwitcher(QAction*))); connect (modeChangeActGroup, SIGNAL (triggered(QAction*)), this, SLOT (actModeSwitcher(QAction*)));
connect (simulscene, SIGNAL(sceneModeChanged(int)) , this, SLOT(setSceneMode(int))); connect (simulscene, SIGNAL(sceneModeChanged(int)) , this, SLOT(setSceneMode(int)));
@@ -133,6 +139,7 @@ void lsim::createToolBars() {
editToolBar->addSeparator(); editToolBar->addSeparator();
editToolBar->addAction(acts.itemEditModeAct); editToolBar->addAction(acts.itemEditModeAct);
editToolBar->addAction(acts.insertEFieldItemAct); editToolBar->addAction(acts.insertEFieldItemAct);
editToolBar->addAction(acts.insertBFieldItemAct);
} }
void lsim::createStatusBar() { void lsim::createStatusBar() {
@@ -214,10 +221,11 @@ void lsim::createDocks() {
void lsim::actModeSwitcher(QAction *action) { void lsim::actModeSwitcher(QAction *action) {
if (action->data().toInt() == SimulScene::FieldItemEdit) simulscene->setSceneMode(SimulScene::FieldItemEdit); 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::HomoEFieldItemInsert) simulscene->setSceneMode(SimulScene::HomoEFieldItemInsert);
if (action->data().toInt() == SimulScene::HomoBFieldItemInsert) simulscene->setSceneMode(SimulScene::HomoBFieldItemInsert);
} }
void lsim::setSceneMode(int mode) { 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) { if(modeChangeActGroup->actions().at(i)->data().toInt() == mode) {
modeChangeActGroup->actions().at(i)->setChecked(true); modeChangeActGroup->actions().at(i)->setChecked(true);
} }

View File

@@ -82,6 +82,7 @@ class lsim: public QMainWindow {
QAction *itemEditModeAct; QAction *itemEditModeAct;
QAction *insertEFieldItemAct; QAction *insertEFieldItemAct;
QAction *insertBFieldItemAct;
}; };
Actions acts; Actions acts;

View File

@@ -25,6 +25,7 @@
#include <cmath> #include <cmath>
#include "graphicsellipseitem.h" #include "graphicsellipseitem.h"
#include "homoefielditem.h" #include "homoefielditem.h"
#include "homobfielditem.h"
#include <QRectF> #include <QRectF>
#include <QGraphicsSceneMouseEvent> #include <QGraphicsSceneMouseEvent>
#include <QtDebug> #include <QtDebug>
@@ -41,8 +42,12 @@ SimulScene::SimulScene ( QObject* parent ) : QGraphicsScene ( parent ) {
setSteps(1000); setSteps(1000);
//setMeterPerPx(1/1000.0); //setMeterPerPx(1/1000.0);
setMeterPerPx(1); setMeterPerPx(1);
currHomoEfieldInsertItem = 0; currHomoEfieldInsertItem = 0;
currHomoEfieldEditItem = 0; currHomoEfieldEditItem = 0;
currHomoBfieldInsertItem = 0;
currHomoBfieldEditItem = 0;
createResizeRects(); createResizeRects();
addLine(0,-298,0,298,QPen(Qt::green, 1, Qt::SolidLine) )->setCacheMode(QGraphicsItem::DeviceCoordinateCache); 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); addItem(currHomoEfieldInsertItem);
QApplication::setOverrideCursor(QCursor(Qt::SizeFDiagCursor)); QApplication::setOverrideCursor(QCursor(Qt::SizeFDiagCursor));
break; 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: default:
if (itemAt(mouseEvent->scenePos())->data(0) == ResizeRectItem && mouseEvent->button()==Qt::LeftButton) { if (itemAt(mouseEvent->scenePos())->data(0) == ResizeRectItem && mouseEvent->button()==Qt::LeftButton) {
pressedResizeItem = itemAt(mouseEvent->scenePos()); pressedResizeItem = itemAt(mouseEvent->scenePos());
@@ -111,6 +122,10 @@ void SimulScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) {
currHomoEfieldEditItem = qgraphicsitem_cast<HomoEFieldItem *>(selectedItems().first()); currHomoEfieldEditItem = qgraphicsitem_cast<HomoEFieldItem *>(selectedItems().first());
QApplication::setOverrideCursor(pressedResizeItem->cursor()); QApplication::setOverrideCursor(pressedResizeItem->cursor());
} }
else if (selectedItems().first()->type() == HomoBFieldItem::Type) {
currHomoBfieldEditItem = qgraphicsitem_cast<HomoBFieldItem *>(selectedItems().first());
QApplication::setOverrideCursor(pressedResizeItem->cursor());
}
} }
else { 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 ) { else if (currHomoEfieldEditItem != 0 ) {
QGraphicsRectItem *pressedRectItem = qgraphicsitem_cast<QGraphicsRectItem *>(pressedResizeItem); QGraphicsRectItem *pressedRectItem = qgraphicsitem_cast<QGraphicsRectItem *>(pressedResizeItem);
@@ -151,6 +179,23 @@ void SimulScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent) {
//resize rechtecke mitverschieben --> macht jetzt schon das Widget //resize rechtecke mitverschieben --> macht jetzt schon das Widget
//if(mouseEvent->scenePos() != mouseEvent->lastScenePos()) displayResizeRects(true); //if(mouseEvent->scenePos() != mouseEvent->lastScenePos()) displayResizeRects(true);
}
else if (currHomoBfieldEditItem != 0 ) {
QGraphicsRectItem *pressedRectItem = qgraphicsitem_cast<QGraphicsRectItem *>(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 { else {
QGraphicsScene::mouseMoveEvent(mouseEvent); QGraphicsScene::mouseMoveEvent(mouseEvent);
@@ -197,14 +242,55 @@ void SimulScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent) {
update(); //moegliche darstellungsprobleme beseitigen update(); //moegliche darstellungsprobleme beseitigen
QApplication::restoreOverrideCursor(); QApplication::restoreOverrideCursor();
} }
else if (currHomoBfieldInsertItem != 0 && myMode == HomoBFieldItemInsert) {
if (currHomoBfieldInsertItem->getRectF().width() < HomoBFieldItem::MinimumWidth || currHomoBfieldInsertItem->getRectF().height() <HomoBFieldItem::MinimumHeight ) {
//removeItem(currHomoEfieldInsertItem); //segmention fault in kombination mit delete?
delete currHomoBfieldInsertItem; //zu kleines feld loeschen
}
else {
//setze Startpunkt des rechtecks auf 0,0, damit pos() richtig funktioniert
currHomoBfieldInsertItem->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<QRectF>)),currHomoBfieldInsertItem,SLOT(handleSceneChange(QList<QRectF>)));
}
update(); //moegliche darstellungsprobleme beseitigen
QApplication::restoreOverrideCursor();
}
else if (currHomoEfieldEditItem != 0) { else if (currHomoEfieldEditItem != 0) {
update(); update();
QApplication::restoreOverrideCursor(); QApplication::restoreOverrideCursor();
}
else if (currHomoBfieldEditItem != 0) {
update();
QApplication::restoreOverrideCursor();
} }
pressedResizeItem = 0; pressedResizeItem = 0;
currHomoEfieldInsertItem = 0; currHomoEfieldInsertItem = 0;
currHomoBfieldInsertItem = 0;
currHomoEfieldEditItem = 0; currHomoEfieldEditItem = 0;
currHomoBfieldEditItem = 0;
QGraphicsScene::mouseReleaseEvent(mouseEvent); QGraphicsScene::mouseReleaseEvent(mouseEvent);
} }

View File

@@ -24,6 +24,7 @@
class QTimeLine; class QTimeLine;
class HomoEFieldItem; class HomoEFieldItem;
class HomoBFieldItem;
class QGraphicsRectItem; class QGraphicsRectItem;
class QGraphicsItemGroup; class QGraphicsItemGroup;
class GraphicsEllipseItem; class GraphicsEllipseItem;
@@ -35,7 +36,7 @@ class QGraphicsItemAnimation;
class SimulScene : public QGraphicsScene { class SimulScene : public QGraphicsScene {
Q_OBJECT Q_OBJECT
public: public:
enum SceneMode {HomoEFieldItemInsert, FieldItemEdit }; enum SceneMode {HomoEFieldItemInsert, FieldItemEdit, HomoBFieldItemInsert };
enum ItemType {ResizeRectItem}; enum ItemType {ResizeRectItem};
SimulScene ( QObject* parent = 0); SimulScene ( QObject* parent = 0);
qreal getHighestZIndexVisible(); //hoechsten z-index der sichtbaren items ausgeben qreal getHighestZIndexVisible(); //hoechsten z-index der sichtbaren items ausgeben
@@ -63,8 +64,6 @@ class SimulScene : public QGraphicsScene {
void setSteps(int steps); void setSteps(int steps);
void setMeterPerPx ( double theValue ); void setMeterPerPx ( double theValue );
double getMeterPerPx() const; double getMeterPerPx() const;
private slots: private slots:
@@ -87,8 +86,13 @@ class SimulScene : public QGraphicsScene {
int steps; int steps;
///ein Pixel entspricht so viel meter ///ein Pixel entspricht so viel meter
double meterPerPx; double meterPerPx;
HomoEFieldItem *currHomoEfieldInsertItem; //Aktuell erstelltes Item HomoEFieldItem *currHomoEfieldInsertItem; //Aktuell erstelltes Item
HomoEFieldItem *currHomoEfieldEditItem; HomoEFieldItem *currHomoEfieldEditItem;
HomoBFieldItem *currHomoBfieldInsertItem; //Aktuell erstelltes Item
HomoBFieldItem *currHomoBfieldEditItem;
QGraphicsItem *pressedResizeItem; QGraphicsItem *pressedResizeItem;
GraphicsEllipseItem *ellipse1; GraphicsEllipseItem *ellipse1;