| 34 | }; |
| 35 | |
| 36 | static ProjectSettingsWidget *createProjectPanel(Project *project) |
| 37 | { |
| 38 | using namespace Layouting; |
| 39 | |
| 40 | auto widget = new ProjectSettingsWidget; |
| 41 | auto settings = new ProjectSettings(project); |
| 42 | settings->setParent(widget); |
| 43 | |
| 44 | QObject::connect( |
| 45 | widget, |
| 46 | &ProjectSettingsWidget::useGlobalSettingsChanged, |
| 47 | settings, |
| 48 | &ProjectSettings::setUseGlobalSettings); |
| 49 | |
| 50 | widget->setUseGlobalSettings(settings->useGlobalSettings()); |
| 51 | |
| 52 | auto generalWidget = new QWidget; |
| 53 | Column{ |
| 54 | settings->enableQodeAssist, |
| 55 | Space{8}, |
| 56 | settings->chatHistoryPath, |
| 57 | } |
| 58 | .attachTo(generalWidget); |
| 59 | |
| 60 | generalWidget->setEnabled(!settings->useGlobalSettings()); |
| 61 | QObject::connect( |
| 62 | widget, |
| 63 | &ProjectSettingsWidget::useGlobalSettingsChanged, |
| 64 | generalWidget, |
| 65 | [generalWidget](bool useGlobal) { generalWidget->setEnabled(!useGlobal); }); |
| 66 | |
| 67 | auto skillsList = new QListWidget; |
| 68 | skillsList->setSelectionMode(QAbstractItemView::NoSelection); |
| 69 | skillsList->setMaximumHeight(160); |
| 70 | |
| 71 | auto refreshSkills = [skillsList, project, settings] { |
| 72 | skillsList->clear(); |
| 73 | |
| 74 | // Project-only roots: the global page shows global skills separately. |
| 75 | const QStringList roots = Skills::SkillsManager::resolveRoots( |
| 76 | project->projectDirectory().toFSPathString(), |
| 77 | {}, |
| 78 | SkillsSettings::splitLines(settings->projectSkillDirs())); |
| 79 | |
| 80 | const QVector<Skills::AgentSkill> skills = Skills::SkillsLoader::scan(roots); |
| 81 | for (const Skills::AgentSkill &skill : skills) { |
| 82 | auto *item = new QListWidgetItem( |
| 83 | QStringLiteral("%1 — %2").arg(skill.name, skill.description), skillsList); |
| 84 | item->setToolTip(skill.skillDir); |
| 85 | } |
| 86 | if (skills.isEmpty()) |
| 87 | new QListWidgetItem(Tr::tr("No skills discovered."), skillsList); |
| 88 | }; |
| 89 | refreshSkills(); |
| 90 | QObject::connect( |
| 91 | &settings->projectSkillDirs, &Utils::BaseAspect::changed, skillsList, refreshSkills); |
| 92 | |
| 93 | Column{ |
nothing calls this directly
no test coverage detected