This commit is contained in:
Connor Turland 2017-01-11 23:17:57 -05:00
parent 3ff102b228
commit 816815d1b5
9 changed files with 135 additions and 78 deletions

View file

@ -5,6 +5,7 @@ import outdent from 'outdent'
import Active from './Active' import Active from './Active'
import DataModel from './DataModel' import DataModel from './DataModel'
import Engine from './Engine'
import Filter from './Filter' import Filter from './Filter'
import GlobalUI from './GlobalUI' import GlobalUI from './GlobalUI'
import JIT from './JIT' import JIT from './JIT'
@ -22,6 +23,7 @@ const Control = {
node.selected = true node.selected = true
node.setData('dim', 30, 'current') node.setData('dim', 30, 'current')
Selected.Nodes.push(node) Selected.Nodes.push(node)
Engine.setNodeSleeping(node.getData('body_id'), true)
}, },
deselectAllNodes: function() { deselectAllNodes: function() {
var l = Selected.Nodes.length var l = Selected.Nodes.length
@ -38,6 +40,7 @@ const Control = {
// remove the node // remove the node
Selected.Nodes.splice( Selected.Nodes.splice(
Selected.Nodes.indexOf(node), 1) Selected.Nodes.indexOf(node), 1)
Engine.setNodeSleeping(node.getData('body_id'), false)
}, },
deleteSelected: function() { deleteSelected: function() {
if (!Active.Map) return if (!Active.Map) return

View file

@ -5,6 +5,7 @@ import Mouse from './Mouse'
import Selected from './Selected' import Selected from './Selected'
import Synapse from './Synapse' import Synapse from './Synapse'
import Topic from './Topic' import Topic from './Topic'
import Util from './Util'
import Visualize from './Visualize' import Visualize from './Visualize'
import GlobalUI from './GlobalUI' import GlobalUI from './GlobalUI'
@ -356,8 +357,35 @@ const Create = {
Create.newTopic.addSynapse = false Create.newTopic.addSynapse = false
Create.newSynapse.topic1id = 0 Create.newSynapse.topic1id = 0
Create.newSynapse.topic2id = 0 Create.newSynapse.topic2id = 0
Create.newSynapse.node1 = null
Create.newSynapse.node2 = null
Mouse.synapseStartCoordinates = [] Mouse.synapseStartCoordinates = []
Mouse.synapseEndCoordinates = null
if (Visualize.mGraph) Visualize.mGraph.plot() if (Visualize.mGraph) Visualize.mGraph.plot()
},
updateForm: function() {
// set the draw synapse start positions
Mouse.synapseStartCoordinates = []
for (let i = Selected.Nodes.length - 1; i >= 0; i -= 1) {
const n = Selected.Nodes[i]
Mouse.synapseStartCoordinates.push({
x: n.pos.getc().x,
y: n.pos.getc().y
})
}
let pixelPos, midpoint = {}
if (Create.newSynapse.beingCreated) {
Mouse.synapseEndCoordinates = {
x: Create.newSynapse.node2.pos.getc().x,
y: Create.newSynapse.node2.pos.getc().y
}
// position the form
midpoint.x = Create.newSynapse.node1.pos.getc().x + (Create.newSynapse.node2.pos.getc().x - Create.newSynapse.node1.pos.getc().x) / 2
midpoint.y = Create.newSynapse.node1.pos.getc().y + (Create.newSynapse.node2.pos.getc().y - Create.newSynapse.node1.pos.getc().y) / 2
pixelPos = Util.coordsToPixels(Visualize.mGraph, midpoint)
$('#new_synapse').css('left', pixelPos.x + 'px')
$('#new_synapse').css('top', pixelPos.y + 'px')
}
} }
} }
} }

View file

