From 6617e2f46e945bc35e71d225c7b72640fa964949 Mon Sep 17 00:00:00 2001
From: pimin <362371171@qq.com>
Date: Sun, 2 Nov 2025 16:36:07 +0800
Subject: [PATCH] modified panel
---
src/Dyt.qrc | 1 +
src/res/default/menu_image_file.png | Bin 0 -> 6968 bytes
src/translations/Dyt_zh_CN.ts | 489 ++++++++++------------------
src/ui/Panel/ImagePanel.cpp | 77 +++++
src/ui/Panel/ImagePanel.h | 63 ++++
src/workspace/FileEntry.cpp | 57 ++++
src/workspace/FileEntry.h | 59 +++-
7 files changed, 428 insertions(+), 318 deletions(-)
create mode 100644 src/res/default/menu_image_file.png
create mode 100644 src/ui/Panel/ImagePanel.cpp
create mode 100644 src/ui/Panel/ImagePanel.h
diff --git a/src/Dyt.qrc b/src/Dyt.qrc
index 3007ee41..95741fca 100644
--- a/src/Dyt.qrc
+++ b/src/Dyt.qrc
@@ -38,6 +38,7 @@
res/models/radar_jamming_station.png
res/models/satellite.png
res/models/warships.png
+ res/default/menu_image_file.png
diff --git a/src/res/default/menu_image_file.png b/src/res/default/menu_image_file.png
new file mode 100644
index 0000000000000000000000000000000000000000..979815d8f32f2927d8352508e118a12c0557f57e
GIT binary patch
literal 6968
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
IC1V`?KNst3hX4Qo
literal 0
HcmV?d00001
diff --git a/src/translations/Dyt_zh_CN.ts b/src/translations/Dyt_zh_CN.ts
index a151b381..2d3d28e7 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
@@ -889,160 +893,6 @@
-
- AddPolarFileDlg
-
-
- Data Files (*.txt *.csv *.dat);;All Files (*.*)
-
-
-
-
- Add Polar
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 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' 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.
-
-
-
-
- Angular axis minimum value must be less than maximum value.
-
-
-
-
- Radial axis minimum value must be less than maximum value.
-
-
-
-
- Time parameter cannot be negative.
-
-
-
-
- Curve %1
-
-
-
-
-
-
- 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
-
-
-
AddSurfaceFileDlg
@@ -1267,7 +1117,7 @@
-
+
Warning
@@ -1287,49 +1137,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 +1790,11 @@
new polar file
+
+
+ new image file
+
+
FitCurveChartView
@@ -2302,38 +2157,38 @@
-
+
Open Workspace
-
-
+
+
Dyt Files (*.dyt)
-
-
-
-
-
-
+
+
+
+
+
+
prompt
-
-
-
-
-
-
+
+
+
+
+
+
please create workspace first
-
+
Save Workspace
diff --git a/src/ui/Panel/ImagePanel.cpp b/src/ui/Panel/ImagePanel.cpp
new file mode 100644
index 00000000..86c5ee41
--- /dev/null
+++ b/src/ui/Panel/ImagePanel.cpp
@@ -0,0 +1,77 @@
+#include "ui/Panel/ImagePanel.h"
+#include "ui/DockWidget.h"
+#include "ui/DockTitleBar.h"
+#include "common/SpdLogger.h"
+#include
+#include
+#include
+
+ImagePanel::ImagePanel(int index, const QString& filePath, QWidget* parent)
+ : DataPanel(index, FileEntryType::Table, filePath, parent)
+{
+ LOG_INFO("Created ImagePanel {} for file: {}", index, filePath.toStdString());
+}
+
+ImagePanel::ImagePanel(int index, std::shared_ptr fileEntry, QWidget* parent)
+ : DataPanel(index, fileEntry, parent)
+{
+ if (fileEntry) {
+ LOG_INFO("Created ImagePanel {} for chart: {}", index, fileEntry->GetName().toStdString());
+ // Override the title with chart name
+ title_ = QString("Image Panel %1 - %2").arg(index).arg(fileEntry->GetName());
+ }
+ else {
+ LOG_WARN("Created ImagePanel {} with null chart data", index);
+ }
+}
+
+ImagePanel::~ImagePanel()
+{
+ LOG_INFO("Destroyed ImagePanel {}", GetIndex());
+}
+
+void ImagePanel::RefreshPanel()
+{
+ // Implement curve-specific refresh logic here
+ DataPanel::RefreshPanel();
+
+ if (auto fileEntry = fileEntry_->AsImage()) {
+ OnDataPanelUpdated(fileEntry);
+ }
+
+ LOG_INFO("Refreshed ImagePanel {}", GetIndex());
+}
+
+void ImagePanel::InitUI()
+{
+
+ QHBoxLayout* mainLayout = new QHBoxLayout(this);
+ mainLayout->setContentsMargins(0, 0, 0, 0);
+ //mainLayout->addWidget(m_pTableWidget);
+ setLayout(mainLayout);
+}
+
+QString ImagePanel::GetTypeDisplayName() const
+{
+ return "Image";
+}
+
+void ImagePanel::OnDataPanelUpdated(FileEntryImage* fileEntry)
+{
+ QString strName = fileEntry->GetName();
+ updateTitle(strName);
+
+}
+
+void ImagePanel::OnTimeChanged(double time)
+{
+
+}
+
+void ImagePanel::updateTitle(const QString & title)
+{
+ if (nullptr != dockWidget_)
+ {
+ dockWidget_->setWindowTitle(title);
+ }
+}
\ No newline at end of file
diff --git a/src/ui/Panel/ImagePanel.h b/src/ui/Panel/ImagePanel.h
new file mode 100644
index 00000000..bdd862b9
--- /dev/null
+++ b/src/ui/Panel/ImagePanel.h
@@ -0,0 +1,63 @@
+#pragma once
+
+#include "DataPanel.h"
+#include "workspace/FileEntry.h"
+#include
+
+class ImagePanel : public DataPanel
+{
+ Q_OBJECT
+
+public:
+ /**
+ * @brief Constructor
+ * @param index Panel index
+ * @param filePath Associated file path
+ * @param parent Parent widget
+ */
+ explicit ImagePanel(int index, const QString& filePath, QWidget* parent = nullptr);
+
+ /**
+ * @brief Constructor with chart data
+ * @param index Panel index
+ * @param chartData Chart data containing curve information
+ * @param parent Parent widget
+ */
+ explicit ImagePanel(int index, std::shared_ptr fileEntry, QWidget* parent = nullptr);
+
+ /**
+ * @brief Destructor
+ */
+ virtual ~ImagePanel();
+
+ /**
+ * @brief Get file type
+ * @return File type (always Curve for this class)
+ */
+ FileEntryType GetFileType() const override { return FileEntryType::Image; }
+
+ /**
+ * @brief Refresh panel content
+ */
+ void RefreshPanel() override;
+
+protected:
+ /**
+ * @brief Initialize UI for curve-specific layout
+ */
+ virtual void InitUI();
+
+ /**
+ * @brief Get type display name
+ * @return Display name for curve type
+ */
+ QString GetTypeDisplayName() const override;
+
+ void OnDataPanelUpdated(FileEntryImage* fileEntry);
+
+ virtual void OnTimeChanged(double time);
+
+private:
+ void updateTitle(const QString& title);
+};
+
diff --git a/src/workspace/FileEntry.cpp b/src/workspace/FileEntry.cpp
index 4b702d1b..db727c98 100644
--- a/src/workspace/FileEntry.cpp
+++ b/src/workspace/FileEntry.cpp
@@ -46,6 +46,8 @@ std::shared_ptr CreateFileEntry(FileEntryType type, const QString& fi
return CreateFileEntryLight(filePath);
case FileEntryType::Polar:
return CreateFileEntryPolar(filePath);
+ case FileEntryType::Image:
+ return CreateFileEntryImage(filePath);
default:
LOG_ERROR("Unknown FileEntryType: {}", static_cast(type));
return nullptr;
@@ -122,6 +124,20 @@ std::shared_ptr CreateFileEntryPolar(const QString& filePath) {
return fileEntry;
}
+std::shared_ptr CreateFileEntryImage(const QString& filePath) {
+ QFileInfo fileInfo(filePath);
+ if (!fileInfo.exists()) {
+ LOG_ERROR("File does not exist: {}", filePath.toUtf8().constData());
+ return nullptr;
+ }
+
+ auto fileEntry = std::make_shared();
+ fileEntry->SetPath(filePath);
+ fileEntry->SetName(fileInfo.baseName()); // Use base name as default display name
+
+ return fileEntry;
+}
+
// Factory functions for creating empty FileEntry objects (for XML parsing)
std::shared_ptr CreateEmptyFileEntry(FileEntryType type) {
switch (type) {
@@ -135,6 +151,8 @@ std::shared_ptr CreateEmptyFileEntry(FileEntryType type) {
return CreateEmptyFileEntryLight();
case FileEntryType::Polar:
return CreateEmptyFileEntryPolar();
+ case FileEntryType::Image:
+ return CreateEmptyFileEntryImage();
default:
LOG_ERROR("Unknown FileEntryType: {}", static_cast(type));
return nullptr;
@@ -171,6 +189,12 @@ std::shared_ptr CreateEmptyFileEntryPolar() {
return fileEntry;
}
+std::shared_ptr CreateEmptyFileEntryImage() {
+ auto fileEntry = std::make_shared();
+ // Don't set path or name - these will be set during XML parsing
+ return fileEntry;
+}
+
// FileEntrySurface method implementations
void FileEntrySurface::SetChartProperties(const ChartProperties& properties) {
chartProperties_ = properties;
@@ -807,4 +831,37 @@ bool FileEntryPolar::ParseFiles(const tinyxml2::XMLElement* chartElement) {
}
return true;
+}
+
+
+void FileEntryImage::SetChartProperties(const ChartProperties& properties) {
+ chartProperties_ = properties;
+}
+
+const FileEntryImage::ChartProperties& FileEntryImage::GetChartProperties() const {
+ return chartProperties_;
+}
+
+void FileEntryImage::AddImageProperty(const ImageProperty& image) {
+ imageProperties_.append(image);
+}
+
+void FileEntryImage::RemoveImageProperty(int index) {
+ if (index >= 0 && index < imageProperties_.size()) {
+ imageProperties_.removeAt(index);
+ }
+}
+
+void FileEntryImage::SetImageProperty(int index, const ImageProperty& surface) {
+ if (index >= 0 && index < imageProperties_.size()) {
+ imageProperties_[index] = surface;
+ }
+}
+
+const FileEntryImage::ImageProperties& FileEntryImage::GetImageProperties() const {
+ return imageProperties_;
+}
+
+FileEntryImage* FileEntryImage::AsImage() {
+ return this;
}
\ No newline at end of file
diff --git a/src/workspace/FileEntry.h b/src/workspace/FileEntry.h
index 4b59b42e..e1f36cbd 100644
--- a/src/workspace/FileEntry.h
+++ b/src/workspace/FileEntry.h
@@ -9,7 +9,8 @@ enum class FileEntryType {
Surface,
Table,
Light,
- Polar
+ Polar,
+ Image
};
enum class ChartType {
@@ -39,6 +40,7 @@ inline const char* FileEntryTypeToString(FileEntryType t) {
case FileEntryType::Table: return "table";
case FileEntryType::Light: return "light";
case FileEntryType::Polar: return "polar";
+ case FileEntryType::Image: return "image";
}
return "unknown";
}
@@ -50,6 +52,7 @@ inline bool FileEntryTypeFromString(const char* s, FileEntryType& out) {
if (0 == strcmp(s, "table")) { out = FileEntryType::Table; return true; }
if (0 == strcmp(s, "light")) { out = FileEntryType::Light; return true; }
if (0 == strcmp(s, "polar")) { out = FileEntryType::Polar; return true; }
+ if (0 == strcmp(s, "image")) { out = FileEntryType::Image; return true; }
return false;
}
@@ -58,6 +61,7 @@ class FileEntryLight;
class FileEntrySurface;
class FileEntryTable;
class FileEntryPolar;
+class FileEntryImage;
class FileEntry {
public:
@@ -80,6 +84,7 @@ public:
virtual FileEntrySurface* AsSurface() { return nullptr; }
virtual FileEntryTable* AsTable() { return nullptr; }
virtual FileEntryPolar* AsPolar() { return nullptr; }
+ virtual FileEntryImage* AsImage() { return nullptr; }
virtual bool ParseFiles(const tinyxml2::XMLElement* element) { return false; }
virtual bool SaveFiles(tinyxml2::XMLElement* scene, tinyxml2::XMLDocument* doc) { return false; }
@@ -101,6 +106,7 @@ std::shared_ptr CreateFileEntrySurface(const QString& filePath);
std::shared_ptr CreateFileEntryTable(const QString& filePath);
std::shared_ptr CreateFileEntryLight(const QString& filePath);
std::shared_ptr CreateFileEntryPolar(const QString& filePath);
+std::shared_ptr CreateFileEntryImage(const QString& filePath);
// Factory functions for creating empty FileEntry objects (for XML parsing)
std::shared_ptr CreateEmptyFileEntry(FileEntryType type);
@@ -109,6 +115,7 @@ std::shared_ptr CreateEmptyFileEntrySurface();
std::shared_ptr CreateEmptyFileEntryTable();
std::shared_ptr CreateEmptyFileEntryLight();
std::shared_ptr CreateEmptyFileEntryPolar();
+std::shared_ptr CreateEmptyFileEntryImage();
class FileEntryCurve : public FileEntry {
@@ -350,4 +357,54 @@ public:
private:
ChartProperties chartProperties_;
LineProperties lineProperties_;
+};
+
+class FileEntryImage : public FileEntry {
+public:
+ struct ChartProperties {
+ int AngularCount;
+ int RadialCount;
+ QString AngularTitle;
+ QString RadialTitle;
+ double AngularMin;
+ double AngularMax;
+ double RadialMin;
+ double RadialMax;
+ QString AngularUnit;
+ QString RadialUnit;
+ double timeParam; // 对应XML的t
+ };
+
+ struct ImageProperty {
+ QString name;
+ QColor color;
+ int Angular;
+ int Radial;
+ };
+
+ using ImageProperties = QList;
+
+public:
+ FileEntryImage() { type_ = FileEntryType::Image; }
+
+ // Chart properties management
+ void SetChartProperties(const ChartProperties& properties);
+ const ChartProperties& GetChartProperties() const;
+
+ // Line properties management
+ void AddImageProperty(const ImageProperty& image);
+ void RemoveImageProperty(int index);
+ void SetImageProperty(int index, const ImageProperty& image);
+ const ImageProperties& GetImageProperties() const;
+
+ // Type conversion
+ FileEntryImage* AsImage() override;
+
+ //// XML处理方法
+ //bool SaveFiles(tinyxml2::XMLElement* scene, tinyxml2::XMLDocument* doc) override;
+ //bool ParseFiles(const tinyxml2::XMLElement* element) override;
+
+private:
+ ChartProperties chartProperties_;
+ ImageProperties imageProperties_;
};
\ No newline at end of file