#include "ui/ModelBrowser/PresetModelPanel.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #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(); } } }