DYTSrouce/src/ui/ModelBrowser/PresetModelPanel.cpp
2025-11-02 00:02:20 +08:00

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();
}
}
}