Mantid
Loading...
Searching...
No Matches
InstrumentSelector.cpp
Go to the documentation of this file.
1// Mantid Repository : https://github.com/mantidproject/mantid
2//
3// Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI,
4// NScD Oak Ridge National Laboratory, European Spallation Source,
5// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS
6// SPDX - License - Identifier: GPL - 3.0 +
12#include "MantidKernel/Logger.h"
13
14#include <set>
15
16namespace {
17Mantid::Kernel::Logger g_log("InstrumentSelector");
18}
19
21using namespace Mantid::Kernel;
22
29InstrumentSelector::InstrumentSelector(QWidget *parent, bool init)
30 : QComboBox(parent), m_changeObserver(*this, &InstrumentSelector::handleConfigChange), m_techniques(),
31 m_currentFacility(nullptr), m_init(init), m_storeChanges(false), m_updateOnFacilityChange(true),
32 m_selectedInstrument() {
33 setEditable(false);
34
35 if (init) {
37
38 Mantid::Kernel::ConfigServiceImpl const &config = Mantid::Kernel::ConfigService::Instance();
40 }
41
42 connect(this, SIGNAL(currentIndexChanged(int)), this, SLOT(updateInstrument()));
43}
44
50 if (m_init) {
51 Mantid::Kernel::ConfigService::Instance().removeObserver(m_changeObserver);
52 }
53}
54
60const QStringList &InstrumentSelector::getTechniques() const { return m_techniques; }
61
68
73void InstrumentSelector::setAutoUpdate(bool autoUpdate) { m_updateOnFacilityChange = autoUpdate; }
74
86
91QString InstrumentSelector::getFacility() { return QString::fromStdString(m_currentFacility->name()); }
92
97void InstrumentSelector::setFacility(const QString &facilityName) { fillWithInstrumentsFromFacility(facilityName); }
98
101 return;
102
103 QString prop = QString::fromStdString(pNf->key());
104 QString newV = QString::fromStdString(pNf->curValue());
105 QString oldV = QString::fromStdString(pNf->preValue());
106
107 if (newV != oldV) {
108 if ((prop == "default.facility") && (newV != QString::fromStdString(m_currentFacility->name()))) {
110 } else if ((prop == "default.instrument") && (newV != this->currentText())) {
111 this->setCurrentIndex(this->findText(newV));
112 }
113 }
114}
115
116//------------------------------------------------------
117// Public slot member functions
118//------------------------------------------------------
119
127 const ConfigServiceImpl &mantidSettings = ConfigService::Instance();
128
129 this->blockSignals(true);
130 this->clear();
131
132 try {
133 if (name.isEmpty()) {
134 m_currentFacility = &(mantidSettings.getFacility());
135 } else {
136 m_currentFacility = &(mantidSettings.getFacility(name.toStdString()));
137 }
139 // could not find the facility
140 // pick the first facility from the valid list
141 m_currentFacility = &(mantidSettings.getFacility(mantidSettings.getFacilityNames()[0]));
142 }
143
144 const auto &instruments = m_currentFacility->instruments();
145 std::set<std::string> alphabetizedNames;
146 for (const auto &instrument : instruments) {
147 alphabetizedNames.insert(instrument.name());
148 }
149 for (const auto &name_std_str : alphabetizedNames) {
150 QString instrumentName = QString::fromStdString(name_std_str);
151 std::string prefix = m_currentFacility->instrument(name_std_str).shortName();
152 QString shortName = QString::fromStdString(prefix);
153 this->addItem(instrumentName, QVariant(shortName));
154 }
156
157 QString defaultName;
158 try {
159 defaultName = QString::fromStdString(ConfigService::Instance().getString("default.instrument"));
160 } catch (Exception::NotFoundError &) {
161 defaultName = "";
162 }
163 int index = this->findText(defaultName);
164 if (index < 0) {
165 index = 0;
166 }
167
168 // Don't affect the default instrument
169 this->setCurrentIndex(index);
170 this->blockSignals(false);
171
173 updateInstrument(this->currentText());
174}
175
180void InstrumentSelector::updateInstrumentOnSelection(const bool storeChanges) { m_storeChanges = storeChanges; }
181
182//------------------------------------------------------
183// Private slot member functions
184//------------------------------------------------------
193 // If enabled, set instrument default
194 if (!name.isEmpty() && m_storeChanges) {
195 ConfigService::Instance().setString("default.instrument", name.toStdString());
196 }
197
198 // If this instrument is different emit the changed signal
199 if (name != m_selectedInstrument) {
201 g_log.debug() << "New instrument selected: " << m_selectedInstrument.toStdString() << '\n';
203 }
204}
205
211
212//------------------------------------------------------
213// Private non-slot member functions
214//------------------------------------------------------
215
222void InstrumentSelector::filterByTechniquesAtFacility(const QStringList &techniques,
223 const Mantid::Kernel::FacilityInfo &facility) {
224 if (techniques.isEmpty())
225 return;
226
227 this->blockSignals(true);
228
229 QStringList supportedInstruments;
230 QStringListIterator techItr(techniques);
231 while (techItr.hasNext()) {
232 const std::vector<InstrumentInfo> instruments = facility.instruments(techItr.next().toStdString());
233 const size_t nInstrs = instruments.size();
234 for (size_t i = 0; i < nInstrs; ++i) {
235 supportedInstruments.append(QString::fromStdString(instruments[i].name()));
236 }
237 }
238
239 // Remove those not supported
240 for (int i = 0; i < this->count();) {
241 if (!supportedInstruments.contains(itemText(i))) {
242 removeItem(i);
243 } else {
244 ++i;
245 }
246 }
247
248 this->blockSignals(false);
249
251}
252
253} // namespace MantidQt::MantidWidgets
std::string name
Definition Run.cpp:60
std::map< DeltaEMode::Type, std::string > index
int count
counter
Definition Matrix.cpp:37
void removeItem(WorkspaceGroup &self, const std::string &name)
void addItem(WorkspaceGroup &self, const std::string &name)
This class defines a widget for selecting an instrument known to Mantid.
void fillWithInstrumentsFromFacility(const QString &name=QString())
Update list for a new facility.
InstrumentSelector(QWidget *parent=nullptr, bool init=true)
Default Constructor.
Poco::NObserver< InstrumentSelector, Mantid::Kernel::ConfigValChangeNotification > m_changeObserver
Poco Observer for Config Service Notifications.
bool m_init
Should the object be initialized.
void setFacility(const QString &facilityName)
Load instruments from a given facility.
void handleConfigChange(Mantid::Kernel::ConfigValChangeNotification_ptr pNf)
bool m_storeChanges
Should the default instrument be changed when the selection changes.
const Mantid::Kernel::FacilityInfo * m_currentFacility
The current facility.
const QStringList & getTechniques() const
Return the list of techniques.
void filterByTechniquesAtFacility(const QStringList &techniques, const Mantid::Kernel::FacilityInfo &facility)
Filter the list to only show those supporting the given technique.
bool getAutoUpdate()
Returns true of auto reloading on facility change is enabled.
void updateInstrument()
Handle an instrument selection from the current index changing.
QString m_selectedInstrument
The last selected instrument.
void updateInstrumentOnSelection(const bool storeChanges)
Sets whether to update the default instrument on selection change.
void setAutoUpdate(bool autoUpdate)
Enable or disable reloading on facility change.
bool m_updateOnFacilityChange
If the instrument list should be reloaded when the facility changes.
QString getFacility()
Get the name of the facility instrumetns are currently loaded from.
void instrumentSelectionChanged(const QString &)
Indicate that the instrument selection has changed.
QStringList m_techniques
A list of technqiues.
void setTechniques(const QStringList &techniques)
Set the list of techniques.
void instrumentListUpdated()
Signals that the list of instruments has been updated.
The ConfigService class provides a simple facade to access the Configuration functionality of the Man...
const FacilityInfo & getFacility() const
Get the default facility.
void addObserver(const Poco::AbstractObserver &observer) const
Add an observer for a notification.
const std::vector< std::string > getFacilityNames() const
Get the list of facility names.
Exception for when an item is not found in a collection.
Definition Exception.h:145
A class that holds information about a facility.
const std::vector< InstrumentInfo > & instruments() const
Returns a list of instruments of this facility.
const std::string & name() const
Return the name of the facility.
const InstrumentInfo & instrument(std::string iName="") const
Returns instruments with given name.
const std::string & shortName() const
Return the short name of the instrument.
The Logger class is in charge of the publishing messages from the framework through various channels.
Definition Logger.h:51
void debug(const std::string &msg)
Logs at debug level.
Definition Logger.cpp:145
Kernel::Logger g_log("ExperimentInfo")
static logger object
Kernel::Logger g_log("DetermineSpinStateOrder")
const Poco::AutoPtr< Mantid::Kernel::ConfigServiceImpl::ValueChanged > & ConfigValChangeNotification_ptr