Add Tooltip for Chart Objects
Add Tooltip for Chart Objects
01 May 2019, 08:56
All chart objects must have a tooltip property, so whenever the user moves the mouse over the object it should show that tooltip which is provided programmatically.
It's a very important and easy to implement feature please add it ASAP.
Replies
afhacker
05 Nov 2019, 12:16
Production-ready tooltip control for chart objects (Not controls and for now, it only works if the chart object is interactive):
namespace cAlgo.API.Extensions.Controls { public class ChartObjectTooltip : CustomControl { #region Fields private readonly Border _border; private readonly Chart _chart; private readonly ChartObject _chartObject; private double _lastMouseX, _lastMouseY; #endregion Fields public ChartObjectTooltip(Chart chart, ChartObject chartObject) { _chart = chart; _chartObject = chartObject; _border = new Border { BackgroundColor = "#3F3F3F", BorderColor = "#969696", BorderThickness = 1, CornerRadius = 5 }; AddChild(_border); _chart.ObjectHoverChanged += Chart_ObjectHoverChanged; _chart.MouseMove += Chart_MouseMove; } #region Properties public Color BackgroundColor { get { return _border.BackgroundColor; } set { _border.BackgroundColor = value; } } public Color BorderColor { get { return _border.BorderColor; } set { _border.BorderColor = value; } } public Thickness BorderThickness { get { return _border.BorderThickness; } set { _border.BorderThickness = value; } } public CornerRadius CornerRadius { get { return _border.CornerRadius; } set { _border.CornerRadius = value; } } public ControlBase Content { get { return _border.Child; } set { _border.Child = value; } } #endregion Properties #region Methods private void Chart_ObjectHoverChanged(ChartObjectHoverChangedEventArgs obj) { if (obj.IsObjectHovered && obj.ChartObject == _chartObject) { UpdateCoorinates(); IsVisible = true; } else { IsVisible = false; } } private void Chart_MouseMove(ChartMouseEventArgs obj) { _lastMouseX = obj.MouseX; _lastMouseY = obj.MouseY; if (IsVisible) { UpdateCoorinates(); } } private void UpdateCoorinates() { var extraDelta = 10; var width = Width; var height = Height; var left = _chart.Width - _lastMouseX > width + extraDelta ? _lastMouseX + extraDelta : _lastMouseX - width - extraDelta; var right = _chart.Height - _lastMouseY > height + extraDelta ? _lastMouseY + extraDelta : _lastMouseY - height - extraDelta; Margin = new Thickness(left, right, 0, 0); } #endregion Methods } }
@afhacker
snowchilli
13 Nov 2019, 02:55
RE:
Panagiotis Charalampous said:
Hi AlgoDeveloper,
You might find the below example useful
using System; using System.Linq; using cAlgo.API; using cAlgo.API.Indicators; using cAlgo.API.Internals; using cAlgo.Indicators; namespace cAlgo.Robots { [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] public class CustomTooltip : Robot { [Parameter(DefaultValue = 0.0)] public double Parameter { get; set; } private Tooltip Tooltip; private double LastMouseX; private double LastMouseY; protected override void OnStart() { Tooltip = new Tooltip { VerticalAlignment = VerticalAlignment.Top, HorizontalAlignment = HorizontalAlignment.Left, IsVisible = false, Width = 120, Height = 40 }; Chart.AddControl(Tooltip); Chart.ObjectHoverChanged += Chart_ObjectHoverChanged; Chart.MouseMove += Chart_MouseMove; } private void Chart_MouseMove(ChartMouseEventArgs obj) { LastMouseX = obj.MouseX; LastMouseY = obj.MouseY; if (Tooltip.IsVisible) UpdateTooltipCoorinates(); } private void Chart_ObjectHoverChanged(ChartObjectHoverChangedEventArgs obj) { if (obj.IsObjectHovered) ShowTooltip(obj.ChartObject.Name); else HideTooltip(); } private void ShowTooltip(string text) { Tooltip.IsVisible = true; Tooltip.Text = text; UpdateTooltipCoorinates(); } private void UpdateTooltipCoorinates() { var extraDelta = 10; var width = Tooltip.Width; var height = Tooltip.Height; var left = Chart.Width - LastMouseX > width + extraDelta ? LastMouseX + extraDelta : LastMouseX - width - extraDelta; var right = Chart.Height - LastMouseY > height + extraDelta ? LastMouseY + extraDelta : LastMouseY - height - extraDelta; Tooltip.Margin = new Thickness(left, right, 0, 0); } private void HideTooltip() { Tooltip.IsVisible = false; } protected override void OnTick() { // Put your core logic here } protected override void OnStop() { // Put your deinitialization logic here } } public class Tooltip : CustomControl { public Tooltip() { var border = new Border { BackgroundColor = "#3F3F3F", BorderColor = "#969696", BorderThickness = 1, CornerRadius = 5 }; ContentLabel = new TextBlock { Margin = 5 }; border.Child = ContentLabel; AddChild(border); } private TextBlock ContentLabel { get; set; } public string Text { get { return ContentLabel.Text; } set { ContentLabel.Text = value; } } } }Best Regards,
Panagiotis
Building the above code (as is) gives me 3 errors
Error CS0246: The type or namespace name 'CustomControl' could not be found (are you missing a using directive or an assembly reference?)
Error CS0122: 'cAlgo.API.TextBlock' is inaccessible due to its protection level
Error CS0053: Inconsistent accessibility: property type 'cAlgo.API.TextBlock' is less accessible than property 'cAlgo.Robots.Tooltip.ContentLabel'
Am I missing references? What else am I missing?
@snowchilli
PanagiotisCharalampous
13 Nov 2019, 09:05
Hi snowchilli,
Thank you for posting in our forum. Do you use v3.6 to build this cBot?
Best Regards,
Panagiotis
@PanagiotisCharalampous
noppanon
09 Apr 2021, 11:46
RE:
PanagiotisCharalampous said:
Hi AlgoDeveloper,
You might find the below example useful
using System; using System.Linq; using cAlgo.API; using cAlgo.API.Indicators; using cAlgo.API.Internals; using cAlgo.Indicators; namespace cAlgo.Robots { [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] public class CustomTooltip : Robot { [Parameter(DefaultValue = 0.0)] public double Parameter { get; set; } private Tooltip Tooltip; private double LastMouseX; private double LastMouseY; protected override void OnStart() { Tooltip = new Tooltip { VerticalAlignment = VerticalAlignment.Top, HorizontalAlignment = HorizontalAlignment.Left, IsVisible = false, Width = 120, Height = 40 }; Chart.AddControl(Tooltip); Chart.ObjectHoverChanged += Chart_ObjectHoverChanged; Chart.MouseMove += Chart_MouseMove; } private void Chart_MouseMove(ChartMouseEventArgs obj) { LastMouseX = obj.MouseX; LastMouseY = obj.MouseY; if (Tooltip.IsVisible) UpdateTooltipCoorinates(); } private void Chart_ObjectHoverChanged(ChartObjectHoverChangedEventArgs obj) { if (obj.IsObjectHovered) ShowTooltip(obj.ChartObject.Name); else HideTooltip(); } private void ShowTooltip(string text) { Tooltip.IsVisible = true; Tooltip.Text = text; UpdateTooltipCoorinates(); } private void UpdateTooltipCoorinates() { var extraDelta = 10; var width = Tooltip.Width; var height = Tooltip.Height; var left = Chart.Width - LastMouseX > width + extraDelta ? LastMouseX + extraDelta : LastMouseX - width - extraDelta; var right = Chart.Height - LastMouseY > height + extraDelta ? LastMouseY + extraDelta : LastMouseY - height - extraDelta; Tooltip.Margin = new Thickness(left, right, 0, 0); } private void HideTooltip() { Tooltip.IsVisible = false; } protected override void OnTick() { // Put your core logic here } protected override void OnStop() { // Put your deinitialization logic here } } public class Tooltip : CustomControl { public Tooltip() { var border = new Border { BackgroundColor = "#3F3F3F", BorderColor = "#969696", BorderThickness = 1, CornerRadius = 5 }; ContentLabel = new TextBlock { Margin = 5 }; border.Child = ContentLabel; AddChild(border); } private TextBlock ContentLabel { get; set; } public string Text { get { return ContentLabel.Text; } set { ContentLabel.Text = value; } } } }Best Regards,
Panagiotis
Hi Panagiotis,
I'm using the latest cTrader 4.0. On your sample, I found that event ObjectHoverChanged does not fired, but MouseMove does fired. Is there anything missing?
Regards,
Noppanon
@noppanon
PanagiotisCharalampous
09 Apr 2021, 11:59
Hi Noppanon,
How did you come to this conclusion? It works fine for me.
Best Regards,
Panagiotis
@PanagiotisCharalampous
PanagiotisCharalampous
04 Nov 2019, 15:54
Hi AlgoDeveloper,
You might find the below example useful
Best Regards,
Panagiotis
@PanagiotisCharalampous