From edeaa7f3c651971657649dc8b51363fd493b5bb2 Mon Sep 17 00:00:00 2001 From: Linloir <3145078758@qq.com> Date: Sat, 17 Dec 2022 11:42:32 +0800 Subject: [PATCH] [UI][ADD] Model selection list --- FinalProject/modelselector.cpp | 84 +++++++++++++++++++++++++++++++++- FinalProject/modelselector.h | 44 ++++++++++++++---- 2 files changed, 119 insertions(+), 9 deletions(-) diff --git a/FinalProject/modelselector.cpp b/FinalProject/modelselector.cpp index 6f70f09..c7c37c6 100644 --- a/FinalProject/modelselector.cpp +++ b/FinalProject/modelselector.cpp @@ -1 +1,83 @@ -#pragma once +#include + +#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; +} diff --git a/FinalProject/modelselector.h b/FinalProject/modelselector.h index 252e624..0391f8e 100644 --- a/FinalProject/modelselector.h +++ b/FinalProject/modelselector.h @@ -1,12 +1,40 @@ #pragma once #include +#include +#include -//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 _objectSelectables; + +private: + // Slot functions + void addNewObject(); + + // Util functions + QString getNewObjectPath(); + Model* loadObject(const QString& path); + void removeObject(ModelSelectable* selectable); + +signals: + void onObjectSelected(Model* selectedModel); +};