diff options
Diffstat (limited to 'spline-widget/spline-widget.cpp')
| -rw-r--r-- | spline-widget/spline-widget.cpp | 74 | 
1 files changed, 46 insertions, 28 deletions
diff --git a/spline-widget/spline-widget.cpp b/spline-widget/spline-widget.cpp index 1f049339..85477ba7 100644 --- a/spline-widget/spline-widget.cpp +++ b/spline-widget/spline-widget.cpp @@ -5,8 +5,6 @@   * copyright notice and this permission notice appear in all copies.   */ -#include "compat/options.hpp" -using namespace options;  #include "spline-widget.hpp"  #include <QPainter>  #include <QPaintEvent> @@ -28,13 +26,21 @@ spline_widget::spline_widget(QWidget *parent) :      setMouseTracking(true);  } -void spline_widget::setConfig(spline* config, const QString& name) +void spline_widget::setConfig(spline* config, bundle b)  { -    mem<QSettings> iniFile = group::ini_file(); -    if (name != "") -        config->loadSettings(*iniFile, name); +    if (config && config->get_bundle() && config->get_bundle() != b) +    { +        QObject::disconnect(connection); +        connection = QMetaObject::Connection(); +    } + +    if (config && config->get_bundle() != b) +        config->set_bundle(b);      _config = config; -    _draw_function = true; +    if (b) +        connection = connect(b.get(), &bundle_type::reloading, +                             this, &spline_widget::reload_spline, +                             Qt::QueuedConnection);      update_range();      update();  } @@ -76,11 +82,11 @@ void spline_widget::drawBackground()      QPen pen(color__, 1, Qt::SolidLine);      const int xstep = 10, ystep = 10; -    const qreal maxx = _config->maxInput() + ystep; -    const qreal maxy = _config->maxOutput() + xstep; +    const qreal maxx = _config->maxInput(); +    const qreal maxy = _config->maxOutput();      // horizontal grid -    for (int i = 0; i < maxy; i += xstep) +    for (int i = 0; i <= maxy; i += xstep)      {          const qreal y = pixel_bounds.height() - i * c.y() + pixel_bounds.y();          drawLine(&painter, @@ -95,7 +101,7 @@ void spline_widget::drawBackground()      }      // vertical grid -    for (int i = 0; i < maxx; i += ystep) +    for (int i = 0; i <= maxx; i += ystep)      {          const qreal x = pixel_bounds.x() + i * c.x();          drawLine(&painter, @@ -120,7 +126,7 @@ void spline_widget::drawFunction()      QPainter painter(&_function);      painter.setRenderHint(QPainter::Antialiasing, true); -    QList<QPointF> points = _config->getPoints(); +    points_t points = _config->getPoints();      const int alpha = !isEnabled() ? 64 : 120;      if (!_preview_only) @@ -158,14 +164,14 @@ void spline_widget::drawFunction()      QPointF prev = point_to_pixel(QPointF(0, 0));      for (qreal i = 0; i < max; i += step)      { -        const qreal val = qreal(_config->getValue(float(i))); +        const qreal val = qreal(_config->getValue(i));          QPointF cur = point_to_pixel(QPointF(i, val));          painter.drawLine(prev, cur);          prev = cur;      }      { -        const qreal val = _config->getValue(float(max)); +        const qreal val = qreal(_config->getValue(max));          QPointF last = point_to_pixel(QPointF(max, val));          painter.drawLine(prev, last);      } @@ -183,7 +189,8 @@ void spline_widget::paintEvent(QPaintEvent *e)          drawBackground();      } -    if (_draw_function) { +    if (_draw_function) +    {          _draw_function = false;          drawFunction();      } @@ -193,13 +200,13 @@ void spline_widget::paintEvent(QPaintEvent *e)      if (_config)      {          QPen pen(Qt::white, 1, Qt::SolidLine); -        QList<QPointF> points = _config->getPoints(); +        points_t points = _config->getPoints();          if (points.size() &&              moving_control_point_idx >= 0 &&              moving_control_point_idx < points.size())          {              if (points[0].x() > 1e-2) -                points.prepend(QPointF(0, 0)); +                points.push_front(QPointF(0, 0));              QPointF prev = point_to_pixel(points[0]);              for (int i = 1; i < points.size(); i++)              { @@ -245,7 +252,7 @@ void spline_widget::mousePressEvent(QMouseEvent *e)  {      if (!_config || !isEnabled())          return; -    QList<QPointF> points = _config->getPoints(); +    points_t points = _config->getPoints();      if (e->button() == Qt::LeftButton)      {          bool bTouchingPoint = false; @@ -257,7 +264,7 @@ void spline_widget::mousePressEvent(QMouseEvent *e)                  if (point_within_pixel(points[i], e->pos()))                  {                      bTouchingPoint = true; -                    moving_control_point_idx = i; +                    moving_control_point_idx = int(i);                      break;                  }              } @@ -269,7 +276,7 @@ void spline_widget::mousePressEvent(QMouseEvent *e)                  for (int i = 0; i < points.size(); i++)                  {                      const QPointF pt = point_to_pixel(points[i]); -                    const auto x = pt.x() - pos.x(); +                    const qreal x = pt.x() - pos.x();                      if (point_closeness_limit * point_closeness_limit >= x * x)                      {                          too_close = true; @@ -313,11 +320,13 @@ void spline_widget::mouseMoveEvent(QMouseEvent *e)      if (!_config || !isEnabled())          return; -    QList<QPointF> points = _config->getPoints(); +    points_t points = _config->getPoints(); -    if (moving_control_point_idx != -1 && +    if (moving_control_point_idx >= 0 &&          moving_control_point_idx < points.size())      { +        const int idx = moving_control_point_idx; +          setCursor(Qt::ClosedHandCursor);          bool overlap = false; @@ -328,9 +337,9 @@ void spline_widget::mouseMoveEvent(QMouseEvent *e)          for (int i = 0; i < 2; i++)          {              bool bad = false; -            if (moving_control_point_idx + 1 < points.size()) +            if (idx + 1 < points.size())              { -                auto other = points[moving_control_point_idx+1]; +                auto other = points[idx+1];                  auto other_pix = point_to_pixel(other);                  bad = pix.x() + point_closeness_limit > other_pix.x();                  if (i == 0 && bad) @@ -341,9 +350,9 @@ void spline_widget::mouseMoveEvent(QMouseEvent *e)                  else                      overlap |= bad;              } -            if (moving_control_point_idx != 0) +            if (idx != 0)              { -                auto other = points[moving_control_point_idx-1]; +                auto other = points[idx-1];                  auto other_pix = point_to_pixel(other);                  bad = pix.x() - point_closeness_limit < other_pix.x();                  if (i == 0 && bad) @@ -360,8 +369,8 @@ void spline_widget::mouseMoveEvent(QMouseEvent *e)          if (!overlap)          { -            points[moving_control_point_idx] = new_pt; -            _config->movePoint(moving_control_point_idx, new_pt); +            points[idx] = new_pt; +            _config->movePoint(int(idx), new_pt);              _draw_function = true;              update();          } @@ -406,6 +415,15 @@ void spline_widget::mouseReleaseEvent(QMouseEvent *e)      }  } +void spline_widget::reload_spline() +{ +    if (_config && _config->get_bundle() != nullptr) +    { +        _config->set_bundle(_config->get_bundle()); +        update_range(); +    } +} +  void spline_widget::update_range()  {      if (!_config)  | 
