diff --git a/Code/Mantid/Vates/ParaviewPlugins/ParaViewWidgets/CMakeLists.txt b/Code/Mantid/Vates/ParaviewPlugins/ParaViewWidgets/CMakeLists.txt index c9f65f95ebf7945661039dec453c24db50e93946..1725eb90d5f5e141f4c606e5b2d073824b452174 100644 --- a/Code/Mantid/Vates/ParaviewPlugins/ParaViewWidgets/CMakeLists.txt +++ b/Code/Mantid/Vates/ParaviewPlugins/ParaViewWidgets/CMakeLists.txt @@ -1,4 +1,5 @@ add_subdirectory( EventNexusReaderObjectPanel ) +add_subdirectory( SQWEventReaderObjectPanel ) add_subdirectory( RebinningCutterObjectPanel ) add_subdirectory( RebinningCutterToolBarExtension ) add_subdirectory( QtWidgets ) diff --git a/Code/Mantid/Vates/ParaviewPlugins/ParaViewWidgets/EventNexusReaderObjectPanel/CMakeLists.txt b/Code/Mantid/Vates/ParaviewPlugins/ParaViewWidgets/EventNexusReaderObjectPanel/CMakeLists.txt index 912161b33630e5e0b5e646356e32a1997636bcf6..0b85110ee3daa4e270eabbca49cbfda4f29409ef 100644 --- a/Code/Mantid/Vates/ParaviewPlugins/ParaViewWidgets/EventNexusReaderObjectPanel/CMakeLists.txt +++ b/Code/Mantid/Vates/ParaviewPlugins/ParaViewWidgets/EventNexusReaderObjectPanel/CMakeLists.txt @@ -9,9 +9,6 @@ qt4_wrap_cpp( MOC_SRCS EventNexusReaderObjectPanel.h ) add_paraview_object_panel( IFACES IFACE_SRCS CLASS_NAME EventNexusReaderObjectPanel XML_NAME EventNexusReader XML_GROUP sources ) -add_paraview_object_panel( IFACES IFACE_SRCS - CLASS_NAME EventNexusReaderObjectPanel - XML_NAME SQWEventReader XML_GROUP sources ) add_paraview_plugin( MantidParaViewEventNexusReaderObjectPanel "1.0" GUI_INTERFACES ${IFACES} SOURCES ${MOC_SRCS} ${IFACE_SRCS} ${INCLUDE_FILES} diff --git a/Code/Mantid/Vates/ParaviewPlugins/ParaViewWidgets/EventNexusReaderObjectPanel/EventNexusReaderObjectPanel.h b/Code/Mantid/Vates/ParaviewPlugins/ParaViewWidgets/EventNexusReaderObjectPanel/EventNexusReaderObjectPanel.h index 7bcfa2ef374f523bd813cee82c5c9ad70ea4eb30..b4d65010955fcb90ac882857581bcb89afb2e433 100644 --- a/Code/Mantid/Vates/ParaviewPlugins/ParaViewWidgets/EventNexusReaderObjectPanel/EventNexusReaderObjectPanel.h +++ b/Code/Mantid/Vates/ParaviewPlugins/ParaViewWidgets/EventNexusReaderObjectPanel/EventNexusReaderObjectPanel.h @@ -4,7 +4,7 @@ /** - Adds and removes from Paraview's autogenerated object panel for the Rebinning Cutting filter. + Adds and removes from Paraview's autogenerated object panel for the Event-based reader/filter. @author Owen Arnold, Tessella plc @date 17/03/2011 diff --git a/Code/Mantid/Vates/ParaviewPlugins/ParaViewWidgets/SQWEventReaderObjectPanel/CMakeLists.txt b/Code/Mantid/Vates/ParaviewPlugins/ParaViewWidgets/SQWEventReaderObjectPanel/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..a4853f5573e6c6284d8570eecc8c21481b95f796 --- /dev/null +++ b/Code/Mantid/Vates/ParaviewPlugins/ParaViewWidgets/SQWEventReaderObjectPanel/CMakeLists.txt @@ -0,0 +1,27 @@ +# Include Qt widgets +include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../QtWidgets ) + +# So that source file shows in VS. +set( INCLUDE_FILES SQWEventReaderObjectPanel.h ) +set( SRC_FILES SQWEventReaderObjectPanel.cxx ) + +qt4_wrap_cpp( MOC_SRCS SQWEventReaderObjectPanel.h ) +add_paraview_object_panel( IFACES IFACE_SRCS + CLASS_NAME SQWEventReaderObjectPanel + XML_NAME EventNexusReader XML_GROUP sources ) +add_paraview_object_panel( IFACES IFACE_SRCS + CLASS_NAME SQWEventReaderObjectPanel + XML_NAME SQWEventReader XML_GROUP sources ) +add_paraview_plugin( MantidParaViewSQWEventReaderObjectPanel "1.0" + GUI_INTERFACES ${IFACES} + SOURCES ${MOC_SRCS} ${IFACE_SRCS} ${INCLUDE_FILES} + ${SRC_FILES} ) +target_link_libraries( MantidParaViewSQWEventReaderObjectPanel +MantidParaViewQtWidgets ) + +# Put library into subfolder. +output_binary_to( MantidParaViewSQWEventReaderObjectPanel ${PVPLUGINS_DIR}) + +install( TARGETS MantidParaViewSQWEventReaderObjectPanel ${TARGET_TYPE} DESTINATION ${PVPLUGINS_DIR} ) + + diff --git a/Code/Mantid/Vates/ParaviewPlugins/ParaViewWidgets/SQWEventReaderObjectPanel/SQWEventReaderObjectPanel.cxx b/Code/Mantid/Vates/ParaviewPlugins/ParaViewWidgets/SQWEventReaderObjectPanel/SQWEventReaderObjectPanel.cxx new file mode 100644 index 0000000000000000000000000000000000000000..df76312d6caddcd796eb9a649191d8cfe609dddc --- /dev/null +++ b/Code/Mantid/Vates/ParaviewPlugins/ParaViewWidgets/SQWEventReaderObjectPanel/SQWEventReaderObjectPanel.cxx @@ -0,0 +1,187 @@ +#include "SQWEventReaderObjectPanel.h" +#include "pqObjectPanelInterface.h" +#include "pqPropertyManager.h" +#include "pqNamedWidgets.h" +#include "vtkSMStringVectorProperty.h" +#include "vtkSMDoubleVectorProperty.h" +#include <QLayout> +#include <QMessageBox> +#include <QCheckBox> +#include <QGridLayout> +#include "GeometryWidget.h" +#include "ThresholdRangeWidget.h" +#include "MantidGeometry/MDGeometry/MDGeometryXMLParser.h" +#include "MantidVatesAPI/SynchronisingGeometryPresenter.h" + +using namespace Mantid::VATES; +using namespace Mantid::Geometry; + +SQWEventReaderObjectPanel::SQWEventReaderObjectPanel(pqProxy* pxy, QWidget* p) : +pqAutoGeneratedObjectPanel(pxy, p), m_cachedMinThreshold(0), m_cachedMaxThreshold(0), m_geometryXMLString(""), m_geometryWidget(NULL), m_thresholdWidget(NULL) +{ + //Auto generated widgets are replaced by Custom Widgets. Autogenerated ones need to be removed. + removeAutoGeneratedWidgets(); +} + +/// Event handler for framework event. +void SQWEventReaderObjectPanel::updateInformationAndDomains() +{ + this->proxy()->UpdatePropertyInformation(); + QGridLayout* gLayout = dynamic_cast<QGridLayout*>(this->layout()); + try + { + this->constructThresholdRanges(gLayout); + this->constructGeometry(gLayout); + } + catch(std::exception& ex) + { + UNUSED_ARG(ex); + QMessageBox::information(NULL, "Setup Not possible.", + "Could not interpret metadata. Are you using a rebinning source? Check field data."); + } +} + +void SQWEventReaderObjectPanel::constructGeometry(QGridLayout* gLayout) +{ + vtkSMStringVectorProperty* inputGeometryProperty = vtkSMStringVectorProperty::SafeDownCast( + this->proxy()->GetProperty("InputGeometryXML")); + + std::string geometryXMLString = inputGeometryProperty->GetElement(0); + + if(m_geometryXMLString != geometryXMLString) //Only attempt to reconstruct the geometry widget if the xml has changed. + { + MDGeometryXMLParser xmlParser(geometryXMLString); + xmlParser.execute(); + + //Empty geometry widget added to layout. + if(m_geometryWidget != NULL) + { + this->layout()->removeWidget(m_geometryWidget); + delete m_geometryWidget; + } + + // Construct custom widget instance. + m_geometryWidget = new GeometryWidget(new SynchronisingGeometryPresenter(xmlParser), false); + gLayout->addWidget(m_geometryWidget, gLayout->rowCount() + 1, 0, Qt::AlignLeft); + + connect(m_geometryWidget, SIGNAL(ignoreBinChanges()), this, SLOT(ignoreBinChangesListner())); + + // Property used as setter. + vtkSMProperty * appliedGeometryXML = this->proxy()->GetProperty("AppliedGeometryXML"); + + //Hook up geometry change event to listener on filter. + this->propertyManager()->registerLink(m_geometryWidget, "GeometryXML", + SIGNAL(valueChanged()), this->proxy(), appliedGeometryXML); + + m_geometryXMLString = geometryXMLString; + } +} + +void SQWEventReaderObjectPanel::constructThresholdRanges(QGridLayout* gLayout) +{ + // Access getter property to extract original input max threshold value. + vtkSMDoubleVectorProperty* inputMaxThresholdProperty = vtkSMDoubleVectorProperty::SafeDownCast( + this->proxy()->GetProperty("InputMaxThreshold")); + double inputMaxThreshold = inputMaxThresholdProperty->GetElement(0); + + // Access getter property to extract original input min threshold value. + vtkSMDoubleVectorProperty* inputMinThresholdProperty = vtkSMDoubleVectorProperty::SafeDownCast( + this->proxy()->GetProperty("InputMinThreshold")); + double inputMinThreshold = inputMinThresholdProperty->GetElement(0); + + if(inputMaxThreshold != m_cachedMaxThreshold || inputMinThreshold != m_cachedMinThreshold) + { + + if(m_thresholdWidget == NULL) + { + m_thresholdWidget = new ThresholdRangeWidget(inputMinThreshold, inputMaxThreshold); + gLayout->addWidget(m_thresholdWidget, gLayout->rowCount() + 1, 0, Qt::AlignCenter); + } + else + { + m_thresholdWidget->setMaximum(inputMaxThreshold); + m_thresholdWidget->setMinimum(inputMinThreshold); + } + + // Property used as setter + vtkSMProperty * minThreshold = this->proxy()->GetProperty("MinThreshold"); + + // Property used as setter + vtkSMProperty * maxThreshold = this->proxy()->GetProperty("MaxThreshold"); + + // Property used as setter + vtkSMProperty * rangeStrategy = this->proxy()->GetProperty("ThresholdRangeStrategyIndex"); + + // Hook-up events to PV properties. + this->propertyManager()->registerLink(m_thresholdWidget, "MinSignal", + SIGNAL(minChanged()), this->proxy(), minThreshold); + + // Hook-up events to PV properties. + this->propertyManager()->registerLink(m_thresholdWidget, "MaxSignal", + SIGNAL(maxChanged()), this->proxy(), maxThreshold); + + // Hook-up events to PV properties. + this->propertyManager()->registerLink(m_thresholdWidget, "ChosenStrategy", + SIGNAL(chosenStrategyChanged()), this->proxy(), rangeStrategy); + + m_cachedMaxThreshold = inputMaxThreshold; + m_cachedMinThreshold = inputMinThreshold; + } +} + +/// Direct removal of autogenerated widgets. +void SQWEventReaderObjectPanel::removeAutoGeneratedWidgets() +{ + popWidget(); // Autogenerated Geometry QLineEdit + popWidget(); // Autogenerated Geometry QLabel + popWidget(); // Autogenerated Max threshold QLineEdit + popWidget(); // Autogenerated Max threshold QLabel + popWidget(); // Autogenerated Min threshold QLineEdit + popWidget(); // Autogenerated Min threshold QLabel + popWidget(); // Autogenerated User defined ComboBox. + popWidget(); // Autogenerated User defined ComboBox. +} + +/// Pop widgets off the layout and hide them. +void SQWEventReaderObjectPanel::popWidget() +{ + unsigned int size = layout()->count(); + if(size >= 1) + { + //Pop the last widget off the layout and hide it. + QLayoutItem* pLayoutItem = layout()->itemAt(size - 1); + QWidget* pWidget = pLayoutItem->widget(); + if (NULL == pWidget) + { + throw std::domain_error( + "Error ::popWidget(). Attempting to pop a non-widget object off the layout!"); + } + else + { + pWidget->setHidden(true); + this->layout()->removeItem(pLayoutItem); + } + } +} + +/// Listener for ignore bin changes. +void SQWEventReaderObjectPanel::ignoreBinChangesListner() +{ + QLayoutItem *child; + unsigned int size = layout()->count(); + for(unsigned int i = 0; i < size; i++) + { + child = layout()->itemAt(i); + QWidget* pWidget = child->widget(); + if (NULL != pWidget) // capability query of layout item. + { + QCheckBox* checkBox; + if((checkBox = dynamic_cast<QCheckBox*>(pWidget)) != NULL) //capability query of widget. + { + // Apply Clip check box set to unchecked. + checkBox->setChecked(false); + break; + } + } + } +} diff --git a/Code/Mantid/Vates/ParaviewPlugins/ParaViewWidgets/SQWEventReaderObjectPanel/SQWEventReaderObjectPanel.h b/Code/Mantid/Vates/ParaviewPlugins/ParaViewWidgets/SQWEventReaderObjectPanel/SQWEventReaderObjectPanel.h new file mode 100644 index 0000000000000000000000000000000000000000..c234d2ed648c5d93fc66ec64f12aaa3737ae4cc5 --- /dev/null +++ b/Code/Mantid/Vates/ParaviewPlugins/ParaViewWidgets/SQWEventReaderObjectPanel/SQWEventReaderObjectPanel.h @@ -0,0 +1,76 @@ +#include "pqAutoGeneratedObjectPanel.h" + +#include "MantidKernel/System.h" + +/** + + Adds and removes from Paraview's autogenerated object panel for the Event based SQW reader/rebinner. + + @author Owen Arnold, Tessella plc + @date 15/07/2011 + + Copyright © 2010 ISIS Rutherford Appleton Laboratory & NScD Oak Ridge National Laboratory + + This file is part of Mantid. + + Mantid 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 3 of the License, or + (at your option) any later version. + + Mantid 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, see <http://www.gnu.org/licenses/>. + + File change history is stored at: <https://svn.mantidproject.org/mantid/trunk/Code/Mantid> + Code Documentation is available at: <http://doxygen.mantidproject.org> + */ + +//Forward declarations +class GeometryWidget; +class ThresholdRangeWidget; +class DLLExport SQWEventReaderObjectPanel : public pqAutoGeneratedObjectPanel +{ +Q_OBJECT +private: + /// cached min threshold. + double m_cachedMinThreshold; + /// cached max threshold. + double m_cachedMaxThreshold; + /// cached geometry xml string. + std::string m_geometryXMLString; + /// Pointer to custom geometry widget. + GeometryWidget* m_geometryWidget; + /// Pointer to custom threshold range widget. + ThresholdRangeWidget* m_thresholdWidget; + +private slots: + /// Handler for ignoring bin changes. i.e. + void ignoreBinChangesListner(); + +public: + + /// Constructor + SQWEventReaderObjectPanel(pqProxy* pxy, QWidget* p); + + /// Framework overriden method. + void updateInformationAndDomains(); + + /// Remove selected auto-generated widgets + void removeAutoGeneratedWidgets(); + + /// Pop the widget off the layout + void popWidget(); + + /// Construct threshold ranges and link-up with properties + void constructThresholdRanges(QGridLayout* gLayout); + + /// Construct geometry widgets and link-up with properties + void constructGeometry(QGridLayout* gLayout); + + +};