Commit 1712f49e authored by Paul Asmuth's avatar Paul Asmuth
Browse files

update the scale/domain configuration methods to the new expression api

parent 14220213
Loading
Loading
Loading
Loading
+59 −66
Original line number Diff line number Diff line
@@ -12,7 +12,8 @@
 * limitations under the License.
 */
#include "core/scale.h"
#include "utils/algo.h"
#include "core/sexpr_conv.h"
#include "core/sexpr_util.h"

#include <assert.h>
#include <iostream>
@@ -164,31 +165,28 @@ std::vector<double> domain_untranslate(
  return s;
}

/*

ReturnCode domain_configure(
    const plist::Property& prop,
ReturnCode domain_configure_kind(
    const Expr* expr,
    DomainConfig* domain) {
  auto args = plist::flatten(prop);
  for (const auto& prop : args) {
    if (prop == "linear") {
  for (; expr; expr = expr_next(expr)) {
    if (expr_is_value(expr, "linear")) {
      domain->kind = DomainKind::LINEAR;
      continue;
    }

    if (prop == "log" ||
        prop == "logarithmic") {
    if (expr_is_value(expr, "log") ||
        expr_is_value(expr, "logarithmic")) {
      domain->kind = DomainKind::LOGARITHMIC;
      continue;
    }

    if (prop == "invert" ||
        prop == "inverted") {
    if (expr_is_value(expr, "invert") ||
        expr_is_value(expr, "inverted")) {
      domain->inverted = true;
      continue;
    }

    return err_invalid_value(prop, {
    return err_invalid_value(expr_inspect(expr), {
      "linear",
      "log",
      "logarithmic",
@@ -200,8 +198,6 @@ ReturnCode domain_configure(
  return OK;
}

*/

ReturnCode scale_layout_linear(
    const DomainConfig& domain,
    ScaleLayout* layout,
@@ -228,6 +224,7 @@ ReturnCode scale_layout_linear(
}

ReturnCode scale_layout_subdivide(
    const DomainConfig& domain,
    ScaleLayout* layout,
    uint32_t divisions) {
  layout->ticks.clear();
@@ -274,40 +271,30 @@ ReturnCode scale_layout_discrete(
  return OK;
}

/*

ReturnCode configure_scale_layout_linear(
    const plist::Property& prop,
ReturnCode scale_configure_layout_linear(
    const Expr* expr,
    ScaleLayoutFn* layout) {
  auto args = expr_collect(expr);

  double step = 0;
  std::optional<double> align;
  switch (prop.size()) {
  switch (args.size()) {
    case 2:
      if (auto rc = expr_to_float64_opt(args[1], &align); !rc) {
        return rc;
      }
    case 1:
      if (auto rc = expr_to_float64(args[0], &step); !rc) {
        return rc;
      }
      break;
    case 0:
      step = 1; // TODO: automatically choose a good value
      break;
    case 1:
    default:
      try {
        step = std::stod(prop[0]);
        break;
      } catch (... ) {
        return ERROR;
      }
  }

  for (size_t i = 1; i < prop.size(); ++i) {
    if (plist::is_tuple(prop[i]) &&
        prop[i].size() == 2 &&
        prop[i][0].value == "align") {
      try {
        align = std::stod(prop[i][1].value);
        break;
      } catch (... ) {
        return ERROR;
      }

      continue;
    }
      return ReturnCode::error(
          "EARG",
          "invalid number of arguments for 'linear'; expected zero, one or two");
  }

  *layout = bind(
@@ -320,23 +307,25 @@ ReturnCode configure_scale_layout_linear(
  return OK;
}

ReturnCode configure_scale_layout_subdivide(
    const plist::Property& prop,
ReturnCode scale_configure_layout_subdivide(
    const Expr* expr,
    ScaleLayoutFn* layout) {
  auto args = expr_collect(expr);

  double subdivisions = 0;
  switch (prop.size()) {
  switch (args.size()) {
    case 0:
      subdivisions = 8; // TODO: automatically choose a good value
      break;
    case 1:
      try {
        subdivisions = std::stod(prop[0]);
        break;
      } catch (... ) {
        return ERROR;
      if (auto rc = expr_to_float64(args[0], &subdivisions); !rc) {
        return rc;
      }
      break;
    default:
      return ERROR;
      return ReturnCode::error(
          "EARG",
          "invalid number of arguments for 'subdivide'; expected one or two");
  }

  *layout = bind(
@@ -348,35 +337,39 @@ ReturnCode configure_scale_layout_subdivide(
  return OK;
}

ReturnCode configure_scale_layout(
    const plist::Property& prop,
ReturnCode scale_configure_layout(
    const Expr* expr,
    ScaleLayoutFn* layout) {
  if (plist::is_value(prop, "linear") ||
      plist::is_enum(prop, "linear")) {
    return configure_scale_layout_linear(prop, layout);
  if (!expr || !expr_is_list(expr)) {
    return ReturnCode::errorf(
        "EARG",
        "invalid argument; expected a list but got: $0",
        "..."); // FIXME
  }

  expr = expr_get_list(expr);

  if (expr_is_value(expr, "linear")) {
    return scale_configure_layout_linear(expr_next(expr), layout);
  }

  if (plist::is_value(prop, "subdivide") ||
      plist::is_enum(prop, "subdivide")) {
    return configure_scale_layout_subdivide(prop, layout);
  if (expr_is_value(expr, "subdivide")) {
    return scale_configure_layout_subdivide(expr_next(expr), layout);
  }

  if (plist::is_value(prop, "discrete") ||
      plist::is_enum(prop, "discrete")) {
  if (expr_is_value(expr, "discrete")) {
    *layout = bind(&scale_layout_discrete, _1, _2);
    return OK;
  }

  return ReturnCode::errorf(
  return ReturnCode::error(
      "EARG",
      "invalid value '$0', expected one of: \n"
      "invalid argument; expected one of: \n"
      "  - linear\n"
      "  - subdivide\n"
      "  - discrete\n",
      prop.value);
      "  - discrete\n");
}

*/

} // namespace fviz
+8 −7
Original line number Diff line number Diff line
@@ -51,7 +51,7 @@ struct ScaleLayout {
  std::vector<double> labels;
};

using ScaleLayoutFn = std::function<void (ScaleLayout*)>;
using ScaleLayoutFn = std::function<void (const DomainConfig&, ScaleLayout*)>;

void domain_fit(double value, DomainConfig* domain);

@@ -72,9 +72,9 @@ std::vector<double> domain_untranslate(
    const DomainConfig& domain,
    const std::vector<double>& data);

//ReturnCode domain_configure(
//    const plist::Property& prop,
//    DomainConfig* domain);
ReturnCode domain_configure_kind(
    const Expr* expr,
    DomainConfig* domain);

ReturnCode scale_layout_linear(
    const DomainConfig& domain,
@@ -83,6 +83,7 @@ ReturnCode scale_layout_linear(
    std::optional<double> align);

ReturnCode scale_layout_subdivide(
    const DomainConfig& domain,
    ScaleLayout* layout,
    uint32_t divisions);

@@ -90,9 +91,9 @@ ReturnCode scale_layout_discrete(
    const DomainConfig& domain,
    ScaleLayout* layout);

//ReturnCode configure_scale_layout(
//    const plist::Property& prop,
//    ScaleLayoutFn* layout);
ReturnCode scale_configure_layout(
    const Expr* expr,
    ScaleLayoutFn* layout);

} // namespace fviz
+4 −0
Original line number Diff line number Diff line
@@ -101,5 +101,9 @@ const std::string& expr_get_value(const Expr* expr) {
  return expr->value;
}

std::string expr_inspect(const Expr* expr) {
  return expr->value; // FIXME
}

} // namespace fviz
+2 −0
Original line number Diff line number Diff line
@@ -40,5 +40,7 @@ bool expr_is_value_quoted(const Expr* expr);
bool expr_is_value_quoted(const Expr* expr, const std::string& cmp);
const std::string& expr_get_value(const Expr* expr);

