Commit 686a6855 authored by Paul Asmuth's avatar Paul Asmuth
Browse files

add layout_elements helper

parent cecffaf6
Loading
Loading
Loading
Loading
+49 −1
Original line number Diff line number Diff line
@@ -34,7 +34,7 @@ namespace plotfx {

LayoutSettings::LayoutSettings() : position(Position::RELATIVE) {}

ReturnCode layout_compute(
ReturnCode layout_element(
    const LayoutSettings& config,
    double bbox_w,
    double bbox_h,
@@ -114,5 +114,53 @@ ReturnCode layout_compute(

  return OK;
}

ReturnCode layout_elements(
    const Layer& layer,
    const Rectangle& parent_bbox,
    const std::vector<ElementRef>& elements,
    std::vector<LayoutInfo>* element_layouts) {
  LayoutState layout_state;
  layout_state.content_box = parent_bbox;

  for (const auto& e : elements) {
    double bbox_w = 0.0;
    double bbox_h = 0.0;

    if (auto rc =
          e->layout(
              layer,
              layout_state.content_box.w,
              layout_state.content_box.h,
              &bbox_w,
              &bbox_h);
          !rc.isSuccess()) {
      return rc;
    }

    LayoutInfo l;
    l.bounding_box = parent_bbox;

    if (auto rc =
          layout_element(
              e->layout_settings(),
              bbox_w,
              bbox_h,
              &layout_state,
              &l.content_box);
          !rc.isSuccess()) {
      return rc;
    }

    element_layouts->emplace_back(l);
  }

  for (auto& l : *element_layouts) {
    l.inner_box = layout_state.content_box;
  }

  return OK;
}

} // namespace plotfx
+9 −1
Original line number Diff line number Diff line
@@ -29,7 +29,9 @@
 */
#pragma once
#include "graphics/geometry.h"
#include "graphics/layer.h"
#include "graphics/measure.h"
#include "element.h"

#include <assert.h>
#include <stdlib.h>
@@ -88,12 +90,18 @@ struct LayoutInfo {

};

ReturnCode layout_compute(
ReturnCode layout_element(
    const LayoutSettings& config,
    double bbox_w,
    double bbox_h,
    LayoutState* parent_layout,
    Rectangle* bbox);

ReturnCode layout_elements(
    const Layer& layer,
    const Rectangle& parent_bbox,
    const std::vector<ElementRef>& elements,
    std::vector<LayoutInfo>* element_layouts);

} // namespace plotfx
+2 −2
Original line number Diff line number Diff line
@@ -35,11 +35,11 @@
#include "plist/plist.h"
#include "utils/return_code.h"
#include "core/format.h"
#include "core/layout.h"

namespace plotfx {
struct Layer;
struct LayoutState;
struct LayoutInfo;
struct LayoutSettings;
struct Document;
struct DataContext;
struct Environment;
+15 −40
Original line number Diff line number Diff line
@@ -49,46 +49,14 @@ ReturnCode draw(
    convert_unit_typographic(layer->dpi, config.font_size, &m);
  }

  /* layout children */
  LayoutState layout_state;
  layout_state.content_box = layout_margin_box(
  /* calculate margin box */
  auto margin_box = layout_margin_box(
      layout.content_box,
      margins[0],
      margins[1],
      margins[2],
      margins[3]);

  std::vector<Rectangle> child_bboxes;
  for (const auto& e : config.children) {
    double bbox_w = 0.0;
    double bbox_h = 0.0;

    if (auto rc =
          e->layout(
              *layer,
              layout.content_box.w,
              layout.content_box.h,
              &bbox_w,
              &bbox_h);
          !rc.isSuccess()) {
      return rc;
    }

    Rectangle bbox;
    if (auto rc =
          layout_compute(
              e->layout_settings(),
              bbox_w,
              bbox_h,
              &layout_state,
              &bbox);
          !rc.isSuccess()) {
      return rc;
    }

    child_bboxes.emplace_back(bbox);
  }

  /* draw background */
  {
    const auto& bg_box = layout.content_box;
@@ -103,14 +71,21 @@ ReturnCode draw(
        bg_fill);
  }

  /* draw children */
  /* layout and draw children */
  std::vector<LayoutInfo> child_layouts;
  if (auto rc =
        layout_elements(
            *layer,
            margin_box,
            config.children,
            &child_layouts);
        !rc) {
    return rc;
  }

  for (size_t i = 0; i < config.children.size(); ++i) {
    const auto& e = config.children[i];

    LayoutInfo l;
    l.bounding_box = layout.bounding_box;
    l.content_box = child_bboxes[i];
    l.inner_box = layout_state.content_box;
    const auto& l = child_layouts[i];

    if (auto rc = e->draw(l, layer); !rc.isSuccess()) {
      return rc;
+1 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@
#include "plist/plist.h"
#include "core/environment.h"
#include "element.h"
#include "core/layout.h"

namespace plotfx {
namespace box {