/*************************************************************************** * Copyright (c) 2026 Théo Veilleux-Trinh * * * * This file is part of the FreeCAD CAx development system. * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Library General Public * * License as published by the Free Software Foundation; either * * version 2 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU Library General Public License for more details. * * * * You should have received a copy of the GNU Library General Public * * License along with this library; see the file COPYING.LIB. If not, * * write to the Free Software Foundation, Inc., 59 Temple Place, * * Suite 330, Boston, MA 02111-1307, USA * * * ***************************************************************************/ #include "TaskCommandLink.h" #include "ui_TaskCommandLink.h" #include "Application.h" #include "Document.h" #include "ViewProvider.h" #include #include #include namespace Gui { TaskCommandLink::TaskCommandLink() : ui(new Ui_TaskCommandLinkDialog()) { proxy = new QWidget(this); ui->setupUi(proxy); ui->objectsList->header()->hide(); ui->objectsList->setSelectionMode(QAbstractItemView::SelectionMode::ExtendedSelection); this->groupLayout()->addWidget(proxy); buildObjectsList(); } TaskCommandLink::~TaskCommandLink() { delete proxy; delete ui; } std::vector TaskCommandLink::selectedObjects() { auto selected = ui->objectsList->selectedItems(); std::vector dst; dst.reserve(selected.size()); for (auto sel : selected) { dst.push_back(sel->data(0, Qt::UserRole).value()); } return dst; } void processObjectsHelper(std::vector objs, QTreeWidgetItem* item) { for (auto obj : objs) { auto objItem = new QTreeWidgetItem(item); objItem->setText(0, obj->Label.getValue()); objItem->setData(0, Qt::UserRole, QVariant::fromValue(obj)); Gui::ViewProvider* vp = nullptr; if (auto doc = Application::Instance->getDocument(obj->getDocument())) { vp = doc->getViewProvider(obj); } if (vp) { objItem->setIcon(0, vp->getIcon()); processObjectsHelper(vp->claimChildren(), objItem); } else { objItem->setIcon(0, QIcon()); } } } void TaskCommandLink::buildObjectsList() { ui->objectsList->clear(); auto allDocuments = App::GetApplication().getDocuments(); bool collapse = true; std::map docItemMap; for (auto doc : allDocuments) { auto docItem = new QTreeWidgetItem(); std::string itemName = doc->Label.getValue(); docItem->setText(0, QString::fromStdString(itemName)); docItem->setIcon(0, QIcon(QStringLiteral(":/icons/Document.svg"))); docItem->setFlags(docItem->flags() & ~Qt::ItemIsSelectable); // Can't link a whole document docItemMap[docItem] = doc; ui->objectsList->addTopLevelItem(docItem); processObjectsHelper(Application::Instance->getDocument(doc)->getTreeRootObjects(), docItem); if (collapse) { ui->objectsList->collapseAll(); } else { ui->objectsList->expandToDepth(0); } } ui->objectsList->selectedItems(); } // dialog TaskCommandLinkDialog::TaskCommandLinkDialog( std::function)> executor_ ) : executor(executor_) { commandLink = new TaskCommandLink(); Content.push_back(commandLink); } void TaskCommandLinkDialog::open() {} bool TaskCommandLinkDialog::accept() { executor(commandLink->selectedObjects()); return true; } } // namespace Gui