std::string expr_inspect(const Expr* expr);

} // namespace fviz
+11 −13
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#include "core/scale.h"
#include "core/format.h"
#include "core/layout.h"
#include "sexpr_conv.h"
#include "sexpr_util.h"

#include <assert.h>
@@ -105,7 +106,7 @@ static Status renderAxisVertical(
    Layer* target) {
  /* compute layout */
  ScaleLayout slayout;
  axis_config.scale_layout(&slayout);
  axis_config.scale_layout(axis_config.scale, &slayout);

  /* draw axis line */
  {
@@ -192,7 +193,7 @@ static Status renderAxisHorizontal(
    Layer* target) {
  /* compute layout */
  ScaleLayout slayout;
  axis_config.scale_layout(&slayout);
  axis_config.scale_layout(axis_config.scale, &slayout);

  /* draw axis line */
  {
@@ -278,7 +279,7 @@ ReturnCode axis_layout_labels(
    double* margin) {
  /* compute scale layout */
  ScaleLayout slayout;
  axis.scale_layout(&slayout);
  axis.scale_layout(axis.scale, &slayout);

  /* compute label size */
  double max = 0;
@@ -494,7 +495,7 @@ ReturnCode build(const Environment& env, const Expr* expr, ElementRef* elem) {
  config->label_font_size = env.font_size;
  config->border_color = env.border_color;
  config->text_color = env.text_color;
  config->scale_layout = bind(&scale_layout_subdivide, _1, 6);
  config->scale_layout = bind(&scale_layout_subdivide, _1, _2, 6);

  if (elem_name == "chart/axis-top") {
    config->position = AxisPosition::TOP;
@@ -529,15 +530,12 @@ ReturnCode build(const Environment& env, const Expr* expr, ElementRef* elem) {

  {
    auto rc = expr_walk_map(expr_next(expr), {
      //{"width", bind(&configure_measure_opt, _1, &config->layout.width)},
      //{"height", bind(&configure_measure_opt, _1, &config->layout.height)},
      //{"format", bind(&confgure_format, _1, &config->label_formatter)},
      //{"labels", bind(&configure_strings, _1, &config->label_override)},
      //{"layout", bind(&configure_scale_layout, _1, &config->scale_layout)},
      //{"scale", bind(&domain_configure, _1, &config->scale)},
      //{"scale-min", bind(&configure_float_opt, _1, &config->scale.min)},
      //{"scale-max", bind(&configure_float_opt, _1, &config->scale.max)},
      //{"scale-padding", bind(&configure_float, _1, &config->scale.padding)},
      {"layout", bind(&scale_configure_layout, _1, &config->scale_layout)},
      {"min", bind(&expr_to_float64_opt, _1, &config->scale.min)},
      {"max", bind(&expr_to_float64_opt, _1, &config->scale.max)},
      {"scale", bind(&domain_configure_kind, _1, &config->scale)},
      {"scale-padding", bind(&expr_to_float64, _1, &config->scale.padding)},
      {"labels", bind(&expr_to_strings, _1, &config->label_override)},
    });

    if (!rc) {
Loading