Salome HOME
23307: [EDF 7315] Improvement of DISTENE meshing plugins
[modules/smesh.git] / src / PluginUtils / SMESH_AdvOptionsWdg.cxx
diff --git a/src/PluginUtils/SMESH_AdvOptionsWdg.cxx b/src/PluginUtils/SMESH_AdvOptionsWdg.cxx
new file mode 100644 (file)
index 0000000..5ae7c92
--- /dev/null
@@ -0,0 +1,155 @@
+// Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007  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, or (at your option) any later version.
+//
+// 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.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+// File   : SMESH_AdvOptionsWdg.h
+// Author : Open CASCADE S.A.S.
+
+#include "SMESH_AdvOptionsWdg.h"
+
+#include <QTableWidget>
+#include <QPushButton>
+#include <QGridLayout>
+#include <QCheckBox>
+#include <QHeaderView>
+
+#define SPACING 6
+#define MARGIN  11
+
+namespace
+{
+  const int IS_CUSTOM = Qt::UserRole;
+}
+
+SMESH_AdvOptionsWdg::SMESH_AdvOptionsWdg( QWidget* parent )
+  : QWidget( parent )
+{
+  myTable = new QTableWidget( /*nbrows=*/0, /*nbcol=*/3, this );
+  QPushButton* addBtn = new QPushButton( tr("ADD_OPTION_BTN"), this );
+
+  myTable->setHorizontalHeaderLabels
+    ( QStringList() << tr("CHOICE") << tr("OPTION_NAME") << tr("OPTION_VALUE") );
+  QHeaderView * header = myTable->horizontalHeader();
+  header->setSectionResizeMode( 0, QHeaderView::ResizeToContents );
+  header->setSectionResizeMode( 1, QHeaderView::Stretch );
+  header->setSectionResizeMode( 2, QHeaderView::ResizeToContents );
+
+  QGridLayout* lay = new QGridLayout( this );
+  lay->setMargin( MARGIN );
+  lay->setSpacing( SPACING );
+  lay->addWidget( myTable, 0,0, 1,3 );
+  lay->addWidget( addBtn,  1,0 );
+
+  connect( addBtn, SIGNAL( clicked() ), SLOT( onAdd() ));
+}
+
+SMESH_AdvOptionsWdg::~SMESH_AdvOptionsWdg()
+{
+}
+
+void SMESH_AdvOptionsWdg::AddOption( QString name, QString value, bool isDefault, bool isCustom )
+{
+  int row = myTable->rowCount();
+  myTable->insertRow( row );
+
+  QTableWidgetItem*  nameItem = new QTableWidgetItem( name );
+  QTableWidgetItem* valueItem = new QTableWidgetItem( value );
+  if ( !name.isEmpty() )
+    nameItem->setFlags( nameItem->flags() & ~Qt::ItemIsEditable );
+  myTable->setItem( row, 1, nameItem );
+  myTable->setItem( row, 2, valueItem );
+  nameItem->setData( IS_CUSTOM, isCustom );
+
+  QCheckBox* chkBox = new QCheckBox();
+  QWidget*      wdg = new QWidget();
+  QHBoxLayout*  lay = new QHBoxLayout( wdg );
+  lay->setContentsMargins(0,0,0,0);
+  lay->addStretch();
+  lay->addWidget(chkBox);
+  lay->addStretch();
+  myTable->setCellWidget( row, 0, wdg );
+  connect( chkBox, SIGNAL(toggled(bool)), this, SLOT(onToggle()));
+  myTable->setCurrentCell( row, 1, QItemSelectionModel::NoUpdate );
+  chkBox->setChecked( !isDefault );
+
+  if ( name.isEmpty() )
+    myTable->editItem( nameItem );
+}
+
+void SMESH_AdvOptionsWdg::SetCustomOptions( const QString& text )
+{
+  QStringList nameVals = text.split(" ");
+  for ( int i = 1; i < nameVals.count(); i += 2 )
+    AddOption( nameVals[i-1], nameVals[i], false, true );
+}
+
+void SMESH_AdvOptionsWdg::onAdd()
+{
+  AddOption( "", "", false, true );
+  
+}
+void SMESH_AdvOptionsWdg::onToggle()
+{
+  int row = myTable->currentRow();
+  QTableWidgetItem* valueItem = myTable->item( row, 2 );
+
+  bool isActive = isChecked( row );
+  int c = isActive ? 0 : 150;
+  valueItem->setForeground( QBrush( QColor( c, c, c )));
+  if ( isActive )
+    valueItem->setFlags( valueItem->flags() | Qt::ItemIsEditable );
+  else
+    valueItem->setFlags( valueItem->flags() & ~Qt::ItemIsEditable );
+}
+
+void SMESH_AdvOptionsWdg::GetOption( int      row,
+                                     QString& name,
+                                     QString& value,
+                                     bool&    isDefault,
+                                     bool &   isCustom)
+{
+  if ( row < myTable->rowCount() )
+  {
+    name      = myTable->item( row, 1 )->text();
+    value     = myTable->item( row, 2 )->text();
+    isDefault = !isChecked( row );
+    isCustom  = myTable->item( row, 1 )->data( IS_CUSTOM ).toInt();
+  }
+}
+
+QString SMESH_AdvOptionsWdg::GetCustomOptions()
+{
+  QString text, value, name;
+  bool isDefault, isCustom;
+  for ( int row = 0; row < myTable->rowCount(); ++row )
+  {
+    GetOption( row, name, value, isDefault, isCustom );
+    if ( !name.isEmpty() && !value.isEmpty() && isCustom && !isDefault )
+      text += name + " " + value + " ";
+  }
+  return text;
+}
+
+bool SMESH_AdvOptionsWdg::isChecked( int row )
+{
+  QCheckBox* cb = myTable->cellWidget( row, 0 )->findChild<QCheckBox *>();
+  return cb->isChecked();
+}