#include "vtkQViewport.h" #include #include #include #include #include #include #include #include #include namespace uLib { namespace Vtk { QViewport::QViewport(QWidget* parent) : QWidget(parent) , Viewport() , m_VtkWidget(nullptr) , m_GridButton(nullptr) { // Build the layout – zero margins so VTK fills the entire widget auto* layout = new QVBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(0); m_VtkWidget = new QVTKOpenGLNativeWidget(this); layout->addWidget(m_VtkWidget); // Grid Toggle Button m_GridButton = new QPushButton(m_VtkWidget); m_GridButton->setText("#"); m_GridButton->setFixedSize(40, 40); m_GridButton->setToolTip("Toggle Grid"); m_GridButton->setStyleSheet( "QPushButton {" " border-radius: 20px;" // Perfectly circular " background-color: rgba(40, 40, 40, 180);" " color: white;" " font-size: 22px;" " border: 1.5px solid rgba(255, 255, 255, 60);" "}" "QPushButton:hover {" " background-color: rgba(70, 70, 70, 200);" " border: 1.5px solid rgba(255, 255, 255, 100);" "}" "QPushButton:checked {" " background-color: rgba(0, 120, 215, 200);" // Nice "active" blue " color: white;" " border: 1.5px solid rgba(255, 255, 255, 120);" "}" "QPushButton:pressed {" " background-color: rgba(0, 90, 160, 220);" "}" ); m_GridButton->setCheckable(true); m_GridButton->setChecked(true); // Grid is on by default connect(m_GridButton, &QPushButton::clicked, this, &QViewport::onGridButtonClicked); // After the Qt widget exists but before the first paint, // attach the renderer and configure the pipeline. SetupPipeline(); } QViewport::~QViewport() { } void QViewport::SetupPipeline() { // Add our renderer to the QVTKOpenGLNativeWidget's render window ::vtkRenderWindow* rw = m_VtkWidget->renderWindow(); rw->AddRenderer(this->GetRenderer()); // Common setup Viewport::SetupPipeline(rw->GetInteractor()); } // ── Public API ──────────────────────────────────────────────────────────────── void QViewport::Render() { if (m_VtkWidget && m_VtkWidget->renderWindow()) m_VtkWidget->renderWindow()->Render(); } vtkRenderWindow* QViewport::GetRenderWindow() { return m_VtkWidget->renderWindow(); } vtkRenderWindowInteractor* QViewport::GetInteractor() { return m_VtkWidget->renderWindow()->GetInteractor(); } void QViewport::onGridButtonClicked() { SetGridVisible(m_GridButton->isChecked()); } void QViewport::OnSelectionChanged(Puppet* p) { emit puppetSelected(p); } void QViewport::resizeEvent(QResizeEvent* event) { QWidget::resizeEvent(event); if (m_GridButton) { // Position under the gizmo (top-right corner). // Standard CameraOrientationWidget is usually 150-180px. int x = width() - m_GridButton->width() - 10; int y = 160; m_GridButton->move(x, y); } } } // namespace Vtk } // namespace uLib