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

add axis-*-label-placement properties

parent 4001e508
Loading
Loading
Loading
Loading
+42 −0
Original line number Diff line number Diff line
@@ -134,12 +134,40 @@ ReturnCode configure(
    {"margin-left", std::bind(&parseMeasureProp, std::placeholders::_1, &config.margins[3])},
    {"axis-top", std::bind(&parseAxisModeProp, std::placeholders::_1, &config.axis_top.mode)},
    {"axis-top-format", std::bind(&confgure_format, std::placeholders::_1, &config.axis_top.label_formatter)},
    {
      "axis-top-label-placement",
      std::bind(
          &axis_configure_label_placement,
          std::placeholders::_1,
          &config.axis_top.label_placement),
    },
    {"axis-right", std::bind(&parseAxisModeProp, std::placeholders::_1, &config.axis_right.mode)},
    {"axis-right-format", std::bind(&confgure_format, std::placeholders::_1, &config.axis_right.label_formatter)},
    {
      "axis-right-label-placement",
      std::bind(
          &axis_configure_label_placement,
          std::placeholders::_1,
          &config.axis_right.label_placement),
    },
    {"axis-bottom", std::bind(&parseAxisModeProp, std::placeholders::_1, &config.axis_bottom.mode)},
    {"axis-bottom-format", std::bind(&confgure_format, std::placeholders::_1, &config.axis_bottom.label_formatter)},
    {
      "axis-bottom-label-placement",
      std::bind(
          &axis_configure_label_placement,
          std::placeholders::_1,
          &config.axis_bottom.label_placement),
    },
    {"axis-left", std::bind(&parseAxisModeProp, std::placeholders::_1, &config.axis_left.mode)},
    {"axis-left-format", std::bind(&confgure_format, std::placeholders::_1, &config.axis_left.label_formatter)},
    {
      "axis-left-label-placement",
      std::bind(
          &axis_configure_label_placement,
          std::placeholders::_1,
          &config.axis_left.label_placement),
    },
    {"xdomain", std::bind(&confgure_domain_kind, std::placeholders::_1, &config.domain_x.kind)},
    {"ydomain", std::bind(&confgure_domain_kind, std::placeholders::_1, &config.domain_y.kind)},
    {
@@ -149,6 +177,13 @@ ReturnCode configure(
          std::bind(&confgure_format, std::placeholders::_1, &config.axis_bottom.label_formatter),
      })
    },
    {
      "xdomain-label-placement",
      configure_multiprop({
          std::bind(&axis_configure_label_placement, std::placeholders::_1, &config.axis_top.label_placement),
          std::bind(&axis_configure_label_placement, std::placeholders::_1, &config.axis_bottom.label_placement),
      })
    },
    {
      "ydomain-format",
      configure_multiprop({
@@ -156,6 +191,13 @@ ReturnCode configure(
          std::bind(&confgure_format, std::placeholders::_1, &config.axis_right.label_formatter),
      })
    },
    {
      "ydomain-label-placement",
      configure_multiprop({
          std::bind(&axis_configure_label_placement, std::placeholders::_1, &config.axis_left.label_placement),
          std::bind(&axis_configure_label_placement, std::placeholders::_1, &config.axis_right.label_placement),
      })
    },
    {"xdomain-padding", std::bind(&configure_float, std::placeholders::_1, &config.domain_x.padding)},
    {"ydomain-padding", std::bind(&configure_float, std::placeholders::_1, &config.domain_y.padding)},
    {"xmin", std::bind(&configure_float_opt, std::placeholders::_1, &config.domain_x.min)},
+55 −25
Original line number Diff line number Diff line
@@ -239,30 +239,6 @@ Status renderAxis(
  return rc;
}

ReturnCode axis_expand_linear_geom(
    const DomainConfig& domain,
    AxisDefinition* axis) {
  uint32_t num_ticks = 8; // FIXME make configurable
  double min = domain.min.value_or(0.0f);
  double max = domain.max.value_or(0.0f);

  axis->ticks.clear();
  axis->labels.clear();

  for (size_t i = 0; i < num_ticks; ++i) {
    axis->ticks.emplace_back((1.0f / (num_ticks - 1)) * i);
  }

  auto tick_values = domain_untranslate(domain, axis->ticks);
  for (size_t i = 0; i < num_ticks; ++i) {
    axis->labels.emplace_back(
        axis->ticks[i],
        axis->label_formatter.format_value(tick_values[i]));
  }

  return OK;
}

ReturnCode axis_expand_auto(
    const AxisDefinition& in,
    const AxisPosition& pos,
@@ -305,7 +281,17 @@ ReturnCode axis_expand_auto(
      break;
  };

  return axis_expand_linear_geom(domain, out); // FIXME
  if (in.label_placement) {
    if (auto rc = in.label_placement(domain, out); !rc) {
      return rc;
    }
  } else {
    if (auto rc = axis_place_labels_geom(domain, out); !rc) {
      return rc;
    }
  }

  return OK;
}

ReturnCode axis_draw_all(
@@ -356,5 +342,49 @@ ReturnCode axis_draw_all(
  return OK;
}

ReturnCode axis_place_labels_geom(
    const DomainConfig& domain,
    AxisDefinition* axis) {
  uint32_t num_ticks = 8; // FIXME make configurable
  double min = domain.min.value_or(0.0f);
  double max = domain.max.value_or(0.0f);

  axis->ticks.clear();
  axis->labels.clear();

  for (size_t i = 0; i < num_ticks; ++i) {
    axis->ticks.emplace_back((1.0f / (num_ticks - 1)) * i);
  }

  auto tick_values = domain_untranslate(domain, axis->ticks);
  for (size_t i = 0; i < num_ticks; ++i) {
    axis->labels.emplace_back(
        axis->ticks[i],
        axis->label_formatter.format_value(tick_values[i]));
  }

  return OK;
}

ReturnCode axis_configure_label_placement(
    const plist::Property& prop,
    AxisLabelPlacement* label_placement) {
  if (prop.size() < 1) {
    return ERROR_INVALID_ARGUMENT;
  }

  if (plist::is_value(prop, "geometric") ||
      plist::is_enum(prop, "geometric")) {
    *label_placement = std::bind(
        &axis_place_labels_geom,
        std::placeholders::_1,
        std::placeholders::_2);

    return OK;
  }

  return ERROR_INVALID_ARGUMENT;
}

} // namespace plotfx
+14 −0
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@
namespace plotfx {
struct DomainConfig;
struct Rectangle;
struct AxisDefinition;

enum class AxisPosition {
  TOP,
@@ -65,6 +66,10 @@ enum class AxisLabelPosition {
  OUTSIDE,
};

using AxisLabelPlacement = std::function<ReturnCode (
    const DomainConfig& domain,
    AxisDefinition*)>;

struct AxisDefinition {
  AxisDefinition();
  AxisMode mode;
@@ -72,6 +77,7 @@ struct AxisDefinition {
  std::vector<double> ticks;
  std::vector<std::pair<double, std::string>> labels;
  AxisLabelPosition label_position;
  AxisLabelPlacement label_placement;
  Formatter label_formatter;
  Colour text_colour;
  Colour border_colour;
@@ -111,5 +117,13 @@ ReturnCode axis_draw_all(
    const AxisDefinition& axis_left,
    Layer* layer);

ReturnCode axis_place_labels_geom(
    const DomainConfig& domain,
    AxisDefinition* axis);

ReturnCode axis_configure_label_placement(
    const plist::Property& prop,
    AxisLabelPlacement* placement);

} // namespace plotfx