summaryrefslogtreecommitdiff
path: root/snap-to-grid.js
blob: d0360a323aa2df717295d3697e20d676dacec565 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
window.onload = function () {
  var dragger = function ()
    {
      curDrag = this;
      this.ox = this.type == "rect" ? this.attr("x") : this.attr("cx");
      this.oy = this.type == "rect" ? this.attr("y") : this.attr("cy");
    },
    move = function (dx, dy)
    {
      var att = this.type == "rect" ? { x: this.ox + dx, y: this.oy } : { cx: this.ox + dx, cy: this.oy };
      this.attr(att);
      r.safari();
    },
    collide = function (obj)
    {
      document.getElementById("debug").innerHTML = curDrag["id"] + " <-> " + obj["id"]
      if (curDrag["grid"] > obj["grid"]) {
        if (curDrag.getBBox().width < obj.getBBox().width &&
            curDrag.getBBox().x > (obj.getBBox().x+obj.getBBox().width/3)) {
          return;
        }
        att = { x: obj.attr("x")+curDrag.getBBox().width+margin };
        obj.attr(att);
      } else {
        if (curDrag.getBBox().width < obj.getBBox().width &&
            curDrag.getBBox().x < (obj.getBBox().x+obj.getBBox().width/3)) {
          return;
        }
        att = { x: obj.attr("x")-(curDrag.getBBox().width+margin) };
        obj.attr(att);
      }

      var tmp = curDrag["grid"];
      curDrag["grid"] = obj["grid"];
      obj["grid"] = tmp;
    },
    up = function ()
    {
      snapToGrid(this);
    },
    snapToGrid = function (obj)
    {
      // just x coord, y is fixed in drag
      var d = 0;
      for (var i = 0; i < 4; i++) {
        obj = null
        for (var j = 0; j < shapes.length; j++) {
          obj = shapesById[j];
          if (obj["grid"] == i)
            break;
        }
        att = {x:d};
        obj.animate(att,250);
        d += obj.getBBox().width+margin;
      }
    },
    widths = [ 10, 128, 30, 40 ],
    r = Raphael("holder", widths[0]+widths[1]+widths[2]+widths[3]+3*margin, 100),
    fix_y = 50,
    margin = 10,
    shapes = [
               r.rect(0,                                      fix_y, widths[0], 30, 0),
               r.rect(widths[0]+margin,                       fix_y, widths[1], 30, 0),
               r.rect(widths[0]+widths[1]+2*margin,           fix_y, widths[2], 30, 0),
               r.rect(widths[0]+widths[1]+widths[2]+3*margin, fix_y, widths[3], 30, 0),
             ],
    colors = [ "#000", "#ccc", "#0f0", "#00f" ],
    shapesById  = {},
    curDrag = null;
  for (var i = 0; i < shapes.length; i++) {
    shapes[i].attr({fill: colors[i], cursor: "move"});
    shapes[i].drag(move, dragger, up).onDragOver( function(a) { collide(a);});
    shapes[i]["id"] = i;
    shapes[i]["grid"] = i;
    shapesById[i] = shapes[i];
  }
};