1 /* 2 SPDX-FileCopyrightText: 2010 Aleix Pol Gonzalez <aleixpol@kde.org> 3 4 SPDX-License-Identifier: LGPL-2.0-or-later 5 */ 6 7 #include "projecttargetscombobox.h" 8 9 #include <QIcon> 10 11 #include <project/projectmodel.h> 12 #include <interfaces/iproject.h> 13 #include <util/kdevstringhandler.h> 14 #include <interfaces/icore.h> 15 #include <interfaces/iprojectcontroller.h> 16 17 using namespace KDevelop; 18 ProjectTargetsComboBox(QWidget * parent)19ProjectTargetsComboBox::ProjectTargetsComboBox(QWidget* parent) 20 : QComboBox(parent) 21 { 22 23 } 24 25 class ExecutablePathsVisitor 26 : public ProjectVisitor 27 { 28 public: ExecutablePathsVisitor(bool exec)29 explicit ExecutablePathsVisitor(bool exec) : m_onlyExecutables(exec) {} 30 using ProjectVisitor::visit; visit(ProjectExecutableTargetItem * eit)31 void visit(ProjectExecutableTargetItem* eit) override { 32 if(!m_onlyExecutables || eit->type()==ProjectTargetItem::ExecutableTarget) 33 m_paths += KDevelop::joinWithEscaping(eit->model()->pathFromIndex(eit->index()), QLatin1Char('/'), QLatin1Char('\\')); 34 } 35 paths() const36 QStringList paths() const { return m_paths; } 37 sort()38 void sort() { m_paths.sort(); } 39 40 private: 41 bool m_onlyExecutables; 42 QStringList m_paths; 43 }; 44 45 setBaseItem(ProjectFolderItem * item,bool exec)46void ProjectTargetsComboBox::setBaseItem(ProjectFolderItem* item, bool exec) 47 { 48 clear(); 49 50 QList<ProjectFolderItem*> items; 51 if(item) { 52 items += item; 53 } else { 54 const auto projects = ICore::self()->projectController()->projects(); 55 items.reserve(projects.size()); 56 for (auto* p : projects) { 57 items += p->projectItem(); 58 } 59 } 60 61 ExecutablePathsVisitor walker(exec); 62 for (ProjectFolderItem* item : qAsConst(items)) { 63 walker.visit(item); 64 } 65 walker.sort(); 66 67 const auto executableItems = walker.paths(); 68 for (const QString& item : executableItems) { 69 addItem(QIcon::fromTheme(QStringLiteral("system-run")), item); 70 } 71 72 } 73 currentItemPath() const74QStringList ProjectTargetsComboBox::currentItemPath() const 75 { 76 return KDevelop::splitWithEscaping(currentText(), QLatin1Char('/'), QLatin1Char('\\')); 77 } 78 setCurrentItemPath(const QStringList & str)79void ProjectTargetsComboBox::setCurrentItemPath(const QStringList& str) 80 { 81 setCurrentIndex(str.isEmpty() && count() ? 0 : findText(KDevelop::joinWithEscaping(str, QLatin1Char('/'), QLatin1Char('\\')))); 82 } 83