diff --git a/src/translations/Dyt_zh_CN.ts b/src/translations/Dyt_zh_CN.ts index a151b381..d835e0f3 100644 --- a/src/translations/Dyt_zh_CN.ts +++ b/src/translations/Dyt_zh_CN.ts @@ -4,397 +4,391 @@ AddCurveFileDlg - - + + Add Curve Data File - + File Selection - + File Path: - + Select curve data file... - + ... - + File Name: - - + + - - + File Size: - + Chart Properties - + Chart Name: - + Chart 1 - + Enter chart name... - + Chart Type: - + X Axis Title: - + Enter X axis title... - + Y Axis Title: - + Enter Y axis title... - + Time: - + Axis Range Settings - + X Tick Count: - + X Min: - + Y Max: - + Y Min: - + X Max: - + Y Tick Count: - + Curve Management - + Curves: - + Add Curve - + Remove - + Selected Curve Properties - + Curve Name: - + Enter curve name... - + Curve Color: - + Select Color - + background-color: rgb(255, 0, 0); border: 1px solid black; - + Data Start: - + Data Stop: - + X Value: - + Y Value: - + Add File - + Cancel - + Curve %1 - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + - - + + + + + + Validation Error - + Please select a data file. - + Selected file does not exist. - + Selected file is not readable. Please check file permissions. - + File is too large (over 100MB). Please select a smaller file. - + At least one curve must be defined. - + Curve %1 name cannot be empty. - + Curve name '%1' is duplicated. Please use different names. - + Curve name '%1' is too long. Please limit to 50 characters. - + Curve '%1' start and stop values must be greater than 0. - + Curve '%1' start value cannot be greater than stop value. - + Curve '%1' data range is too small. At least 2 data points are required. - + Curve '%1' stop value is too large. Please ensure it does not exceed 1000000. - + Curve '%1' X value is out of range. Please ensure it is between -1000000 and 1000000. - + Curve '%1' Y value is out of range. Please ensure it is between -1000000 and 1000000. - + Chart name cannot be empty. - + Chart name is too long. Please limit to 100 characters. - + X axis title is too long. Please limit to 50 characters. - + Y axis title is too long. Please limit to 50 characters. - + X axis minimum value must be less than maximum value. - + Y axis minimum value must be less than maximum value. - + Time parameter cannot be negative. - - X axis tick count must be at least 2. - - - - + Data Files (*.txt *.csv *.dat);;All Files (*.*) - - - + + + Error - + Failed to create file entry - + Unable to get current workspace - + Curve file count has reached the limit (9 files) - + File already exists - + File copy failed - + Invalid file - + Failed to add file @@ -403,7 +397,7 @@ AddLightFileDlg - + Add Light Data File @@ -435,7 +429,7 @@ - + - @@ -451,153 +445,163 @@ - Chart Names: + Chart Name: - - Color Properties + + Chart 1 + Time: + + + + + Color Properties + + + + Open Color: - - + + Select Color - + background-color: rgb(0, 255, 0); border: 1px solid black; - + Close Color: - + background-color: rgb(255, 0, 0); border: 1px solid black; - + Light Management - + Lights: - + Add Light Row - + Remove - + Selected Light Properties - + Light Names: - + Enter light names (comma separated)... - + Light Datas: - + Enter data values (comma separated integers)... - + Edit Data - + Row Index: - + Add File - + Cancel - + Light Data Files (*.txt *.csv *.dat);;All Files (*.*) - + Warning - + Please enter a Chart name. - - + + Error - + Unable to get current workspace - + Curve file count has reached the limit (9 files) - + File already exists - + File copy failed - + Invalid file - + Failed to add file @@ -1004,6 +1008,7 @@ + Error @@ -1019,7 +1024,12 @@ - Curve file count has reached the limit (9 files) + Polar file count has reached the limit (9 files) + + + + + Failed to create Polar file entry. @@ -1267,7 +1277,7 @@ - + Warning @@ -1287,49 +1297,49 @@ - + Please enter a Surface name. - - - + + + Error - + Failed to create surface file entry. - + Unable to get current workspace - + Surface file count has reached the limit (9 files) - + File already exists - + File copy failed - + Invalid file - + Failed to add file @@ -1940,6 +1950,11 @@ new polar file + + + new image file + + FitCurveChartView @@ -2024,22 +2039,22 @@ - + model elements - + preset models - + attribte - + Main View @@ -2302,38 +2317,38 @@ - + Open Workspace - - + + Dyt Files (*.dyt) - - - - - - + + + + + + prompt - - - - - - + + + + + + please create workspace first - + Save Workspace diff --git a/src/ui/DockWidget.cpp b/src/ui/DockWidget.cpp index 29548c19..6e121252 100644 --- a/src/ui/DockWidget.cpp +++ b/src/ui/DockWidget.cpp @@ -17,16 +17,6 @@ DockWidgetTitleBar::~DockWidgetTitleBar() { } -//QSize DockWidgetTitleBar::minimumSizeHint() const { -// QDockWidget* dw = qobject_cast(parentWidget()); -// Q_ASSERT(dw); -// QSize result(0, 90); -// if (dw->features() & QDockWidget::DockWidgetVerticalTitleBar) -// result.transpose(); -// return result; -//} - - DockWidget::DockWidget(const QString& title, QWidget* parent) : QDockWidget(title, parent) { setFeatures(DockWidgetClosable | DockWidgetMovable | DockWidgetFloatable); @@ -42,6 +32,10 @@ DockWidget::DockWidget(const QString& title, QWidget* parent) DockWidget::DockWidget(QWidget* parent) : QDockWidget(parent) { setFeatures(DockWidgetClosable | DockWidgetMovable | DockWidgetFloatable); + SystemManagerMenu* windowManagerMenu = MainFrame::Get().GetMenuManager("system_manager"); + if (nullptr != windowManagerMenu) { + windowManagerMenu->AddDockWidget(this); + } m_bMax = false; } diff --git a/src/ui/MainWindow.cpp b/src/ui/MainWindow.cpp index f5cbf96c..76047ec2 100644 --- a/src/ui/MainWindow.cpp +++ b/src/ui/MainWindow.cpp @@ -39,7 +39,9 @@ MainWindow::MainWindow(QWidget* parent) , ui(new Ui::MainWindow) { ui->setupUi(this); + LOG_INFO("MainWindow::MainWindow - Constructor called, about to call InitUI"); InitUI(); + LOG_INFO("MainWindow::MainWindow - Constructor completed"); } MainWindow::~MainWindow() { @@ -48,6 +50,8 @@ MainWindow::~MainWindow() { } void MainWindow::InitUI() { + LOG_INFO("MainWindow::InitUI - Function started"); + QWidget* centralWidget = takeCentralWidget(); if (nullptr != centralWidget) { delete centralWidget; @@ -63,7 +67,7 @@ void MainWindow::InitUI() { model->setObjectName("Dock.ModelBrowser"); modelBrowser_ = new ModelBrowser(0); modelBrowser_->AttachDock(model); - m_mapDockWidget.insert("ModelBrowser", model); + mapDockWidget_.insert("ModelBrowser", model); addDockWidget(Qt::LeftDockWidgetArea, model); // 创建预制模型面板 @@ -73,7 +77,7 @@ void MainWindow::InitUI() { presetModelPanel_ = new PresetModelPanel(0); presetModelPanel_->AttachDock(presetModel); addDockWidget(Qt::LeftDockWidgetArea, presetModel); - m_mapDockWidget.insert("PresetModelPanel", presetModel); + mapDockWidget_.insert("PresetModelPanel", presetModel); DockWidget* attribte = new DockWidget(tr("attribte"), 0); attribte->SetDockWidgetTitleBar(new DockTitleBar(attribte)); @@ -81,7 +85,7 @@ void MainWindow::InitUI() { //addDockWidget(pSettingUI->GetArea("PropertyBrowser"), attribte); propertyBrowser_ = new PropertyBrowser(0); propertyBrowser_->AttachDock(attribte); - m_mapDockWidget.insert("PropertyBrowser", attribte); + mapDockWidget_.insert("PropertyBrowser", attribte); addDockWidget(Qt::RightDockWidgetArea, attribte); connect(modelBrowser_, &ModelBrowser::WorkSpaceChange, propertyBrowser_, &PropertyBrowser::OnWorkSpaceChange); @@ -95,152 +99,27 @@ void MainWindow::InitUI() { viewDock->setObjectName("Dock.MainView"); viewDock->setWidget(qtOsgViewWidget_); addDockWidget(Qt::LeftDockWidgetArea, viewDock); - m_mapDockWidget.insert("MainView", viewDock); + mapDockWidget_.insert("MainView", viewDock); splitDockWidget(model, viewDock, Qt::Horizontal); // 将预制模型面板与模型浏览器标签化 tabifyDockWidget(model, presetModel); - //QString wavePath ="", speedPath = "", rdPath = "", matlabParam=""; - //if (WorkSpaceManager::Get().GetCurrent()) - //{ - // if (!WorkSpaceManager::Get().GetCurrent()->GetWavePath().isEmpty()) - // { - // wavePath = RecourceHelper::Get().GetBasePath() + "/" + WorkSpaceManager::Get().GetCurrent()->GetWavePath(); - // } - - // if (!WorkSpaceManager::Get().GetCurrent()->GetReportPath().isEmpty()) - // { - // speedPath = RecourceHelper::Get().GetBasePath() + "/" + WorkSpaceManager::Get().GetCurrent()->GetReportPath(); - // } - - // if (!WorkSpaceManager::Get().GetCurrent()->GetRDPath().isEmpty()) - // { - // rdPath = RecourceHelper::Get().GetBasePath() + "/" + WorkSpaceManager::Get().GetCurrent()->GetRDPath(); - // } - - // if (!WorkSpaceManager::Get().GetCurrent()->GetMatlabParam().isEmpty()) - // { - // matlabParam = RecourceHelper::Get().GetBasePath() + "/" + WorkSpaceManager::Get().GetCurrent()->GetMatlabParam(); - // } - //} - - //DockWidget* fitCurveDock = new DockWidget(tr("Wave Curve"), 0); - //fitCurveDock->SetDockWidgetTitleBar(new DockTitleBar(fitCurveDock)); - //fitCurveDock->setObjectName("Dock.WaveCurveDialog"); - //fitCurveDlg_ = new FitCurveDialog(); - //fitCurveDlg_->AttachDock(fitCurveDock); - //m_mapDockWidget.insert("WaveCurveDialog", fitCurveDock); - //addDockWidget(Qt::BottomDockWidgetArea, fitCurveDock); - - //fitCurveDlg_->InitWaveFile(wavePath); - //DockWidget* fitLgCurveDock = new DockWidget(tr("Speed Curve"), 0); - //fitLgCurveDock->SetDockWidgetTitleBar(new DockTitleBar(fitLgCurveDock)); - //fitLgCurveDock->setObjectName("Dock.SpeedCurveDialog"); - - //fitYLgCurveDlg_ = new FitCurveDialog(); - //fitYLgCurveDlg_->AttachDock(fitLgCurveDock); - //m_mapDockWidget.insert("SpeedCurveDialog", fitLgCurveDock); - //addDockWidget(Qt::BottomDockWidgetArea, fitLgCurveDock); - //tabifyDockWidget(fitCurveDock, fitLgCurveDock); - - - //fitYLgCurveDlg_->InitReportFile(speedPath); - - //DockWidget* surfaceCurveDock = new DockWidget(tr("3D Curve"), 0); - //surfaceCurveDock->SetDockWidgetTitleBar(new DockTitleBar(surfaceCurveDock)); - //surfaceCurveDock->setObjectName("Dock.3DCurveDialog"); - - //surfaceDlg_ = new SurfaceDialog(); - //surfaceDlg_->AttachDock(surfaceCurveDock); - //m_mapDockWidget.insert("3DCurveDialog", surfaceCurveDock); - //addDockWidget(Qt::BottomDockWidgetArea, surfaceCurveDock); - //tabifyDockWidget(fitCurveDock, surfaceCurveDock); - - //surfaceDlg_->InitRD(rdPath); - - //{ - // targetUITable_ = new TargetListWgt; - - // QStringList headerLabels; - // headerLabels << tr("Target number") << tr("Signal-to-noise ratio") - // << tr("Azimuth line of sight") << tr("Pitch gaze angle") - // << tr("azimuth") << tr("Pitch angle") - // << tr("attribute") << tr("Doppler") - // << tr("course") << tr("Speed") - // << tr("longitude") << tr("latitude") - // << tr("distance") << tr("velocity") - // << tr("Radial dimensions") << tr("Target RCS"); - - // targetUITable_->SetHeader(headerLabels); - // //const QString reportPath = RecourceHelper::Get().GetBasePath() + "/workspace/Report.txt"; - // //targetUITable_->InitFile(speedPath, 50); - - // DockWidget* dataTableDock = new DockWidget(tr("Report Table"), 0); - // dataTableDock->SetDockWidgetTitleBar(new DockTitleBar(dataTableDock)); - // dataTableDock->setObjectName("Dock.TargetListWgt_Table"); - // // addDockWidget(pSettingUI->GetArea("TargetListWgt"), dataTableDock); - // targetUITable_->AttachDock(dataTableDock); - // m_mapDockWidget.insert("TargetListWgt_Table", dataTableDock); - // addDockWidget(Qt::BottomDockWidgetArea, dataTableDock); - // tabifyDockWidget(fitCurveDock, dataTableDock); - - //} - - //const QString lampPath = RecourceHelper::Get().GetBasePath() + "/workspace/Lamp.txt"; - - //DockWidget* signalIndicatorLampDock = new DockWidget(tr("Signal Indicator Lamp"), 0); - //signalIndicatorLampDock->SetDockWidgetTitleBar(new DockTitleBar(signalIndicatorLampDock)); - //signalIndicatorLampDock->setObjectName("Dock.SignalIndicatorLampUI"); - //signalIndicatorLampUI_ = new SignalIndicatorLampUI; - //signalIndicatorLampUI_->AttachDock(signalIndicatorLampDock); - ////signalIndicatorLampUI_->InitLamp(lampPath); - - //m_mapDockWidget.insert("SignalIndicatorLampUI", signalIndicatorLampDock); - //addDockWidget(Qt::BottomDockWidgetArea, signalIndicatorLampDock); - //tabifyDockWidget(fitCurveDock, signalIndicatorLampDock); - - // DockWidget* addParamSettingDock = new DockWidget(tr("ParamSetting"), 0); - // addParamSettingDock->SetDockWidgetTitleBar(new DockTitleBar(addParamSettingDock)); - // addParamSettingDock->setObjectName("Dock.ParamSetting"); - // addParamDlg_ = new AddParamSetting(matlabParam); - // addParamDlg_->AttachDock(addParamSettingDock); - // m_mapDockWidget.insert("ParamSetting", addParamSettingDock); - // addDockWidget(Qt::BottomDockWidgetArea, addParamSettingDock); - // tabifyDockWidget(fitCurveDock, addParamSettingDock); - - //DockWidget* matlabDock = new DockWidget(tr("bat File"), 0); - //matlabDock->SetDockWidgetTitleBar(new DockTitleBar(matlabDock)); - //matlabDock->setObjectName("Dock.Matlab"); - //matlabFileDlg_ = new CodeEdtUI; - //matlabFileDlg_->AttachDock(matlabDock); - //m_mapDockWidget.insert("Matlab", matlabDock); - // addDockWidget(Qt::BottomDockWidgetArea, matlabDock); - // tabifyDockWidget(fitCurveDock, matlabDock); - - //ui->discript->setText(tr("name: 5year 0412")); - //ui->status->setText(tr("start: no start")); - - // InitDockLayout(); - dataPanelManager_ = new DataPanelManager(this, this); connect(&WorkSpaceManager::Get(), &WorkSpaceManager::WorkSpaceChanged, dataPanelManager_, &DataPanelManager::OnWorkspaceChanged); // Restore previous UI layout if available + LOG_INFO("MainWindow::InitUI - About to call UiLayoutManager::Restore"); UiLayoutManager::Restore(this, 1); - - //InitChartLayout(); + LOG_INFO("MainWindow::InitUI - UiLayoutManager::Restore completed"); //ui->viewWidget->layout()->addWidget(qtOsgViewWidget_); qtOsgViewWidget_->LoadDefaultScene(); - /*OsgViewer::Get().Initialize(); - OsgViewer::Get().OnFrame();*/ #if 0 - // MatlabObject* mtlb = new MatlabObject; MatlabObject::GetInstance()->RunMatlabFile(""); #endif // 1 } @@ -277,150 +156,4 @@ void MainWindow::slotResetWorkSpace() rdPath = RecourceHelper::Get().GetBasePath() + "/" + WorkSpaceManager::Get().GetCurrent()->GetRDPath(); } } - - //fitCurveDlg_->InitWaveFile(wavePath); - //fitYLgCurveDlg_->InitReportFile(speedPath); - //surfaceDlg_->InitRD(rdPath); - //targetUITable_->InitFile(speedPath, 50); -} - -void MainWindow::InitChartLayout() -{ - QString strChart = RecourceHelper::Get().GetBasePath() + "/workspace/Chart.xml"; - m_mgrChart.Load(strChart); - - QVariantList varList = m_mgrChart.GetChartWgt(); - for (int nI = 0; nI < varList.size(); nI++) - { - QVariantMap mapWgt = varList.at(nI).toMap(); - QString strWgt = mapWgt.value("Name").toString(); - QVariantList listChart = mapWgt.value("Chart").toList(); - - QMainWindow* mainWindow_ = new QMainWindow; - //connect(mainWindow_, &QMainWindow::tabifiedDockWidgetActivated, this, &MainWindow::OnTabifiedDockWidgetActivated); - - DockWidget* wgtDock = new DockWidget(strWgt, 0); - wgtDock->SetDockWidgetTitleBar(new DockTitleBar(wgtDock)); - wgtDock->setWidget(mainWindow_); - addDockWidget(Qt::BottomDockWidgetArea, wgtDock); - - for (int nJ = 0; nJ < listChart.size(); nJ++) - { - QVariantMap mapChart = listChart.at(nJ).toMap(); - InitChart(mapChart, mainWindow_); - } - } -} - -QDockWidget *MainWindow::InitChart(QVariantMap mapChart, QMainWindow* mainWindow) -{ - QString strName = mapChart.value("Name").toString(); - QString strType = mapChart.value("Type").toString(); - QString after = mapChart.value("after").toString(); - QString orientation = mapChart.value("orientation").toString(); - int nT = mapChart.value("t").toInt(); - QString strFile = mapChart.value("File").toString(); - - DockWidget* pDock = new DockWidget(strName, 0); - - if (strType == "Wave" || strType == "Report") - { - QString xTitle = mapChart.value("xTitle").toString(); - QString yTitle = mapChart.value("yTitle").toString(); - float xMin = mapChart.value("xMin").toFloat(); - float xMax = mapChart.value("xMax").toFloat(); - int xCount = mapChart.value("xCount").toInt(); - float yMin = mapChart.value("yMin").toFloat(); - float yMax = mapChart.value("yMax").toFloat(); - int yCount = mapChart.value("yCount").toInt(); - QVariantList listCurve = mapChart.value("Curve").toList(); - - FitCurveDialog *fitCurveDlg = new FitCurveDialog(); - fitCurveDlg->AttachDock(pDock); - fitCurveDlg->updateTitle(strName + "-" + strFile); - fitCurveDlg->updateTitleAxis(xTitle, yTitle); - fitCurveDlg->updateMinMaxX(xMin, xMax, xCount); - fitCurveDlg->updateMinMaxY(yMin, yMax, yCount); - - if (strType == "Wave") - { - fitCurveDlg->updateParseWaveFile(strFile, nT, listCurve); - } - else if (strType == "Report") - { - fitCurveDlg->updateParseReportFile(strFile, nT, listCurve); - } - } - else if (strType == "Table") - { - QString head = mapChart.value("head").toString(); - QVariantList listCurve = mapChart.value("Curve").toList(); - - TargetListWgt *targetUITable = new TargetListWgt; - targetUITable->AttachDock(pDock); - targetUITable->SetHead(head); - targetUITable->updateTitle(strName + "-" + strFile); - targetUITable->updateParseFile(strFile, nT, listCurve); - } - else if (strType == "Lamp") - { - QString openColor = mapChart.value("openColor").toString(); - QString closeColor = mapChart.value("closeColor").toString(); - QVariantList listCurve = mapChart.value("Curve").toList(); - - SignalIndicatorLampUI *signalIndicatorLamp = new SignalIndicatorLampUI; - signalIndicatorLamp->AttachDock(pDock); - signalIndicatorLamp->updateTitle(strName + "-" + strFile); - signalIndicatorLamp->updateLampColor(openColor, closeColor); - signalIndicatorLamp->updateParseFile(strFile, nT, listCurve); - } - else if (strType == "Surface") - { - QString xTitle = mapChart.value("xTitle").toString(); - QString yTitle = mapChart.value("yTitle").toString(); - QString zTitle = mapChart.value("zTitle").toString(); - float xMin = mapChart.value("xMin").toFloat(); - float xMax = mapChart.value("xMax").toFloat(); - int xCount = mapChart.value("xCount").toInt(); - float yMin = mapChart.value("yMin").toFloat(); - float yMax = mapChart.value("yMax").toFloat(); - int yCount = mapChart.value("yCount").toInt(); - float zMin = mapChart.value("zMin").toFloat(); - float zMax = mapChart.value("zMax").toFloat(); - int zCount = mapChart.value("zCount").toInt(); - QVariantList listCurve = mapChart.value("Curve").toList(); - - SurfaceDialog *surfaceDlg = new SurfaceDialog(); - surfaceDlg->AttachDock(pDock); - surfaceDlg->updateTitle(strName + "-" + strFile); - surfaceDlg->updateTitleAxis(xTitle, yTitle, zTitle); - surfaceDlg->updateMinMaxX(xMin, xMax, xCount); - surfaceDlg->updateMinMaxY(yMin, yMax, yCount); - surfaceDlg->updateMinMaxZ(zMin, zMax, zCount); - surfaceDlg->updateParseFile(strFile, nT, listCurve); - } - - mainWindow->addDockWidget(Qt::LeftDockWidgetArea, pDock); - - QDockWidget* afterDock = m_mapChartWidget.value(after); - if (afterDock) - { - if (orientation == QString("Horizontal")) - { - mainWindow->splitDockWidget(afterDock, pDock, Qt::Horizontal); - } - else if (orientation == QString("Vertical")) - { - mainWindow->splitDockWidget(afterDock, pDock, Qt::Vertical); - } - } - - m_mapChartWidget.insert(strName, pDock); - - return pDock; -} - -QDockWidget * MainWindow::InitCurveChart(QVariantMap mapChart, QMainWindow * mainWindow) -{ - return nullptr; } diff --git a/src/ui/MainWindow.h b/src/ui/MainWindow.h index 7e6e29e3..2cdbb586 100644 --- a/src/ui/MainWindow.h +++ b/src/ui/MainWindow.h @@ -32,16 +32,6 @@ public: return qtOsgViewWidget_; } - class FitCurveDialog* GetFitCurveDlg() const { - return fitCurveDlg_; - } - class FitCurveDialog* GetFitYLgCurveDlg() const { - return fitYLgCurveDlg_; - } - class SurfaceDialog* GetSurfaceDlg() const { - return surfaceDlg_; - } - DataPanelManager* GetDataPanelManager() const { return dataPanelManager_; } @@ -53,10 +43,6 @@ private: void InitUI(); void UninitUI(); - void InitChartLayout(); - QDockWidget *InitChart(QVariantMap mapChart, QMainWindow* mainWindow); - QDockWidget *InitCurveChart(QVariantMap mapChart, QMainWindow* mainWindow); - private: Ui::MainWindow* ui; @@ -66,20 +52,11 @@ private: class QWebEngineView* webEngineView_{ nullptr }; class OsgWidget* qtOsgViewWidget_{ nullptr }; - class FitCurveDialog* fitCurveDlg_{ nullptr }; - class FitCurveDialog* fitYLgCurveDlg_{ nullptr }; - class SurfaceDialog* surfaceDlg_{ nullptr }; - class TargetListWgt* targetUITable_{ nullptr }; - class QTabWidget* tabWidget_{ nullptr }; class SignalIndicatorLampUI* signalIndicatorLampUI_{ nullptr }; class CodeEdtUI* matlabFileDlg_{ nullptr }; class AddParamSetting* addParamDlg_{ nullptr }; DataPanelManager* dataPanelManager_{ nullptr }; - QMap m_mapDockWidget; - - ChartXMLMgr m_mgrChart; - - QMap m_mapChartWidget; + QMap mapDockWidget_; }; \ No newline at end of file diff --git a/src/ui/Panel/DataPanelManager.cpp b/src/ui/Panel/DataPanelManager.cpp index 7657e01d..4b09dc87 100644 --- a/src/ui/Panel/DataPanelManager.cpp +++ b/src/ui/Panel/DataPanelManager.cpp @@ -7,6 +7,7 @@ #include "workspace/FileEntry.h" #include "workspace/Timestep.h" #include "common/SpdLogger.h" +#include "utils/UiLayoutManager.h" #include #include @@ -65,6 +66,8 @@ void DataPanelManager::SetWorkspace(WorkSpace* workspace) UpdatePanelsForType(FileEntryType::Table); UpdatePanelsForType(FileEntryType::Light); UpdatePanelsForType(FileEntryType::Polar); + LOG_INFO("DataPanelManager::SetWorkspace - Reapplying UI layout after panels created"); + UiLayoutManager::Restore(mainWindow_, 1); } else { ClearAllPanels(); } @@ -199,6 +202,8 @@ DataPanel* DataPanelManager::CreateDataPanel(FileEntryType fileType, const QStri // Add to main window mainWindow_->addDockWidget(Qt::RightDockWidgetArea, dockWidget); + + // Do not force visibility here; let UiLayoutManager restore saved state // Create panel using factory DataPanel* panel = DataPanelFactory::CreatePanel(fileType, index, filePath, dockWidget); diff --git a/src/utils/UiLayoutManager.cpp b/src/utils/UiLayoutManager.cpp index db35dd40..42cf887b 100644 --- a/src/utils/UiLayoutManager.cpp +++ b/src/utils/UiLayoutManager.cpp @@ -2,37 +2,122 @@ #include #include +#include #include +#include +#include #include "common/RecourceHelper.h" +#include "common/SpdLogger.h" namespace { static inline QString layoutIniPath() { return RecourceHelper::Get().GetBasePath() + "/config/UIState.ini"; } + +static inline bool ensureConfigDirectory() { + const QString configDir = RecourceHelper::Get().GetBasePath() + "/config"; + QDir dir; + if (!dir.exists(configDir)) { + if (!dir.mkpath(configDir)) { + LOG_ERROR("Failed to create config directory: {}", configDir.toStdString()); + return false; + } + LOG_INFO("Created config directory: {}", configDir.toStdString()); + } + return true; +} } void UiLayoutManager::Save(QMainWindow* mainWindow, int version) { - if (!mainWindow) return; + if (!mainWindow) { + LOG_WARN("MainWindow is null, cannot save layout"); + return; + } + + if (!ensureConfigDirectory()) { + LOG_ERROR("Cannot create config directory, layout will not be saved"); + return; + } + const QString iniPath = layoutIniPath(); + LOG_INFO("Saving UI layout to: {}", iniPath.toStdString()); + QSettings settings(iniPath, QSettings::IniFormat); settings.setValue("MainWindow/geometry", mainWindow->saveGeometry()); settings.setValue("MainWindow/state", mainWindow->saveState(version)); + + // Force sync to ensure data is written to disk + settings.sync(); + + if (settings.status() != QSettings::NoError) { + LOG_ERROR("Failed to save UI layout settings, status: {}", static_cast(settings.status())); + } else { + LOG_INFO("UI layout saved successfully"); + } } void UiLayoutManager::Restore(QMainWindow* mainWindow, int version) { - if (!mainWindow) return; - const QString iniPath = layoutIniPath(); - if (!QFile::exists(iniPath)) { + LOG_INFO("UiLayoutManager::Restore - Starting layout restoration for version {}", version); + + if (!mainWindow) { + LOG_WARN("MainWindow is null, cannot restore layout"); return; } + + const QString iniPath = layoutIniPath(); + LOG_INFO("UiLayoutManager::Restore - Using config file: {}", iniPath.toStdString()); + + if (!QFile::exists(iniPath)) { + LOG_INFO("Layout file does not exist: {}, using default layout", iniPath.toStdString()); + return; + } + + LOG_INFO("Restoring UI layout from: {}", iniPath.toStdString()); + QSettings settings(iniPath, QSettings::IniFormat); const QByteArray geometry = settings.value("MainWindow/geometry").toByteArray(); - if (!geometry.isEmpty()) { - mainWindow->restoreGeometry(geometry); - } const QByteArray state = settings.value("MainWindow/state").toByteArray(); - if (!state.isEmpty()) { - mainWindow->restoreState(state, version); + + LOG_INFO("UiLayoutManager::Restore - Geometry data size: {} bytes", geometry.size()); + LOG_INFO("UiLayoutManager::Restore - State data size: {} bytes", state.size()); + + if (!geometry.isEmpty()) { + bool geometryRestored = mainWindow->restoreGeometry(geometry); + LOG_INFO("UiLayoutManager::Restore - Geometry restoration: {}", geometryRestored ? "SUCCESS" : "FAILED"); + } else { + LOG_WARN("UiLayoutManager::Restore - No geometry data found"); } + + if (!state.isEmpty()) { + bool stateRestored = mainWindow->restoreState(state, version); + LOG_INFO("UiLayoutManager::Restore - State restoration: {}", stateRestored ? "SUCCESS" : "FAILED"); + + // Log dock widget information + QList dockWidgets = mainWindow->findChildren(); + LOG_INFO("UiLayoutManager::Restore - Found {} dock widgets after restoration", dockWidgets.size()); + for (QDockWidget* dock : dockWidgets) { + LOG_INFO("UiLayoutManager::Restore - DockWidget: {} - Visible: {}, Floating: {}, Area: {}", + dock->objectName().toStdString(), + dock->isVisible(), + dock->isFloating(), + static_cast(mainWindow->dockWidgetArea(dock))); + + // Ensure essential dock widgets are visible after restoration + QString objName = dock->objectName(); + if (objName == "Dock.ModelBrowser" || + objName == "Dock.PresetModelPanel" || + objName == "Dock.PropertyBrowser" || + objName == "Dock.MainView") { + if (!dock->isVisible()) { + LOG_INFO("UiLayoutManager::Restore - Making essential DockWidget visible: {}", objName.toStdString()); + dock->show(); + } + } + } + } else { + LOG_WARN("UiLayoutManager::Restore - No state data found"); + } + + LOG_INFO("UiLayoutManager::Restore - Layout restoration completed"); } \ No newline at end of file