@@ -63,12 +63,12 @@ namespace {
6363 return -1 ;
6464 }
6565
66- WString axisName (Axis axis , int yAxis )
66+ WString axisName (Axis axis , int axisId )
6767 {
68- if (axis == Axis ::X )
69- return Wt ::utf8 ("X Axis" );
70- else {
71- return Wt ::utf8 ("Y axis {1}" ).arg (yAxis + 1 );
68+ if (axis == Axis ::X ) {
69+ return Wt ::utf8 ("X Axis {1}" ). arg ( axisId + 1 );
70+ } else {
71+ return Wt ::utf8 ("Y axis {1}" ).arg (axisId + 1 );
7272 }
7373 }
7474}
@@ -221,6 +221,9 @@ ChartConfig::ChartConfig(WCartesianChart *chart)
221221 addEntry (markers , "Asterisk" );
222222 addEntry (markers , "Diamond" );
223223
224+ xAxesModel_ = std ::make_shared < WStandardItemModel > (0 , 1 );
225+ addEntry (xAxesModel_ , axisName (Axis ::X , 0 ));
226+
224227 yAxesModel_ = std ::make_shared < WStandardItemModel > (0 , 1 );
225228 addEntry (yAxesModel_ , axisName (Axis ::Y , 0 ));
226229 addEntry (yAxesModel_ , axisName (Axis ::Y , 1 ));
@@ -240,6 +243,7 @@ ChartConfig::ChartConfig(WCartesianChart *chart)
240243 ::addHeader (seriesConfigPtr , "Enabled" );
241244 ::addHeader (seriesConfigPtr , "Type" );
242245 ::addHeader (seriesConfigPtr , "Marker" );
246+ ::addHeader (seriesConfigPtr , "X axis" );
243247 ::addHeader (seriesConfigPtr , "Y axis" );
244248 ::addHeader (seriesConfigPtr , "Legend" );
245249 ::addHeader (seriesConfigPtr , "Shadow" );
@@ -265,18 +269,23 @@ ChartConfig::ChartConfig(WCartesianChart *chart)
265269 sc .markerEdit -> setCurrentIndex (0 );
266270 connectSignals (sc .markerEdit );
267271
268- sc .axisEdit = seriesConfig -> elementAt (j ,4 )-> addNew < WComboBox > ( );
269- sc .axisEdit -> setModel (yAxesModel_ );
270- sc .axisEdit -> setCurrentIndex (0 );
271- connectSignals (sc .axisEdit );
272+ sc .xAxisEdit = seriesConfig -> elementAt (j , 4 )-> addNew < WComboBox > ( );
273+ sc .xAxisEdit -> setModel (xAxesModel_ );
274+ sc .xAxisEdit -> setCurrentIndex (0 );
275+ connectSignals (sc .xAxisEdit );
272276
273- sc .legendEdit = seriesConfig -> elementAt (j , 5 )-> addWidget (cpp14 ::make_unique < WCheckBox > ( ));
277+ sc .yAxisEdit = seriesConfig -> elementAt (j , 5 )-> addNew < WComboBox > ( );
278+ sc .yAxisEdit -> setModel (yAxesModel_ );
279+ sc .yAxisEdit -> setCurrentIndex (0 );
280+ connectSignals (sc .yAxisEdit );
281+
282+ sc .legendEdit = seriesConfig -> elementAt (j , 6 )-> addWidget (cpp14 ::make_unique < WCheckBox > ( ));
274283 connectSignals (sc .legendEdit );
275284
276- sc .shadowEdit = seriesConfig -> elementAt (j ,6 )-> addWidget (cpp14 ::make_unique < WCheckBox > ( ));
285+ sc .shadowEdit = seriesConfig -> elementAt (j , 7 )-> addWidget (cpp14 ::make_unique < WCheckBox > ( ));
277286 connectSignals (sc .shadowEdit );
278287
279- sc .labelsEdit = seriesConfig -> elementAt (j ,7 )-> addWidget (cpp14 ::make_unique < WComboBox > ( ));
288+ sc .labelsEdit = seriesConfig -> elementAt (j , 8 )-> addWidget (cpp14 ::make_unique < WComboBox > ( ));
280289 sc .labelsEdit -> setModel (labels );
281290 sc .labelsEdit -> setCurrentIndex (0 );
282291 connectSignals (sc .labelsEdit );
@@ -350,12 +359,18 @@ ChartConfig::ChartConfig(WCartesianChart *chart)
350359 addAxis (Axis ::Y , 0 );
351360 addAxis (Axis ::Y , 1 );
352361
353- WPushButton * addAxisBtn =
362+ WPushButton * addXAxisBtn =
363+ axisConfig -> addNew < WPushButton > (Wt ::utf8 ("Add X axis" ));
364+ addXAxisBtn -> clicked ().connect (this , & ChartConfig ::addXAxis );
365+ WPushButton * clearXAxesBtn =
366+ axisConfig -> addNew < WPushButton > (Wt ::utf8 ("Clear X axes" ));
367+ clearXAxesBtn -> clicked ().connect (this , & ChartConfig ::clearXAxes );
368+ WPushButton * addYAxisBtn =
354369 axisConfig -> addNew < WPushButton > (utf8 ("Add Y axis" ));
355- addAxisBtn -> clicked ().connect (this , & ChartConfig ::addYAxis );
356- WPushButton * clearAxesBtn =
370+ addYAxisBtn -> clicked ().connect (this , & ChartConfig ::addYAxis );
371+ WPushButton * clearYAxesBtn =
357372 axisConfig -> addNew < WPushButton > (utf8 ("Clear Y axes" ));
358- clearAxesBtn -> clicked ().connect (this , & ChartConfig ::clearYAxes );
373+ clearYAxesBtn -> clicked ().connect (this , & ChartConfig ::clearYAxes );
359374
360375 p = list -> addWidget ("Axis properties" , std ::move (axisConfig ));
361376 p -> setMargin (WLength ::Auto , Side ::Left | Side ::Right );
@@ -440,7 +455,8 @@ void ChartConfig::update()
440455
441456 s -> setMarker (static_cast < MarkerType > (sc .markerEdit -> currentIndex ()));
442457
443- s -> bindToYAxis (sc .axisEdit -> currentIndex ());
458+ s -> bindToXAxis (sc .xAxisEdit -> currentIndex ());
459+ s -> bindToYAxis (sc .yAxisEdit -> currentIndex ());
444460
445461 if (sc .legendEdit -> isChecked ()) {
446462 s -> setLegendEnabled (true);
@@ -474,7 +490,7 @@ void ChartConfig::update()
474490
475491 for (std ::size_t i = 0 ; i < axisControls_ .size (); ++ i ) {
476492 AxisControl & sc = axisControls_ [i ];
477- WAxis & axis = i == 0 ? chart_ -> axis ( Axis :: X ) : chart_ -> yAxis (i - 1 );
493+ WAxis & axis = static_cast < int > ( i ) < chart_ -> xAxisCount () ? chart_ -> xAxis ( i ) : chart_ -> yAxis (i - chart_ -> xAxisCount () );
478494
479495 axis .setVisible (sc .visibleEdit -> isChecked ());
480496
@@ -655,6 +671,15 @@ void ChartConfig::connectSignals(WFormWidget *w)
655671 w -> enterPressed ().connect (this , & ChartConfig ::update );
656672}
657673
674+ void ChartConfig ::addXAxis ()
675+ {
676+ int xAxis = chart_ -> addXAxis (cpp14 ::make_unique < WAxis > ( ));
677+ addAxis (Axis ::X , xAxis );
678+ addEntry (xAxesModel_ , axisName (Axis ::X , xAxis ));
679+ if (xAxis == 0 )
680+ update ();
681+ }
682+
658683void ChartConfig ::addYAxis ()
659684{
660685 int yAxis = chart_ -> addYAxis (cpp14 ::make_unique < WAxis > ( ));
@@ -664,13 +689,14 @@ void ChartConfig::addYAxis()
664689 update ();
665690}
666691
667- void ChartConfig ::addAxis (Axis ax , int yAxis )
692+ void ChartConfig ::addAxis (Axis ax , int axisId )
668693{
669- int j = ax == Axis ::X ? 1 : yAxis + 2 ;
694+ int j = ax == Axis ::X ? 1 + axisId : 1 + chart_ -> xAxisCount () + axisId ;
670695
671- const WAxis & axis = ax == Axis ::X ? chart_ -> axis ( Axis :: X ) : chart_ -> yAxis (yAxis );
696+ const WAxis & axis = ax == Axis ::X ? chart_ -> xAxis ( axisId ) : chart_ -> yAxis (axisId );
672697 AxisControl sc ;
673698
699+ axisConfig_ -> insertRow (j );
674700 axisConfig_ -> elementAt (j , 0 )-> addNew < WText > (axisName (axis .id (), axis .yAxisId ()));
675701
676702 sc .visibleEdit = axisConfig_ -> elementAt (j , 1 )-> addNew < WCheckBox > ( );
@@ -752,15 +778,31 @@ void ChartConfig::addAxis(Axis ax, int yAxis)
752778 }
753779 connectSignals (sc .locationEdit );
754780
755- if (ax != Axis ::X ) {
756- WPushButton * removeAxisButton =
757- axisConfig_ -> elementAt (j , 12 )-> addNew < WPushButton > (utf8 ("x" ));
781+ WPushButton * removeAxisButton =
782+ axisConfig_ -> elementAt (j , 12 )-> addNew < WPushButton > (utf8 ("x" ));
783+ if (ax == Axis ::X ) {
784+ removeAxisButton -> clicked ().connect (std ::bind (& ChartConfig ::removeXAxis , this , & axis ));
785+ } else {
758786 removeAxisButton -> clicked ().connect (std ::bind (& ChartConfig ::removeYAxis , this , & axis ));
759787 }
760788
761789 axisConfig_ -> rowAt (j )-> setStyleClass ("trdata" );
762790
763- axisControls_ .push_back (sc );
791+ axisControls_ .insert (axisControls_ .begin () + j - 1 , sc );
792+ }
793+
794+ void ChartConfig ::removeXAxis (const WAxis * axis )
795+ {
796+ int xAxis = axis -> xAxisId ();
797+ for (std ::size_t i = 0 ; i < chart_ -> series ().size (); ++ i ) {
798+ if (chart_ -> series ()[i ]-> xAxis () == xAxis )
799+ chart_ -> series ()[i ]-> bindToXAxis (-1 );
800+ }
801+ chart_ -> removeXAxis (xAxis );
802+ axisConfig_ -> removeRow (1 + xAxis );
803+ xAxesModel_ -> removeRow (xAxis );
804+ axisControls_ .erase (axisControls_ .begin () + xAxis );
805+ update ();
764806}
765807
766808void ChartConfig ::removeYAxis (const WAxis * axis )
@@ -771,12 +813,29 @@ void ChartConfig::removeYAxis(const WAxis *axis)
771813 chart_ -> series ()[i ]-> bindToYAxis (-1 );
772814 }
773815 chart_ -> removeYAxis (yAxis );
774- axisConfig_ -> removeRow (yAxis + 2 );
816+ axisConfig_ -> removeRow (1 + chart_ -> xAxisCount () + yAxis );
775817 yAxesModel_ -> removeRow (yAxis );
776- axisControls_ .erase (axisControls_ .begin () + yAxis + 1 );
818+ axisControls_ .erase (axisControls_ .begin () + chart_ -> xAxisCount () + yAxis );
777819 update ();
778820}
779821
822+ void ChartConfig ::clearXAxes ()
823+ {
824+ if (chart_ -> xAxisCount () == 0 )
825+ return ;
826+
827+ for (std ::size_t i = 0 ; i < chart_ -> series ().size (); ++ i ) {
828+ chart_ -> series ()[i ]-> bindToXAxis (-1 );
829+ }
830+ const int xAxisCount = chart_ -> xAxisCount ();
831+ chart_ -> clearXAxes ();
832+ for (int i = 0 ; i < xAxisCount ; ++ i ) {
833+ axisConfig_ -> removeRow (1 );
834+ }
835+ xAxesModel_ -> clear ();
836+ axisControls_ .erase (axisControls_ .begin (), axisControls_ .begin () + xAxisCount );
837+ }
838+
780839void ChartConfig ::clearYAxes ()
781840{
782841 if (chart_ -> yAxisCount () == 0 )
@@ -785,9 +844,11 @@ void ChartConfig::clearYAxes()
785844 for (std ::size_t i = 0 ; i < chart_ -> series ().size (); ++ i ) {
786845 chart_ -> series ()[i ]-> bindToYAxis (-1 );
787846 }
847+ const int yAxisCount = chart_ -> yAxisCount ();
788848 chart_ -> clearYAxes ();
789- while (axisConfig_ -> rowCount () > 2 )
790- axisConfig_ -> removeRow (2 );
849+ for (int i = 0 ; i < yAxisCount ; ++ i ) {
850+ axisConfig_ -> removeRow (axisConfig_ -> rowCount () - 1 );
851+ }
791852 yAxesModel_ -> clear ();
792- axisControls_ .resize (1 );
853+ axisControls_ .resize (chart_ -> xAxisCount () );
793854}
0 commit comments