Add bone nodes picking interface
parent
d736d86969
commit
12e7eacea2
|
@ -4,7 +4,6 @@
|
||||||
#include "bone_property_widget.h"
|
#include "bone_property_widget.h"
|
||||||
#include "document.h"
|
#include "document.h"
|
||||||
#include "theme.h"
|
#include "theme.h"
|
||||||
#include <QMenu>
|
|
||||||
#include <QVBoxLayout>
|
#include <QVBoxLayout>
|
||||||
#include <QWidgetAction>
|
#include <QWidgetAction>
|
||||||
|
|
||||||
|
@ -76,15 +75,23 @@ void BoneManageWidget::showSelectedBoneProperties()
|
||||||
|
|
||||||
auto* propertyWidget = new BonePropertyWidget(m_document, boneIds);
|
auto* propertyWidget = new BonePropertyWidget(m_document, boneIds);
|
||||||
|
|
||||||
auto menu = std::make_unique<QMenu>(this->parentWidget());
|
m_propertyMenu = std::make_unique<QMenu>(this->parentWidget());
|
||||||
QWidgetAction* widgetAction = new QWidgetAction(menu.get());
|
|
||||||
|
connect(propertyWidget, &BonePropertyWidget::pickBoneJoints, this, [this]() {
|
||||||
|
if (nullptr == this->m_propertyMenu)
|
||||||
|
return;
|
||||||
|
this->m_document->setEditMode(Document::EditMode::Pick);
|
||||||
|
this->m_propertyMenu->close();
|
||||||
|
});
|
||||||
|
|
||||||
|
QWidgetAction* widgetAction = new QWidgetAction(m_propertyMenu.get());
|
||||||
widgetAction->setDefaultWidget(propertyWidget);
|
widgetAction->setDefaultWidget(propertyWidget);
|
||||||
menu->addAction(widgetAction);
|
m_propertyMenu->addAction(widgetAction);
|
||||||
|
|
||||||
auto x = mapToGlobal(QPoint(0, 0)).x();
|
auto x = mapToGlobal(QPoint(0, 0)).x();
|
||||||
if (x <= 0)
|
if (x <= 0)
|
||||||
x = QCursor::pos().x();
|
x = QCursor::pos().x();
|
||||||
menu->exec(QPoint(
|
m_propertyMenu->exec(QPoint(
|
||||||
x - propertyWidget->width(),
|
x - propertyWidget->width(),
|
||||||
QCursor::pos().y()));
|
QCursor::pos().y()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
#ifndef DUST3D_APPLICATION_BONE_MANAGE_WIDGET_H_
|
#ifndef DUST3D_APPLICATION_BONE_MANAGE_WIDGET_H_
|
||||||
#define DUST3D_APPLICATION_BONE_MANAGE_WIDGET_H_
|
#define DUST3D_APPLICATION_BONE_MANAGE_WIDGET_H_
|
||||||
|
|
||||||
|
#include <QMenu>
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
#include <dust3d/base/uuid.h>
|
#include <dust3d/base/uuid.h>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
class Document;
|
class Document;
|
||||||
class BonePreviewGridWidget;
|
class BonePreviewGridWidget;
|
||||||
|
@ -29,6 +31,7 @@ private:
|
||||||
QPushButton* m_addButton = nullptr;
|
QPushButton* m_addButton = nullptr;
|
||||||
QPushButton* m_selectButton = nullptr;
|
QPushButton* m_selectButton = nullptr;
|
||||||
QPushButton* m_propertyButton = nullptr;
|
QPushButton* m_propertyButton = nullptr;
|
||||||
|
std::unique_ptr<QMenu> m_propertyMenu;
|
||||||
void updateToolButtons();
|
void updateToolButtons();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#include "float_number_widget.h"
|
#include "float_number_widget.h"
|
||||||
#include "image_preview_widget.h"
|
#include "image_preview_widget.h"
|
||||||
#include "theme.h"
|
#include "theme.h"
|
||||||
|
#include <QComboBox>
|
||||||
#include <QGroupBox>
|
#include <QGroupBox>
|
||||||
#include <QHBoxLayout>
|
#include <QHBoxLayout>
|
||||||
#include <QLineEdit>
|
#include <QLineEdit>
|
||||||
|
@ -33,7 +34,23 @@ BonePropertyWidget::BonePropertyWidget(Document* document,
|
||||||
renameLayout->addWidget(m_nameEdit);
|
renameLayout->addWidget(m_nameEdit);
|
||||||
renameLayout->addStretch();
|
renameLayout->addStretch();
|
||||||
|
|
||||||
|
m_jointsWidget = new IntNumberWidget;
|
||||||
|
m_jointsWidget->setRange(2, 10);
|
||||||
|
|
||||||
|
QPushButton* nodePicker = new QPushButton(QChar(fa::eyedropper));
|
||||||
|
nodePicker->setToolTip(tr("Click node one by one on canvas as joints in order"));
|
||||||
|
Theme::initIconButton(nodePicker);
|
||||||
|
|
||||||
|
connect(nodePicker, &QPushButton::clicked, this, &BonePropertyWidget::pickBoneJoints);
|
||||||
|
|
||||||
|
QHBoxLayout* jointsLayout = new QHBoxLayout;
|
||||||
|
jointsLayout->addWidget(new QLabel(tr("Joints")));
|
||||||
|
jointsLayout->addWidget(m_jointsWidget);
|
||||||
|
jointsLayout->addStretch();
|
||||||
|
jointsLayout->addWidget(nodePicker);
|
||||||
|
|
||||||
mainLayout->addLayout(renameLayout);
|
mainLayout->addLayout(renameLayout);
|
||||||
|
mainLayout->addLayout(jointsLayout);
|
||||||
}
|
}
|
||||||
|
|
||||||
mainLayout->setSizeConstraint(QLayout::SetFixedSize);
|
mainLayout->setSizeConstraint(QLayout::SetFixedSize);
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#define DUST3D_APPLICATION_BONE_PROPERTY_WIDGET_H_
|
#define DUST3D_APPLICATION_BONE_PROPERTY_WIDGET_H_
|
||||||
|
|
||||||
#include "document.h"
|
#include "document.h"
|
||||||
|
#include "int_number_widget.h"
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
#include <dust3d/base/uuid.h>
|
#include <dust3d/base/uuid.h>
|
||||||
|
|
||||||
|
@ -12,6 +13,7 @@ class BonePropertyWidget : public QWidget {
|
||||||
signals:
|
signals:
|
||||||
void renameBone(const dust3d::Uuid& boneId, const QString& name);
|
void renameBone(const dust3d::Uuid& boneId, const QString& name);
|
||||||
void groupOperationAdded();
|
void groupOperationAdded();
|
||||||
|
void pickBoneJoints();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BonePropertyWidget(Document* document,
|
BonePropertyWidget(Document* document,
|
||||||
|
@ -26,6 +28,7 @@ private:
|
||||||
dust3d::Uuid m_boneId;
|
dust3d::Uuid m_boneId;
|
||||||
const Document::Bone* m_bone = nullptr;
|
const Document::Bone* m_bone = nullptr;
|
||||||
QLineEdit* m_nameEdit = nullptr;
|
QLineEdit* m_nameEdit = nullptr;
|
||||||
|
IntNumberWidget* m_jointsWidget = nullptr;
|
||||||
void prepareBoneIds();
|
void prepareBoneIds();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ IntNumberWidget::IntNumberWidget(QWidget* parent, bool singleLine)
|
||||||
{
|
{
|
||||||
m_slider = new QSlider(Qt::Horizontal, this);
|
m_slider = new QSlider(Qt::Horizontal, this);
|
||||||
m_slider->setRange(0, 100);
|
m_slider->setRange(0, 100);
|
||||||
m_slider->setFixedWidth(240);
|
m_slider->setFixedWidth(Theme::sidebarPreferredWidth * 0.6);
|
||||||
|
|
||||||
m_label = new QLabel(this);
|
m_label = new QLabel(this);
|
||||||
m_label->setAlignment(Qt::AlignLeft);
|
m_label->setAlignment(Qt::AlignLeft);
|
||||||
|
|
|
@ -705,8 +705,7 @@ void SkeletonGraphicsWidget::updateCursor()
|
||||||
setCursor(Qt::CrossCursor);
|
setCursor(Qt::CrossCursor);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
unsetCursor();
|
setCursor(Qt::ArrowCursor);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
emit cursorChanged();
|
emit cursorChanged();
|
||||||
|
@ -827,7 +826,7 @@ bool SkeletonGraphicsWidget::mouseMove(QMouseEvent* event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Document::EditMode::Select == m_document->editMode || Document::EditMode::Add == m_document->editMode) {
|
if (Document::EditMode::Select == m_document->editMode || Document::EditMode::Add == m_document->editMode || Document::EditMode::Pick == m_document->editMode) {
|
||||||
|
|
||||||
//
|
//
|
||||||
// > For overlapping nodes, you can make it a bit better by selecting the node center nearest the mouse, rather than simply checking against the wider circle.
|
// > For overlapping nodes, you can make it a bit better by selecting the node center nearest the mouse, rather than simply checking against the wider circle.
|
||||||
|
|
Loading…
Reference in New Issue