Files
lsim/src/lsim.cpp
catdog2 ffdd1677f1 HomoBField einfuegbar in die scene und editierbar
git-svn-id: http://svn.lsim.tuxzone.org/trunk@5 4bec179b-ab65-46ed-a5f8-55b8b5c735d0
2008-10-14 19:31:02 +00:00

281 lines
9.8 KiB
C++

/***************************************************************************
* Copyright (C) 2008 by Peter Dahlberg *
* pdahlberg@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include <QtGui>
#include "lsim.h"
#include "simulscene.h"
#include <QDockWidget>
#include <QPushButton>
#include <QVBoxLayout>
#include <QActionGroup>
#include <QDoubleSpinBox>
#include <QListView>
#include <QStringListModel>
#include <QLabel>
#include "expdoublespinbox.h"
#include "homoefieldwidget.h"
lsim::lsim() {
gview = new GraphicsView();
setCentralWidget (gview);
createScene();
createActions();
simulscene->setSceneMode(SimulScene::FieldItemEdit);
createMenus();
createToolBars();
createStatusBar();
createDocks();
}
void lsim::closeEvent (QCloseEvent *event) {
//event->ignore();
}
void lsim::about() {
QMessageBox::about (this, tr ("\334ber lsim"),
tr ("Ein Proramm, dass noch fast gar nix kann usw..."));
}
void lsim::createActions() {
acts.aboutAct = new QAction (tr ("&About"), this);
acts.aboutAct->setStatusTip (tr ("Show the application's About box"));
connect (acts.aboutAct, SIGNAL (triggered()), this, SLOT (about()));
acts.aboutQtAct = new QAction (tr ("\334ber &Qt"), this);
acts.aboutQtAct->setStatusTip (tr ("Show the Qt library's About box"));
connect (acts.aboutQtAct, SIGNAL (triggered()), qApp, SLOT (aboutQt()));
acts.oglEnable = new QAction (tr ("Opengl ein"), this);
acts.oglEnable->setStatusTip (tr ("OGL ein"));
connect (acts.oglEnable, SIGNAL (triggered()), gview, SLOT (enableOGLViewport()));
acts.oglDisable = new QAction (tr ("Opengl aus"), this);
acts.oglDisable->setStatusTip (tr ("OGL aus"));
connect (acts.oglDisable, SIGNAL (triggered()), gview, SLOT (disableOGLViewport()));
acts.timerStart = new QAction (tr ("Timer Start"), this);
acts.timerStart->setStatusTip (tr ("Timer starten"));
connect (acts.timerStart, SIGNAL (triggered()), simulscene, SLOT (startTimer()));
acts.exitAct = new QAction (tr ("Beenden"), this);
acts.exitAct->setStatusTip (tr ("Die Anwendung beenden"));
connect (acts.exitAct, SIGNAL (triggered()), qApp, SLOT (quit()));
//Edit, insert, Modechange
acts.itemEditModeAct = new QAction (tr ("Edit"), this);
acts.itemEditModeAct->setStatusTip (tr ("Editiermode"));
acts.itemEditModeAct->setCheckable(true);
acts.itemEditModeAct->setData(QVariant(SimulScene::FieldItemEdit));
acts.insertEFieldItemAct = new QAction (tr ("E-Feld"), this);
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)));
}
void lsim::createMenus() {
fileMenu = menuBar()->addMenu("Datei");
fileMenu->addAction(acts.oglEnable);
fileMenu->addAction(acts.oglDisable);
fileMenu->addSeparator();
fileMenu->addAction(acts.exitAct);
menuBar()->addMenu("Bearbeiten");
menuBar()->addMenu("Ansicht");
menuBar()->addMenu("Einstellungen");
helpMenu = menuBar()->addMenu (tr ("&Help"));
helpMenu->addAction (acts.aboutAct);
helpMenu->addAction (acts.aboutQtAct);
}
void lsim::createToolBars() {
fileToolBar = addToolBar (tr ("File"));
fileToolBar->addAction(acts.oglEnable);
fileToolBar->addAction(acts.oglDisable);
editToolBar = addToolBar (tr ("Edit"));
editToolBar->addAction(acts.timerStart);
editToolBar->addSeparator();
editToolBar->addAction(acts.itemEditModeAct);
editToolBar->addAction(acts.insertEFieldItemAct);
editToolBar->addAction(acts.insertBFieldItemAct);
}
void lsim::createStatusBar() {
statusBar()->showMessage (tr ("Ready"));
}
void lsim::createScene() {
simulscene = new SimulScene();
gview->setScene(simulscene);
}
void lsim::createDocks() {
QPushButton *button1 = new QPushButton("Loeschen");
QPushButton *button2 = new QPushButton("calculate");
ExpDoubleSpinBox *time_step_box = new ExpDoubleSpinBox;
time_step_box->setRange(-pow(10,33), pow(10,33));
time_step_box->setDecimals(30);
time_step_box->setKeyboardTracking(false);
time_step_box->setValue(simulscene->getTimePerStep());
connect(time_step_box, SIGNAL(valueChanged(double)),simulscene, SLOT(setTimePerStep(double)));
connect(simulscene, SIGNAL(timePerStepChanged(double)),time_step_box, SLOT(setValue( double )));
ExpDoubleSpinBox *meter_per_px_box = new ExpDoubleSpinBox;
meter_per_px_box->setRange(-pow(10,33), pow(10,33));
meter_per_px_box->setDecimals(30);
meter_per_px_box->setKeyboardTracking(false);
meter_per_px_box->setValue(simulscene->getMeterPerPx());
connect(meter_per_px_box, SIGNAL(valueChanged(double)),simulscene, SLOT(setMeterPerPx(double)));
connect(simulscene, SIGNAL(meterPerPxChanged(double)),meter_per_px_box, SLOT(setValue( double )));
QSlider *slider1 = new QSlider();
slider1->setMinimum(0);
slider1->setMaximum(360);
connect (button1, SIGNAL(clicked()) , simulscene, SLOT(deleteSelectedFieldItems()));
connect (button2, SIGNAL(clicked()) , simulscene, SLOT(startCalculation()));
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(button1);
layout->addWidget(button2);
layout->addWidget(slider1);
layout->addWidget(time_step_box);
layout->addWidget(meter_per_px_box);
QWidget *widget2 = new QWidget;
widget2->setLayout(layout);
//HomoEFieldWidget *eFieldOpt = new HomoEFieldWidget(0,0,qgraphicsitem_cast<HomoEFieldItem *>(simulscene->items().first()));
//HomoEFieldItem *homoitem = new HomoEFieldItem(QRectF(44,44,99,99));
fieldItemEditDock = new QDockWidget(tr("Feldeinstellungen"), this);
fieldItemEditDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea);
fieldItemEditDock->setWidget(new QWidget);
addDockWidget(Qt::LeftDockWidgetArea, fieldItemEditDock);
connect (simulscene, SIGNAL(selectionChanged ()) , this, SLOT(updateDockFieldWidget()));
updateDockFieldWidget();
dock_2 = new QDockWidget(tr("Ein Testdock 2"), this);
dock_2->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea);
dock_2->setWidget((widget2));
addDockWidget(Qt::LeftDockWidgetArea, dock_2);
probeItemDock = new QDockWidget(tr("Probleladung"), this);
probeItemDock->setWidget(simulscene->getProbeDockWidget());
addDockWidget(Qt::LeftDockWidgetArea, probeItemDock);
tabifyDockWidget(dock_2,fieldItemEditDock);
tabifyDockWidget(fieldItemEditDock, probeItemDock);
setDockOptions(QMainWindow::VerticalTabs);
}
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){ //nur das aktuelle checked setzen
if(modeChangeActGroup->actions().at(i)->data().toInt() == mode) {
modeChangeActGroup->actions().at(i)->setChecked(true);
}
else {
modeChangeActGroup->actions().at(i)->setChecked(false);
}
}
/*
//Problem mit resizeRects, warum auch immer :(
//je nach sceneMode den cursor eintellen
switch (mode) {
case SimulScene::HomoEFieldItemInsert:
gview->setCursor(Qt::CrossCursor);
break;
default:
gview->unsetCursor();
}
*/
}
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;
if(simulscene->selectedItems().count() == 1) {
QGraphicsItem *currItem = simulscene->selectedItems().first();
if (FieldItem::isFieldItem(currItem)) {
FieldItem *currFieldItem = qgraphicsitem_cast<FieldItem *>(currItem);
currDockWidget = currFieldItem->getDockWidget();
}
}
fieldItemEditDock->setWidget(currDockWidget);
}