[UI][ADD] Model selection list

This commit is contained in:
Linloir 2022-12-17 11:42:32 +08:00
parent ffa0ac065a
commit edeaa7f3c6
No known key found for this signature in database
GPG Key ID: 58EEB209A0F2C366
2 changed files with 119 additions and 9 deletions

View File

@ -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;
}

View File

@ -1,12 +1,40 @@
#pragma once
#include <qwidget.h>
#include <qboxlayout.h>
#include <qlist.h>
//class ModelSelector : public QWidget
//{
// Q_OBJECT
//
//public:
// ModelSelector(QWidget* parent = 0);
// ~ModelSelector();
//};
#include "scrolllistwidget.h"
#include "pushbutton.h"
#include "modelselectable.h"
#include "model.h"
class ModelSelector : public QWidget
{
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);
};