Files
create/src/Mod/Assembly/Gui/ViewProviderAssemblyLink.cpp

151 lines
5.2 KiB
C++

// SPDX-License-Identifier: LGPL-2.1-or-later
/****************************************************************************
* *
* Copyright (c) 2024 Ondsel <development@ondsel.com> *
* *
* This file is part of FreeCAD. *
* *
* FreeCAD is free software: you can redistribute it and/or modify it *
* under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation, either version 2.1 of the *
* License, or (at your option) any later version. *
* *
* FreeCAD 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 *
* Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License along with FreeCAD. If not, see *
* <https://www.gnu.org/licenses/>. *
* *
***************************************************************************/
#include "PreCompiled.h"
#ifndef _PreComp_
#include <QAction>
#include <QMenu>
#include <vector>
#include <sstream>
#include <iostream>
#endif
#include <App/Link.h>
#include <App/Document.h>
#include <App/DocumentObject.h>
#include <App/Part.h>
#include <Gui/ActionFunction.h>
#include <Gui/Application.h>
#include <Gui/BitmapFactory.h>
#include <Gui/CommandT.h>
#include <Gui/MainWindow.h>
#include <Mod/Assembly/App/AssemblyObject.h>
#include <Mod/Assembly/App/AssemblyLink.h>
#include "ViewProviderAssembly.h"
#include "ViewProviderAssemblyLink.h"
using namespace Assembly;
using namespace AssemblyGui;
PROPERTY_SOURCE(AssemblyGui::ViewProviderAssemblyLink, Gui::ViewProviderPart)
ViewProviderAssemblyLink::ViewProviderAssemblyLink()
{}
ViewProviderAssemblyLink::~ViewProviderAssemblyLink() = default;
QIcon ViewProviderAssemblyLink::getIcon() const
{
auto* assembly = dynamic_cast<Assembly::AssemblyLink*>(getObject());
if (assembly->isRigid()) {
return Gui::BitmapFactory().pixmap("Assembly_AssemblyLinkRigid.svg");
}
else {
return Gui::BitmapFactory().pixmap("Assembly_AssemblyLink.svg");
}
}
bool ViewProviderAssemblyLink::setEdit(int mode)
{
auto* assemblyLink = dynamic_cast<Assembly::AssemblyLink*>(getObject());
if (!assemblyLink->isRigid() && mode == (int)ViewProvider::Transform) {
Base::Console().userTranslatedNotification(
"Flexible sub-assemblies cannot be transformed.");
return true;
}
return ViewProviderPart::setEdit(mode);
}
bool ViewProviderAssemblyLink::doubleClicked()
{
auto* link = freecad_cast<AssemblyLink*>(getObject());
if (!link) {
return true;
}
auto* assembly = link->getLinkedAssembly();
auto* vpa =
freecad_cast<ViewProviderAssembly*>(Gui::Application::Instance->getViewProvider(assembly));
if (!vpa) {
return true;
}
return vpa->doubleClicked();
}
bool ViewProviderAssemblyLink::onDelete(const std::vector<std::string>& subNames)
{
Q_UNUSED(subNames)
Base::Console().warning("onDelete\n");
Gui::Command::doCommand(Gui::Command::Doc,
"App.getDocument(\"%s\").getObject(\"%s\").removeObjectsFromDocument()",
getObject()->getDocument()->getName(),
getObject()->getNameInDocument());
// getObject()->purgeTouched();
return ViewProviderPart::onDelete(subNames);
}
void ViewProviderAssemblyLink::setupContextMenu(QMenu* menu, QObject* receiver, const char* member)
{
auto func = new Gui::ActionFunction(menu);
QAction* act;
auto* assemblyLink = dynamic_cast<Assembly::AssemblyLink*>(getObject());
if (assemblyLink->isRigid()) {
act = menu->addAction(QObject::tr("Turn flexible"));
act->setToolTip(QObject::tr(
"Your sub-assembly is currently rigid. This will make it flexible instead."));
}
else {
act = menu->addAction(QObject::tr("Turn rigid"));
act->setToolTip(QObject::tr(
"Your sub-assembly is currently flexible. This will make it rigid instead."));
}
func->trigger(act, [this]() {
auto* assemblyLink = dynamic_cast<Assembly::AssemblyLink*>(getObject());
Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Toggle Rigid"));
Gui::cmdAppObjectArgs(assemblyLink,
"Rigid = %s",
assemblyLink->Rigid.getValue() ? "False" : "True");
Gui::Command::commitCommand();
Gui::Selection().clearSelection();
});
Q_UNUSED(receiver)
Q_UNUSED(member)
}