Nevron Forum

Placing a gauge panel in a docked panel breaks tooltips and indicator dragging

https://www.nevron.com/Forum/Topic9467.aspx

By Kevin Harrison 1 - Thursday, November 19, 2015

I am populating an NChartControl with a title Label, subtitle Label and GaugePanel. Unlike all the examples, I want my gauge not to impinge into the title area as the size of the NChartControl is reduced. If I set the GaugePanel to Dock.Fill, then I lose the ability to centre the gauge within its panel.
The obvious answer is to place the GaugePanel within an NDockPanel which is set to Dock.Fill. This means the gauge maintains its central position within its panel.
However, once I do this, the Tooltip doesn't work and dragging of the indicator is no longer works. I suspect other tools are broken as well.
How do I achieve my goal?
Thanks
Kevin

By Nevron Support - Friday, November 20, 2015

Hi Kevin,

Can you send us an example of the current configuration so that we can replicate the problem?
By Kevin Harrison 1 - Monday, November 23, 2015

What do you mean by the current configuration?
I've done some experimenting. If I open the examples solution and add a host panel for the gauge in the Interactivity - Tooltips example, it all works as expected. This means there's something in my code causing the issue.
What is strange is, in my code, I've investigated what element the HitTest thinks I'm clicking on with and without a host panel for the gauge. Without a host panel the ChartElement is GaugeMarker, Axis etc. When I add a hosting panel and the tooltip and dragging doesn't work, then the ChartElement is ControlBackground for both the marker and axes on a linear gauge. On a radial gauge, I can get GaugePanel in many areas, but GaugeAxis when I'm over a label in the centre of the gauge. It seems the coordinate transformation has become confused?
All I've done is add the host panel!
NDockPanel gaugeHostPanel = new NDockPanel();
gaugeHostPanel.DockMargins = new NMarginsL(10, 10, 10, 10);
gaugeHostPanel.DockMode = PanelDockMode.Fill;
gaugePanel.BoundsMode = BoundsMode.Fit;
gaugeHostPanel.ChildPanels.Add(gaugePanel);
this.nevronControl.Panels.Add(gaugeHostPanel);

instead of:
this.nevronControl.Panels.Add(gaugePanel);



By Kevin Harrison 1 - Monday, November 23, 2015

Here's the serialised info for the rendered gauges. Two pairs: NoHost and WithHost ( the latter with the nested panel)
By Nevron Support - Tuesday, November 24, 2015

Hi Kevin,

We could not replicate this - this is the code we tested with:

  private void Form1_Load(object sender, EventArgs e)
  {
   nChartControl1.Panels.Clear();

   NDockPanel gaugeHostPanel = new NDockPanel();
   gaugeHostPanel.DockMargins = new NMarginsL(10, 10, 10, 10);
   gaugeHostPanel.DockMode = PanelDockMode.Fill;

   NRadialGaugePanel radialGauge = new NRadialGaugePanel();
   radialGauge.Location = new NPointL(new NLength(10, NRelativeUnit.ParentPercentage), new NLength(15, NRelativeUnit.ParentPercentage));
   radialGauge.Size = new NSizeL(new NLength(80, NRelativeUnit.ParentPercentage), new NLength(80, NRelativeUnit.ParentPercentage));
   radialGauge.PaintEffect = new NGlassEffectStyle();
   radialGauge.BorderStyle = new NEdgeBorderStyle(BorderShape.Auto);
   radialGauge.BackgroundFillStyle = new NAdvancedGradientFillStyle(AdvancedGradientScheme.WhiteOnBlack, 0);

   // configure scale
   NLinearScaleConfigurator scale = ((NGaugeAxis)radialGauge.Axes[0]).ScaleConfigurator as NLinearScaleConfigurator;
   scale.SetPredefinedScaleStyle(PredefinedScaleStyle.PresentationNoStroke);
   scale.LabelFitModes = new LabelFitMode[0];
   scale.MinorTickCount = 3;
   scale.RulerStyle.FillStyle = new NColorFillStyle(Color.FromArgb(40, Color.White));
   scale.OuterMajorTickStyle.FillStyle = new NColorFillStyle(Color.Orange);
   scale.LabelStyle.TextStyle.FontStyle = new NFontStyle("Arial", 12, FontStyle.Bold | FontStyle.Italic);
   scale.LabelStyle.TextStyle.FillStyle = new NColorFillStyle(Color.White);

   NGaugeAxis m_Axis = (NGaugeAxis)radialGauge.Axes[0];

   NRangeIndicator indicator1 = new NRangeIndicator();
   indicator1.Value = 50;
   indicator1.FillStyle = new NColorFillStyle(Color.LightBlue);
   indicator1.StrokeStyle.Color = Color.DarkBlue;
   indicator1.EndWidth = new NLength(20);
   indicator1.AllowDragging = true;
   radialGauge.Indicators.Add(indicator1);

   NNeedleValueIndicator indicator2 = new NNeedleValueIndicator();
   indicator2.Value = 79;
   indicator2.Shape.FillStyle = new NGradientFillStyle(GradientStyle.Horizontal, GradientVariant.Variant1, Color.White, Color.Red);
   indicator2.Shape.StrokeStyle.Color = Color.Red;
   indicator2.AllowDragging = true;
   radialGauge.Indicators.Add(indicator2);
   radialGauge.SweepAngle = 270;

   NMarkerValueIndicator indicator3 = new NMarkerValueIndicator();
   indicator3.Value = 90;
   radialGauge.Indicators.Add(indicator3);

   nChartControl1.Controller.Tools.Add(new NTooltipTool());
   nChartControl1.Controller.Tools.Add(new NSelectorTool());
   nChartControl1.Controller.Tools.Add(new NIndicatorDragTool());

   indicator1.InteractivityStyle.Tooltip.Text = "Range Tooltip";
   indicator2.InteractivityStyle.Tooltip.Text = "Needle Tooltip";
   indicator3.InteractivityStyle.Tooltip.Text = "Marker Tooltip";
   m_Axis.InteractivityStyle.Tooltip.Text = "Scale Tooltip";


   radialGauge.BoundsMode = BoundsMode.Fit;
   gaugeHostPanel.ChildPanels.Add(radialGauge);
   this.nChartControl1.Panels.Add(gaugeHostPanel);

   nChartControl1.MouseDown += new MouseEventHandler(nChartControl1_MouseDown);
  }

  void nChartControl1_MouseDown(object sender, MouseEventArgs e)
  {     
   NHitTestResult result = nChartControl1.HitTest(e.X, e.Y);

  }

All interactive functionality - tooltips, hit testing and indicator dragging is working OK.