Commit da5c3801 authored by Paul Asmuth's avatar Paul Asmuth
Browse files

implement grids

parent e22e83d6
Loading
Loading
Loading
Loading
+47 −3
Original line number Diff line number Diff line
@@ -20,8 +20,8 @@ namespace fnordmetric {
namespace ui {

Canvas::Canvas() :
    width_(750),
    height_(300) {}
    width_(800),
    height_(320) {}

void Canvas::render(RenderTarget* target) const {
  // FIXPAUL: initialize from rendertarget
@@ -30,6 +30,7 @@ void Canvas::render(RenderTarget* target) const {
  target->beginChart(width_, height_, "chart bar horizontal"); 
  renderOutsideLegends(target, &viewport);
  renderAxes(target, &viewport);
  renderGrids(target, &viewport);
  renderInsideLegends(target, &viewport);
  renderCharts(target, &viewport);
  target->finishChart();
@@ -379,7 +380,6 @@ void Canvas::renderLeftAxis(
  target->finishGroup();
}


void Canvas::renderOutsideLegends(
    RenderTarget* target,
    Viewport* viewport) const {
@@ -645,6 +645,45 @@ void Canvas::renderLeftLegend(
  }
}

void Canvas::renderGrids(RenderTarget* target, Viewport* viewport) const {
  for (const auto& grid : grids_) {
    switch (grid->placement()) {

      case GridDefinition::GRID_HORIZONTAL:
        target->beginGroup("grid horizontal");
        for (const auto& tick : grid->ticks()) {
          auto line_y = viewport->paddingTop() +
              viewport->innerHeight() * (1.0 - tick);

          target->drawLine(
              viewport->paddingLeft(),
              line_y,
              viewport->paddingLeft() + viewport->innerWidth(),
              line_y,
              "gridline");
        }
        target->finishGroup();
        break;

      case GridDefinition::GRID_VERTICAL:
        target->beginGroup("grid vertical");
        for (const auto& tick : grid->ticks()) {
          auto line_x = viewport->paddingLeft() + viewport->innerWidth() * tick;

          target->drawLine(
              line_x,
              viewport->paddingTop(),
              line_x,
              viewport->paddingTop() + viewport->innerHeight(),
              "gridline");
        }
        target->finishGroup();
        break;

    }
  }
}

std::string Canvas::renderSVG() const {
  auto output = util::OutputStream::getStdout();
  SVGTarget target(output.get());
@@ -657,6 +696,11 @@ AxisDefinition* Canvas::addAxis(AxisDefinition::kPosition position) {
  return axes_.back().get();
}

GridDefinition* Canvas::addGrid(GridDefinition::kPlacement placement) {
  grids_.emplace_back(new GridDefinition(placement));
  return grids_.back().get();
}

LegendDefinition* Canvas::addLegend(
    LegendDefinition::kVerticalPosition vert_pos,
    LegendDefinition::kHorizontalPosition horiz_pos,
+6 −0
Original line number Diff line number Diff line
@@ -205,11 +205,17 @@ protected:
      bool bottom,
      bool outside) const;

  /**
   * Render the grids
   */
  void renderGrids(RenderTarget* target, Viewport* viewport) const;

  // FIXPAUL this belongs into the rendertarget
  int width_;
  int height_;
  std::vector<std::unique_ptr<AxisDefinition>> axes_;
  std::vector<std::unique_ptr<LegendDefinition>> legends_;
  std::vector<std::unique_ptr<GridDefinition>> grids_;
  std::vector<std::unique_ptr<Drawable>> drawables_;
};

+2 −1
Original line number Diff line number Diff line
@@ -29,8 +29,9 @@ LegendDefinition* Drawable::addLegend(
    LegendDefinition::kHorizontalPosition horiz_pos,
    LegendDefinition::kPlacement placement,
    const std::string& title) {
  canvas_->addLegend(vert_pos, horiz_pos, placement, title);
  auto legend = canvas_->addLegend(vert_pos, horiz_pos, placement, title);
  updateLegend();
  return legend;
}

void Drawable::addSeries(Series* series) {
+20 −1
Original line number Diff line number Diff line
@@ -12,7 +12,26 @@
namespace fnordmetric {
namespace ui {

GridDefinition::GridDefinition(kPlacement placement) : placement_(placement) {}
GridDefinition::GridDefinition(
    kPlacement placement) :
    placement_(placement),
    domain_(nullptr) {}

void GridDefinition::setDomain(DomainAdapter* domain) {
  domain_ = domain;
}

GridDefinition::kPlacement GridDefinition::placement() const {
  return placement_;
}

const std::vector<double> GridDefinition::ticks() const {
  if (domain_->empty()) {
    return std::vector<double>();
  } else {
    return domain_->get()->getTicks();
  }
}

}
}
+4 −0
Original line number Diff line number Diff line
@@ -32,8 +32,12 @@ public:
   */
  void setDomain(DomainAdapter* domain);

  kPlacement placement() const;
  const std::vector<double> ticks() const;

protected:
  kPlacement placement_;
  DomainAdapter* domain_;
};

}
Loading