test_sdk/gui/spgr/gtl_gui_spgr_chart.cpp

122 lines
3.9 KiB
C++
Raw Permalink Normal View History

#include "gtl_gui_spgr_chart.h"
namespace gtl {
namespace gui {
namespace spgr{
chart::chart(QWidget* parent, ::chart::axis_horz *axis_x, ::chart::axis_vert *axis_y)
: ::chart::widget(parent, axis_x, axis_y)
, _marker(nullptr)
{
}
chart::~chart()
{
remove();
}
void chart::add(::chart::series::series *s)
{
if(_marker)
_marker->set_series(s);
remove();
::chart::widget::add(s);
connect(static_cast<series*>(s), &series::freq_chart_changed, this, &chart::f_widget_changed);
connect(static_cast<series*>(s), &series::time_chart_changed, this, &chart::t_widget_changed);
if(_marker == nullptr)
{
_marker = new spgr::marker(s);
connect(_marker, &spgr::marker::get_nearest_x, this, &chart::get_neares_series_x);
connect(_marker, &spgr::marker::get_nearest_y, this, &chart::get_neares_series_y);
connect(_marker, &spgr::marker::position_changed, this, &chart::marker_pos_changed);
::chart::widget::add(_marker);
}
_marker->set_pos();
}
void chart::mousePressEvent(QMouseEvent *event)
{
_mouse_pos_press = event->pos();
::chart::widget::mousePressEvent(event);
}
void chart::mouseReleaseEvent(QMouseEvent *event)
{
if(_series.empty())
return;
if(_tool_zooming->boundingRect().width() < 5)
{
_marker->set_pos(_axis_x->map_from_widget(event->pos().x()), _axis_y->map_from_widget(event->pos().y()));
marker_pos_changed();
}
::chart::widget::mouseReleaseEvent(event);
}
void chart::mouseDoubleClickEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
if(_series.empty())
return;
series* s = static_cast<series*>(_series[0]);
s->autoscale();
}
}
void chart::mouseMoveEvent(QMouseEvent *event)
{
// if(!_tool_zooming->isVisible())
// {
// for(auto it : _series)
// static_cast<chart_series*>(it)->set_tool_tip(event->pos());
// }
::chart::widget::mouseMoveEvent(event);
}
void chart::get_neares_series_x(qreal &x, chart_line::pos_behaviors)
{
series* s = static_cast<series*>(_series[0]);
qreal res = s->spec_res();
int idx = std::round(x/res);
x = idx * res/* + res/2*/;
}
void chart::get_neares_series_y(qreal &y, chart_line::pos_behaviors)
{
series* s = static_cast<series*>(_series[0]);
qreal time = s->spec_time();
int idx = (y/time);
y = idx * time + time/2;
}
void chart::marker_pos_changed()
{
series* s = static_cast<series*>(_series[0]);
s->set_pos(_marker->pos());
}
void chart::t_widget_changed()
{
_marker->set_visible_vert_line(static_cast<series*>(_series[0])->time_widget());
}
void chart::f_widget_changed()
{
_marker->set_visible_horz_line(static_cast<series*>(_series[0])->freq_widget());
}
}
} // namespace gui
} // namespace gtl