// SMESH SMESHGUI : GUI for SMESH component // // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // // This library 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 2.1 of the License. // // This library 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 library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org // // // // File : SMESHGUI_aParameterDlg.cxx // Author : Nicolas REJNERI // Module : SMESH // $Header$ #include "SMESHGUI_aParameterDlg.h" #include "SMESHGUI_aParameter.h" #include "SMESHGUI.h" #include "SMESHGUI_SpinBox.h" #include "SMESHGUI_Utils.h" #include "SMESHGUI_FunctionPreview.h" #include "SUIT_Tools.h" #include "SUIT_Desktop.h" // QT Includes #include #include #include #include #include #include #include using namespace std; //====================================================================================== // function : SMESHGUI_aParameterDlg() // // The dialog will by default be modal, unless you set 'modal' to // false when constructing dialog // //====================================================================================== SMESHGUI_aParameterDlg::SMESHGUI_aParameterDlg ( SMESHGUI* theModule, std::list params, QString title, bool modal) : QDialog( SMESH::GetDesktop( theModule ), "MyParameterDialog", modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu), myParamList(params), mySMESHGUI(theModule) { /* creating widgets */ init(); /* title */ setCaption(title); /* Move widget on the botton right corner of main widget */ SUIT_Tools::centerWidget(this, SMESH::GetDesktop( theModule ) ); } //====================================================================================== // function : SMESHGUI_aParameterDlg::init() // purpose : creates dialog's layout //====================================================================================== void SMESHGUI_aParameterDlg::init() { setSizeGripEnabled(TRUE); QVBoxLayout* topLayout = new QVBoxLayout(this); topLayout->setMargin(11); topLayout->setSpacing(6); /***************************************************************/ QGroupBox* GroupC1 = new QGroupBox(this, "GroupC1"); GroupC1->setColumnLayout(0, Qt::Vertical); GroupC1->layout()->setSpacing(0); GroupC1->layout()->setMargin(0); QGridLayout* GroupC1Layout = new QGridLayout(GroupC1->layout()); GroupC1Layout->setAlignment(Qt::AlignTop); GroupC1Layout->setSpacing(6); GroupC1Layout->setMargin(11); /* Spin boxes with labels */ list::iterator paramIt = myParamList.begin(); int row; for( row = 0; paramIt != myParamList.end(); paramIt++ , row++) { SMESHGUI_aParameterPtr param = (*paramIt); QLabel * label = new QLabel(GroupC1, "TextLabel"); GroupC1Layout->addWidget(label, row, 0); label->setText(param->Label()); QWidget* aSpinWidget = param->CreateWidget( GroupC1 ); if (aSpinWidget) { GroupC1Layout->addWidget(aSpinWidget, row, 1); aSpinWidget->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum)); aSpinWidget->setMinimumSize(150, 0); QString sig = param->sigValueChanged(); if( !sig.isEmpty() /*&& param->GetType()!=SMESHGUI_aParameter::TABLE*/ ) connect( aSpinWidget, sig.latin1(), this, SLOT( onValueChanged() ) ); param->InitializeWidget(aSpinWidget); mySpinList.push_back(aSpinWidget); myLabelList.push_back(label); } } myPreview = new SMESHGUI_FunctionPreview( GroupC1 ); GroupC1Layout->addWidget( myPreview, row, 1 ); paramIt = myParamList.begin(); std::list::const_iterator anIt = mySpinList.begin(); for( ; paramIt!=myParamList.end(); paramIt++, anIt++ ) { (*paramIt)->TakeValue( *anIt ); UpdateShown( *paramIt, *anIt ); FunctionPreview( *paramIt, *anIt ); } /***************************************************************/ QGroupBox* GroupButtons = new QGroupBox(this, "GroupButtons"); GroupButtons->setColumnLayout(0, Qt::Vertical); GroupButtons->layout()->setSpacing(0); GroupButtons->layout()->setMargin(0); QGridLayout* GroupButtonsLayout = new QGridLayout(GroupButtons->layout()); GroupButtonsLayout->setAlignment(Qt::AlignTop); GroupButtonsLayout->setSpacing(6); GroupButtonsLayout->setMargin(11); /* Ok button */ myButtonOk = new QPushButton(GroupButtons, "buttonOk"); myButtonOk->setText(tr("SMESH_BUT_OK")); myButtonOk->setAutoDefault(TRUE); myButtonOk->setDefault(TRUE); GroupButtonsLayout->addWidget(myButtonOk, 0, 0); /* add spacer between buttons */ GroupButtonsLayout->addItem(new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum), 0, 1); /* Cancel button */ myButtonCancel = new QPushButton(GroupButtons, "buttonCancel"); myButtonCancel->setText(tr("SMESH_BUT_CANCEL")); myButtonCancel->setAutoDefault(TRUE); GroupButtonsLayout->addWidget(myButtonCancel, 0, 2); /***************************************************************/ topLayout->addWidget(GroupC1, 1 ); topLayout->addWidget(GroupButtons, 0 ); /* signals and slots connections */ connect(myButtonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); connect(myButtonCancel, SIGNAL(clicked()), this, SLOT(reject())); } //====================================================================================== // function : ~SMESHGUI_aParameterDlg() // purpose : Destructor //====================================================================================== SMESHGUI_aParameterDlg::~SMESHGUI_aParameterDlg() { } //======================================================================= //function : ClickOnOk //purpose : //======================================================================= void SMESHGUI_aParameterDlg::ClickOnOk() { if (!mySMESHGUI->isActiveStudyLocked()) { list::iterator paramIt = myParamList.begin(); list::iterator widgetIt = mySpinList.begin(); for (; paramIt != myParamList.end() && widgetIt != mySpinList.end(); paramIt++ , widgetIt++) (*paramIt)->TakeValue(*widgetIt); accept(); } } //======================================================================= // function : Parameters() // purpose : return a list of parameters from a dialog box //======================================================================= bool SMESHGUI_aParameterDlg::Parameters( SMESHGUI* theModule, list params, const char *aTitle) { if (!params.empty()) { SMESHGUI_aParameterDlg *Dialog = new SMESHGUI_aParameterDlg( theModule, params, aTitle, TRUE); return (Dialog->exec() == QDialog::Accepted); } return false; } //======================================================================= // function : FunctionPreview // purpose : //======================================================================= void SMESHGUI_aParameterDlg::FunctionPreview( const SMESHGUI_aParameterPtr p, QWidget* w ) { if( !w || !w->isShown() ) return; SMESHGUI_strParameter* str_param = dynamic_cast( p.operator->() ); SMESHGUI_tableParameter* tab_param = dynamic_cast( p.operator->() ); SMESHGUI_boolParameter* bool_param = dynamic_cast( p.operator->() ); if( str_param && str_param->needPreview() ) { QString val; str_param->GetNewText( val ); if( !val.isNull() ) myPreview->setParams( val ); } else if( tab_param && tab_param->needPreview() ) { SMESH::double_array d; tab_param->data( d ); myPreview->setParams( d ); } else if( bool_param && bool_param->needPreview() ) { int exp=0; bool_param->GetNewInt( exp ); myPreview->setIsExp( exp ); } } //======================================================================= // function : onValueChanged // purpose : //======================================================================= void SMESHGUI_aParameterDlg::onValueChanged() { if( sender()->inherits( "QWidget" ) ) { QWidget* w = ( QWidget* )sender(); std::list::const_iterator anIt = mySpinList.begin(), aLast = mySpinList.end(); std::list::const_iterator aPIt = myParamList.begin(); for( ; anIt!=aLast; anIt++, aPIt++ ) if( *anIt == w ) { (*aPIt)->TakeValue( w ); UpdateShown( *aPIt, w ); FunctionPreview( *aPIt, w ); break; } } } //======================================================================= // function : onValueChanged // purpose : //======================================================================= void SMESHGUI_aParameterDlg::UpdateShown( const SMESHGUI_aParameterPtr param, QWidget* w ) { SMESHGUI_dependParameter* depPar = dynamic_cast( param.get() ); if( !depPar ) depPar = dynamic_cast( param.get() ); if( !depPar ) return; SMESHGUI_dependParameter::ShownMap& map = depPar->shownMap(); if( map.isEmpty() ) return; int val; depPar->TakeValue( w ); depPar->GetNewInt( val ); bool hasValue = map.contains( val ); std::list::const_iterator anIt = mySpinList.begin(), aLast = mySpinList.end(), aLIt = myLabelList.begin(); std::list::iterator aPIt = myParamList.begin(); bool preview = false; for( int i=0; anIt!=aLast; anIt++, aLIt++, i++, aPIt++ ) { bool shown = hasValue && map[ val ].contains( i ); (*anIt)->setShown( shown ); (*aLIt)->setShown( shown ); if( shown ) { SMESHGUI_strParameter* str_param = dynamic_cast( (*aPIt).operator->() ); SMESHGUI_tableParameter* tab_param = dynamic_cast( (*aPIt).operator->() ); preview = preview || ( str_param && str_param->needPreview() ) || ( tab_param && tab_param->needPreview() ); } } myPreview->setShown( preview ); }