281 lines
9.8 KiB
C++
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);
|
|
}
|