@ -88,8 +88,8 @@ const Synapse = Backbone.Model.extend({
} }
} }
if (Active.Map) { if (Active.Map && providedMapping) {
mapping = providedMapping || this.getMapping() mapping = providedMapping
mappingID = mapping.isNew() ? mapping.cid : mapping.id mappingID = mapping.isNew() ? mapping.cid : mapping.id
edge.data.$mappings = [] edge.data.$mappings = []
edge.data.$mappingIDs = [mappingID] edge.data.$mappingIDs = [mappingID]
@ -100,10 +100,12 @@ const Synapse = Backbone.Model.extend({
updateEdge: function() { updateEdge: function() {
var mapping var mapping
var edge = this.get('edge') var edge = this.get('edge')
edge.data.$synapses = edge.data.$synapses || []
edge.getData('synapses').push(this) edge.getData('synapses').push(this)
if (Active.Map) { if (Active.Map) {
mapping = this.getMapping() mapping = this.getMapping()
edge.data.$mappings = edge.data.$mappings || []
edge.getData('mappings').push(mapping) edge.getData('mappings').push(mapping)
} }

View file

@ -117,10 +117,6 @@ const DataModel = {
Filter.checkMetacodes() Filter.checkMetacodes()
Filter.checkMappers() Filter.checkMappers()
}) })
DataModel.Mappings.on('remove', function(mapping) {
console.log('removed', mapping)
if (mapping.get('mappable_type') === 'Topic') Engine.removeTopic(mapping)
})
} }
} }

View file

@ -1,8 +1,10 @@
import Matter, { World, Composite, Runner, Common, Body, Bodies, Events } from 'matter-js' import Matter, { Vector, Sleeping, World, Constraint, Composite, Runner, Common, Body, Bodies, Events } from 'matter-js'
import $jit from '../patched/JIT' import $jit from '../patched/JIT'
import Create from './Create'
import DataModel from './DataModel' import DataModel from './DataModel'
import JIT from './JIT'
import Visualize from './Visualize' import Visualize from './Visualize'
const Engine = { const Engine = {
@ -12,32 +14,63 @@ const Engine = {
Engine.engine.world.gravity.scale = 0 Engine.engine.world.gravity.scale = 0
}, },
run: init => { run: init => {
if (init) DataModel.Mappings.each(Engine.addTopic) if (init) {
Visualize.mGraph.graph.eachNode(Engine.addNode)
DataModel.Synapses.each(s => Engine.addEdge(s.get('edge')))
}
Engine.runner = Matter.Runner.run(Engine.engine) Engine.runner = Matter.Runner.run(Engine.engine)
}, },
endActiveMap: () => { endActiveMap: () => {
Runner.stop(Engine.runner) Runner.stop(Engine.runner)
Matter.Engine.clear(Engine.engine) Matter.Engine.clear(Engine.engine)
}, },
setTopicPos: (id, x, y) => { setNodePos: (id, x, y) => {
const body = Composite.get(Engine.engine.world, id, 'body') const body = Composite.get(Engine.engine.world, id, 'body')
Body.setPosition(body, { x, y }) Body.setPosition(body, { x, y })
Body.setVelocity(body, Vector.create(0, 0))
Body.setAngularVelocity(body, 0)
Body.setAngle(body, 0)
}, },
addTopic: mapping => { setNodeSleeping: (id, isSleeping) => {
let body = Bodies.circle(mapping.get('xloc'), mapping.get('yloc'), 25) const body = Composite.get(Engine.engine.world, id, 'body')
body.topic_id = mapping.get('mappable_id') Sleeping.set(body, isSleeping)
DataModel.Topics.get(body.topic_id).get('node').setData('body_id', body.id) if (!isSleeping) {
Body.setVelocity(body, Vector.create(0, 0))
Body.setAngularVelocity(body, 0)
Body.setAngle(body, 0)
}
},
addNode: node => {
let body = Bodies.circle(node.pos.x, node.pos.y, 100)
body.node_id = node.id
node.setData('body_id', body.id)
World.addBody(Engine.engine.world, body) World.addBody(Engine.engine.world, body)
}, },
removeTopic: mapping => { removeNode: node => {
},
addEdge: edge => {
const bodyA = Composite.get(Engine.engine.world, edge.nodeFrom.getData('body_id'), 'body')
const bodyB = Composite.get(Engine.engine.world, edge.nodeTo.getData('body_id'), 'body')
let constraint = Constraint.create({
bodyA,
bodyB,
length: JIT.ForceDirected.graphSettings.levelDistance,
stiffness: 0.2
})
edge.setData('constraint_id', constraint.id)
World.addConstraint(Engine.engine.world, constraint)
},
removeEdge: synapse => {
}, },
callUpdate: () => { callUpdate: () => {
Engine.engine.world.bodies.forEach(b => { Engine.engine.world.bodies.forEach(b => {
const node = DataModel.Topics.get(b.topic_id).get('node') const node = Visualize.mGraph.graph.getNode(b.node_id)
const newPos = new $jit.Complex(b.position.x, b.position.y) const newPos = new $jit.Complex(b.position.x, b.position.y)
node.setPos(newPos, 'current') node && node.setPos(newPos, 'current')
}) })
Create.newSynapse.updateForm()
Visualize.mGraph.plot() Visualize.mGraph.plot()
} }
} }

