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