Home Reference Source Repository

src/es6/layout/treemap.es6

import {d3} from "nbpresent-deps";

import {ManualLayout} from "./manual";

let KEY = "treemap";

export class TreemapLayout extends ManualLayout {
  static clsKey(){
    return KEY;
  }

  key(){
    return KEY;
  }

  init(){
    super.init();

    let that = this;

    this.treemap = d3.layout.treemap()
      .size([100, 100])
      .sticky(true)
      .value((d) => {
        return d._value.attrs["treemap:weight"] || 1;
      });

    let regions = d3.entries(this.slide.value.regions)
      .map((d)=> {
        d._value = d.value;
        return d;
      })

    // initialize missing values
    regions
      .filter((d) => d.value.attrs["treemap:weight"] == null)
      .map((d) => {
        that.tree.merge(["slides", that.slide.key, "regions", d.key, "attrs"], {
          "treemap:weight": d.value["treemap:weight"] || 1
        });
      });

    this.treemap({
      children: regions
    });

    regions.map((d) => {
      let path = ["slides", that.slide.key, "regions", d.key, "attrs"];
      let old = that.tree.get(path),
        newValues = {
          x: d.x / 100,
          y: d.y / 100,
          width: d.dx / 100,
          height: d.dy / 100
        },
        toSet;

      for(var key in newValues){
        if(old[key] !== newValues[key]){
          (toSet ? toSet : toSet = {})[key] = newValues[key];
        }
      }

      if(toSet){
        that.tree.merge(path, toSet);
      }
    });
  }
}