View file

@ -393,7 +393,6 @@ const JIT = {
Visualize.mGraph.busy = false Visualize.mGraph.busy = false
Mouse.boxEndCoordinates = eventInfo.getPos() Mouse.boxEndCoordinates = eventInfo.getPos()
JIT.selectWithBox(e) JIT.selectWithBox(e)
return return
} }
} }
@ -853,22 +852,6 @@ const JIT = {
Create.newTopic.hide() Create.newTopic.hide()
Create.newSynapse.hide() Create.newSynapse.hide()
// set the draw synapse start positions
var l = Selected.Nodes.length
if (l > 0) {
for (let i = l - 1; i >= 0; i -= 1) {
const n = Selected.Nodes[i]
Mouse.synapseStartCoordinates.push({
x: n.pos.getc().x,
y: n.pos.getc().y
})
}
} else {
Mouse.synapseStartCoordinates = [{
x: JIT.tempNode.pos.getc().x,
y: JIT.tempNode.pos.getc().y
}]
}
Mouse.synapseEndCoordinates = { Mouse.synapseEndCoordinates = {
x: pos.x, x: pos.x,
y: pos.y y: pos.y
@ -954,6 +937,8 @@ const JIT = {
Create.newTopic.addSynapse = false Create.newTopic.addSynapse = false
Create.newSynapse.topic1id = JIT.tempNode.getData('topic').id Create.newSynapse.topic1id = JIT.tempNode.getData('topic').id
Create.newSynapse.topic2id = JIT.tempNode2.getData('topic').id Create.newSynapse.topic2id = JIT.tempNode2.getData('topic').id
Create.newSynapse.node1 = JIT.tempNode
Create.newSynapse.node2 = JIT.tempNode2
JIT.tempNode2.setData('dim', 25, 'current') JIT.tempNode2.setData('dim', 25, 'current')
Visualize.mGraph.plot() Visualize.mGraph.plot()
midpoint.x = JIT.tempNode.pos.getc().x + (JIT.tempNode2.pos.getc().x - JIT.tempNode.pos.getc().x) / 2 midpoint.x = JIT.tempNode.pos.getc().x + (JIT.tempNode2.pos.getc().x - JIT.tempNode.pos.getc().x) / 2
@ -961,6 +946,7 @@ const JIT = {
pixelPos = Util.coordsToPixels(Visualize.mGraph, midpoint) pixelPos = Util.coordsToPixels(Visualize.mGraph, midpoint)
$('#new_synapse').css('left', pixelPos.x + 'px') $('#new_synapse').css('left', pixelPos.x + 'px')
$('#new_synapse').css('top', pixelPos.y + 'px') $('#new_synapse').css('top', pixelPos.y + 'px')
Create.newSynapse.alreadyAdded = false
Create.newSynapse.open() Create.newSynapse.open()
JIT.tempNode = null JIT.tempNode = null
JIT.tempNode2 = null JIT.tempNode2 = null
@ -1068,7 +1054,7 @@ const JIT = {
n.pos.setp(theta, rho) n.pos.setp(theta, rho)
} else { } else {
n.pos.setc(x, y) n.pos.setc(x, y)
Engine.setTopicPos(n.getData('body_id'), x, y) Engine.setNodePos(n.getData('body_id'), x, y)
} }
if (Active.Map) { if (Active.Map) {
@ -1274,26 +1260,6 @@ const JIT = {
Mouse.boxEndCoordinates = false Mouse.boxEndCoordinates = false
Visualize.mGraph.plot() Visualize.mGraph.plot()
}, // selectWithBox }, // selectWithBox
drawSelectBox: function(eventInfo, e) {
const ctx = Visualize.mGraph.canvas.getCtx()
const startX = Mouse.boxStartCoordinates.x
const startY = Mouse.boxStartCoordinates.y
const currX = eventInfo.getPos().x
const currY = eventInfo.getPos().y
Visualize.mGraph.canvas.clear()
Visualize.mGraph.plot()
ctx.beginPath()
ctx.moveTo(startX, startY)
ctx.lineTo(startX, currY)
ctx.lineTo(currX, currY)
ctx.lineTo(currX, startY)
ctx.lineTo(startX, startY)
ctx.strokeStyle = 'black'
ctx.stroke()
}, // drawSelectBox
selectNodeOnClickHandler: function(node, e) { selectNodeOnClickHandler: function(node, e) {
if (Visualize.mGraph.busy) return if (Visualize.mGraph.busy) return

View file

@ -4,6 +4,7 @@ import Active from './Active'
import Control from './Control' import Control from './Control'
import Create from './Create' import Create from './Create'
import DataModel from './DataModel' import DataModel from './DataModel'
import Engine from './Engine'
import JIT from './JIT' import JIT from './JIT'
import Map from './Map' import Map from './Map'
import Selected from './Selected' import Selected from './Selected'
@ -28,13 +29,18 @@ const Synapse = {
} else callback(DataModel.Synapses.get(id)) } else callback(DataModel.Synapses.get(id))
}, },
renderSynapse: function(mapping, synapse, node1, node2, createNewInDB) { renderSynapse: function(mapping, synapse, node1, node2, createNewInDB, alreadyAdded) {
var edgeOnViz var edgeOnViz
var newedge
var newedge = synapse.createEdge(mapping) if (!alreadyAdded) {
newedge = synapse.createEdge(mapping)
Visualize.mGraph.graph.addAdjacence(node1, node2, newedge.data) Visualize.mGraph.graph.addAdjacence(node1, node2, newedge.data)
}
edgeOnViz = Visualize.mGraph.graph.getAdjacence(node1.id, node2.id) edgeOnViz = Visualize.mGraph.graph.getAdjacence(node1.id, node2.id)
if (!alreadyAdded) {
Engine.addEdge(edgeOnViz)
}
synapse.set('edge', edgeOnViz) synapse.set('edge', edgeOnViz)
synapse.updateEdge() // links the synapse and the mapping to the edge synapse.updateEdge() // links the synapse and the mapping to the edge
@ -109,7 +115,7 @@ const Synapse = {
DataModel.Mappings.add(mapping) DataModel.Mappings.add(mapping)
// this function also includes the creation of the synapse in the database // this function also includes the creation of the synapse in the database
self.renderSynapse(mapping, synapse, node1, node2, true) self.renderSynapse(mapping, synapse, node1, node2, true, Create.newSynapse.alreadyAdded)
} // for each in synapsesToCreate } // for each in synapsesToCreate
Create.newSynapse.hide() Create.newSynapse.hide()

View file

@ -11,9 +11,11 @@ import Filter from './Filter'
import GlobalUI from './GlobalUI' import GlobalUI from './GlobalUI'
import JIT from './JIT' import JIT from './JIT'
import Map from './Map' import Map from './Map'
import Mouse from './Mouse'
import Router from './Router' import Router from './Router'
import Selected from './Selected' import Selected from './Selected'
import Settings from './Settings' import Settings from './Settings'
import Synapse from './Synapse'
import SynapseCard from './SynapseCard' import SynapseCard from './SynapseCard'
import TopicCard from './TopicCard' import TopicCard from './TopicCard'
import Util from './Util' import Util from './Util'
@ -170,15 +172,26 @@ const Topic = {
// TODO: move createNewInDB and permitCreateSynapseAfter into opts // TODO: move createNewInDB and permitCreateSynapseAfter into opts
renderTopic: function(mapping, topic, createNewInDB, permitCreateSynapseAfter, opts = {}) { renderTopic: function(mapping, topic, createNewInDB, permitCreateSynapseAfter, opts = {}) {
var nodeOnViz, tempPos var nodeOnViz, tempPos
var newnode = topic.createNode() var newnode = topic.createNode()
var midpoint = {} var midpoint = {}
var pixelPos var pixelPos
if (!$.isEmptyObject(Visualize.mGraph.graph.nodes)) { if (!$.isEmptyObject(Visualize.mGraph.graph.nodes)) {
Visualize.mGraph.graph.addNode(newnode) if (Create.newTopic.addSynapse && permitCreateSynapseAfter) {
Create.newSynapse.topic1id = JIT.tempNode.getData('topic').id
Create.newSynapse.node1 = JIT.tempNode
// this will also add a new node if the node doesn't exist
Visualize.mGraph.graph.addAdjacence(JIT.tempNode, newnode)
Create.newSynapse.alreadyAdded = true
Mouse.synapseEndCoordinates = null
}
else Visualize.mGraph.graph.addNode(newnode)
nodeOnViz = Visualize.mGraph.graph.getNode(newnode.id) nodeOnViz = Visualize.mGraph.graph.getNode(newnode.id)
if (Create.newTopic.addSynapse && permitCreateSynapseAfter) Create.newSynapse.node2 = nodeOnViz
Engine.addNode(nodeOnViz)
if (Create.newTopic.addSynapse && permitCreateSynapseAfter) {
Engine.addEdge(Visualize.mGraph.graph.getAdjacence(JIT.tempNode.id, nodeOnViz.id))
}
topic.set('node', nodeOnViz, {silent: true}) topic.set('node', nodeOnViz, {silent: true})
topic.updateNode() // links the topic and the mapping to the node topic.updateNode() // links the topic and the mapping to the node
@ -196,16 +209,8 @@ const Topic = {
nodeOnViz.setPos(new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')), 'end') nodeOnViz.setPos(new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')), 'end')
} }
if (Create.newTopic.addSynapse && permitCreateSynapseAfter) { if (Create.newTopic.addSynapse && permitCreateSynapseAfter) {
Create.newSynapse.topic1id = JIT.tempNode.getData('topic').id
// position the form
midpoint.x = JIT.tempNode.pos.getc().x + (nodeOnViz.pos.getc().x - JIT.tempNode.pos.getc().x) / 2
midpoint.y = JIT.tempNode.pos.getc().y + (nodeOnViz.pos.getc().y - JIT.tempNode.pos.getc().y) / 2
pixelPos = Util.coordsToPixels(Visualize.mGraph, midpoint)
$('#new_synapse').css('left', pixelPos.x + 'px')
$('#new_synapse').css('top', pixelPos.y + 'px')
// show the form // show the form
Create.newSynapse.open() //Create.newSynapse.open()
Visualize.mGraph.fx.animate({ Visualize.mGraph.fx.animate({
modes: ['node-property:dim'], modes: ['node-property:dim'],
duration: 500, duration: 500,
@ -227,6 +232,7 @@ const Topic = {
Engine.run() Engine.run()
Visualize.mGraph.loadJSON(newnode) Visualize.mGraph.loadJSON(newnode)
nodeOnViz = Visualize.mGraph.graph.getNode(newnode.id) nodeOnViz = Visualize.mGraph.graph.getNode(newnode.id)
Engine.addNode(nodeOnViz)
topic.set('node', nodeOnViz, {silent: true}) topic.set('node', nodeOnViz, {silent: true})
topic.updateNode() // links the topic and the mapping to the node topic.updateNode() // links the topic and the mapping to the node
@ -251,7 +257,6 @@ const Topic = {
} }
var topicSuccessCallback = function(topicModel, response) { var topicSuccessCallback = function(topicModel, response) {
if (Active.Map) { if (Active.Map) {
Engine.addTopic(mapping)
mapping.save({ mappable_id: topicModel.id }, { mapping.save({ mappable_id: topicModel.id }, {
success: function(model, response) { success: function(model, response) {
mappingSuccessCallback(model, response, topicModel) mappingSuccessCallback(model, response, topicModel)
@ -264,6 +269,7 @@ const Topic = {
if (Create.newTopic.addSynapse) { if (Create.newTopic.addSynapse) {
Create.newSynapse.topic2id = topicModel.id Create.newSynapse.topic2id = topicModel.id
Synapse.createSynapseLocally()
} }
} }

View file

@ -2560,7 +2560,10 @@ Extras.Classes.Navigation = new Class({
} }
if (Metamaps.Mouse.boxStartCoordinates && ((e.button == 0 && e.shiftKey) || (e.button == 0 && e.ctrlKey) || rightClick)) { if (Metamaps.Mouse.boxStartCoordinates && ((e.button == 0 && e.shiftKey) || (e.button == 0 && e.ctrlKey) || rightClick)) {
Metamaps.Visualize.mGraph.busy = true; Metamaps.Visualize.mGraph.busy = true;
Metamaps.JIT.drawSelectBox(eventInfo,e); Metamaps.Mouse.boxEndCoordinates = {
x: eventInfo.getPos().x,
y: eventInfo.getPos().y
}
//console.log('mouse move'); //console.log('mouse move');
return; return;
} }
@ -2607,8 +2610,6 @@ Extras.Classes.Navigation = new Class({
// START METAMAPS CODE // START METAMAPS CODE
if (Metamaps.Mouse.didPan) Metamaps.JIT.SmoothPanning(); if (Metamaps.Mouse.didPan) Metamaps.JIT.SmoothPanning();
// END METAMAPS CODE // END METAMAPS CODE
}, },
@ -2651,7 +2652,10 @@ Extras.Classes.Navigation = new Class({
} }
if (Metamaps.Mouse.boxStartCoordinates && ((e.button == 0 && e.shiftKey) || (e.button == 0 && e.ctrlKey) || rightClick)) { if (Metamaps.Mouse.boxStartCoordinates && ((e.button == 0 && e.shiftKey) || (e.button == 0 && e.ctrlKey) || rightClick)) {
Metamaps.Visualize.mGraph.busy = true; Metamaps.Visualize.mGraph.busy = true;
Metamaps.JIT.drawSelectBox(eventInfo,e); Metamaps.Mouse.boxEndCoordinates = {
x: eventInfo.getPos().x,
y: eventInfo.getPos().y
}
return; return;
} }
if (rightClick){ if (rightClick){
@ -7225,7 +7229,7 @@ Graph.Plot = {
var T = !!root.visited; var T = !!root.visited;
//START METAMAPS CODE //START METAMAPS CODE
if (Metamaps.Mouse.synapseStartCoordinates.length > 0) { if (Metamaps.Mouse.synapseStartCoordinates.length > 0 && Metamaps.Mouse.synapseEndCoordinates) {
ctx.save(); ctx.save();
var start; var start;
var end = Metamaps.Mouse.synapseEndCoordinates; var end = Metamaps.Mouse.synapseEndCoordinates;
@ -7238,6 +7242,19 @@ Graph.Plot = {
} }
ctx.restore(); ctx.restore();
} }
if (Metamaps.Mouse.boxStartCoordinates && Metamaps.Mouse.boxEndCoordinates) {
ctx.save();
ctx.beginPath()
ctx.moveTo(Metamaps.Mouse.boxStartCoordinates.x, Metamaps.Mouse.boxStartCoordinates.y)
ctx.lineTo(Metamaps.Mouse.boxStartCoordinates.x, Metamaps.Mouse.boxEndCoordinates.y)
ctx.lineTo(Metamaps.Mouse.boxEndCoordinates.x, Metamaps.Mouse.boxEndCoordinates.y)
ctx.lineTo(Metamaps.Mouse.boxEndCoordinates.x, Metamaps.Mouse.boxStartCoordinates.y)
ctx.lineTo(Metamaps.Mouse.boxStartCoordinates.x, Metamaps.Mouse.boxStartCoordinates.y)
ctx.strokeStyle = 'black'
ctx.stroke()
ctx.restore()
}
//END METAMAPS CODE //END METAMAPS CODE
aGraph.eachNode(function(node) { aGraph.eachNode(function(node) {