#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(s), &series::freq_chart_changed, this, &chart::f_widget_changed); connect(static_cast(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[0]); s->autoscale(); } } void chart::mouseMoveEvent(QMouseEvent *event) { // if(!_tool_zooming->isVisible()) // { // for(auto it : _series) // static_cast(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[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[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[0]); s->set_pos(_marker->pos()); } void chart::t_widget_changed() { _marker->set_visible_vert_line(static_cast(_series[0])->time_widget()); } void chart::f_widget_changed() { _marker->set_visible_horz_line(static_cast(_series[0])->freq_widget()); } } } // namespace gui } // namespace gtl