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)19 ProjectTargetsComboBox::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)46 void 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() const74 QStringList ProjectTargetsComboBox::currentItemPath() const
75 {
76     return KDevelop::splitWithEscaping(currentText(), QLatin1Char('/'), QLatin1Char('\\'));
77 }
78 
setCurrentItemPath(const QStringList & str)79 void ProjectTargetsComboBox::setCurrentItemPath(const QStringList& str)
80 {
81     setCurrentIndex(str.isEmpty() && count() ? 0 : findText(KDevelop::joinWithEscaping(str, QLatin1Char('/'), QLatin1Char('\\'))));
82 }
83