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

add tick_position to the axis definition

parent 8ce9030b
Loading
Loading
Loading
Loading
+73 −13
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ namespace plotfx {
AxisDefinition::AxisDefinition() :
    mode(AxisMode::AUTO),
    label_position(AxisLabelPosition::OUTSIDE),
    tick_position(AxisLabelPosition::INSIDE),
    label_formatter(format_decimal_fixed(1)),
    label_padding({Unit::REM, 0.8f}),
    label_font_size({Unit::REM, 1.0f}),
@@ -82,19 +83,19 @@ static Status renderAxisVertical(
    strokeLine(target, {x, y0}, {x, y1}, style);
  }

  double label_position = 0;
  switch (axis_config.label_position) {
  /* draw ticks */
  double tick_position = 0;
  switch (axis_config.tick_position) {
    case AxisLabelPosition::RIGHT:
      label_position = 1;
      tick_position = 1;
      break;
    case AxisLabelPosition::LEFT:
      label_position = -1;
      tick_position = -1;
      break;
    default:
      break;
  }

  /* draw ticks */
  for (const auto& tick : axis_config.ticks) {
    auto y = y0 + (y1 - y0) * (1.0 - tick);
    StrokeStyle style;
@@ -102,11 +103,23 @@ static Status renderAxisVertical(
    strokeLine(
        target,
        {x, y},
        {x + to_px(target->measures, axis_config.tick_length).value * label_position, y},
        {x + to_px(target->measures, axis_config.tick_length).value * tick_position, y},
        style);
  }

  /* draw labels */
  double label_position = 0;
  switch (axis_config.label_position) {
    case AxisLabelPosition::RIGHT:
      label_position = 1;
      break;
    case AxisLabelPosition::LEFT:
      label_position = -1;
      break;
    default:
      break;
  }

  auto label_padding = to_px(target->measures, axis_config.label_padding).value;
  for (const auto& label : axis_config.labels) {
    auto [ tick, label_text ] = label;
@@ -142,19 +155,19 @@ static Status renderAxisHorizontal(
    strokeLine(target, {x0, y}, {x1, y}, style);
  }

  double label_position = 0;
  switch (axis_config.label_position) {
  /* draw ticks */
  double tick_position = 0;
  switch (axis_config.tick_position) {
    case AxisLabelPosition::BOTTOM:
      label_position = 1;
      tick_position = 1;
      break;
    case AxisLabelPosition::TOP:
      label_position = -1;
      tick_position = -1;
      break;
    default:
      break;
  }

  /* draw ticks */
  for (const auto& tick : axis_config.ticks) {
    auto x = x0 + (x1 - x0) * tick;
    StrokeStyle style;
@@ -162,11 +175,23 @@ static Status renderAxisHorizontal(
    strokeLine(
        target,
        {x, y},
        {x, y + to_px(target->measures, axis_config.tick_length).value * label_position},
        {x, y + to_px(target->measures, axis_config.tick_length).value * tick_position},
        style);
  }

  /* draw labels */
  double label_position = 0;
  switch (axis_config.label_position) {
    case AxisLabelPosition::BOTTOM:
      label_position = 1;
      break;
    case AxisLabelPosition::TOP:
      label_position = -1;
      break;
    default:
      break;
  }

  auto label_padding = to_px(target->measures, axis_config.label_padding).value;
  for (const auto& label : axis_config.labels) {
    auto [ tick, label_text ] = label;
@@ -246,6 +271,41 @@ ReturnCode axis_expand_auto(
    AxisDefinition* out) {
  *out = in;

  switch (out->tick_position) {
    case AxisLabelPosition::OUTSIDE:
      switch (pos) {
        case AxisPosition::TOP:
          out->tick_position = AxisLabelPosition::TOP;
          break;
        case AxisPosition::RIGHT:
          out->tick_position = AxisLabelPosition::RIGHT;
          break;
        case AxisPosition::BOTTOM:
          out->tick_position = AxisLabelPosition::BOTTOM;
          break;
        case AxisPosition::LEFT:
          out->tick_position = AxisLabelPosition::LEFT;
          break;
      }
      break;
    case AxisLabelPosition::INSIDE:
      switch (pos) {
        case AxisPosition::TOP:
          out->tick_position = AxisLabelPosition::BOTTOM;
          break;
        case AxisPosition::RIGHT:
          out->tick_position = AxisLabelPosition::LEFT;
          break;
        case AxisPosition::BOTTOM:
          out->tick_position = AxisLabelPosition::TOP;
          break;
        case AxisPosition::LEFT:
          out->tick_position = AxisLabelPosition::RIGHT;
          break;
      }
      break;
  };

  switch (out->label_position) {
    case AxisLabelPosition::OUTSIDE:
      switch (pos) {
+1 −0
Original line number Diff line number Diff line
@@ -76,6 +76,7 @@ struct AxisDefinition {
  std::string title;
  std::vector<double> ticks;
  std::vector<std::pair<double, std::string>> labels;
  AxisLabelPosition tick_position;
  AxisLabelPosition label_position;
  AxisLabelPlacement label_placement;
  Formatter label_formatter;
+1 −1
Original line number Diff line number Diff line
@@ -12,7 +12,7 @@ plot {
  margin-right: 3.4rem;

  ymin: -10;
  ymax: 30;
  ymax: 32;
  xdomain: categorical;
  xdomain-format: string;