forked from nique_372/GrapichsByLeo
709 lines
53 KiB
MQL5
709 lines
53 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| Base.mqh |
|
|
//| Copyright 2025, Niquel Mendoza. |
|
|
//| https://www.mql5.com/es/users/nique_372/news |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Copyright 2025, Niquel Mendoza."
|
|
#property link "https://www.mql5.com/es/users/nique_372/news"
|
|
#property strict
|
|
|
|
#ifndef HISTOGRAM_BARRAS_BASE_BY_LEO_MQH
|
|
#define HISTOGRAM_BARRAS_BASE_BY_LEO_MQH
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
#include "..\\Defines.mqh"
|
|
#include "..\\Texto.mqh"
|
|
|
|
|
|
// Estilo agresivo, no se hacen comprobaciones.. para maxima velocidad.. a tener cuidado con todas las funciones
|
|
// Notas:
|
|
// - para horizontal_ m_barras_y1_init nunca es el comienzo se le agrega un gap de 1 para respoectar linea de corte
|
|
// Clase base para barras normales con fill
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
class CHistogramConjuntoNor : public CLoggerBase
|
|
{
|
|
protected:
|
|
//--- Barras de un conjutno
|
|
HistogramBar m_barras[]; // Barras que representan el conjunto
|
|
ENUM_HIST_DRAW_RECT_STYLE m_barras_style_draw_rect;
|
|
HistFunctionDrawRect m_function_draw_rect; // Funcion para dibujar las barras
|
|
int m_barras_size; // Tamaño de barras
|
|
int m_barras_reserve; // Reserva de barras
|
|
int m_barras_x1_init; // Y1 inicial para barras
|
|
int m_barras_y1_init; // X1 inciial para barras
|
|
int m_barras_gap_eje; // Gap para el eje (solo se usa con corte)
|
|
bool m_init;
|
|
|
|
//--- Variables cacheadas con el maximo y minimo valor
|
|
double m_max_value;
|
|
double m_min_value;
|
|
|
|
//--- Puntero a canvas del CHistogram
|
|
CCanvasCustom* m_canvas;
|
|
|
|
//--- Funcion para convertir valor a pixel (setean externamente)
|
|
HistogramFuncionCalculatePixel m_function_calc_pixel;
|
|
double m_fpos;
|
|
double m_fneg;
|
|
double m_fcort;
|
|
|
|
//--- Espacio disponible
|
|
int m_barras_ancho_total; // Ancho en pixeles sumando todas las barras
|
|
int m_barras_ancho_unico; // Ancho de cada barra
|
|
|
|
//--- Texto
|
|
HistogramFuncionCalcTextCordinates m_label_function;
|
|
HistogramBarLabel m_label;
|
|
int m_label_gap_by_eje; // Gap del eje
|
|
|
|
|
|
//--- Variables controladas externamente no de la clase
|
|
double m_value_for_ancho;
|
|
uint m_clean_color;
|
|
|
|
|
|
//--- Function que se ejeucta cada vez que se cambia el tamaño de barras (numero de barras)
|
|
virtual void OnBarrasResize() = 0; // Funcion se que sejeucta cada vez que cambia el max_ancho
|
|
virtual void ResizeBarra(HistogramBar& barra) = 0; // Funcion para aumentar el "size"
|
|
virtual void RecalculeBarCordinates() = 0; // Recalcula las cordenadas de las barras
|
|
virtual void CalculeTextCordinates() = 0; // Calcula las cordenas del texto
|
|
virtual void OnNewValuesPosNegCorte() = 0;
|
|
|
|
//---
|
|
void SetFunctionCalcText();
|
|
|
|
|
|
public:
|
|
//--- Constructor
|
|
CHistogramConjuntoNor();
|
|
|
|
|
|
//--- Set general
|
|
// Esta funcion setea los valores generales de la clase
|
|
void Set(CCanvasCustom* c, string label, uint txt_clr, ENUM_HISTOGRAM_TEXT_MODE txt_mode, int txt_font_size, string txt_font, int label_gap_eje, ENUM_HIST_DRAW_RECT_STYLE initial_style);
|
|
|
|
// Inicializa la clase
|
|
void Init(HistogramFuncionCalculatePixel fcalc, int x1_in, int y1_in, int size_corte, int barras_ancho_max, double fpos, double fneg, double fcort); // Inicializa
|
|
|
|
//--- Recalculo
|
|
//- Funcion que se ejeucta cada vez que se "ropme" un maximo o minimo como para cambiars los "size" de las barras
|
|
void SetNewsValues(int gap_corte, double fpos, double fneg, double fcort);
|
|
|
|
//- Funcion que se ejecuta cuando se cambia x1, y1, sizebarras
|
|
void SetNewsCordenadasAndSize(int x1, int y1, int barras_ancho);
|
|
|
|
//- Recalcula las cordenas
|
|
// Como parametro se le da las cordenadas de un rectnauglo disponible para esta barra
|
|
// Lo que hace es recaclular las cordendas de los rectangulos y el texto
|
|
void SetNewCordenadas(int x1, int y1);
|
|
|
|
//- Limpia las barras
|
|
// clean_color: color con el que se limpiaran las abrras usualente color d efondo
|
|
// redraw: bandera que indica si se redibujara (si es false solo se camiba los pixeles pero la imagen "externa" no)
|
|
void CleanBarras(bool free_array, bool redraw = false);
|
|
|
|
//--- Recalculo
|
|
__forceinline void RecalculeCordinates(); // Recalcula todas las cordenas TEXTO Y BARRAS
|
|
__forceinline void RecalculeCordinatesOnlyBars(); // Actuliza el ancho y reclaucla cordendas
|
|
|
|
//- Destruccion
|
|
// Funcion que se llama luego de eliminar el objeto (solo si se limina dinamicamente)
|
|
void Destroy();
|
|
|
|
|
|
//--- Setter y Getters generales
|
|
//- Reserve
|
|
__forceinline int ReserveBarras() const { return m_barras_reserve; }
|
|
inline void ReserveBarras(int size);
|
|
|
|
//- Tamaño
|
|
__forceinline int SizeBarras() const { return m_barras_size; }
|
|
|
|
//- Tamaño en pixeles ocupado por todo el conjunto
|
|
// Getter
|
|
__forceinline int SizeBarrasInPixels() const { return m_barras_ancho_total;}
|
|
// Settet
|
|
void SizeBarrasInPixels(const int new_max_ancho);
|
|
|
|
//- Tamaño en pixeles ocupado por cada barra
|
|
__forceinline int SizeBarra() const { return m_barras_ancho_unico; }
|
|
|
|
|
|
//- Cordenas de inicio
|
|
__forceinline int XInicial() const { return m_barras_x1_init; }
|
|
__forceinline int YInicial() const { return m_barras_y1_init; }
|
|
|
|
//- Iniciado ?
|
|
__forceinline bool IsInit() const { return m_init; }
|
|
|
|
//- Color de limpieza
|
|
__forceinline uint CleanColor() const { return m_clean_color; }
|
|
inline void CleanColor(uint new_valuie) { m_clean_color = new_valuie; }
|
|
|
|
//--- Trabajo con barras
|
|
// update_data, unicamente actuliza pixeles NO la imagen como tal para eso se debera de llamar a canvas.Update()
|
|
// false: cuando solo se busca añadir barras todavia no hacer el calculo de cordenadas
|
|
// true: una vez finalizado todo si es que se necesita añadir otra barra extra
|
|
|
|
//- Añadir
|
|
inline void AddBarraFast(double value, uint clr);
|
|
void AddBarra(double value, uint clr, bool update_data);
|
|
|
|
//- Remover
|
|
void RemoveBar(const int index, bool update_data);
|
|
|
|
//- Color
|
|
inline void BarColor(const int index, const uint new_value);
|
|
__forceinline uint BarColor(const int index) const { return m_barras[index].clr; }
|
|
|
|
//- Fondo?
|
|
__forceinline ENUM_HIST_DRAW_RECT_STYLE DrawRectStyle() const { return m_barras_style_draw_rect; }
|
|
void DrawRectStyle(const ENUM_HIST_DRAW_RECT_STYLE default_style, bool redraw_pixels_in_canvas);
|
|
void DrawRectStyle(HistFunctionDrawRect funtion_draw, ENUM_HIST_DRAW_RECT_STYLE style_type, bool redraw_pixels_in_canvas);
|
|
|
|
//- Valor
|
|
// El ultimo parametro update_max_min, se debera poner true luego de llamar inicalemntemente a setmaxmin
|
|
void BarValue(const int index, const double new_value, bool update_max_min, bool update_rect);
|
|
__forceinline double BarValue(const int index) const { return m_barras[index].value; }
|
|
__forceinline double BarMaxValue() const { return m_max_value; }
|
|
__forceinline double BarMinValue() const { return m_min_value; }
|
|
|
|
//- Maximio y minimo
|
|
// Recalcual el maixmo y minimo
|
|
void SetMaxAndMinValue();
|
|
|
|
//--- Texto del conjunto de barras
|
|
//- Setter general
|
|
inline void Text(const string& new_text, uint new_clr);
|
|
|
|
//- Valor
|
|
__forceinline string TextValue() const { return m_label.value;}
|
|
inline void TextValue(const string& new_text);
|
|
|
|
//- Color
|
|
__forceinline uint TextColor() const { return m_label.clr;}
|
|
inline void TextColor(const uint new_value);
|
|
inline void TextClean(); // Solo limpia los pixeles y si es necesario redibuja NO ELIMINA EL FONT NI NADA
|
|
|
|
//--- Redibuja
|
|
void Redraw(); // Redibuja
|
|
|
|
|
|
//--- Ancho
|
|
__forceinline double ValueForAncho() const { return m_value_for_ancho; }
|
|
inline void ValueForAncho(double v) { m_value_for_ancho = v; }
|
|
inline void ValueForAnchoReduce(double r) { m_value_for_ancho -= r; }
|
|
inline void ValueForAnchoAument(double a) { m_value_for_ancho += a; }
|
|
};
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
CHistogramConjuntoNor::CHistogramConjuntoNor(void)
|
|
: m_barras_reserve(0), m_barras_size(0), m_canvas(NULL), m_barras_ancho_total(0),
|
|
m_barras_ancho_unico(0), m_fcort(0.00), m_fneg(0.00), m_fpos(0.00), m_function_calc_pixel(NULL), m_label_function(NULL),
|
|
m_barras_x1_init(0), m_barras_y1_init(0), m_init(false), m_barras_gap_eje(0), m_label_gap_by_eje(0)
|
|
{
|
|
//--- Valores por defecto para label
|
|
m_label.clr = clrBlack;
|
|
m_label.font = "Arial";
|
|
m_label.font_size = 5;
|
|
m_label.mode = WRONG_VALUE;
|
|
m_label.value = NULL;
|
|
m_label.x = 0;
|
|
m_label.y = 0;
|
|
|
|
//--- Resize inicial
|
|
ArrayResize(m_barras, 0);
|
|
}
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void CHistogramConjuntoNor::Destroy()
|
|
{
|
|
//---
|
|
if(!m_init)
|
|
return;
|
|
|
|
//--- Limpiaza su parte en canvas
|
|
CleanBarras(true); // Limpiamos las barras
|
|
TextColor(); // Limpaimos el texto
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void CHistogramConjuntoNor::CleanBarras(bool free_array, bool redraw = false)
|
|
{
|
|
for(int i = 0; i < m_barras_size; i++)
|
|
m_function_draw_rect(m_canvas, m_barras[i].x1, m_barras[i].y1, m_barras[i].x2, m_barras[i].y2, m_clean_color); // Limpiamos el espacio ocupado
|
|
|
|
//---
|
|
if(free_array)
|
|
{
|
|
ArrayResize(m_barras, 0, m_barras_reserve);
|
|
m_barras_size = 0;
|
|
}
|
|
|
|
//---
|
|
if(redraw)
|
|
m_canvas.Update();
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void CHistogramConjuntoNor::ReserveBarras(int size)
|
|
{
|
|
m_barras_reserve = size;
|
|
m_barras.Reserve((uint)size);
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
inline void CHistogramConjuntoNor::AddBarraFast(double value, uint clr)
|
|
{
|
|
HistogramBar new_bar(0, 0, 0, 0, value, clr);
|
|
ArrayResize(m_barras, m_barras_size + 1, m_barras_reserve);
|
|
m_barras[m_barras_size] = new_bar;
|
|
m_barras_size++;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void CHistogramConjuntoNor::AddBarra(double value, uint clr, bool update_data)
|
|
{
|
|
HistogramBar new_bar(0, 0, 0, 0, value, clr);
|
|
ArrayResize(m_barras, m_barras_size + 1, m_barras_reserve);
|
|
m_barras[m_barras_size] = new_bar;
|
|
m_barras_size++;
|
|
|
|
//--- Solo recalcular si se pide ademas de que debe de estar iniciado
|
|
if(m_init && update_data)
|
|
{
|
|
//--- Recalculamos el ancho de cada barra
|
|
HISTOGRAM_CONJ_RECALCULE
|
|
|
|
//--- Recalculamso cordenadas con el nuevo ancho
|
|
RecalculeCordinatesOnlyBars();
|
|
}
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
// Esta funcion se ejecuta
|
|
void CHistogramConjuntoNor::Redraw()
|
|
{
|
|
m_canvas.Update();
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void CHistogramConjuntoNor::RemoveBar(const int index, bool update_data)
|
|
{
|
|
//---
|
|
const int last = m_barras_size - 1;
|
|
|
|
//---
|
|
if(m_barras_size > 1)
|
|
{
|
|
// Si hay 2 barras o mas enotnces limpiamos la anteiro (si el index es mayor a 0, de lo contiroa limpiamos el siguiente 1)
|
|
int idx = (index == 0) ? 1 : (index - 1);
|
|
m_function_draw_rect(m_canvas, m_barras[idx].x1, m_barras[idx].y1, m_barras[idx].x2, m_barras[idx].y2, m_clean_color);
|
|
}
|
|
|
|
//---
|
|
m_function_draw_rect(m_canvas, m_barras[index].x1, m_barras[index].y1, m_barras[index].x2, m_barras[index].y2, m_clean_color);
|
|
|
|
//--- Eliminamos
|
|
for(int i = index; i < last; i++)
|
|
m_barras[i] = m_barras[i + 1];
|
|
|
|
//--- Resize
|
|
m_barras_size--;
|
|
ArrayResize(m_barras, m_barras_size, m_barras_reserve);
|
|
|
|
//---
|
|
if(update_data)
|
|
{
|
|
if(m_barras_size <= 0)
|
|
{
|
|
// Ya no hay barras no hace falta recalcular
|
|
return;
|
|
}
|
|
|
|
//--- Recalculamos el ancho de cada barra
|
|
HISTOGRAM_CONJ_RECALCULE
|
|
|
|
//--- Recalculamso cordenadas
|
|
OnBarrasResize(); // Redibujamos si es necesario
|
|
}
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
inline void CHistogramConjuntoNor::BarColor(const int index, const uint new_value)
|
|
{
|
|
m_barras[index].clr = new_value;
|
|
m_function_draw_rect(m_canvas, m_barras[index].x1, m_barras[index].y1, m_barras[index].x2, m_barras[index].y2, new_value);
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void CHistogramConjuntoNor::BarValue(const int index, const double new_value, bool update_max_min, bool update_rect)
|
|
{
|
|
if(update_max_min)
|
|
{
|
|
if(new_value > m_max_value)
|
|
m_max_value = new_value;
|
|
if(new_value < m_min_value)
|
|
m_min_value = new_value;
|
|
}
|
|
|
|
//--- Limpiamos valor anterior
|
|
m_function_draw_rect(m_canvas, m_barras[index].x1, m_barras[index].y1, m_barras[index].x2, m_barras[index].y2, m_clean_color);
|
|
|
|
//--- Actulizamos valor
|
|
m_barras[index].value = new_value;
|
|
|
|
//---
|
|
if(update_rect)
|
|
{
|
|
ResizeBarra(m_barras[index]);
|
|
m_function_draw_rect(m_canvas, m_barras[index].x1, m_barras[index].y1, m_barras[index].x2, m_barras[index].y2, m_barras[index].clr);
|
|
}
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void CHistogramConjuntoNor::DrawRectStyle(const ENUM_HIST_DRAW_RECT_STYLE default_style, bool redraw_pixels_in_canvas)
|
|
{
|
|
//--- Reseteo
|
|
m_barras_style_draw_rect = default_style;
|
|
if(m_barras_style_draw_rect)
|
|
m_function_draw_rect = HistConjuntoDrawRectFunctions::HistDrawRectFill;
|
|
else
|
|
m_function_draw_rect = HistConjuntoDrawRectFunctions::HistDrawRectNoFill;
|
|
|
|
//--- Redibujamos
|
|
if(redraw_pixels_in_canvas)
|
|
for(int i = 0; i < m_barras_size; i++)
|
|
m_function_draw_rect(m_canvas, m_barras[i].x1, m_barras[i].y1, m_barras[i].x2, m_barras[i].y2, m_barras[i].clr);
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void CHistogramConjuntoNor::DrawRectStyle(HistFunctionDrawRect funtion_draw, ENUM_HIST_DRAW_RECT_STYLE style_type, bool redraw_pixels_in_canvas)
|
|
{
|
|
//--- Reseteo
|
|
m_barras_style_draw_rect = style_type;
|
|
m_function_draw_rect = funtion_draw;
|
|
|
|
//--- Redibujamos
|
|
if(redraw_pixels_in_canvas)
|
|
for(int i = 0; i < m_barras_size; i++)
|
|
m_function_draw_rect(m_canvas, m_barras[i].x1, m_barras[i].y1, m_barras[i].x2, m_barras[i].y2, m_barras[i].clr);
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void CHistogramConjuntoNor::SetMaxAndMinValue()
|
|
{
|
|
m_max_value = m_barras[0].value;
|
|
m_min_value = m_barras[0].value;
|
|
|
|
for(int i = 1; i < m_barras_size; i++)
|
|
{
|
|
const double v = m_barras[i].value;
|
|
if(v > m_max_value)
|
|
m_max_value = v;
|
|
if(v < m_min_value)
|
|
m_min_value = v;
|
|
}
|
|
}
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
inline void CHistogramConjuntoNor::Text(const string &new_text, uint new_clr)
|
|
{
|
|
m_label.clr = new_clr;
|
|
m_label.value = new_text;
|
|
|
|
//--- Cambiamos el texto
|
|
::TextSetFont(m_label.font, m_label.font_size);
|
|
m_canvas.TextOuTF(m_label.x, m_label.y, m_label.value, m_label.clr, m_label.mode);
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
inline void CHistogramConjuntoNor::TextColor(const uint new_value)
|
|
{
|
|
m_label.clr = new_value;
|
|
|
|
//--- Cambiamos el texto
|
|
::TextSetFont(m_label.font, m_label.font_size);
|
|
m_canvas.TextOuTF(m_label.x, m_label.y, m_label.value, m_label.clr, m_label.mode);
|
|
}
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
inline void CHistogramConjuntoNor::TextClean()
|
|
{
|
|
::TextSetFont(m_label.font, m_label.font_size);
|
|
m_canvas.TextOuTF(m_label.x, m_label.y, m_label.value, m_clean_color, m_label.mode);
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
inline void CHistogramConjuntoNor::TextValue(const string &new_text)
|
|
{
|
|
//---
|
|
::TextSetFont(m_label.font, m_label.font_size);
|
|
|
|
//--- Limpiamoas el texto anterior
|
|
m_canvas.TextOuTF(m_label.x, m_label.y, m_label.value, m_clean_color, m_label.mode);
|
|
|
|
//--- Cambiamos el texto
|
|
m_label.value = new_text;
|
|
m_canvas.TextOuTF(m_label.x, m_label.y, m_label.value, m_label.clr, m_label.mode);
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
void CHistogramConjuntoNor::SetFunctionCalcText(void)
|
|
{
|
|
switch(m_label.mode)
|
|
{
|
|
case HISTOGRAM_TEXT_MODE_CENTER:
|
|
m_label_function = HistogramFuncTxtCalc::HFCTextCenter;
|
|
break;
|
|
case HISTOGRAM_TEXT_MODE_LEFT_UPPER:
|
|
m_label_function = HistogramFuncTxtCalc::HFCTextLeftUpper;
|
|
break;
|
|
case HISTOGRAM_TEXT_MODE_RIGHT_UPPER:
|
|
m_label_function = HistogramFuncTxtCalc::HFCTextRightUpper;
|
|
break;
|
|
default:
|
|
m_label_function = HistogramFuncTxtCalc::HFCTextCenter;
|
|
break;
|
|
}
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
/*
|
|
Notas:
|
|
- Niguna de estas fucniones REDIBUJA EL BITMAP, unicamente acutlizan los piexles de canvas, para acutlizar la imagen, lo que ve el usuario
|
|
Se debera de llamar a Redraw
|
|
*/
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
void CHistogramConjuntoNor::SetNewCordenadas(int x1, int y1)
|
|
{
|
|
//--- Nuevas cordenas de anclaje
|
|
m_barras_x1_init = x1;
|
|
m_barras_y1_init = y1;
|
|
|
|
//--- Recalculo de cordenas texto y barras
|
|
RecalculeCordinates();
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
void CHistogramConjuntoNor::SizeBarrasInPixels(const int new_max_ancho)
|
|
{
|
|
//--- Vefificacion de tamaño
|
|
if(m_barras_size < 1 || !m_init)
|
|
{
|
|
LogFatalError("No hay barras para el resize, o no esta iniciado", FUNCION_ACTUAL);
|
|
Remover();
|
|
return;
|
|
}
|
|
|
|
//---
|
|
m_barras_ancho_total = new_max_ancho;
|
|
|
|
#ifdef HISTOGRAM_CONJ_ACTIVAR_AUTO_RESIZE
|
|
//--- Verificacion del texto
|
|
if(m_label.font_size > m_barras_ancho_total)
|
|
{
|
|
LogWarning("Se esta modificando el fontsize, valor mas grande que el ancho disponible", FUNCION_ACTUAL);
|
|
m_label.font_size = m_barras_ancho_total;
|
|
}
|
|
#endif
|
|
|
|
//--- Ancho de la barra
|
|
HISTOGRAM_CONJ_RECALCULE
|
|
|
|
//---
|
|
OnBarrasResize(); // Cambio del "aancho" de las barras, solo el ancho
|
|
CalculeTextCordinates(); // Recalculo del texto
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
void CHistogramConjuntoNor::SetNewsCordenadasAndSize(int x1, int y1, int barras_ancho)
|
|
{
|
|
//--- Vefificacion de tamaño
|
|
if(m_barras_size < 1 || !m_init)
|
|
{
|
|
LogFatalError("No hay barras para el resize, o no esta iniciado", FUNCION_ACTUAL);
|
|
Remover();
|
|
return;
|
|
}
|
|
|
|
//--- Nuevas cordenas de anclaje
|
|
m_barras_x1_init = x1;
|
|
m_barras_y1_init = y1;
|
|
|
|
//--- Nuevo ancho
|
|
m_barras_ancho_total = barras_ancho;
|
|
|
|
#ifdef HISTOGRAM_CONJ_ACTIVAR_AUTO_RESIZE
|
|
//--- Verificacion del texto
|
|
if(m_label.font_size > m_barras_ancho_total)
|
|
{
|
|
LogWarning("Se esta modificando el fontsize, valor mas grande que el ancho disponible", FUNCION_ACTUAL);
|
|
m_label.font_size = m_barras_ancho_total;
|
|
}
|
|
#endif
|
|
|
|
//--- Ancho de la barra
|
|
HISTOGRAM_CONJ_RECALCULE
|
|
|
|
//---Recalculamos cordenas de texto y barras
|
|
RecalculeCordinates();
|
|
}
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
void CHistogramConjuntoNor::SetNewsValues(int gap_corte, double fpos, double fneg, double fcort)
|
|
{
|
|
m_fcort = fcort;
|
|
m_fneg = fneg;
|
|
m_fpos = fpos;
|
|
m_barras_gap_eje = gap_corte;
|
|
|
|
//--- Recalculamos las cordenadas de las barras
|
|
//RecalculeBarCordinates();
|
|
OnNewValuesPosNegCorte();
|
|
}
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
// Estra funcion recalcula las cordadenas de todo
|
|
__forceinline void CHistogramConjuntoNor::RecalculeCordinates(void)
|
|
{
|
|
RecalculeBarCordinates(); // Recalculaos y filleamos los recnautrlgos
|
|
CalculeTextCordinates(); // Recalculamos todas las cordenadas del texto
|
|
}
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
// Esta funcion se debera de ejeuctar cuando se agergan barras. (luego de m_init = true), y
|
|
// al momento de finalizar el agregado se debra de ejecutar esto para reclauclos las cordnaas y ancho de cada barra (esto dado qeu se aumentaron barras)
|
|
__forceinline void CHistogramConjuntoNor::RecalculeCordinatesOnlyBars()
|
|
{
|
|
for(int i = 0; i < m_barras_size; i++)
|
|
m_function_draw_rect(m_canvas, m_barras[i].x1, m_barras[i].y1, m_barras[i].x2, m_barras[i].y2, m_clean_color); // Limpiamos el espacio ocupado (si hjay corndenas no inbiciado no se dibujan)
|
|
|
|
RecalculeBarCordinates();
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Seteo general de parametros |
|
|
//+------------------------------------------------------------------+
|
|
/*
|
|
Advertencia, si el txt_font o txt_font_Size es invalido se toma el valor de canvas (setear el fontsize con FOntSet en CHistogram)
|
|
*/
|
|
void CHistogramConjuntoNor::Set(CCanvasCustom *c, string label, uint txt_clr, ENUM_HISTOGRAM_TEXT_MODE txt_mode, int txt_font_size, string txt_font, int label_gap_eje, ENUM_HIST_DRAW_RECT_STYLE initial_style)
|
|
{
|
|
//--- General
|
|
m_canvas = c;
|
|
|
|
//---
|
|
m_barras_style_draw_rect = initial_style;
|
|
if(m_barras_style_draw_rect) // Si no es 0, (fill)
|
|
m_function_draw_rect = HistConjuntoDrawRectFunctions::HistDrawRectFill;
|
|
else
|
|
m_function_draw_rect = HistConjuntoDrawRectFunctions::HistDrawRectNoFill;
|
|
|
|
//--- Texto
|
|
m_label_gap_by_eje = label_gap_eje;
|
|
m_label.clr = txt_clr;
|
|
m_label.mode = txt_mode;
|
|
m_label.value = label;
|
|
m_label.font = txt_font == NULL ? c.FontNameGet() : txt_font;
|
|
m_label.font_size = txt_font_size < 1 ? c.FontSizeGet() : txt_font_size;
|
|
SetFunctionCalcText(); // Seteamos la funcion para calcular el texto
|
|
|
|
//--- Si ya esta inicado volvermos a recalcular
|
|
if(m_init)
|
|
RecalculeCordinates(); // SI se cambio el fill entonces recalcula, si se camibo el texto tambien
|
|
}
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Inicializacion de la clase |
|
|
//+------------------------------------------------------------------+
|
|
void CHistogramConjuntoNor::Init(HistogramFuncionCalculatePixel fcalc, int x1_in, int y1_in, int size_corte, int barras_ancho_max, double fpos, double fneg, double fcort)
|
|
{
|
|
//---
|
|
if(m_barras_size < 1)
|
|
{
|
|
LogFatalError("No hay barras para crear el conjunto", FUNCION_ACTUAL);
|
|
Remover();
|
|
return;
|
|
}
|
|
//---
|
|
m_function_calc_pixel = fcalc;
|
|
|
|
//--- General
|
|
m_init = true;
|
|
m_barras_x1_init = x1_in;
|
|
m_barras_y1_init = y1_in;
|
|
m_fcort = fcort;
|
|
m_fneg = fneg;
|
|
m_fpos = fpos;
|
|
m_barras_gap_eje = size_corte;
|
|
|
|
//--- Ancho de la barra
|
|
m_barras_ancho_total = barras_ancho_max;
|
|
HISTOGRAM_CONJ_RECALCULE
|
|
|
|
#ifdef HISTOGRAM_CONJ_ACTIVAR_AUTO_RESIZE
|
|
//--- Verificacion del texto
|
|
if(m_label.font_size > m_barras_ancho_total)
|
|
{
|
|
LogWarning("Se esta modificando el fontsize, valor mas grande que el ancho disponible", FUNCION_ACTUAL);
|
|
m_label.font_size = m_barras_ancho_total;
|
|
}
|
|
#endif
|
|
|
|
//--- Dibujamos
|
|
RecalculeCordinates();
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
#endif
|
|
//+------------------------------------------------------------------+
|