2025-10-16 03:29:25 +00:00
# include "ui/Panel/CurvePanel.h"
# include "ui/DockWidget.h"
# include "common/SpdLogger.h"
# include <QVBoxLayout>
# include <QLabel>
# include <QFileInfo>
2025-10-20 18:17:40 +00:00
# include <QScrollArea>
# include <QGroupBox>
# include <QCheckBox>
# include <QHBoxLayout>
2025-10-16 03:29:25 +00:00
CurvePanel : : CurvePanel ( int index , const QString & filePath , QWidget * parent )
: DataPanel ( index , FileEntryType : : Curve , filePath , parent )
2025-10-20 18:17:40 +00:00
, hasChartData_ ( false )
2025-10-16 03:29:25 +00:00
{
LOG_INFO ( " Created CurvePanel {} for file: {} " , index , filePath . toStdString ( ) ) ;
}
2025-10-20 18:17:40 +00:00
CurvePanel : : CurvePanel ( int index , std : : shared_ptr < BaseChartData > chartData , QWidget * parent )
: DataPanel ( index , FileEntryType : : Curve , chartData ? chartData - > path : QString ( ) , parent )
, chartData_ ( chartData )
, hasChartData_ ( chartData ! = nullptr )
{
if ( chartData ) {
LOG_INFO ( " Created CurvePanel {} for chart: {} " , index , chartData - > name . toStdString ( ) ) ;
// Override the title with chart name
title_ = QString ( " Curve Panel %1 - %2 " ) . arg ( index ) . arg ( chartData - > name ) ;
} else {
LOG_WARN ( " Created CurvePanel {} with null chart data " , index ) ;
}
}
2025-10-16 03:29:25 +00:00
CurvePanel : : ~ CurvePanel ( )
{
LOG_INFO ( " Destroyed CurvePanel {} " , GetIndex ( ) ) ;
}
void CurvePanel : : RefreshPanel ( )
{
// Implement curve-specific refresh logic here
DataPanel : : RefreshPanel ( ) ;
2025-10-20 18:17:40 +00:00
if ( hasChartData_ ) {
UpdateCurveDisplay ( ) ;
}
2025-10-16 03:29:25 +00:00
LOG_INFO ( " Refreshed CurvePanel {} " , GetIndex ( ) ) ;
}
2025-10-20 18:17:40 +00:00
void CurvePanel : : SetChartData ( std : : shared_ptr < BaseChartData > chartData )
2025-10-16 03:29:25 +00:00
{
2025-10-20 18:17:40 +00:00
chartData_ = chartData ;
hasChartData_ = ( chartData ! = nullptr ) ;
if ( chartData ) {
// Update title
title_ = QString ( " Curve Panel %1 - %2 " ) . arg ( GetIndex ( ) ) . arg ( chartData - > name ) ;
// Refresh the display
UpdateCurveDisplay ( ) ;
LOG_INFO ( " Set chart data for CurvePanel {}: {} " , GetIndex ( ) , chartData - > name . toStdString ( ) ) ;
} else {
LOG_WARN ( " Set null chart data for CurvePanel {} " , GetIndex ( ) ) ;
}
}
void CurvePanel : : UpdateCurveDisplay ( )
{
if ( ! hasChartData_ | | ! chartData_ ) {
return ;
}
// Clear existing layout and recreate
if ( layout ( ) ) {
QLayoutItem * item ;
while ( ( item = layout ( ) - > takeAt ( 0 ) ) ! = nullptr ) {
delete item - > widget ( ) ;
delete item ;
}
delete layout ( ) ;
}
2025-10-16 03:29:25 +00:00
2025-10-20 18:17:40 +00:00
// Create new layout with chart information
QVBoxLayout * mainLayout = new QVBoxLayout ( this ) ;
2025-10-16 03:29:25 +00:00
2025-10-20 18:17:40 +00:00
// Chart info section
QGroupBox * chartInfoGroup = new QGroupBox ( QString ( " Chart: %1 " ) . arg ( chartData_ - > name ) ) ;
QVBoxLayout * chartInfoLayout = new QVBoxLayout ( chartInfoGroup ) ;
// Chart details - handle different chart types
QLabel * pathLabel = new QLabel ( QString ( " File: %1 " ) . arg ( QFileInfo ( chartData_ - > path ) . fileName ( ) ) ) ;
chartInfoLayout - > addWidget ( pathLabel ) ;
// Type-specific information
if ( auto curveChart = std : : dynamic_pointer_cast < CurveChartData > ( chartData_ ) ) {
QLabel * titleLabel = new QLabel ( QString ( " Title: X=%1, Y=%2 " ) . arg ( curveChart - > xTitle , curveChart - > yTitle ) ) ;
QLabel * rangeLabel = new QLabel ( QString ( " Range: X[%1-%2], Y[%3-%4] " )
. arg ( curveChart - > xMin ) . arg ( curveChart - > xMax )
. arg ( curveChart - > yMin ) . arg ( curveChart - > yMax ) ) ;
QLabel * countLabel = new QLabel ( QString ( " Count: X=%1, T=%2 " ) . arg ( curveChart - > xCount ) . arg ( curveChart - > t ) ) ;
chartInfoLayout - > addWidget ( titleLabel ) ;
chartInfoLayout - > addWidget ( rangeLabel ) ;
chartInfoLayout - > addWidget ( countLabel ) ;
// Curves section
if ( ! curveChart - > curves . isEmpty ( ) ) {
QGroupBox * curvesGroup = new QGroupBox ( QString ( " Curves (%1) " ) . arg ( curveChart - > curves . size ( ) ) ) ;
QVBoxLayout * curvesLayout = new QVBoxLayout ( curvesGroup ) ;
// Add scroll area for curves
QScrollArea * scrollArea = new QScrollArea ( ) ;
QWidget * scrollWidget = new QWidget ( ) ;
QVBoxLayout * scrollLayout = new QVBoxLayout ( scrollWidget ) ;
for ( const CurveData & curve : curveChart - > curves ) {
QHBoxLayout * curveLayout = new QHBoxLayout ( ) ;
// Curve checkbox for show/hide
QCheckBox * curveCheckBox = new QCheckBox ( curve . name ) ;
curveCheckBox - > setChecked ( true ) ;
// Curve info
QLabel * curveInfo = new QLabel ( QString ( " Range: %1-%2, Color: %3 " )
. arg ( curve . start ) . arg ( curve . stop ) . arg ( curve . color ) ) ;
curveInfo - > setStyleSheet ( QString ( " QLabel { color: rgb(%1); } " ) . arg ( curve . color ) ) ;
curveLayout - > addWidget ( curveCheckBox ) ;
curveLayout - > addWidget ( curveInfo ) ;
curveLayout - > addStretch ( ) ;
scrollLayout - > addLayout ( curveLayout ) ;
}
scrollWidget - > setLayout ( scrollLayout ) ;
scrollArea - > setWidget ( scrollWidget ) ;
scrollArea - > setWidgetResizable ( true ) ;
scrollArea - > setMaximumHeight ( 200 ) ;
curvesLayout - > addWidget ( scrollArea ) ;
mainLayout - > addWidget ( curvesGroup ) ;
}
} else if ( auto surfaceChart = std : : dynamic_pointer_cast < SurfaceChartData > ( chartData_ ) ) {
QLabel * titleLabel = new QLabel ( QString ( " Title: X=%1, Y=%2, Z=%3 " )
. arg ( surfaceChart - > xTitle , surfaceChart - > yTitle , surfaceChart - > zTitle ) ) ;
QLabel * rangeLabel = new QLabel ( QString ( " Range: X[%1-%2], Y[%3-%4], Z[%5-%6] " )
. arg ( surfaceChart - > xMin ) . arg ( surfaceChart - > xMax )
. arg ( surfaceChart - > yMin ) . arg ( surfaceChart - > yMax )
. arg ( surfaceChart - > zMin ) . arg ( surfaceChart - > zMax ) ) ;
QLabel * countLabel = new QLabel ( QString ( " Count: X=%1, Y=%2, Z=%3, T=%4 " )
. arg ( surfaceChart - > xCount ) . arg ( surfaceChart - > yCount )
. arg ( surfaceChart - > zCount ) . arg ( surfaceChart - > t ) ) ;
chartInfoLayout - > addWidget ( titleLabel ) ;
chartInfoLayout - > addWidget ( rangeLabel ) ;
chartInfoLayout - > addWidget ( countLabel ) ;
// Surface curves section
if ( ! surfaceChart - > curves . isEmpty ( ) ) {
QGroupBox * curvesGroup = new QGroupBox ( QString ( " Surface Curves (%1) " ) . arg ( surfaceChart - > curves . size ( ) ) ) ;
QVBoxLayout * curvesLayout = new QVBoxLayout ( curvesGroup ) ;
QScrollArea * scrollArea = new QScrollArea ( ) ;
QWidget * scrollWidget = new QWidget ( ) ;
QVBoxLayout * scrollLayout = new QVBoxLayout ( scrollWidget ) ;
for ( const SurfaceCurveData & curve : surfaceChart - > curves ) {
QHBoxLayout * curveLayout = new QHBoxLayout ( ) ;
QCheckBox * curveCheckBox = new QCheckBox ( curve . name ) ;
curveCheckBox - > setChecked ( true ) ;
QLabel * curveInfo = new QLabel ( QString ( " Range: %1-%2, Color: %3, Pos: (%4,%5,%6) " )
. arg ( curve . start ) . arg ( curve . stop ) . arg ( curve . color )
. arg ( curve . x ) . arg ( curve . y ) . arg ( curve . z ) ) ;
curveInfo - > setStyleSheet ( QString ( " QLabel { color: rgb(%1); } " ) . arg ( curve . color ) ) ;
curveLayout - > addWidget ( curveCheckBox ) ;
curveLayout - > addWidget ( curveInfo ) ;
curveLayout - > addStretch ( ) ;
scrollLayout - > addLayout ( curveLayout ) ;
}
scrollWidget - > setLayout ( scrollLayout ) ;
scrollArea - > setWidget ( scrollWidget ) ;
scrollArea - > setWidgetResizable ( true ) ;
scrollArea - > setMaximumHeight ( 200 ) ;
curvesLayout - > addWidget ( scrollArea ) ;
mainLayout - > addWidget ( curvesGroup ) ;
}
} else if ( auto tableChart = std : : dynamic_pointer_cast < TableChartData > ( chartData_ ) ) {
QLabel * headLabel = new QLabel ( QString ( " Head: %1 " ) . arg ( tableChart - > head ) ) ;
QLabel * timeLabel = new QLabel ( QString ( " Time: %1 " ) . arg ( tableChart - > t ) ) ;
chartInfoLayout - > addWidget ( headLabel ) ;
chartInfoLayout - > addWidget ( timeLabel ) ;
// Table curves section
if ( ! tableChart - > curves . isEmpty ( ) ) {
QGroupBox * curvesGroup = new QGroupBox ( QString ( " Table Data (%1) " ) . arg ( tableChart - > curves . size ( ) ) ) ;
QVBoxLayout * curvesLayout = new QVBoxLayout ( curvesGroup ) ;
QScrollArea * scrollArea = new QScrollArea ( ) ;
QWidget * scrollWidget = new QWidget ( ) ;
QVBoxLayout * scrollLayout = new QVBoxLayout ( scrollWidget ) ;
for ( const TableCurveData & curve : tableChart - > curves ) {
QHBoxLayout * curveLayout = new QHBoxLayout ( ) ;
QCheckBox * curveCheckBox = new QCheckBox ( curve . name ) ;
curveCheckBox - > setChecked ( true ) ;
QLabel * curveInfo = new QLabel ( QString ( " Color: %1, Data: %2 " )
. arg ( curve . color ) . arg ( curve . data ) ) ;
curveInfo - > setStyleSheet ( QString ( " QLabel { color: rgb(%1); } " ) . arg ( curve . color ) ) ;
curveLayout - > addWidget ( curveCheckBox ) ;
curveLayout - > addWidget ( curveInfo ) ;
curveLayout - > addStretch ( ) ;
scrollLayout - > addLayout ( curveLayout ) ;
}
scrollWidget - > setLayout ( scrollLayout ) ;
scrollArea - > setWidget ( scrollWidget ) ;
scrollArea - > setWidgetResizable ( true ) ;
scrollArea - > setMaximumHeight ( 200 ) ;
curvesLayout - > addWidget ( scrollArea ) ;
mainLayout - > addWidget ( curvesGroup ) ;
}
} else if ( auto lightChart = std : : dynamic_pointer_cast < LightChartData > ( chartData_ ) ) {
QLabel * colorLabel = new QLabel ( QString ( " Open Color: %1, Close Color: %2 " )
. arg ( lightChart - > openColor ) . arg ( lightChart - > closeColor ) ) ;
QLabel * timeLabel = new QLabel ( QString ( " Time: %1 " ) . arg ( lightChart - > t ) ) ;
chartInfoLayout - > addWidget ( colorLabel ) ;
chartInfoLayout - > addWidget ( timeLabel ) ;
// Light curves section
if ( ! lightChart - > curves . isEmpty ( ) ) {
QGroupBox * curvesGroup = new QGroupBox ( QString ( " Light Data (%1) " ) . arg ( lightChart - > curves . size ( ) ) ) ;
QVBoxLayout * curvesLayout = new QVBoxLayout ( curvesGroup ) ;
QScrollArea * scrollArea = new QScrollArea ( ) ;
QWidget * scrollWidget = new QWidget ( ) ;
QVBoxLayout * scrollLayout = new QVBoxLayout ( scrollWidget ) ;
for ( const LightCurveData & curve : lightChart - > curves ) {
QHBoxLayout * curveLayout = new QHBoxLayout ( ) ;
QCheckBox * curveCheckBox = new QCheckBox ( curve . name ) ;
curveCheckBox - > setChecked ( true ) ;
QLabel * curveInfo = new QLabel ( QString ( " Data: %1 " ) . arg ( curve . data ) ) ;
curveLayout - > addWidget ( curveCheckBox ) ;
curveLayout - > addWidget ( curveInfo ) ;
curveLayout - > addStretch ( ) ;
scrollLayout - > addLayout ( curveLayout ) ;
}
scrollWidget - > setLayout ( scrollLayout ) ;
scrollArea - > setWidget ( scrollWidget ) ;
scrollArea - > setWidgetResizable ( true ) ;
scrollArea - > setMaximumHeight ( 200 ) ;
curvesLayout - > addWidget ( scrollArea ) ;
mainLayout - > addWidget ( curvesGroup ) ;
}
}
mainLayout - > addWidget ( chartInfoGroup ) ;
// Placeholder for actual curve rendering
QLabel * renderLabel = new QLabel ( " Curve Rendering Area \n (To be implemented by rendering team) " ) ;
renderLabel - > setAlignment ( Qt : : AlignCenter ) ;
renderLabel - > setStyleSheet ( " QLabel { color: #666; font-size: 12px; padding: 20px; border: 1px dashed #ccc; } " ) ;
renderLabel - > setMinimumHeight ( 200 ) ;
mainLayout - > addWidget ( renderLabel ) ;
mainLayout - > addStretch ( ) ;
setLayout ( mainLayout ) ;
}
void CurvePanel : : InitUI ( )
{
if ( hasChartData_ ) {
UpdateCurveDisplay ( ) ;
} else {
// Create basic layout for file-based panel
QVBoxLayout * layout = new QVBoxLayout ( this ) ;
// Add placeholder label showing panel information
QLabel * infoLabel = new QLabel ( QString ( " Curve Panel %1 \n File: %2 \n \n Curve Drawing Area \n Please inherit this class to implement specific drawing functionality " )
. arg ( GetIndex ( ) )
. arg ( QFileInfo ( GetFilePath ( ) ) . fileName ( ) ) ) ;
infoLabel - > setAlignment ( Qt : : AlignCenter ) ;
infoLabel - > setStyleSheet ( " QLabel { color: #666; font-size: 12px; padding: 20px; } " ) ;
layout - > addWidget ( infoLabel ) ;
setLayout ( layout ) ;
}
2025-10-16 03:29:25 +00:00
}
QString CurvePanel : : GetTypeDisplayName ( ) const
{
return " Curve " ;
}