Advertisement
Guest User

Untitled

a guest
Aug 24th, 2014
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. defaultStyle = {
  2.     fontName: "sans-serif"
  3.     fontSize: 16
  4.     topPadding: 0
  5.     leftPadding: 0
  6.     rightPadding: 0
  7.     bottomPadding: 0
  8.     spacing: 5
  9.     indent: 10
  10.     verticalSpacing: 0
  11.     color: "black"
  12.     selection: "blue"
  13.     #background: "green"
  14.     #border: "red"
  15. }
  16.  
  17. buildStyle = (parent, style) ->
  18.     for name, value of parent
  19.         style[name] ?= value
  20.     return style
  21.  
  22. labelStyle = buildStyle defaultStyle, {
  23.     color: "purple"
  24.     fontSize: 12
  25. }
  26.  
  27. condStyle = buildStyle defaultStyle, {
  28.     indent: 0
  29.     selection: "yellow"
  30. }
  31.  
  32. addFrame = (container, node) ->
  33.     if isMark(node, 'cr')
  34.         return container.newline(node)
  35.     if isList(node, 'cond')
  36.         container.push frame = newFrame node, condStyle
  37.         first = true
  38.         for item in node.list
  39.             frame.newline() unless first
  40.             if isList(item, 'else')
  41.                 row = newFrame item, defaultStyle
  42.                 row.push newDeco("else", labelStyle)
  43.                 for subitem in item.list
  44.                     addFrame row, subitem
  45.             else
  46.                 row = newFrame item, defaultStyle
  47.                 row.push newDeco("else", labelStyle) unless first
  48.                 row.push newDeco("if", labelStyle)
  49.                 for subitem in item.list
  50.                     addFrame row, subitem
  51.             frame.push row
  52.             first = false
  53.     else if isList(node, 'infix')
  54.         container.push frame = newFrame node, buildStyle defaultStyle, {
  55.             selection: "green"
  56.         }
  57.         #frame.push newDeco("{", labelStyle)
  58.         addFrame frame, item for item in node.list
  59.         #frame.push newDeco("}", labelStyle)
  60.     else if isList(node)
  61.         container.push frame = newFrame node, buildStyle defaultStyle, {
  62.             selection: "blue"
  63.         }
  64.         if node.label?
  65.             frame.push newDeco(node.label, labelStyle)
  66.         for item in node.list
  67.             addFrame(frame, item)
  68.     else if isText(node, 'int')
  69.         container.push frame = newFrame node, buildStyle container.style, {
  70.             color: "blue"
  71.         }
  72.     else
  73.         container.push frame = newFrame node, container.style
  74.     return null
  75.  
  76. window.addEventListener 'load', () ->
  77.     canvas = autoResize document.getElementById('editor')
  78.     bc = canvas.getContext '2d'
  79.     mouse = mouseInput(canvas)
  80.  
  81.     root = newList([
  82.         newList([
  83.             newList([
  84.                 newText("square")
  85.                 newText("x")
  86.             ])
  87.             newMark('cr')
  88.             newList([
  89.                 newText("x")
  90.                 newText("*")
  91.                 newText("x")
  92.             ], 'infix')
  93.         ], 'define')
  94.         newList([
  95.             newList([
  96.                 newText("factorial")
  97.                 newText("n")
  98.             ])
  99.             newMark('cr')
  100.             newList([
  101.                 newList([
  102.                     newList([
  103.                         newText("n")
  104.                         newText("=")
  105.                         newText("1", "int")
  106.                     ], 'infix')
  107.                     newMark("cr")
  108.                     newText("1", "int")
  109.                 ])
  110.                 newList([
  111.                     newList([
  112.                         newText("n")
  113.                         newText("=")
  114.                         newText("0", "int")
  115.                     ], 'infix')
  116.                     newMark("cr")
  117.                     newText("1", "int")
  118.                 ])
  119.                 newList([
  120.                     newMark("cr")
  121.                     newList([
  122.                         newText("n")
  123.                         newText("*")
  124.                         newList([
  125.                             newText("factorial")
  126.                             newList([
  127.                                 newText("n")
  128.                                 newText("-")
  129.                                 newText("1", "int")
  130.                             ], 'infix')
  131.                         ])
  132.                     ], 'infix')
  133.                 ], 'else')
  134.             ], 'cond')
  135.         ], 'define')
  136.     ])
  137.  
  138.     frame = newFrame root, buildStyle defaultStyle, {
  139.         indent: 0
  140.         verticalSpacing: 25
  141.     }
  142.     first = true
  143.     for node in frame.node.list
  144.         frame.newline() unless first
  145.         addFrame(frame, node)
  146.         first = false
  147.  
  148.     draw = () ->
  149.         bc.fillStyle = "#ccc"
  150.         bc.fillRect(0, 0, canvas.width, canvas.height)
  151.  
  152.         frame.layout(bc)
  153.         frame.x = 50
  154.         frame.y = 50
  155.         frame.paint(bc)
  156.  
  157.         near = frame.nearest(mouse.point...)
  158.         over = null
  159.         over = near.frame.parent if near?
  160. #        if over?
  161. #            [dx, dy] = mouse.point
  162. #            if over.parent?
  163. #                {x, y} = over.parent.getPosition()
  164. #                dx -= x
  165. #                dy -= y
  166. #            near = over.nearest(dx, dy)
  167.  
  168.         bc.globalAlpha = 0.1
  169.         while over?
  170.             bc.strokeStyle = over.style.selection
  171.             {x, y} = over.getPosition()
  172.             bc.strokeRect(x, y, over.width, over.height)
  173.             over = over.parent
  174.  
  175.         bc.globalAlpha = 0.5
  176.         if near? and near.frame? and near.dist < 100
  177.             index = near.index
  178.             near = near.frame
  179.             bc.strokeStyle = "black"
  180.             bc.fillStyle = "black"
  181.             {x, y} = near.getPosition()
  182.             near.paintSelection(bc, index, index)
  183.  
  184.         bc.globalAlpha = 1.0
  185.  
  186.         requestAnimationFrame draw
  187.     draw()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement