122 lines
3.9 KiB
C++
122 lines
3.9 KiB
C++
|
|
#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
|
|
|