| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #include <QPainter> |
| #include <QPaintEvent> |
|
|
|
|
| #include <App/Document.h> |
| #include <Gui/Application.h> |
| #include <Gui/BitmapFactory.h> |
| #include <Gui/Document.h> |
| #include <Gui/Selection/Selection.h> |
| #include <Gui/ViewProvider.h> |
| #include <Gui/ViewProviderDocumentObject.h> |
|
|
| #include "DlgInspectAppearance.h" |
| #include "ui_DlgInspectAppearance.h" |
|
|
|
|
| using namespace MatGui; |
|
|
| ColorWidget::ColorWidget(const Base::Color& color, QWidget* parent) |
| : QWidget(parent) |
| { |
| _color = color.asValue<QColor>(); |
| } |
|
|
| void ColorWidget::paintEvent(QPaintEvent* event) |
| { |
| QPainter painter(this); |
|
|
| |
| auto color = QColor(255, 255, 255); |
| auto left = event->rect().left(); |
| auto width = event->rect().width(); |
| painter.fillRect(left, event->rect().top(), width, event->rect().height(), QBrush(color)); |
|
|
| |
| color = QColor(0, 0, 0); |
| left = event->rect().left() + 2; |
| width = event->rect().width() - 4; |
| if (event->rect().width() > 75) { |
| left += (event->rect().width() - 75) / 2; |
| width = 71; |
| } |
| painter.fillRect(left, event->rect().top() + 2, width, event->rect().height() - 4, QBrush(color)); |
|
|
| |
| left = event->rect().left() + 5; |
| width = event->rect().width() - 10; |
| if (event->rect().width() > 75) { |
| left += (event->rect().width() - 75) / 2; |
| width = 65; |
| } |
| painter.fillRect(left, event->rect().top() + 5, width, event->rect().height() - 10, QBrush(_color)); |
| } |
|
|
| |
|
|
| DlgInspectAppearance::DlgInspectAppearance(QWidget* parent) |
| : QWidget(parent) |
| , ui(new Ui_DlgInspectAppearance) |
| { |
| ui->setupUi(this); |
|
|
| std::vector<Gui::ViewProvider*> views = getSelection(); |
| update(views); |
|
|
| Gui::Selection().Attach(this); |
| } |
|
|
| DlgInspectAppearance::~DlgInspectAppearance() |
| { |
| Gui::Selection().Detach(this); |
| } |
|
|
| bool DlgInspectAppearance::accept() |
| { |
| return true; |
| } |
|
|
| std::vector<Gui::ViewProvider*> DlgInspectAppearance::getSelection() const |
| { |
| std::vector<Gui::ViewProvider*> views; |
|
|
| |
| std::vector<Gui::SelectionSingleton::SelObj> sel = |
| Gui::Selection().getSelection(nullptr, Gui::ResolveMode::OldStyleElement, true); |
| for (const auto& it : sel) { |
| Gui::ViewProvider* view = |
| Gui::Application::Instance->getDocument(it.pDoc)->getViewProvider(it.pObject); |
| views.push_back(view); |
| } |
|
|
| return views; |
| } |
|
|
| |
| void DlgInspectAppearance::OnChange(Gui::SelectionSingleton::SubjectType& rCaller, |
| Gui::SelectionSingleton::MessageType Reason) |
| { |
| Q_UNUSED(rCaller); |
|
|
| if (Reason.Type == Gui::SelectionChanges::AddSelection |
| || Reason.Type == Gui::SelectionChanges::RmvSelection |
| || Reason.Type == Gui::SelectionChanges::SetSelection |
| || Reason.Type == Gui::SelectionChanges::ClrSelection) { |
| std::vector<Gui::ViewProvider*> views = getSelection(); |
| update(views); |
| } |
| } |
| |
|
|
| void DlgInspectAppearance::update(std::vector<Gui::ViewProvider*>& views) |
| { |
| App::Document* doc = App::GetApplication().getActiveDocument(); |
| if (doc) { |
| ui->editDocument->setText(QString::fromUtf8(doc->Label.getValue())); |
|
|
| if (views.size() == 1) { |
| auto view = dynamic_cast<Gui::ViewProviderDocumentObject*>(views[0]); |
| if (!view) { |
| return; |
| } |
| auto* obj = view->getObject(); |
| if (!obj) { |
| return; |
| } |
| auto* labelProp = dynamic_cast<App::PropertyString*>(obj->getPropertyByName("Label")); |
| if (labelProp) { |
| ui->editObjectLabel->setText(QString::fromUtf8(labelProp->getValue())); |
| } |
| else { |
| ui->editObjectLabel->setText(QStringLiteral("")); |
| } |
| ui->editObjectName->setText(QLatin1String(obj->getNameInDocument())); |
|
|
| auto subElement = Gui::Selection().getSelectionEx(); |
| if (subElement.size() > 0) { |
| auto& subObject = subElement[0]; |
| if (subObject.getSubNames().size() > 0) { |
| ui->editSubShape->setText(QString::fromStdString(subObject.getSubNames()[0])); |
| } |
| else { |
| ui->editSubShape->setText(QStringLiteral("")); |
| } |
| } |
| else { |
| ui->editSubShape->setText(QStringLiteral("")); |
| } |
|
|
| auto subShapeType = QString::fromUtf8(obj->getTypeId().getName()); |
| subShapeType.remove(subShapeType.indexOf(QStringLiteral("::")), subShapeType.size()); |
| ui->editSubShapeType->setText(subShapeType); |
| ui->editShapeType->setText(QString::fromUtf8(obj->getTypeId().getName())); |
|
|
| ui->tabAppearance->clear(); |
| if (labelProp && QString::fromUtf8(labelProp->getValue()).size() > 0) { |
| auto* prop = |
| dynamic_cast<App::PropertyMaterialList*>(view->getPropertyByName("ShapeAppearance")); |
| if (prop) { |
| for (int index = 0; index < prop->getSize(); index++) { |
| auto& material = (prop->getValues())[index]; |
| auto* tab = makeAppearanceTab(material); |
| ui->tabAppearance->addTab(tab, QString::number(index)); |
| } |
| } |
| } |
| } |
| } |
| } |
|
|
| QWidget* DlgInspectAppearance::makeAppearanceTab(const App::Material& material) |
| { |
| QWidget* tab = new QWidget(this); |
|
|
| auto* grid = new QGridLayout(); |
| tab->setLayout(grid); |
|
|
| int row = 0; |
| auto* labelDiffuse = new QLabel(); |
| labelDiffuse->setText(tr("Diffuse color")); |
| labelDiffuse->setToolTip( |
| tr("Defines the base color of a surface when illuminated by light. It represents how the " |
| "object scatters light evenly in all directions, independent of the viewer’s angle. " |
| "This property will influence the material color the most.")); |
| auto* colorDiffuse = new ColorWidget(material.diffuseColor); |
| colorDiffuse->setMaximumHeight(23); |
|
|
| grid->addWidget(labelDiffuse, row, 0); |
| grid->addWidget(colorDiffuse, row, 1); |
| row += 1; |
|
|
| auto* labelAmbient = new QLabel(); |
| labelAmbient->setText(tr("Ambient color")); |
| labelAmbient->setToolTip( |
| tr("Defines the color of a surface under indirect, uniform lighting, representing how it " |
| "appears when illuminated only by ambient light in a scene, without directional light, " |
| "shading, or highlights")); |
| auto* colorAmbient = new ColorWidget(material.ambientColor); |
| colorAmbient->setMaximumHeight(23); |
|
|
| grid->addWidget(labelAmbient, row, 0); |
| grid->addWidget(colorAmbient, row, 1); |
| row += 1; |
|
|
| auto* labelEmissive = new QLabel(); |
| labelEmissive->setText(tr("Emissive color")); |
| labelEmissive->setToolTip( |
| tr("Defines the color of a surface that appears to emit as if it were a light source, " |
| "independent of external lighting, making the object look self-illuminated. Set to " |
| "black to have no emissive color.")); |
| auto* colorEmissive = new ColorWidget(material.emissiveColor); |
| colorEmissive->setMaximumHeight(23); |
|
|
| grid->addWidget(labelEmissive, row, 0); |
| grid->addWidget(colorEmissive, row, 1); |
| row += 1; |
|
|
| auto* labelSpecular = new QLabel(); |
| labelSpecular->setText(tr("Specular color")); |
| labelSpecular->setToolTip( |
| tr("Defines the color and intensity of the bright, mirror-like highlights that appear on " |
| "shiny or reflective surfaces when light hits them directly. Set to bright colors for " |
| "shiny objects.")); |
| auto* colorSpecular = new ColorWidget(material.specularColor); |
| colorSpecular->setMaximumHeight(23); |
|
|
| grid->addWidget(labelSpecular, row, 0); |
| grid->addWidget(colorSpecular, row, 1); |
| row += 1; |
|
|
| auto* labelShininess = new QLabel(); |
| labelShininess->setText(tr("Shininess")); |
| labelShininess->setToolTip( |
| tr("Defines the size and sharpness of specular highlights on a surface. Higher values " |
| "produce small, sharp highlights, while lower values create broad, soft highlights. " |
| "Note that the highlight intensity is defined by specular color.")); |
| auto* editShininess = new QLineEdit(); |
| editShininess->setText(QString::number(material.shininess)); |
| editShininess->setEnabled(false); |
|
|
| grid->addWidget(labelShininess, row, 0); |
| grid->addWidget(editShininess, row, 1); |
| row += 1; |
|
|
| auto* labelTransparency = new QLabel(); |
| labelTransparency->setText(tr("Transparency")); |
| labelTransparency->setToolTip(tr("Defines how much light passes through an object, making it " |
| "partially or fully see-through")); |
| auto* editTransparency = new QLineEdit(); |
| editTransparency->setText(QString::number(material.transparency)); |
| editTransparency->setEnabled(false); |
|
|
| grid->addWidget(labelTransparency, row, 0); |
| grid->addWidget(editTransparency, row, 1); |
|
|
| return tab; |
| } |
|
|
|
|
| |
|
|
| TaskInspectAppearance::TaskInspectAppearance() |
| { |
| widget = new DlgInspectAppearance(); |
| addTaskBox(Gui::BitmapFactory().pixmap("Part_Loft"), widget); |
| } |
|
|
| TaskInspectAppearance::~TaskInspectAppearance() = default; |
|
|
| void TaskInspectAppearance::open() |
| {} |
|
|
| void TaskInspectAppearance::clicked(int) |
| {} |
|
|
| bool TaskInspectAppearance::accept() |
| { |
| return widget->accept(); |
| } |
|
|
| #include "moc_DlgInspectAppearance.cpp" |
|
|