text: //=========================================================================
  //  Copyright (c) Kitware, Inc.
  //  All rights reserved.
  //  See LICENSE.txt for details.
  //
  //  This software is distributed WITHOUT ANY WARRANTY; without even
  //  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
  //  PURPOSE.  See the above copyright notice for more information.
  //=========================================================================
  #include "qtCMBSceneMesherDialog.h"
  #include "ui_qtCMBSceneMesherDialog.h"
  
  #include "pqCMBSceneTree.h"
  #include "pqFileDialog.h"
  #include <QPushButton>
  
  qtCMBSceneMesherDialog::qtCMBSceneMesherDialog(
    pqCMBSceneTree* tree, QWidget* parent, Qt::WindowFlags flags)
    : QDialog(parent, flags)
  {
    this->Tree = tree;
    this->InternalWidget = new Ui::qtCMBSceneMesherDialog;
    this->InternalWidget->setupUi(this);
    QObject::connect(this->InternalWidget->Mesher, SIGNAL(currentIndexChanged(int)), this,
      SIGNAL(mesherSelectionChanged(int)));
    QObject::connect(this->InternalWidget->SurfaceList, SIGNAL(itemSelectionChanged()), this,
      SLOT(surfaceSelectionChanged()));
    QObject::connect(
      this->InternalWidget->BrowseNewPtsFile, SIGNAL(clicked()), this, SLOT(displayFileBrowser()));
  }
  
  qtCMBSceneMesherDialog::~qtCMBSceneMesherDialog()
  {
    delete this->InternalWidget;
  }
  
  void qtCMBSceneMesherDialog::insertMesherPath(int i, const char* mpath)
  {
    this->InternalWidget->Mesher->insertItem(i, mpath);
  }
  
  void qtCMBSceneMesherDialog::removeMesherPath(int i)
  {
    this->InternalWidget->Mesher->removeItem(i);
  }
  
  void qtCMBSceneMesherDialog::removeAllMesherPaths()
  {
    this->InternalWidget->Mesher->clear();
  }
  
  QString qtCMBSceneMesherDialog::getMesherPath(int i) const
  {
    return this->InternalWidget->Mesher->itemText(i);
  }
  
  void qtCMBSceneMesherDialog::setCurrentMesherPathIndex(int i)
  {
    this->InternalWidget->Mesher->setCurrentIndex(i);
  }
  
  int qtCMBSceneMesherDialog::getCurrentMesherPathIndex() const
  {
    return this->InternalWidget->Mesher->currentIndex();
  }
  
  QString qtCMBSceneMesherDialog::getCurrentMesherPath() const
  {
    return this->InternalWidget->Mesher->currentText();
  }
  
  int qtCMBSceneMesherDialog::getNumberOfMesherPaths() const
  {
    return this->InternalWidget->Mesher->count();
  }
  
  void qtCMBSceneMesherDialog::insertSurfaceName(int i, const char* vname)
  {
    this->InternalWidget->SurfaceList->insertItem(i, vname);
  }
  
  void qtCMBSceneMesherDialog::removeAllSurfaceNames()
  {
    this->InternalWidget->SurfaceList->blockSignals(true);
    this->InternalWidget->SurfaceList->clear();
    this->InternalWidget->SurfaceList->blockSignals(false);
  }
  
  void qtCMBSceneMesherDialog::setSelectedSurfaceNames(QList<int>& currentIndices)
  {
    QListIterator<int> listIter(currentIndices);
    this->InternalWidget->SurfaceList->blockSignals(true);
    while (listIter.hasNext())
    {
      this->InternalWidget->SurfaceList->item(listIter.next())->setSelected(true);
    }
    this->InternalWidget->SurfaceList->blockSignals(false);
    this->surfaceSelectionChanged();
  }
  
  void qtCMBSceneMesherDialog::getSelectedSurfaceNames(QStringList& selectedNames) const
  {
    selectedNames.clear();
    const QList<QListWidgetItem*>& selectedItems = this->InternalWidget->SurfaceList->selectedItems();
    QList<QListWidgetItem*>::const_iterator iter = selectedItems.begin();
    for (; iter != selectedItems.end(); iter++)
    {
      selectedNames.push_back((*iter)->text());
    }
  }
  
  int qtCMBSceneMesherDialog::getNumberOfSurfaceNames() const
  {
    return this->InternalWidget->SurfaceList->count();
  }
  
  void qtCMBSceneMesherDialog::insertVOIName(int i, const char* vname)
  {
    this->InternalWidget->VOI->insertItem(i, vname);
  }
  
  void qtCMBSceneMesherDialog::removeVOIName(int i)
  {
    this->InternalWidget->VOI->removeItem(i);
  }
  
  void qtCMBSceneMesherDialog::removeAllVOINames()
  {
    this->InternalWidget->VOI->clear();
  }
  
  QString qtCMBSceneMesherDialog::getVOIName(int i) const
  {
    return this->InternalWidget->VOI->itemText(i);
  }
  
  void qtCMBSceneMesherDialog::setCurrentVOINameIndex(int i)
  {
    this->InternalWidget->VOI->setCurrentIndex(i);
  }
  
  int qtCMBSceneMesherDialog::getCurrentVOINameIndex() const
  {
    return this->InternalWidget->VOI->currentIndex();
  }
  
  QString qtCMBSceneMesherDialog::getCurrentVOIName() const
  {
    return this->InternalWidget->VOI->currentText();
  }
  
  int qtCMBSceneMesherDialog::getNumberOfVOINames() const
  {
    return this->InternalWidget->VOI->count();
  }
  
  void qtCMBSceneMesherDialog::setMeshLength(double c, bool isRelative)
  {
    this->InternalWidget->MeshLength->setValue(c);
    if (isRelative)
    {
      this->InternalWidget->MeshLengthType->setCurrentIndex(1);
    }
    else
    {
      this->InternalWidget->MeshLengthType->setCurrentIndex(0);
    }
  }
  
  double qtCMBSceneMesherDialog::getMeshLength(bool& isRelative) const
  {
    isRelative = (this->InternalWidget->MeshLengthType->currentIndex() == 1);
    return this->InternalWidget->MeshLength->value();
  }
  
  void qtCMBSceneMesherDialog::setInterpolatingRadius(double c)
  {
    this->InternalWidget->InterpolatingRadius->setValue(c);
  }
  
  double qtCMBSceneMesherDialog::getInterpolatingRadius() const
  {
    return this->InternalWidget->InterpolatingRadius->value();
  }
  
  void qtCMBSceneMesherDialog::surfaceSelectionChanged()
  {
    this->InternalWidget->buttonBox->button(QDialogButtonBox::Ok)
      ->setEnabled(this->InternalWidget->SurfaceList->selectedItems().count() > 0);
  
    QStringList surfaceNames;
    this->getSelectedSurfaceNames(surfaceNames);
    bool enableState = this->Tree->IsTemporaryPtsFileForMesherNeeded(surfaceNames);
    this->InternalWidget->DeleteCreatedPtsFile->setEnabled(enableState);
    this->InternalWidget->BrowseNewPtsFile->setEnabled(enableState);
    this->InternalWidget->TemporaryPtsFileName->setEnabled(enableState);
  }
  
  void qtCMBSceneMesherDialog::displayFileBrowser()
  {
    QString filters = "LIDAR Pts (*.pts *.bin *.bin.pts)";
  
    pqFileDialog file_dialog(
      this->Tree->getCurrentServer(), this, tr("Open File:"), QString(), filters);
  
    //file_dialog->setAttribute(Qt::WA_DeleteOnClose);
    file_dialog.setObjectName("NewPtsFileDialog");
    file_dialog.setFileMode(pqFileDialog::AnyFile);
    file_dialog.setWindowModality(Qt::WindowModal);
    QObject::connect(&file_dialog, SIGNAL(filesSelected(const QStringList&)), this,
      SLOT(filesSelected(const QStringList&)));
    file_dialog.exec();
  }
  
  void qtCMBSceneMesherDialog::filesSelected(const QStringList& files)
  {
    if (files.size() == 0)
    {
      return;
    }
  
    this->InternalWidget->TemporaryPtsFileName->setText(files[0]);
  }
  
  void qtCMBSceneMesherDialog::setTemporaryPtsFileName(const char* name)
  {
    this->InternalWidget->TemporaryPtsFileName->setText(name);
  }
  
  QString qtCMBSceneMesherDialog::getTemporaryPtsFileName()
  {
    return this->InternalWidget->TemporaryPtsFileName->text();
  }
  
  bool qtCMBSceneMesherDialog::getDeleteCreatedPtsFile()
  {
    return this->InternalWidget->DeleteCreatedPtsFile->isEnabled() &&
      this->InternalWidget->DeleteCreatedPtsFile->checkState() == Qt::Checked;
  }
  
  void qtCMBSceneMesherDialog::setOmicronBaseName(const char* name)
  {
    this->InternalWidget->OmicronBaseName->setText(name);
  }
  
  QString qtCMBSceneMesherDialog::getOmicronBaseName()
  {
    return this->InternalWidget->OmicronBaseName->text();
  }
  