GrabBag/AppUtils/UICommon/Src/ToolExtrinsicWidget.cpp

134 lines
5.3 KiB
C++

#include "ToolExtrinsicWidget.h"
#include "ui_ToolExtrinsicWidget.h"
#include <QDoubleValidator>
#include <QFont>
#include <QList>
ToolExtrinsicWidget::ToolExtrinsicWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::ToolExtrinsicWidget)
, m_groupExtrinsic(nullptr)
, m_comboEulerOrder(nullptr)
, m_editRotX(nullptr)
, m_editRotY(nullptr)
, m_editRotZ(nullptr)
, m_labelTargetOffset(nullptr)
, m_widgetTargetOffsetRow(nullptr)
, m_editOffsetX(nullptr)
, m_editOffsetY(nullptr)
, m_editOffsetZ(nullptr)
{
setupUI();
}
ToolExtrinsicWidget::~ToolExtrinsicWidget()
{
delete ui;
}
void ToolExtrinsicWidget::setData(int eulerOrder,
double rotX, double rotY, double rotZ,
double offsetX, double offsetY, double offsetZ)
{
if (m_comboEulerOrder) {
int idx = m_comboEulerOrder->findData(eulerOrder);
if (idx < 0) idx = 0;
m_comboEulerOrder->setCurrentIndex(idx);
}
if (m_editRotX) m_editRotX->setText(QString::number(rotX, 'f', 6));
if (m_editRotY) m_editRotY->setText(QString::number(rotY, 'f', 6));
if (m_editRotZ) m_editRotZ->setText(QString::number(rotZ, 'f', 6));
if (m_editOffsetX) m_editOffsetX->setText(QString::number(offsetX, 'f', 3));
if (m_editOffsetY) m_editOffsetY->setText(QString::number(offsetY, 'f', 3));
if (m_editOffsetZ) m_editOffsetZ->setText(QString::number(offsetZ, 'f', 3));
}
void ToolExtrinsicWidget::getData(int& eulerOrder,
double& rotX, double& rotY, double& rotZ,
double& offsetX, double& offsetY, double& offsetZ) const
{
eulerOrder = m_comboEulerOrder ? m_comboEulerOrder->currentData().toInt() : 11;
rotX = m_editRotX ? m_editRotX->text().trimmed().toDouble() : 0.0;
rotY = m_editRotY ? m_editRotY->text().trimmed().toDouble() : 0.0;
rotZ = m_editRotZ ? m_editRotZ->text().trimmed().toDouble() : 0.0;
offsetX = m_editOffsetX ? m_editOffsetX->text().trimmed().toDouble() : 0.0;
offsetY = m_editOffsetY ? m_editOffsetY->text().trimmed().toDouble() : 0.0;
offsetZ = m_editOffsetZ ? m_editOffsetZ->text().trimmed().toDouble() : 0.0;
}
void ToolExtrinsicWidget::setTargetOffsetVisible(bool visible)
{
if (m_labelTargetOffset) m_labelTargetOffset->setVisible(visible);
if (m_widgetTargetOffsetRow) m_widgetTargetOffsetRow->setVisible(visible);
}
void ToolExtrinsicWidget::initEulerOrderComboBox()
{
if (!m_comboEulerOrder) return;
m_comboEulerOrder->addItem(QStringLiteral("RZ-RY-RX (外旋ZYX)"), 11);
m_comboEulerOrder->addItem(QStringLiteral("RX-RY-RZ (外旋XYZ)"), 10);
m_comboEulerOrder->addItem(QStringLiteral("RZ-RX-RY (外旋ZXY)"), 12);
m_comboEulerOrder->addItem(QStringLiteral("RY-RX-RZ (外旋YXZ)"), 13);
m_comboEulerOrder->addItem(QStringLiteral("RY-RZ-RX (外旋YZX)"), 14);
m_comboEulerOrder->addItem(QStringLiteral("RX-RZ-RY (外旋XZY)"), 15);
m_comboEulerOrder->setCurrentIndex(0);
}
void ToolExtrinsicWidget::setupUI()
{
ui->setupUi(this);
QFont font;
font.setPointSize(16);
setStyleSheet(
"QLabel { color: rgb(221, 225, 233); }"
"QLineEdit { color: rgb(221, 225, 233); background-color: rgb(47, 48, 52); "
"border: 1px solid rgb(70, 72, 78); padding: 4px; }"
"QComboBox { color: rgb(221, 225, 233); background-color: rgb(47, 48, 52); "
"border: 1px solid rgb(70, 72, 78); padding: 6px; }"
"QComboBox QAbstractItemView { color: rgb(221, 225, 233); background-color: rgb(47, 48, 52); "
"selection-background-color: rgb(70, 100, 150); }"
"QGroupBox { color: rgb(221, 225, 233); border: 1px solid rgb(100, 100, 100); "
"border-radius: 4px; margin-top: 12px; padding-top: 8px; }"
"QGroupBox::title { subcontrol-origin: margin; left: 10px; padding: 0 3px 0 3px; }");
const QList<QWidget*> widgets = findChildren<QWidget*>();
for (QWidget* widget : widgets) {
widget->setFont(font);
}
m_groupExtrinsic = ui->groupExtrinsic;
m_comboEulerOrder = ui->comboEulerOrder;
m_editRotX = ui->editRotX;
m_editRotY = ui->editRotY;
m_editRotZ = ui->editRotZ;
m_labelTargetOffset = ui->labelTargetOffset;
m_widgetTargetOffsetRow = ui->widgetTargetOffsetRow;
m_editOffsetX = ui->editOffsetX;
m_editOffsetY = ui->editOffsetY;
m_editOffsetZ = ui->editOffsetZ;
initEulerOrderComboBox();
auto* validatorX = new QDoubleValidator(-360.0, 360.0, 6, this);
validatorX->setNotation(QDoubleValidator::StandardNotation);
auto* validatorY = new QDoubleValidator(-360.0, 360.0, 6, this);
validatorY->setNotation(QDoubleValidator::StandardNotation);
auto* validatorZ = new QDoubleValidator(-360.0, 360.0, 6, this);
validatorZ->setNotation(QDoubleValidator::StandardNotation);
m_editRotX->setValidator(validatorX);
m_editRotY->setValidator(validatorY);
m_editRotZ->setValidator(validatorZ);
auto* validatorTargetOffset = new QDoubleValidator(-10000.0, 10000.0, 3, this);
validatorTargetOffset->setNotation(QDoubleValidator::StandardNotation);
m_editOffsetX->setValidator(validatorTargetOffset);
m_editOffsetY->setValidator(validatorTargetOffset);
m_editOffsetZ->setValidator(validatorTargetOffset);
setTargetOffsetVisible(false);
setData(11, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
}