Commit 99a96050 authored by Paul Asmuth's avatar Paul Asmuth
Browse files

linechart: add {x,y}{min,max} properties

parent cf56e1c1
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -51,8 +51,6 @@ LinechartSeries::LinechartSeries() :
    colour(Colour::fromRGB(0, 0, 0)) {}

LinechartConfig::LinechartConfig() :
    x_domain(PlotDomain::LINEAR),
    y_domain(PlotDomain::LINEAR),
    margin_rem(4.0f) {}

ReturnCode drawSeries(
@@ -93,8 +91,8 @@ ReturnCode draw(
    const Rectangle& clip,
    Layer* layer) {
  // setup domains
  DomainConfig domain_x;
  DomainConfig domain_y;
  auto domain_x = config.domain_x;
  auto domain_y = config.domain_y;

  for (const auto& s : config.series) {
    domain_fit(s.xs, &domain_x);
@@ -183,6 +181,10 @@ ReturnCode configure(const plist::PropertyList& plist, ElementRef* elem) {
    {"axis-right", std::bind(&parseAxisModeProp, std::placeholders::_1, &config.axis_right.mode)},
    {"axis-bottom", std::bind(&parseAxisModeProp, std::placeholders::_1, &config.axis_bottom.mode)},
    {"axis-left", std::bind(&parseAxisModeProp, std::placeholders::_1, &config.axis_left.mode)},
    {"xmin", std::bind(&configure_float_opt, std::placeholders::_1, &config.domain_x.min)},
    {"xmax", std::bind(&configure_float_opt, std::placeholders::_1, &config.domain_x.max)},
    {"ymin", std::bind(&configure_float_opt, std::placeholders::_1, &config.domain_y.min)},
    {"ymax", std::bind(&configure_float_opt, std::placeholders::_1, &config.domain_y.max)},
    {"series", std::bind(&configureSeries, std::placeholders::_1, &config)},
  };

+2 −2
Original line number Diff line number Diff line
@@ -50,8 +50,8 @@ struct LinechartSeries {

struct LinechartConfig {
  LinechartConfig();
  PlotDomain x_domain;
  PlotDomain y_domain;
  DomainConfig domain_x;
  DomainConfig domain_y;
  AxisDefinition axis_top;
  AxisDefinition axis_right;
  AxisDefinition axis_bottom;
+1 −1
Original line number Diff line number Diff line
@@ -39,7 +39,7 @@
namespace plotfx {

AxisDefinition::AxisDefinition() :
    mode(AxisMode::OFF),
    mode(AxisMode::AUTO),
    label_placement(AxisLabelPlacement::OUTSIDE),
    label_padding_rem(1.0f),
    label_font_size_rem(1.0f),
+5 −3
Original line number Diff line number Diff line
@@ -34,13 +34,15 @@ namespace plotfx {
DomainConfig::DomainConfig() :
    space(PlotDomain::LINEAR) {}


void domain_fit(const std::vector<double>& data, DomainConfig* domain) {
  bool fit_min = !domain->min;
  bool fit_max = !domain->max;

  for (const auto& d : data) {
    if (!domain->min || *domain->min > d) {
    if (fit_min && (!domain->min || *domain->min > d)) {
      domain->min = std::optional<double>(d);
    }
    if (!domain->max || *domain->max < d) {
    if (fit_max && (!domain->max || *domain->max < d)) {
      domain->max = std::optional<double>(d);
    }
  }
+19 −0
Original line number Diff line number Diff line
@@ -81,5 +81,24 @@ ReturnCode configure_colour(
  return ReturnCode::error("EARG", "invalid colour");
}

ReturnCode configure_float_opt(
    const plist::Property& prop,
    std::optional<double>* value) {
  if (prop.size() != 1) {
    return ReturnCode::errorf(
        "EARG",
        "incorrect number of arguments; expected: 1, got: $0",
        prop.size());
  }

  try {
    *value = std::optional<double>(std::stod(prop[0].data));
  } catch (... ) {
    return ERROR_INVALID_ARGUMENT;
  }

  return OK;
}

} // namespace plotfx
Loading