diff --git a/.gitignore b/.gitignore index 21989986..5ae90f68 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ build/ bin/ thirdparty/ +tritoin/ +QWEN.md diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 826a32ba..a8a6d2d0 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -14,8 +14,8 @@ find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Widgets LinguistTools DataVis message("qt VERSION " ${QT_VERSION_MAJOR}) -FILE(GLOB_RECURSE HEADER_FILES ./*.h common/*.h common/*.hpp model/*.h app/*.h) -FILE(GLOB_RECURSE CPP_FILES ./*.cpp common/*.cpp model/*.cpp app/*.cpp) +FILE(GLOB_RECURSE HEADER_FILES ./*.h common/*.h common/*.hpp model/*.h app/*.h utils/*.h) +FILE(GLOB_RECURSE CPP_FILES ./*.cpp common/*.cpp model/*.cpp app/*.cpp utils/*.cpp) FILE(GLOB_RECURSE CC_FILES ./*.cc) FILE(GLOB_RECURSE UI_FILES ./*.ui) FILE(GLOB_RECURSE QRC_FILES ./*.qrc) diff --git a/src/translations/Dyt_zh_CN.ts b/src/translations/Dyt_zh_CN.ts index 41b77004..f5ed3103 100644 --- a/src/translations/Dyt_zh_CN.ts +++ b/src/translations/Dyt_zh_CN.ts @@ -540,127 +540,132 @@ - + model elements - + attribte - + + Main View + + + + Wave Curve - + Speed Curve - + 3D Curve - + Target number - + Signal-to-noise ratio - + Azimuth line of sight - + Pitch gaze angle - + azimuth - + Pitch angle - + attribute - + Doppler - + course - + Speed - + longitude - + latitude - + distance - + velocity - + Radial dimensions - + Target RCS - + Report Table - + Signal Indicator Lamp - + ParamSetting - + bat File diff --git a/src/ui/MainWindow.cpp b/src/ui/MainWindow.cpp index 0554d49c..8ac1706e 100644 --- a/src/ui/MainWindow.cpp +++ b/src/ui/MainWindow.cpp @@ -1,6 +1,7 @@ #include "MainWindow.h" #include +#include "utils/UiLayoutManager.h" #include "PropertyBrowser.h" #include "ModelBrowser.h" @@ -43,43 +44,47 @@ MainWindow::~MainWindow() { } void MainWindow::InitUI() { - - tabWidget_ = new QTabWidget; - tabWidget_->setTabPosition(QTabWidget::South); - tabWidget_->tabBar()->setMinimumWidth(300); - - ui->viewWidget->layout()->addWidget(tabWidget_); - - pSettingUI = new LayoutSettingUI(); - - const QString uiLaytouPath = RecourceHelper::Get().GetBasePath() + "/workspace/UILayout.xml"; - - pSettingUI->InitConfig(uiLaytouPath); - //pSettingUI->show(); - - connect(pSettingUI, &LayoutSettingUI::signalUpdate, this, &MainWindow::InitDockLayout); + QWidget* centralWidget = takeCentralWidget(); + if (nullptr != centralWidget) { + delete centralWidget; + } + setDockNestingEnabled(true); setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea); setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea); + setDockOptions(QMainWindow::AllowTabbedDocks | QMainWindow::AllowNestedDocks | QMainWindow::AnimatedDocks); DockWidget* model = new DockWidget(tr("model elements"), 0); + model->setObjectName("Dock.ModelBrowser"); // addDockWidget(pSettingUI->GetArea("ModelBrowser"), model); modelBrowser_ = new ModelBrowser(0); modelBrowser_->AttachDock(model); m_mapDockWidget.insert("ModelBrowser", model); DockWidget* attribte = new DockWidget(tr("attribte"), 0); + attribte->setObjectName("Dock.PropertyBrowser"); //addDockWidget(pSettingUI->GetArea("PropertyBrowser"), attribte); propertyBrowser_ = new PropertyBrowser(0); propertyBrowser_->AttachDock(attribte); m_mapDockWidget.insert("PropertyBrowser", attribte); + addDockWidget(Qt::RightDockWidgetArea, attribte); connect(modelBrowser_, &ModelBrowser::WorkSpaceChange, propertyBrowser_, &PropertyBrowser::OnWorkSpaceChange); connect(modelBrowser_, &ModelBrowser::EntityChange, propertyBrowser_, &PropertyBrowser::OnEntityChange); qtOsgViewWidget_ = new OsgWidget; qtOsgViewWidget_->Initialize(); - //m_mapDockWidget.insert("PropertyBrowser", attribte); + + // 主视图改为 DockWidget,支持自由停靠 + DockWidget* viewDock = new DockWidget(tr("Main View"), 0); + viewDock->setObjectName("Dock.MainView"); + viewDock->setWidget(qtOsgViewWidget_); + addDockWidget(Qt::LeftDockWidgetArea, viewDock); + m_mapDockWidget.insert("MainView", viewDock); + + // 左侧模型面板,并与主视图横向并排(类似 VS 左侧工具 + 中间视图) + addDockWidget(Qt::LeftDockWidgetArea, model); + splitDockWidget(model, viewDock, Qt::Horizontal); QString wavePath ="", speedPath = "", rdPath = "", matlabParam=""; if (WorkSpaceManager::Get().GetCurrent()) @@ -106,25 +111,33 @@ void MainWindow::InitUI() { } DockWidget* fitCurveDock = new DockWidget(tr("Wave Curve"), 0); + fitCurveDock->setObjectName("Dock.WaveCurveDialog"); fitCurveDlg_ = new FitCurveDialog(1); fitCurveDlg_->AttachDock(fitCurveDock); m_mapDockWidget.insert("WaveCurveDialog", fitCurveDock); + addDockWidget(Qt::BottomDockWidgetArea, fitCurveDock); fitCurveDlg_->InitWaveFile(wavePath); DockWidget* fitLgCurveDock = new DockWidget(tr("Speed Curve"), 0); + fitLgCurveDock->setObjectName("Dock.SpeedCurveDialog"); fitYLgCurveDlg_ = new FitCurveDialog(1); 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->setObjectName("Dock.3DCurveDialog"); surfaceDlg_ = new SurfaceDialog(); surfaceDlg_->AttachDock(surfaceCurveDock); m_mapDockWidget.insert("3DCurveDialog", surfaceCurveDock); + addDockWidget(Qt::BottomDockWidgetArea, surfaceCurveDock); + tabifyDockWidget(fitCurveDock, surfaceCurveDock); surfaceDlg_->InitRD(rdPath); @@ -146,36 +159,51 @@ void MainWindow::InitUI() { targetUITable_->InitFile(speedPath, 50); DockWidget* dataTableDock = new DockWidget(tr("Report Table"), 0); + 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->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->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->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(); - + // InitDockLayout(); + + // Restore previous UI layout if available + UiLayoutManager::Restore(this, 1); + //ui->viewWidget->layout()->addWidget(qtOsgViewWidget_); qtOsgViewWidget_->LoadDefaultScene(); /*OsgViewer::Get().Initialize(); @@ -188,6 +216,8 @@ void MainWindow::InitUI() { } void MainWindow::UninitUI() { + // Save layout state before tearing down widgets + UiLayoutManager::Save(this, 1); if (qtOsgViewWidget_) { qtOsgViewWidget_->Uninitialize(); delete qtOsgViewWidget_; @@ -195,157 +225,6 @@ void MainWindow::UninitUI() { } } -void MainWindow::InitDockLayout() { - while (tabWidget_->count() > 0) { - tabWidget_->removeTab(0); - } - - tabWidget_->tabBar()->setExpanding(true); - - QVariantList listTab = pSettingUI->GetAreaLayout().toList(); - for (int i = 0; i < listTab.size(); i++) { - QVariantMap mapTab = listTab[i].toMap(); - QString strTabName = mapTab.value("Name").toString(); - - QMainWindow* mainWindow_ = new QMainWindow; - connect(mainWindow_, &QMainWindow::tabifiedDockWidgetActivated, this, &MainWindow::OnTabifiedDockWidgetActivated); - - QVariantList listDocArea = mapTab.value("Widget").toList(); - - tabWidget_->insertTab(i, mainWindow_, strTabName); - if (listDocArea[0].toList().size() > 0) { - mainWindow_->setCentralWidget(qtOsgViewWidget_); - //OsgViewer::Get().Initialize(); - //OsgViewer::Get().OnFrame(); - } else { - mainWindow_->takeCentralWidget(); - } - - - if (listDocArea.size() > 0) { - QDockWidget* lastDock = nullptr; - - for (int j = 1; j < listDocArea.size(); j++) { - Qt::DockWidgetArea dockArea; - if (j == 1) { - dockArea = Qt::LeftDockWidgetArea; - } else if (j == 2) { - dockArea = Qt::TopDockWidgetArea; - } else if (j == 3) { - dockArea = Qt::RightDockWidgetArea; - } else if (j == 4) { - dockArea = Qt::BottomDockWidgetArea; - } - - QVariantList listDocAreaChild = listDocArea[j].toList(); - for (int m = 0; m < listDocAreaChild.size(); m++) { - QVariant varWidget = listDocAreaChild[m]; - - if (varWidget.type() == QVariant::String) { - QDockWidget* pDock = m_mapDockWidget.value(varWidget.toString()); - if (pDock == nullptr) { - continue; - } - mainWindow_->addDockWidget(dockArea, pDock); - lastDock = pDock; - } else { - QVariantList listWidget = varWidget.toList(); - for (int k = 0; k < listWidget.size(); k++) { - QDockWidget* pDock = m_mapDockWidget.value(listWidget[k].toString()); - mainWindow_->addDockWidget(dockArea, pDock); - - if (k == 0) { - if (lastDock) { - mainWindow_->splitDockWidget(lastDock, pDock, Qt::Vertical); - } - } else { - mainWindow_->splitDockWidget(lastDock, pDock, Qt::Horizontal); - } - - lastDock = pDock; - } - } - } - } - } - } - - tabWidget_->tabBar()->setMinimumWidth(500); - /* AddDockArea("DockLeftArea"); - AddDockArea("DockTopArea"); - AddDockArea("DockRightArea"); - AddDockArea("DockBottomArea");*/ -} - -void MainWindow::AddDockArea(const QString& strArea) { - Qt::DockWidgetArea dockArea; - Qt::Orientation orient; - - if (strArea == "DockLeftArea") { - dockArea = Qt::LeftDockWidgetArea; - orient = Qt::Vertical; - } else if (strArea == "DockTopArea") { - dockArea = Qt::TopDockWidgetArea; - orient = Qt::Horizontal; - } else if (strArea == "DockRightArea") { - dockArea = Qt::RightDockWidgetArea; - orient = Qt::Vertical; - } else if (strArea == "DockBottomArea") { - dockArea = Qt::BottomDockWidgetArea; - orient = Qt::Horizontal; - } else { - return; - } - - QList listAdd; - - QVariant varArea = pSettingUI->GetAreaLayout(); - if (varArea.isValid()) { - QVariantList listWidget = varArea.toList(); - for each(QVariant varWidget in listWidget) { - if (varWidget.type() == QVariant::String) { - QDockWidget* pDock = m_mapDockWidget.value(varWidget.toString()); - addDockWidget(dockArea, pDock); - - listAdd.push_back(pDock); - } else { - QDockWidget* pLastDock = nullptr; - QVariantList listTab = varWidget.toList(); - for each(QVariant tabChild in listTab) { - QDockWidget* pDock = m_mapDockWidget.value(tabChild.toString()); - addDockWidget(dockArea, pDock); - - if (pLastDock) { - //tabifyDockWidget(pLastDock, pDock); - splitDockWidget(pLastDock, pDock, Qt::Horizontal); - } - - listAdd.push_back(pDock); - - pLastDock = pDock; - } - } - } - } - QList listSpliter; - for (size_t i = 0; i < listAdd.size(); i++) { - listSpliter.push_back(1); - } - - resizeDocks(listAdd, listSpliter, orient); -} - -void MainWindow::OnTabifiedDockWidgetActivated(QDockWidget* dockWidget) { - //if (dockWidget) { - // QMainWindow* mainWindow = qobject_cast(dockWidget->parentWidget()); - // if (mainWindow) { - // mainWindow->removeDockWidget(dockWidget); - // } - - // // tabWidget_->setCurrentWidget(dockWidget->parentWidget()); - //} -} - void MainWindow::slotShowUISetting() { pSettingUI->show(); } diff --git a/src/ui/MainWindow.h b/src/ui/MainWindow.h index 13680c78..376d73b7 100644 --- a/src/ui/MainWindow.h +++ b/src/ui/MainWindow.h @@ -44,12 +44,6 @@ private: void InitUI(); void UninitUI(); - void InitDockLayout(); - void AddDockArea(const QString& strArea); - -protected: - void OnTabifiedDockWidgetActivated(QDockWidget* dockWidget); - private: Ui::MainWindow* ui; diff --git a/src/ui/MainWindow.ui b/src/ui/MainWindow.ui index 61c17f6e..63d92d14 100644 --- a/src/ui/MainWindow.ui +++ b/src/ui/MainWindow.ui @@ -1,131 +1,20 @@ - MainWindow - - - - 0 - 0 - 800 - 658 - - - - MainWindow - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 19 - - - 19 - - - 19 - - - 19 - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - - - - - - - - 0 - 20 - - - - - 16777215 - 30 - - - - - 0 - - - 0 - - - - - - - - - - - - - - - - - - - Qt::Horizontal - - - - 767 - 20 - - - - - - - - - - - - + MainWindow + + + + 0 + 0 + 1223 + 950 + + + + MainWindow + + + + + diff --git a/src/utils/UiLayoutManager.cpp b/src/utils/UiLayoutManager.cpp new file mode 100644 index 00000000..db35dd40 --- /dev/null +++ b/src/utils/UiLayoutManager.cpp @@ -0,0 +1,38 @@ +#include "UiLayoutManager.h" + +#include +#include +#include + +#include "common/RecourceHelper.h" + +namespace { +static inline QString layoutIniPath() { + return RecourceHelper::Get().GetBasePath() + "/config/UIState.ini"; +} +} + +void UiLayoutManager::Save(QMainWindow* mainWindow, int version) { + if (!mainWindow) return; + const QString iniPath = layoutIniPath(); + QSettings settings(iniPath, QSettings::IniFormat); + settings.setValue("MainWindow/geometry", mainWindow->saveGeometry()); + settings.setValue("MainWindow/state", mainWindow->saveState(version)); +} + +void UiLayoutManager::Restore(QMainWindow* mainWindow, int version) { + if (!mainWindow) return; + const QString iniPath = layoutIniPath(); + if (!QFile::exists(iniPath)) { + return; + } + 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); + } +} \ No newline at end of file diff --git a/src/utils/UiLayoutManager.h b/src/utils/UiLayoutManager.h new file mode 100644 index 00000000..4d1796e7 --- /dev/null +++ b/src/utils/UiLayoutManager.h @@ -0,0 +1,13 @@ +#pragma once + +#include +class QMainWindow; + +class UiLayoutManager { +public: + // 保存主窗口布局到 workspace/UIState.ini + static void Save(QMainWindow* mainWindow, int version = 1); + + // 从 workspace/UIState.ini 恢复布局 + static void Restore(QMainWindow* mainWindow, int version = 1); +}; \ No newline at end of file