10#include "boost/algorithm/string.hpp"
12#include <QApplication>
29 : QWidget(parent), m_tree(nullptr), m_findAlg(nullptr), m_execButton(nullptr),
31 auto *buttonLayout =
new QHBoxLayout();
34 m_tree->setHeaderLabel(
"Algorithms");
40 m_findAlg->completer()->setCompletionMode(QCompleter::PopupCompletion);
43 QSizePolicy expandHoriz;
44 expandHoriz.setHorizontalPolicy(QSizePolicy::Expanding);
57 QVBoxLayout *layout =
new QVBoxLayout(
this);
59 layout->addLayout(buttonLayout);
66 AlgorithmFactory::Instance().notificationCenter.addObserver(
m_updateObserver);
74 AlgorithmFactory::Instance().notificationCenter.removeObserver(
m_updateObserver);
97 if (!alg.name.isEmpty()) {
105 int i =
m_findAlg->findText(text, Qt::MatchFixedString);
109 m_tree->blockSignals(
true);
110 m_tree->setCurrentIndex(QModelIndex());
111 m_tree->blockSignals(
false);
136 if (alg.
name.isEmpty())
152 m_tree->blockSignals(
true);
153 m_tree->setCurrentIndex(QModelIndex());
154 m_tree->blockSignals(
false);
197 auto isCategoryName = [](
const QTreeWidgetItem *item) {
198 return (item->childCount() != 0 && !item->text(0).contains(
" v."));
202 if (items.size() > 0 && !isCategoryName(items[0])) {
203 QString str = items[0]->text(0);
204 QStringList lst = str.split(
" v.");
214 if (e->button() == Qt::LeftButton) {
215 if (!itemAt(e->pos()))
216 selectionModel()->clear();
220 QTreeWidget::mousePressEvent(e);
226 if (!(e->buttons() & Qt::LeftButton))
228 if ((e->pos() -
m_dragStartPosition).manhattanLength() < QApplication::startDragDistance())
232 QDrag *drag =
new QDrag(
this);
233 auto *mimeData =
new QMimeData;
235 mimeData->setText(
"Algorithm");
236 drag->setMimeData(mimeData);
238 Qt::DropAction dropAction = drag->exec(Qt::CopyAction | Qt::MoveAction);
246 if (!alg.name.isEmpty()) {
251 QTreeWidget::mouseDoubleClickEvent(e);
259 using AlgNamesType = std::vector<AlgorithmDescriptor>;
260 AlgNamesType names = AlgorithmFactory::Instance().getDescriptors(
false,
false);
263 sort(names.begin(), names.end(), AlgorithmDescriptorLess);
265 QMap<QString, QTreeWidgetItem *> categories;
266 QMap<QString, QTreeWidgetItem *> algorithms;
271 for (AlgNamesType::const_iterator i = names.begin(); i != names.end(); ++i) {
272 QString algName = QString::fromStdString(i->name);
273 QString catName = QString::fromStdString(i->category);
274 QStringList subCats = catName.split(
'\\');
275 if (!categories.contains(catName)) {
276 if (subCats.size() == 1) {
277 QTreeWidgetItem *catItem =
new QTreeWidgetItem(QStringList(catName));
278 categories.insert(catName, catItem);
279 this->addTopLevelItem(catItem);
281 QString cn = subCats[0];
282 QTreeWidgetItem *catItem =
nullptr;
283 int n = subCats.size();
284 for (
int j = 0; j <
n; j++) {
285 if (categories.contains(cn)) {
286 catItem = categories[cn];
288 QTreeWidgetItem *newCatItem =
new QTreeWidgetItem(QStringList(subCats[j]));
289 categories.insert(cn, newCatItem);
291 this->addTopLevelItem(newCatItem);
293 catItem->addChild(newCatItem);
295 catItem = newCatItem;
298 cn +=
"\\" + subCats[j + 1];
303 QTreeWidgetItem *algItem =
new QTreeWidgetItem(QStringList(algName +
" v." + QString::number(i->version)));
304 QString cat_algName = catName + algName;
305 if (!algorithms.contains(cat_algName)) {
306 algorithms.insert(cat_algName, algItem);
307 categories[catName]->addChild(algItem);
309 algorithms[cat_algName]->addChild(algItem);
319 if (e->key() == Qt::Key_Return) {
323 QComboBox::keyPressEvent(e);
330 AlgNamesType names = AlgorithmFactory::Instance().getDescriptors(
true,
false);
334 sort(names.begin(), names.end(), AlgorithmDescriptorNameLess);
337 std::string prevName =
"";
338 for (AlgNamesType::const_iterator i = names.begin(); i != names.end(); ++i) {
339 if (i->name != prevName)
340 this->
addItem(QString::fromStdString(i->name));
343 this->setCurrentIndex(-1);
349 for (AlgNamesType::const_iterator i = algNamesList.begin(); i != algNamesList.end(); ++i) {
351 if ((!i->alias.empty()) && (!boost::iequals(i->alias, i->name))) {
353 newAlias.
name = i->alias +
" [" + i->name +
"]";
354 aliasList.emplace_back(newAlias);
358 algNamesList.reserve(algNamesList.size() + aliasList.size());
359 algNamesList.insert(algNamesList.end(), aliasList.begin(), aliasList.end());
364 QString retVal = text;
365 int foundOpen = text.indexOf(
"[");
366 if (foundOpen != -1) {
367 int foundClose = text.lastIndexOf(
"]");
368 if (foundClose != -1)
369 retVal = text.mid(foundOpen + 1, foundClose - foundOpen - 1);
378 QString typedText = this->currentText().trimmed();
379 if (!typedText.isEmpty())
382 int matchedIndex = this->findText(typedText, Qt::MatchStartsWith);
383 if (matchedIndex > -1) {
384 typedText = this->itemText(matchedIndex);
void addItem(WorkspaceGroup &self, const std::string &name)
const Poco::AutoPtr< Mantid::Kernel::DynamicFactory< Algorithm >::UpdateNotification > & AlgorithmFactoryUpdateNotification_ptr
Structure uniquely describing an algorithm with its name, category and version.
std::string category
category
std::string name
Algorithm Name.