From cc8f16074c1519d23dcff97d48142a66c943f3e8 Mon Sep 17 00:00:00 2001 From: Anthony Lim <anthony.lim@stfc.ac.uk> Date: Tue, 2 May 2017 16:33:11 +0100 Subject: [PATCH] refs #19149 moved groups to fitbrowser --- .../src/Muon/MuonAnalysis.cpp | 4 + MantidQt/MantidWidgets/CMakeLists.txt | 1 + .../MuonFitPropertyBrowser.h | 21 ++- .../MuonFitPropertyBrowser.ui | 128 ++++++++++++++++++ .../MantidWidgets/src/MuonFitDataSelector.cpp | 19 +-- .../src/MuonFitPropertyBrowser.cpp | 105 +++++++++++++- 6 files changed, 252 insertions(+), 26 deletions(-) create mode 100644 MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonFitPropertyBrowser.ui diff --git a/MantidQt/CustomInterfaces/src/Muon/MuonAnalysis.cpp b/MantidQt/CustomInterfaces/src/Muon/MuonAnalysis.cpp index 22096b36b54..69f8b3738a0 100644 --- a/MantidQt/CustomInterfaces/src/Muon/MuonAnalysis.cpp +++ b/MantidQt/CustomInterfaces/src/Muon/MuonAnalysis.cpp @@ -399,6 +399,7 @@ void MuonAnalysis::plotItem(ItemType itemType, int tableRow, PlotType plotType) { m_updating = true; m_dataSelector->clearChosenGroups(); + m_uiForm.fitBrowser->clearChosenGroups(); AnalysisDataServiceImpl &ads = AnalysisDataService::Instance(); try { @@ -1828,6 +1829,8 @@ void MuonAnalysis::selectMultiPeak(const QString &wsName, std::transform(groups.pairNames.begin(), groups.pairNames.end(), std::back_inserter(groupsAndPairs), &QString::fromStdString); m_dataSelector->setAvailableGroups(groupsAndPairs); + m_uiForm.fitBrowser->setAvailableGroups(groupsAndPairs); + m_dataSelector->setNumPeriods(m_numPeriods); // Set the selected run, group/pair and period @@ -3049,6 +3052,7 @@ void MuonAnalysis::multiFitCheckboxChanged(int state) { m_fitFunctionPresenter->setMultiFitState(multiFitState); if (multiFitState == Muon::MultiFitState::Disabled) { m_dataSelector->clearChosenGroups(); + m_uiForm.fitBrowser->clearChosenGroups(); } } /** diff --git a/MantidQt/MantidWidgets/CMakeLists.txt b/MantidQt/MantidWidgets/CMakeLists.txt index 5a23fcbece2..de35258d5dd 100644 --- a/MantidQt/MantidWidgets/CMakeLists.txt +++ b/MantidQt/MantidWidgets/CMakeLists.txt @@ -350,6 +350,7 @@ set ( UI_FILES inc/MantidQtMantidWidgets/MWView.ui inc/MantidQtMantidWidgets/MultifitSetupDialog.ui inc/MantidQtMantidWidgets/MuonFitDataSelector.ui + inc/MantidQtMantidWidgets/MuonFitPropertyBrowser.ui inc/MantidQtMantidWidgets/ProcessingAlgoWidget.ui inc/MantidQtMantidWidgets/RenameParDialog.ui inc/MantidQtMantidWidgets/SelectFunctionDialog.ui diff --git a/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonFitPropertyBrowser.h b/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonFitPropertyBrowser.h index 2dbfe5467bd..b8ad478409b 100644 --- a/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonFitPropertyBrowser.h +++ b/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonFitPropertyBrowser.h @@ -6,7 +6,8 @@ #include "MantidQtMantidWidgets/IMuonFitFunctionModel.h" #include "MantidQtAPI/MWRunFiles.h" - +#include <QMap> +#include <QCheckBox> /* Forward declarations */ class QDockWidget; class QLabel; @@ -24,6 +25,9 @@ class QtProperty; class QtBrowserItem; class QVBoxLayout; class QSplitter; +class QWidget; + + namespace Mantid { namespace API { @@ -64,7 +68,6 @@ public: Mantid::API::IFunction_sptr getFunction() const override { return getFittingFunction(); } - QtProperty *addToGroupManager(QString name); /// Set list of workspaces to fit void setWorkspaceNames(const QStringList &wsNames) override; /// Get output name @@ -100,6 +103,11 @@ public: virtual void setFitEnabled(bool yes) override; void TFAsymmFit(int maxIterations); + void setAvailableGroups(const QStringList &groups); + QStringList getChosenGroups() const; + void setChosenGroup(const QString &group); + /// Clear list of selected groups + void clearChosenGroups() const; public slots: /// Perform the fit algorithm @@ -136,7 +144,7 @@ private: /// new menu option QAction *m_fitActiontest; /// Create new fit menu - QPushButton *MuonFitPropertyBrowser::createMuonFitMenuButton(QWidget *w); + QPushButton *createMuonFitMenuButton(QWidget *w); /// Get the registered function names void populateFunctionNames() override; @@ -146,6 +154,8 @@ private: /// workspaces void finishAfterSimultaneousFit(const Mantid::API::IAlgorithm *fitAlg, const int nWorkspaces) const; + void clearGroupCheckboxes(); + void addGroupCheckbox(const QString &name); /// Splitter for additional widgets and splitter between this and browser QSplitter *m_widgetSplitter, *m_mainSplitter; /// Names of workspaces to fit @@ -157,7 +167,10 @@ private: QtBrowserItem *m_multiFitSettingsGroup; QtProperty *m_groupsToFit; mutable QStringList m_groupsToFitOptions; - + /// Map of group names to checkboxes + QMap<QString,QCheckBox *> m_groupBoxes; + QWidget *m_groupWindow; + //int m_groupWindowCount; }; std::vector<double> readNormalization(); diff --git a/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonFitPropertyBrowser.ui b/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonFitPropertyBrowser.ui new file mode 100644 index 00000000000..4e89b911371 --- /dev/null +++ b/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MuonFitPropertyBrowser.ui @@ -0,0 +1,128 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>MuonFitDataSelector</class> + <widget class="QWidget" name="MuonFitDataSelector"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>923</width> + <height>285</height> + </rect> + </property> + <property name="windowTitle"> + <string>MuonFitDataSelector</string> + </property> + <layout class="QGridLayout" name="gridLayoutAll"> + <item row="0" column="0"> + <widget class="QGroupBox" name="groupBoxDataSelector"> + <property name="title"> + <string>Data</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <layout class="QHBoxLayout" name="horizontalLayoutLabel"> + <item> + <widget class="QGroupBox" name="groupBoxGroups"> + <property name="title"> + <string>Groups</string> + </property> + <layout class="QVBoxLayout" name="verticalLayoutGroups"> + <item> + <widget class="QCheckBox" name="chkFwd"> + <property name="text"> + <string>fwd</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="chkBwd"> + <property name="text"> + <string>bwd</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayoutTime"> + <item> + <widget class="QGroupBox" name="groupBoxPeriods"> + <property name="title"> + <string>Periods</string> + </property> + <layout class="QVBoxLayout" name="verticalLayoutPeriods"> + <item> + <widget class="QCheckBox" name="chk1"> + <property name="text"> + <string>1</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="chk2"> + <property name="text"> + <string>2</string> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayoutPeriodsCombine"> + <item> + <widget class="QCheckBox" name="chkCombine"> + <property name="text"> + <string>Combine</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="txtFirst"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="lblMinus"> + <property name="text"> + <string><html><head/><body><p><span style=" font-size:12pt; font-weight:600;">-</span></p></body></html></string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="txtSecond"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Maximum" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </item> + </layout> + </item> + </layout> + </item> + </layout> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/MantidQt/MantidWidgets/src/MuonFitDataSelector.cpp b/MantidQt/MantidWidgets/src/MuonFitDataSelector.cpp index eabe5c5bae5..19c7e39f5ab 100644 --- a/MantidQt/MantidWidgets/src/MuonFitDataSelector.cpp +++ b/MantidQt/MantidWidgets/src/MuonFitDataSelector.cpp @@ -34,23 +34,6 @@ MuonFitDataSelector::MuonFitDataSelector(QWidget *parent) m_ui.runs->doButtonOpt(API::MWRunFiles::ButtonOpts::None); - QSettings multiFitSettings; - multiFitSettings.beginGroup(""); - - /* Create function group */ - QtProperty *multiFitSettingsGroup(NULL); - // Seperates the data and the settings into two seperate categories - //multiFitSettingsGroup=parent->addToGroupManager("Test"); -/* m_groupsToFit = FitPropertyBrowser::m_enumManager->addProperty("Groups/Pairs to fit"); - m_groupsToFitOptions << "All groups" - << "All Pairs" - << "Custom"; - //moo need to add periods.... - - m_enumManager->setEnumNames(m_groupsToFit, m_groupsToFitOptions); - multiFitSettingsGroup->addSubProperty(m_groupsToFit);*/ - - } /** @@ -533,7 +516,7 @@ void MuonFitDataSelector::setUserInput(const QVariant &value) { * doing a simultaneous fit, chosen via the radio buttons. * @returns :: fit type from enum */ -IMuonFitDataSelector::FitType MuonFitDataSelector::getFitType() const { +IMuonFitDataSelector::FitType MuonFitDataSelector::getFitType() const { // will need to pass group and periods // If radio buttons disabled, it's a single fit unless multiple groups/periods // chosen if (!m_ui.rbCoAdd->isEnabled()) { diff --git a/MantidQt/MantidWidgets/src/MuonFitPropertyBrowser.cpp b/MantidQt/MantidWidgets/src/MuonFitPropertyBrowser.cpp index cfc855583d7..5026289b936 100644 --- a/MantidQt/MantidWidgets/src/MuonFitPropertyBrowser.cpp +++ b/MantidQt/MantidWidgets/src/MuonFitPropertyBrowser.cpp @@ -47,11 +47,18 @@ #include <QAction> #include <QLayout> #include <QSplitter> -#include <QMap> #include <QLabel> #include <QPushButton> + #include <QMenu> #include <QSignalMapper> + +#include <QCheckBox> + + + + + namespace { Mantid::Kernel::Logger g_log("MuonFitPropertyBrowser"); } @@ -164,8 +171,14 @@ void MuonFitPropertyBrowser::init() { connect(m_browser, SIGNAL(currentItemChanged(QtBrowserItem *)), this, SLOT(currentItemChanged(QtBrowserItem *))); + m_groupWindow = new QWidget(); + + QString tmp="moo"; + addGroupCheckbox(tmp); + tmp = "baa"; + addGroupCheckbox(tmp); - /* Create editors and assign them to the managers */ + /* Create editors and assign them to the managers */ createEditors(w); updateDecimals(); @@ -212,6 +225,8 @@ void MuonFitPropertyBrowser::init() { m_mainSplitter = new QSplitter(Qt::Vertical, w); m_mainSplitter->insertWidget(0, m_widgetSplitter); m_mainSplitter->insertWidget(1, m_browser); + //moo + m_mainSplitter->insertWidget(2,m_groupWindow); m_mainSplitter->setStretchFactor(0, 1); m_mainSplitter->setStretchFactor(1, 0); @@ -320,7 +335,6 @@ void MuonFitPropertyBrowser::enumChanged(QtProperty *prop) { if (prop == m_groupsToFit) { int j = m_enumManager->value(m_groupsToFit); std::string option = m_groupsToFitOptions[j].toStdString(); - double a = 1.; } else { FitPropertyBrowser::enumChanged(prop); @@ -891,9 +905,92 @@ bool MuonFitPropertyBrowser::hasGuess() const { return false; } } +/** +* Sets group names and updates checkboxes on UI +* By default sets all unchecked +* @param groups :: [input] List of group names +*/ +void MuonFitPropertyBrowser::setAvailableGroups(const QStringList &groups) { + // If it's the same list, do nothing + if (groups.size() == m_groupBoxes.size()) { + auto existingGroups = m_groupBoxes.keys(); + auto newGroups = groups; + qSort(existingGroups); + qSort(newGroups); + if (existingGroups == newGroups) { + return; + } + } + clearGroupCheckboxes(); + for (const auto group : groups) { + addGroupCheckbox(group); + std::string tmp = group.toStdString(); + double a = 1.; + } +} +/** +* Clears all group names and checkboxes +* (ready to add new ones) +*/ +void MuonFitPropertyBrowser::clearGroupCheckboxes() { + for (const auto &checkbox : m_groupBoxes) { + delete(checkbox); + //checkbox->deleteLater(); // will disconnect signal automatically + } + m_groupBoxes.clear(); +} +/** +* Add a new checkbox to the list of groups with given name +* The new checkbox is unchecked by default +* @param name :: [input] Name of group to add +*/ +void MuonFitPropertyBrowser::addGroupCheckbox(const QString &name) { + auto checkBox = new QCheckBox(name,m_groupWindow); + //m_groupWindow->updateGeometry();//m_groupWindow->addWidget(checkBox); + //m_groupWindow->setLayout(layout); + m_groupBoxes.insert(name, checkBox); + checkBox->setChecked(false); + connect(checkBox, SIGNAL(clicked(bool)), this, + SIGNAL(selectedGroupsChanged())); +} +/** +* Returns a list of the selected groups (checked boxes) +* @returns :: list of selected groups +*/ +QStringList MuonFitPropertyBrowser::getChosenGroups() const { + QStringList chosen; + for (auto iter = m_groupBoxes.constBegin(); iter != m_groupBoxes.constEnd(); + ++iter) { + if (iter.value()->isChecked()) { + chosen.append(iter.key()); + } + } + return chosen; +} +/** +* Clears the list of selected groups (unchecks boxes) +*/ +void MuonFitPropertyBrowser::clearChosenGroups() const { + for (auto iter = m_groupBoxes.constBegin(); iter != m_groupBoxes.constEnd(); + ++iter) { + iter.value()->setChecked(false); + } +} +/** +* Set the chosen group ticked and all others off +* Used when switching from Home tab to Data Analysis tab +* @param group :: [input] Name of group to select +*/ +void MuonFitPropertyBrowser::setChosenGroup(const QString &group) { + for (auto iter = m_groupBoxes.constBegin(); iter != m_groupBoxes.constEnd(); + ++iter) { + if (iter.key() == group) { + iter.value()->setChecked(true); + } + } +} -QtProperty *MuonFitPropertyBrowser::addToGroupManager(QString name) { return m_groupManager->addProperty(name); }; } // MantidQt } // API -- GitLab