attach vtk context to gcompose

This commit is contained in:
AndreaRigoni
2026-03-22 12:18:33 +00:00
parent a8f786d8d1
commit 324aaa91b7
36 changed files with 674 additions and 19 deletions

View File

@@ -1,6 +1,10 @@
#include "MainPanel.h"
#include "ViewportPane.h"
#include "ContextPanel.h"
#include "Core/ObjectFactory.h"
#include "Core/ObjectsContext.h"
#include "Vtk/vtkObjectsContext.h"
#include "Vtk/vtkQViewport.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QSplitter>
@@ -11,7 +15,7 @@
#include <QApplication>
#include "StyleManager.h"
MainPanel::MainPanel(QWidget* parent) : QWidget(parent) {
MainPanel::MainPanel(QWidget* parent) : QWidget(parent), m_context(nullptr), m_mainVtkContext(nullptr) {
auto* mainLayout = new QVBoxLayout(this);
mainLayout->setContentsMargins(0, 0, 0, 0);
mainLayout->setSpacing(0);
@@ -44,8 +48,23 @@ MainPanel::MainPanel(QWidget* parent) : QWidget(parent) {
themeMenu->addAction("Bright", this, &MainPanel::onBrightTheme);
btnTheme->setMenu(themeMenu);
// New Menu Button
auto* btnNew = new QPushButton("New", menuPanel);
btnNew->setObjectName("MenuButton");
auto* newMenu = new QMenu(btnNew);
auto classes = uLib::ObjectFactory::Instance().GetRegisteredClasses();
for (const auto& className : classes) {
auto* action = newMenu->addAction(QString::fromStdString(className));
connect(action, &QAction::triggered, [this, className]() {
this->onCreateObject(className);
});
}
btnNew->setMenu(newMenu);
menuLayout->addWidget(logo);
menuLayout->addWidget(btnFile);
menuLayout->addWidget(btnNew);
menuLayout->addWidget(btnTheme);
menuLayout->addStretch();
@@ -58,6 +77,16 @@ MainPanel::MainPanel(QWidget* parent) : QWidget(parent) {
m_firstPane = new ViewportPane(m_rootSplitter);
m_rootSplitter->addWidget(m_firstPane);
connect(m_contextPanel, &ContextPanel::objectSelected, [this](uLib::Object* obj) {
if (auto* viewport = qobject_cast<uLib::Vtk::QViewport*>(m_firstPane->currentViewport())) {
uLib::Vtk::Puppet* puppet = nullptr;
if (m_mainVtkContext) {
puppet = m_mainVtkContext->GetPuppet(obj);
}
viewport->SelectPuppet(puppet);
}
});
// Set initial sizes
QList<int> sizes;
sizes << 200 << 1000;
@@ -67,7 +96,52 @@ MainPanel::MainPanel(QWidget* parent) : QWidget(parent) {
}
void MainPanel::setContext(uLib::ObjectsContext* context) {
m_context = context;
m_contextPanel->setContext(context);
if (m_mainVtkContext) {
if (auto* viewport = qobject_cast<uLib::Vtk::QViewport*>(m_firstPane->currentViewport())) {
viewport->RemovePuppet(*m_mainVtkContext);
}
delete m_mainVtkContext;
m_mainVtkContext = nullptr;
}
if (context) {
if (auto* viewport = qobject_cast<uLib::Vtk::QViewport*>(m_firstPane->currentViewport())) {
m_mainVtkContext = new uLib::Vtk::vtkObjectsContext(context);
viewport->AddPuppet(*m_mainVtkContext);
uLib::Object::connect(m_mainVtkContext, &uLib::Vtk::vtkObjectsContext::PuppetAdded, [viewport](uLib::Vtk::Puppet* p) {
if (viewport && p) {
viewport->AddPuppet(*p);
viewport->ZoomAuto();
viewport->Render();
}
});
// Add any puppets that were created during m_mainVtkContext's construction
for (auto* obj : context->GetObjects()) {
if (auto* p = m_mainVtkContext->GetPuppet(obj)) {
viewport->AddPuppet(*p);
}
}
uLib::Object::connect(context, &uLib::Object::Updated, [viewport]() {
viewport->ZoomAuto();
viewport->Render();
});
viewport->ZoomAuto();
viewport->Render();
}
}
}
void MainPanel::onCreateObject(const std::string& className) {
if (!m_context) return;
auto* obj = uLib::ObjectFactory::Instance().Create(className);
if (obj) {
m_context->AddObject(obj);
}
}
void MainPanel::onOpen() {