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

make the LegendItemMap accessible to layer constructors

parent 8b99105d
Loading
Loading
Loading
Loading
+13 −8
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@
#include "graphics/layer.h"
#include "common/domain.h"
#include "common/config_helpers.h"
#include "common/utils/algo.h"
#include "legend.h"

using namespace std::placeholders;
@@ -50,14 +51,11 @@ LegendConfig::LegendConfig() :
    position_horiz(HAlign::LEFT),
    position_vert(VAlign::TOP) {}

void legend_add_item(
    LegendGroup* group,
    const std::string& title,
    const Color& color) {
  LegendItem item;
  item.title = title;
  item.color = color;
  group->items.emplace_back(std::move(item));
void legend_items_add(
    const std::string& key,
    LegendItemGroup items,
    LegendItemMap* map) {
  (*map)[key].emplace_back(std::move(items));
}

ReturnCode legend_layout_items(
@@ -331,6 +329,7 @@ ReturnCode legend_configure_position(
ReturnCode legend_configure(
    const Document& doc,
    const plist::Property& prop,
    const LegendItemMap& item_map,
    LegendMap* map) {
  if (!plist::is_map(prop)) {
    return ERROR_INVALID_ARGUMENT;
@@ -445,6 +444,10 @@ ReturnCode legend_configure(
    return rc;
  }

  if (auto items = find_ptr(item_map, config.key); items) {
    config.groups.insert(config.groups.end(), items->begin(), items->end());
  }

  map->emplace(config.key, config);
  return OK;
}
@@ -452,6 +455,7 @@ ReturnCode legend_configure(
ReturnCode legend_configure_all(
    const Document& doc,
    const plist::PropertyList& plist,
    const LegendItemMap& items,
    LegendMap* config) {
  static const ParserDefinitions pdefs = {
    {
@@ -460,6 +464,7 @@ ReturnCode legend_configure_all(
          &legend_configure,
          doc,
          _1,
          items,
          config),
    },
  };
+11 −8
Original line number Diff line number Diff line
@@ -52,13 +52,14 @@ struct LegendItem {
  Color color;
};

using LegendItemList = std::vector<LegendItem>;

struct LegendGroup {
struct LegendItemGroup {
  std::vector<LegendItem> items;
  std::string title;
};

using LegendItemList = std::vector<LegendItem>;
using LegendItemMap = std::unordered_map<std::string, std::vector<LegendItemGroup>>;

struct LegendConfig {
  LegendConfig();
  std::string key;
@@ -75,24 +76,26 @@ struct LegendConfig {
  HAlign position_horiz;
  VAlign position_vert;
  std::string title;
  std::vector<LegendGroup> groups;
  std::vector<LegendItemGroup> groups;
};

using LegendMap = std::unordered_map<std::string, LegendConfig>;

void legend_add_item(
    LegendGroup* group,
    const std::string& title,
    const Color& color);
void legend_items_add(
    const std::string& key,
    LegendItemGroup item_group,
    LegendItemMap* map);

ReturnCode legend_configure(
    const Document& doc,
    const plist::Property& prop,
    const LegendItemMap& items,
    LegendMap* config);

ReturnCode legend_configure_all(
    const Document& doc,
    const plist::PropertyList& plist,
    const LegendItemMap& items,
    LegendMap* config);

ReturnCode legend_draw(
+17 −4
Original line number Diff line number Diff line
@@ -103,6 +103,7 @@ ReturnCode configure_layer(
    const Document& doc,
    const DataContext& data,
    const DomainMap& scales,
    LegendItemMap* legend_items,
    PlotConfig* config) {
  std::string type = "points";
  static const ParserDefinitions pdefs = {
@@ -124,7 +125,7 @@ ReturnCode configure_layer(

  if (type == "lines")
    layer_builder = elem_builder<lines::PlotLinesConfig>(
        bind(&lines::configure, _1, _2, _3, scales, _4),
        bind(&lines::configure, _1, _2, _3, scales, legend_items, _4),
        &lines::draw);

  if (type == "points")
@@ -150,9 +151,10 @@ ReturnCode configure_layers(
    const Document& doc,
    const DataContext& data,
    const DomainMap& scales,
    LegendItemMap* legend_items,
    PlotConfig* config) {
  static const ParserDefinitions pdefs_layer = {
    {"layer", bind(&configure_layer, _1, doc, data, scales, config)}
    {"layer", bind(&configure_layer, _1, doc, data, scales, legend_items, config)}
  };

  return parseAll(plist, pdefs_layer);
@@ -376,14 +378,25 @@ ReturnCode configure(
    PlotConfig* config) {
  DataContext data = data_in;
  DomainMap scales;
  LegendItemMap legend_items;

  return try_chain({
    bind(&configure_datasource, ref(plist), &data),
    bind(&configure_data_refs, ref(plist), &data),
    bind(&configure_scales, ref(plist), ref(data), &scales),
    bind(&configure_style, ref(plist), doc, &scales, ref(config)),
    bind(&configure_layers, ref(plist), doc, ref(data), ref(scales), ref(config)),
    bind(&legend_configure_all, doc, ref(plist), &config->legends),
    bind(&configure_layers,
        ref(plist),
        doc,
        ref(data),
        ref(scales),
        &legend_items,
        config),
    bind(&legend_configure_all,
        doc,
        ref(plist),
        ref(legend_items),
        &config->legends),
    bind(&axis_resolve,
        ref(scales),
        &config->axis_top,
+3 −0
Original line number Diff line number Diff line
@@ -78,6 +78,7 @@ ReturnCode configure(
    const DataContext& data,
    const Document& doc,
    const DomainMap& scales,
    LegendItemMap* legend,
    PlotLinesConfig* config) {
  SeriesRef data_x = find_maybe(data.defaults, "x");
  SeriesRef data_y = find_maybe(data.defaults, "y");
@@ -86,6 +87,8 @@ ReturnCode configure(
  std::string scale_x = SCALE_DEFAULT_X;
  std::string scale_y = SCALE_DEFAULT_Y;

  std::string legend_key = LEGEND_DEFAULT;

  std::optional<Color> color_default;
  SeriesRef color_var = find_maybe(data.defaults, "color");
  DomainConfig color_domain;
+1 −0
Original line number Diff line number Diff line
@@ -63,6 +63,7 @@ ReturnCode configure(
    const DataContext& data,
    const Document& doc,
    const DomainMap& scales,
    LegendItemMap* legend,
    PlotLinesConfig* config);

} // namespace lines