mirror of
https://github.com/Linloir/SceneEditor.git
synced 2025-12-18 07:58:11 +08:00
[UI][ADD] Model selection list
This commit is contained in:
parent
ffa0ac065a
commit
edeaa7f3c6
@ -1 +1,83 @@
|
|||||||
#pragma once
|
#include <qfiledialog.h>
|
||||||
|
|
||||||
|
#include "modelselector.h"
|
||||||
|
|
||||||
|
ModelSelector::ModelSelector(QWidget* parent) :
|
||||||
|
QWidget(parent)
|
||||||
|
{
|
||||||
|
// Set maximum width
|
||||||
|
setMaximumWidth(240);
|
||||||
|
|
||||||
|
// Set up the main layout
|
||||||
|
_stretchLayout = new QVBoxLayout(this);
|
||||||
|
_stretchLayout->setContentsMargins(0, 0, 0, 0);
|
||||||
|
_stretchLayout->setSpacing(8);
|
||||||
|
setLayout(_stretchLayout);
|
||||||
|
|
||||||
|
// Create and add the 'add new' button
|
||||||
|
_addNewObjectBtn = new PushButton(nullptr, this);
|
||||||
|
_addNewObjectBtn->setChildWidget(new QLabel("Add New", _addNewObjectBtn));
|
||||||
|
_addNewObjectBtn->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
|
||||||
|
_addNewObjectBtn->setMargin(32, 24, 32, 24);
|
||||||
|
_addNewObjectBtn->setRadius(10);
|
||||||
|
_addNewObjectBtn->setBackgroundColor(QColor(58, 143, 183, 20));
|
||||||
|
_stretchLayout->addWidget(_addNewObjectBtn);
|
||||||
|
_addNewObjectBtn->show();
|
||||||
|
|
||||||
|
// Create the selection list widget
|
||||||
|
_objectList = new ScrollListWidget(this);
|
||||||
|
_stretchLayout->addWidget(_objectList);
|
||||||
|
_objectList->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
||||||
|
_objectList->show();
|
||||||
|
|
||||||
|
// Connect
|
||||||
|
connect(_addNewObjectBtn, &PushButton::onClick, this, &ModelSelector::addNewObject);
|
||||||
|
}
|
||||||
|
|
||||||
|
ModelSelector::~ModelSelector() {}
|
||||||
|
|
||||||
|
void ModelSelector::addNewObject() {
|
||||||
|
QString path = getNewObjectPath();
|
||||||
|
if (path.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Model* model = loadObject(path);
|
||||||
|
ModelSelectable* newSelectable = new ModelSelectable(model, this);
|
||||||
|
|
||||||
|
_objectSelectables.push_back(newSelectable);
|
||||||
|
_objectList->addWidget(newSelectable);
|
||||||
|
|
||||||
|
connect(newSelectable, &ModelSelectable::onSelected, this, [=]() {
|
||||||
|
emit onObjectSelected(model);
|
||||||
|
});
|
||||||
|
connect(newSelectable, &ModelSelectable::onRemoved, this, [=]() {
|
||||||
|
removeObject(newSelectable);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
QString ModelSelector::getNewObjectPath() {
|
||||||
|
QString path = QFileDialog::getOpenFileName(this, "Select Model", "", "Model Files (*.obj)");
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
Model* ModelSelector::loadObject(const QString& path) {
|
||||||
|
Model* model = new Model(path.toStdString());
|
||||||
|
return model;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ModelSelector::removeObject(ModelSelectable* selectable) {
|
||||||
|
// Check if selectable is still in list
|
||||||
|
if (!_objectSelectables.contains(selectable)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove the selectable from the list
|
||||||
|
_objectSelectables.removeAll(selectable);
|
||||||
|
|
||||||
|
// Remove the selectable from the list widget
|
||||||
|
_objectList->removeWidget(selectable);
|
||||||
|
|
||||||
|
// Delete the selectable
|
||||||
|
delete selectable;
|
||||||
|
}
|
||||||
|
|||||||
@ -1,12 +1,40 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <qwidget.h>
|
#include <qwidget.h>
|
||||||
|
#include <qboxlayout.h>
|
||||||
|
#include <qlist.h>
|
||||||
|
|
||||||
//class ModelSelector : public QWidget
|
#include "scrolllistwidget.h"
|
||||||
//{
|
#include "pushbutton.h"
|
||||||
// Q_OBJECT
|
#include "modelselectable.h"
|
||||||
//
|
#include "model.h"
|
||||||
//public:
|
|
||||||
// ModelSelector(QWidget* parent = 0);
|
class ModelSelector : public QWidget
|
||||||
// ~ModelSelector();
|
{
|
||||||
//};
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
ModelSelector(QWidget* parent = 0);
|
||||||
|
~ModelSelector();
|
||||||
|
|
||||||
|
private:
|
||||||
|
// UI elements
|
||||||
|
QVBoxLayout* _stretchLayout = nullptr;
|
||||||
|
PushButton* _addNewObjectBtn = nullptr;
|
||||||
|
ScrollListWidget* _objectList = nullptr;
|
||||||
|
|
||||||
|
// Object selection storage
|
||||||
|
QList<ModelSelectable*> _objectSelectables;
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Slot functions
|
||||||
|
void addNewObject();
|
||||||
|
|
||||||
|
// Util functions
|
||||||
|
QString getNewObjectPath();
|
||||||
|
Model* loadObject(const QString& path);
|
||||||
|
void removeObject(ModelSelectable* selectable);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void onObjectSelected(Model* selectedModel);
|
||||||
|
};
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user