/*
* Copyright (C) 2008,2009,2010 Thorsten Liebig (Thorsten.Liebig@gmx.de)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation, either version 3 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see .
*/
#include
#include "QCSPropEditor.h"
#include "QCSXCAD_Global.h"
#include "iostream"
#include "time.h"
#include "CSPropUnknown.h"
#include "CSPropMaterial.h"
#include "CSPropDispersiveMaterial.h"
#include "CSPropLorentzMaterial.h"
#include "CSPropDiscMaterial.h"
#include "CSPropLumpedElement.h"
#include "CSPropMetal.h"
#include "CSPropConductingSheet.h"
#include "CSPropExcitation.h"
#include "CSPropProbeBox.h"
#include "CSPropDumpBox.h"
#include "CSPropResBox.h"
QColorPushButton::QColorPushButton(const QString & text, QWidget * parent ) : QPushButton(text,parent)
{
setFlat(true);
setAutoFillBackground(true);
QObject::connect(this,SIGNAL(clicked()),this,SLOT(ChangeColor()));
//Color.setAlpha(255);
RGBa c;
c.R=1 + (rand()%255);
c.G=1 + (rand()%255);
c.B=1 + (rand()%255);
SetColor(c);
}
QColorPushButton::~QColorPushButton()
{
}
void QColorPushButton::SetColor(RGBa c)
{
QPalette palette;
Color=QColor(c.R,c.G,c.B,c.a);
palette.setColor(QPalette::Button,QColor(c.R,c.G,c.B));
if (c.R+c.G+c.B>(128*3)) palette.setColor(QPalette::ButtonText,QColor(0,0,0));
else palette.setColor(QPalette::ButtonText,QColor(255,255,255));
setPalette(palette);
}
RGBa QColorPushButton::GetColor()
{
RGBa c;
c.R=Color.red();
c.G=Color.green();
c.B=Color.blue();
c.a=Color.alpha();
return c;
}
void QColorPushButton::ChangeColor()
{
QColor newColor=QColorDialog::getColor(Color,this);
if (newColor.isValid())
{
int alpha=Color.alpha();
Color=newColor;
Color.setAlpha(alpha);
QPalette palette;
palette.setColor(QPalette::Button,newColor);
if (Color.red()+Color.blue()+Color.green()>(128*3)) palette.setColor(QPalette::ButtonText,QColor(0,0,0));
else palette.setColor(QPalette::ButtonText,QColor(255,255,255));
setPalette(palette);
}
}
QCSPropEditor::QCSPropEditor(ContinuousStructure *CS, CSProperties* prop, int iSimMode, QWidget* parent) : QDialog(parent)
{
clCS=CS;
clProp=prop;
saveProp=clProp;
m_SimMode=iSimMode;
MainLayout = new QVBoxLayout();
setWindowTitle(tr("Property Editor"));
MainLayout->addWidget(BuildGeneral());
GetValues();
if (propGB!=NULL)
{
MainLayout->addWidget(propGB);
}
MainLayout->addStretch();
MainLayout->addLayout(BuildButtons());
setLayout(MainLayout);
setAttribute(Qt::WA_DeleteOnClose, true);
setWindowModality(Qt::ApplicationModal);
}
QCSPropertyGroupBox* QCSPropEditor::BuildPropGroupBox(CSProperties* clProp)
{
QCSPropertyGroupBox* propGB=NULL;
switch (clProp->GetType())
{
case CSProperties::MATERIAL:
propGB = new QCSPropMaterialGB(clProp->ToMaterial());
break;
case CSProperties::METAL:
break;
case CSProperties::EXCITATION:
propGB = new QCSPropExcitationGB(clProp->ToExcitation());
break;
case CSProperties::PROBEBOX:
propGB = new QCSPropProbeBoxGB(clProp->ToProbeBox());
break;
case CSProperties::DUMPBOX:
propGB = new QCSPropDumpBoxGB(clProp->ToDumpBox(),m_SimMode);
break;
case CSProperties::RESBOX:
propGB = new QCSPropResBoxGB(clProp->ToResBox());
break;
case CSProperties::UNKNOWN:
propGB = new QCSPropUnknownGB(clProp->ToUnknown());
break;
default:
return NULL;
break;
};
return propGB;
}
void QCSPropEditor::Reset()
{
GetValues();
if (propGB!=NULL) propGB->GetValues();
}
void QCSPropEditor::Save()
{
SetValues();
if (propGB!=NULL) propGB->SetValues();
accept();
}
void QCSPropEditor::Cancel()
{
reject();
}
void QCSPropEditor::ChangeType(int item)
{
bool ok=false;
int type = TypeCB->itemData(item).toInt(&ok);
if (ok==false) return;
if (type==clProp->GetType()) return;
//if (propGB!=NULL) MainLayout->removeWidget(propGB);
//if (propGB!=savePropGB) delete propGB;
if (clProp!=saveProp) delete clProp;
delete propGB;propGB=NULL;
if (type==saveProp->GetType())
{
clProp=saveProp;
}
else switch (type)
{
case CSProperties::MATERIAL:
clProp = new CSPropMaterial(saveProp);
break;
case CSProperties::METAL:
clProp = new CSPropMetal(saveProp);
break;
case CSProperties::EXCITATION:
clProp = new CSPropExcitation(saveProp);
break;
case CSProperties::PROBEBOX:
clProp = new CSPropProbeBox(saveProp);
break;
case CSProperties::DUMPBOX:
clProp = new CSPropDumpBox(saveProp);
break;
case CSProperties::RESBOX:
clProp = new CSPropResBox(saveProp);
break;
default:
clProp = new CSPropUnknown(saveProp);
break;
};
propGB=BuildPropGroupBox(clProp);
if (propGB!=NULL) MainLayout->insertWidget(1,propGB);
setLayout(MainLayout);
}
void QCSPropEditor::Fill2EdgeColor()
{
ECButton->SetColor(FCButton->GetColor());
}
void QCSPropEditor::Edge2FillColor()
{
FCButton->SetColor(ECButton->GetColor());
}
QGroupBox* QCSPropEditor::BuildGeneral()
{
QGroupBox* box= new QGroupBox("General");
QGridLayout* grid = new QGridLayout();
Name = new QLineEdit(QString::fromUtf8(clProp->GetName().c_str()));
Name->setEnabled(QCSX_Settings.GetEdit());
grid->addWidget(new QLabel(tr("Name: ")),0,0);
grid->addWidget(Name,0,1);
grid->addWidget(new QLabel(QString(tr("ID: %1")).arg(clProp->GetID())),0,2);
grid->addWidget(new QLabel(tr("Type: ")),1,0);
TypeCB = new QComboBox();
TypeCB->addItem(tr("Unknown"),QVariant(CSProperties::UNKNOWN));
TypeCB->addItem(tr("Material"),QVariant(CSProperties::MATERIAL));
TypeCB->addItem(tr("Metal"),QVariant(CSProperties::METAL));
TypeCB->addItem(tr("Excitation"),QVariant(CSProperties::EXCITATION));
TypeCB->addItem(tr("Probe Box"),QVariant(CSProperties::PROBEBOX));
TypeCB->addItem(tr("Res Box"),QVariant(CSProperties::RESBOX));
TypeCB->addItem(tr("Dump Box"),QVariant(CSProperties::DUMPBOX));
TypeCB->setEnabled(QCSX_Settings.GetEdit());
grid->addWidget(TypeCB,1,1,1,2);
QObject::connect(TypeCB,SIGNAL(currentIndexChanged(int)),this,SLOT(ChangeType(int)));
QHBoxLayout* HLay = new QHBoxLayout();
HLay->addStretch(1);
FCButton = new QColorPushButton(tr("Change Fill-Color"));
FCButton->setFixedSize(100,50);
HLay->addWidget(FCButton);
QVBoxLayout* VLay = new QVBoxLayout();
QPushButton* F2EButton = new QPushButton("-->");
F2EButton->setFixedSize(30,20);
QObject::connect(F2EButton,SIGNAL(clicked()),this,SLOT(Fill2EdgeColor()));
QPushButton* E2FButton = new QPushButton("<--");
E2FButton->setFixedSize(30,20);
QObject::connect(E2FButton,SIGNAL(clicked()),this,SLOT(Edge2FillColor()));
VLay->addWidget(F2EButton);
VLay->addWidget(E2FButton);
HLay->addLayout(VLay);
ECButton = new QColorPushButton(tr("Change Edge-Color"));
ECButton->setFixedSize(100,50);
HLay->addWidget(ECButton);
HLay->addStretch(1);
grid->addLayout(HLay,2,0,1,3);
box->setLayout(grid);
return box;
}
QLayout* QCSPropEditor::BuildButtons()
{
QHBoxLayout* lay = new QHBoxLayout();
QPushButton* ok = new QPushButton(tr("Ok"));
QObject::connect(ok,SIGNAL(clicked()),this,SLOT(Save()));
lay->addWidget(ok);
if (QCSX_Settings.GetEdit())
{
QPushButton* reset = new QPushButton(tr("Reset"));
QObject::connect(reset,SIGNAL(clicked()),this,SLOT(Reset()));
lay->addWidget(reset);
QPushButton* cancel = new QPushButton(tr("Cancel"));
QObject::connect(cancel,SIGNAL(clicked()),this,SLOT(Cancel()));
lay->addWidget(cancel);
}
lay->addStretch();
return lay;
}
void QCSPropEditor::GetValues()
{
if (clProp!=saveProp)
{
delete clProp;
delete propGB;
clProp=saveProp;
}
propGB = BuildPropGroupBox(clProp);
Name->setText(QString::fromUtf8(clProp->GetName().c_str()));
TypeCB->setCurrentIndex(GetIndexOfType());
FCButton->SetColor(clProp->GetFillColor());
ECButton->SetColor(clProp->GetEdgeColor());
}
void QCSPropEditor::SetValues()
{
//RGBa c;
clProp->SetFillColor(FCButton->GetColor());
clProp->SetEdgeColor(ECButton->GetColor());
clProp->SetName(Name->text().toLatin1().data());
if (saveProp!=clProp) clCS->ReplaceProperty(saveProp,clProp);
}
int QCSPropEditor::GetIndexOfType()
{
for (int i=0;icount();++i)
{
if (TypeCB->itemData(i).toInt()==clProp->GetType()) return i;
}
return 0;
}
/***************************QCSPropertyGroupBox**************************************/
QCSPropertyGroupBox::QCSPropertyGroupBox(QWidget *parent) : QGroupBox(parent)
{
}
QCSPropertyGroupBox::~QCSPropertyGroupBox()
{
}
void QCSPropertyGroupBox::SetValues()
{
}
void QCSPropertyGroupBox::GetValues()
{
}
/***************************QCSPropUnknownGB**************************************/
QCSPropUnknownGB::QCSPropUnknownGB(CSPropUnknown *prop, QWidget *parent) : QCSPropertyGroupBox(parent)
{
clProp=prop;
TypeName=QString(tr("Unknown"));
setTitle(tr("Unknown Property"));
QGridLayout* layout = new QGridLayout();
Property = new QLineEdit();
layout->addWidget(new QLabel(tr("Property: ")),0,0);
layout->addWidget(Property,0,1);
GetValues();
setLayout(layout);
}
QCSPropUnknownGB::~QCSPropUnknownGB()
{
}
void QCSPropUnknownGB::SetValues()
{
clProp->SetProperty(Property->text().toLatin1().data());
}
void QCSPropUnknownGB::GetValues()
{
Property->setText(clProp->GetProperty().c_str());
}
/***************************QCSPropMaterialGB**************************************/
QCSPropMaterialGB::QCSPropMaterialGB(CSPropMaterial *prop, QWidget *parent) : QCSPropertyGroupBox(parent)
{
clProp=prop;
TypeName=QString(tr("Material"));
setTitle(tr("Material Property"));
QGridLayout* layout = new QGridLayout();
GetValues();
setLayout(layout);
}
QCSPropMaterialGB::~QCSPropMaterialGB()
{
}
void QCSPropMaterialGB::SetValues()
{
}
void QCSPropMaterialGB::GetValues()
{
}
/***************************QCSPropExcitationGB**************************************/
QCSPropExcitationGB::QCSPropExcitationGB(CSPropExcitation *prop, QWidget *parent) : QCSPropertyGroupBox(parent)
{
clProp=prop;
TypeName=QString(tr("Excitation"));
setTitle(tr("Excitation Property"));
QGridLayout* layout = new QGridLayout();
Number = new QSpinBox();
Number->setRange(0,999);
Number->setEnabled(QCSX_Settings.GetEdit());
layout->addWidget(new QLabel(tr("Number: ")),0,0);
layout->addWidget(Number,0,1);
Type = new QComboBox();
Type->addItem(tr("Electric field (soft)"));
Type->addItem(tr("Electric field (hard)"));
Type->addItem(tr("Magnetic field (soft)"));
Type->addItem(tr("Magnetic field (hard)"));
Type->setEnabled(QCSX_Settings.GetEdit());
layout->addWidget(new QLabel(tr("Type: ")),0,2);
layout->addWidget(Type,0,3,1,3);
QObject::connect(Type,SIGNAL(currentIndexChanged(int)),this,SLOT(TypeChanged(int)));
layout->addWidget(new QLabel(tr("Excitation (X):")),1,0);
Excitation[0] = new QLineEdit();
layout->addWidget(Excitation[0],1,1);
layout->addWidget(new QLabel(tr("Excitation Y:")),1,2);
Excitation[1] = new QLineEdit();
layout->addWidget(Excitation[1],1,3);
layout->addWidget(new QLabel(tr("Excitation Z:")),1,4);
Excitation[2] = new QLineEdit();
layout->addWidget(Excitation[2],1,5);
layout->addWidget(new QLabel(tr("Analytic Fct (X): ")),2,0);
FctLine[0] = new QLineEdit();
layout->addWidget(FctLine[0],2,1,1,5);
layout->addWidget(new QLabel(tr("Analytic Fct (Y): ")),3,0);
FctLine[1] = new QLineEdit();
layout->addWidget(FctLine[1],3,1,1,5);
layout->addWidget(new QLabel(tr("Analytic Fct (Z): ")),4,0);
FctLine[2] = new QLineEdit();
layout->addWidget(FctLine[2],4,1,1,5);
GetValues();
setLayout(layout);
}
QCSPropExcitationGB::~QCSPropExcitationGB()
{
}
void QCSPropExcitationGB::SetValues()
{
bool bOk;
double dVal;
QString line;
for (unsigned int i=0;i<3;++i)
{
line=Excitation[i]->text();
dVal=line.toDouble(&bOk);
if (bOk) clProp->SetExcitation(dVal,i);
else clProp->SetExcitation(line.toLatin1().data(),i);
}
clProp->SetNumber((unsigned int)Number->value());
clProp->SetExcitType(Type->currentIndex()+1);
for (unsigned int i=0;i<3;++i)
clProp->SetWeightFunction(FctLine[i]->text().toLatin1().data(),i);
}
void QCSPropExcitationGB::GetValues()
{
std::string line;
for (unsigned int i=0;i<3;++i)
{
line=clProp->GetExcitationString(i);
if (!line.empty()) Excitation[i]->setText(line.c_str());
else Excitation[i]->setText(QString("%1").arg(clProp->GetExcitation(i)));
}
Number->setValue(clProp->GetNumber());
Type->setCurrentIndex(clProp->GetExcitType());
TypeChanged(clProp->GetExcitType());
for (unsigned int i=0;i<3;++i)
FctLine[i]->setText(clProp->GetWeightFunction(i).c_str());
}
void QCSPropExcitationGB::TypeChanged(int index)
{
//enable/disable certain lines, depending on the excitation typez
switch (index)
{
default:
Excitation[0]->setEnabled(true & QCSX_Settings.GetEdit());
Excitation[1]->setEnabled(true & QCSX_Settings.GetEdit());
Excitation[2]->setEnabled(true & QCSX_Settings.GetEdit());
FctLine[0]->setEnabled(true & QCSX_Settings.GetEdit());
FctLine[1]->setEnabled(true & QCSX_Settings.GetEdit());
FctLine[2]->setEnabled(true & QCSX_Settings.GetEdit());
break;
}
}
/***************************QCSPropChargeBoxGB**************************************/
QCSPropProbeBoxGB::QCSPropProbeBoxGB(CSPropProbeBox *prop, QWidget *parent) : QCSPropertyGroupBox(parent)
{
clProp=prop;
TypeName=QString(tr("Probe Box"));
setTitle(tr("ProbeBox Property"));
QGridLayout* layout = new QGridLayout();
Number = new QSpinBox();
Number->setRange(0,999);
Number->setEnabled(QCSX_Settings.GetEdit());
layout->addWidget(new QLabel(tr("Number: ")),0,0);
layout->addWidget(Number,0,1);
GetValues();
setLayout(layout);
}
QCSPropProbeBoxGB::~QCSPropProbeBoxGB()
{
}
void QCSPropProbeBoxGB::SetValues()
{
clProp->SetNumber((unsigned int)Number->value());
}
void QCSPropProbeBoxGB::GetValues()
{
Number->setValue(clProp->GetNumber());
}
/***************************QCSPropResBoxGB**************************************/
QCSPropResBoxGB::QCSPropResBoxGB(CSPropResBox *prop, QWidget *parent) : QCSPropertyGroupBox(parent)
{
clProp=prop;
TypeName=QString(tr("Resolution Box"));
setTitle(tr("ResBox Property"));
QGridLayout* layout = new QGridLayout();
Factor = new QSpinBox();
Factor->setRange(2,16);
Factor->setEnabled(QCSX_Settings.GetEdit());
layout->addWidget(new QLabel(tr("Resolution Factor: ")),0,0);
layout->addWidget(Factor,0,1);
GetValues();
setLayout(layout);
}
QCSPropResBoxGB::~QCSPropResBoxGB()
{
}
void QCSPropResBoxGB::SetValues()
{
clProp->SetResFactor((unsigned int)Factor->value());
}
void QCSPropResBoxGB::GetValues()
{
Factor->setValue(clProp->GetResFactor());
}
/***************************QCSPropDumpBoxGB**************************************/
QCSPropDumpBoxGB::QCSPropDumpBoxGB(CSPropDumpBox *prop, int SimMode, QWidget *parent) : QCSPropertyGroupBox(parent)
{
UNUSED(SimMode);
clProp=prop;
TypeName=QString(tr("Dump Box"));
setTitle(tr("Dump Property"));
QVBoxLayout* layout = new QVBoxLayout();
GetValues();
setLayout(layout);
}
QCSPropDumpBoxGB::~QCSPropDumpBoxGB()
{
}
void QCSPropDumpBoxGB::SetValues()
{
}
void QCSPropDumpBoxGB::GetValues()
{
}