feat: Add animated home button to view cube to reset camera

Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
This commit is contained in:
2026-02-17 16:56:25 -07:00
parent 405e151f12
commit c28c080009
5 changed files with 122 additions and 4 deletions

View File

@@ -5,10 +5,12 @@
#include <QOpenGLShaderProgram>
#include <QOpenGLTexture>
#include <QScreen>
#include <QSvgRenderer>
#include <QVector>
ViewCube::ViewCube()
{
m_homeButtonRenderer = new QSvgRenderer(QString(":/icons/rectangle.svg"));
for (int i = 0; i < 6; ++i) {
m_faceTextures[i] = nullptr;
}
@@ -20,6 +22,7 @@ ViewCube::~ViewCube()
delete m_faceTextures[i];
}
delete m_textureShaderProgram;
delete m_homeButtonRenderer;
m_cubeVbo.destroy();
m_cubeVao.destroy();
m_axesVbo.destroy();
@@ -42,10 +45,9 @@ void ViewCube::paintGL(QOpenGLShaderProgram* simpleShader, int simpleShaderColor
QRect viewCubeRect(width - viewCubeSize, 0, viewCubeSize, viewCubeSize);
QPoint physicalMousePos = mousePos * QGuiApplication::primaryScreen()->devicePixelRatio();
float opacity = 0.5f;
if (viewCubeRect.contains(physicalMousePos)) {
opacity = 1.0f;
}
m_isHovered = viewCubeRect.contains(physicalMousePos);
float opacity = m_isHovered ? 1.0f : 0.5f;
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
@@ -210,3 +212,39 @@ void ViewCube::drawAxes(QOpenGLShaderProgram* simpleShader, int colorLoc, const
glLineWidth(1.0f);
}
void ViewCube::paint2D(QPainter& painter, int widgetWidth, int widgetHeight)
{
if (!m_isHovered) {
return;
}
int viewCubeSize = 150; // logical pixels
int buttonSize = 24;
int buttonMargin = 8;
int viewCubeX = widgetWidth - viewCubeSize;
int viewCubeY = 0;
m_homeButtonRect = QRect(viewCubeX - buttonMargin - buttonSize, viewCubeY, buttonSize, buttonSize);
if (m_homeButtonRenderer && m_homeButtonRenderer->isValid()) {
m_homeButtonRenderer->render(&painter, m_homeButtonRect);
}
}
bool ViewCube::handleMousePress(const QPoint& pos, int widgetWidth, int widgetHeight)
{
if (!m_isHovered) {
return false;
}
int viewCubeSize = 150;
int buttonSize = 24;
int buttonMargin = 8;
int viewCubeX = widgetWidth - viewCubeSize;
int viewCubeY = 0;
QRect homeButtonRect(viewCubeX - buttonMargin - buttonSize, viewCubeY, buttonSize, buttonSize);
return homeButtonRect.contains(pos);
}