157 lines
4.8 KiB
C++
157 lines
4.8 KiB
C++
#include "ui/ModelBrowser/PresetModelPanel.h"
|
|
|
|
#include <QApplication>
|
|
#include <QDebug>
|
|
#include <QListWidgetItem>
|
|
#include <QMimeData>
|
|
#include <QDrag>
|
|
#include <QPixmap>
|
|
#include <QPainter>
|
|
#include <QVBoxLayout>
|
|
#include <QMetaType>
|
|
#include <QHBoxLayout>
|
|
#include <QLabel>
|
|
#include <QIcon>
|
|
#include <QMouseEvent>
|
|
#include <QFontMetrics>
|
|
#include <QWidget>
|
|
|
|
#include "common/RecourceHelper.h"
|
|
#include "common/SpdLogger.h"
|
|
#include "ui/DockTitleBar.h"
|
|
#include "ui/DockWidget.h"
|
|
#include "workspace/PresetModelConfigParser.h"
|
|
|
|
#include "ui_PresetModelPanel.h"
|
|
|
|
|
|
PresetModelPanel::PresetModelPanel(QWidget *parent)
|
|
: QWidget(parent)
|
|
, ui(new Ui::PresetModelPanel)
|
|
, dragSourceWidget_(nullptr)
|
|
{
|
|
ui->setupUi(this);
|
|
InitUI();
|
|
}
|
|
|
|
PresetModelPanel::~PresetModelPanel()
|
|
{
|
|
ClearDynamicUI();
|
|
delete ui;
|
|
}
|
|
|
|
void PresetModelPanel::AttachDock(DockWidget* dockWidget)
|
|
{
|
|
if (nullptr == dockWidget) {
|
|
qDebug() << __FUNCTION__ << "dockwidget is nullptr";
|
|
return;
|
|
}
|
|
|
|
dockWidget->SetDockWidgetTitleBar(nullptr);
|
|
dockWidget->setWidget(this);
|
|
|
|
DockTitleBar* dockTitleBar = new DockTitleBar;
|
|
dockWidget->SetDockWidgetTitleBar(dockTitleBar);
|
|
}
|
|
|
|
void PresetModelPanel::InitUI()
|
|
{
|
|
// Try to load model data from configuration files
|
|
QString presetsPath = QString("%1/presets").arg(RecourceHelper::Get().GetResourcesPath());
|
|
if (PresetModelConfigParser::Get().LoadAllConfigs(presetsPath)) {
|
|
// Successfully loaded from configuration files
|
|
CreateDynamicUI();
|
|
LoadModelsFromConfig();
|
|
} else {
|
|
// Failed to load configuration files, use hardcoded defaults as fallback
|
|
LOG_WARN("Failed to load preset models from config files, using hardcoded defaults. Error: {}",
|
|
PresetModelConfigParser::Get().GetLastError().toStdString());
|
|
}
|
|
}
|
|
|
|
void PresetModelPanel::CreateDynamicUI()
|
|
{
|
|
// Clear any existing dynamic UI
|
|
ClearDynamicUI();
|
|
|
|
// Get all category names from configuration
|
|
QStringList categoryNames = PresetModelConfigParser::Get().GetCategoryNames();
|
|
|
|
if (categoryNames.isEmpty()) {
|
|
LOG_WARN("No categories found in configuration");
|
|
return;
|
|
}
|
|
|
|
// Create UI for each category
|
|
for (const QString& categoryName : categoryNames) {
|
|
ModelCategory category = PresetModelConfigParser::Get().GetCategory(categoryName);
|
|
|
|
// Create page widget
|
|
QWidget* page = new QWidget();
|
|
page->setObjectName(QString("%1Page").arg(categoryName.toLower()));
|
|
|
|
// Create layout for the page
|
|
QVBoxLayout* layout = new QVBoxLayout(page);
|
|
layout->setSpacing(0);
|
|
layout->setContentsMargins(0, 0, 0, 0);
|
|
|
|
// Create list widget
|
|
PresetModelListWidget* listWidget = new PresetModelListWidget(page);
|
|
listWidget->setObjectName(QString("%1List").arg(categoryName.toLower()));
|
|
listWidget->setDragDropMode(QAbstractItemView::DragOnly);
|
|
listWidget->setDefaultDropAction(Qt::CopyAction);
|
|
|
|
// Add list widget to layout
|
|
layout->addWidget(listWidget);
|
|
|
|
// Add page to toolbox with display name
|
|
QString displayName = category.displayName.isEmpty() ? categoryName : category.displayName;
|
|
ui->PresetModelToolBox->addItem(page, displayName);
|
|
|
|
// Store references for later use
|
|
categoryWidgets_[categoryName] = listWidget;
|
|
categoryPages_[categoryName] = page;
|
|
|
|
LOG_INFO("Created dynamic UI for category: {}", categoryName.toStdString());
|
|
}
|
|
|
|
// Set first page as current if available
|
|
if (ui->PresetModelToolBox->count() > 0) {
|
|
ui->PresetModelToolBox->setCurrentIndex(0);
|
|
}
|
|
}
|
|
|
|
void PresetModelPanel::LoadModelsFromConfig() {
|
|
// Load models for each dynamically created category
|
|
QStringList categoryNames = PresetModelConfigParser::Get().GetCategoryNames();
|
|
|
|
for (const QString& categoryName : categoryNames) {
|
|
ModelCategory category = PresetModelConfigParser::Get().GetCategory(categoryName);
|
|
|
|
if (!category.models.isEmpty() && categoryWidgets_.contains(categoryName)) {
|
|
PresetModelListWidget* listWidget = categoryWidgets_[categoryName];
|
|
listWidget->setModelType(categoryName);
|
|
listWidget->setModelList(category.models);
|
|
|
|
LOG_INFO("Loaded {} models for category: {}",
|
|
category.models.size(), categoryName.toStdString());
|
|
}
|
|
}
|
|
}
|
|
|
|
void PresetModelPanel::ClearDynamicUI()
|
|
{
|
|
// Clear all dynamic UI elements
|
|
categoryWidgets_.clear();
|
|
categoryPages_.clear();
|
|
|
|
// Remove all pages from toolbox
|
|
while (ui->PresetModelToolBox->count() > 0) {
|
|
QWidget* widget = ui->PresetModelToolBox->widget(0);
|
|
ui->PresetModelToolBox->removeItem(0);
|
|
if (widget) {
|
|
widget->deleteLater();
|
|
}
|
|
}
|
|
}
|