<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
|
|
<!-- 必须强制指定页面编码为 UTF-8 -->
|
|
<meta charset="utf-8">
|
|
|
|
<!-- Demo 的简要说明,必须要填写 -->
|
|
<meta name="description" content="百度脑图的原型 Demo">
|
|
|
|
<!-- Demo 的作者,建议填写 -->
|
|
<meta name="author" content="kity@baidu.com">
|
|
|
|
<!-- Demo 的标题,必须填写 -->
|
|
<title>Graffle</title>
|
|
|
|
<!-- Demo 开发过程中使用 CMD 引入 Kity 源码,方便调试 -->
|
|
<!-- dev start -->
|
|
<!-- 目录型的 Demo 注意修正源码引用路径 -->
|
|
<script src="../../dev-lib/sea.js"></script>
|
|
<script>
|
|
// 设置好 kity 源代码目录
|
|
seajs.config( { base: '../../src'} );
|
|
</script>
|
|
<!-- dev end -->
|
|
|
|
<!-- 生产使用中可以直接引用发布压缩的版本 -->
|
|
<!-- production start -->
|
|
<!-- 目录型的 Demo 注意修正源码引用路径 -->
|
|
<!-- <script src="../dist/kity.min.js"></script> -->
|
|
<!-- production end -->
|
|
<script>
|
|
|
|
define('demo', function (require) {
|
|
var Draggable = require('../demo/public/draggable');
|
|
var Paper = require('core/class').extendClass( require('graphic/paper'), Draggable.prototype );
|
|
var Rect = require('graphic/rect');
|
|
var BezierConnection = require('../demo/graffle/bezierconnection');
|
|
var PatternBrush = require('graphic/pattern');
|
|
var Group = require('graphic/group');
|
|
var Ellipse = require('graphic/ellipse');
|
|
var Color = require('graphic/color');
|
|
var Palette = require('graphic/palette');
|
|
var utils = require('core/utils');
|
|
|
|
var createClass = require('core/class').createClass;
|
|
|
|
var MindRect = createClass( {
|
|
base: Rect,
|
|
mixins: [Draggable],
|
|
getCenter: function() {
|
|
return {
|
|
x: this.getX(),
|
|
y: this.getY()
|
|
};
|
|
},
|
|
setCenterX: function(x) {
|
|
return this.setPositionX( x - this.getWidth() / 2 );
|
|
},
|
|
setCenterY: function(y) {
|
|
return this.setPositionY( y - this.getHeight() / 2 );
|
|
},
|
|
getCenterX: function() {
|
|
return this.getPositionX() + this.getWidth() / 2;
|
|
},
|
|
getCenterY: function() {
|
|
return this.getPositionY() + this.getHeight() / 2;
|
|
},
|
|
dragStart: function() {
|
|
this.dragStartPos = this.getPosition();
|
|
},
|
|
dragMove: function( e ) {
|
|
var pos = this.dragStartPos, delta = e.movement;
|
|
this.setPosition(pos.x + delta.x, pos.y + delta.y);
|
|
}
|
|
} );
|
|
|
|
var MindContainer = createClass({
|
|
base: Group,
|
|
constructor: function( x, y, width, height ) {
|
|
this.callBase();
|
|
this.x = x || 0;
|
|
this.y = y || 0;
|
|
this.width = width || 1000;
|
|
this.height = height || 1000;
|
|
this.palette = new Palette().pipe(function() {
|
|
var fill = Color.createHSL(0, 75, 60);
|
|
this.add('level0-fill', fill);
|
|
this.add('level0-stroke', fill.dec(Color.L, 30));
|
|
this.add('level1-fill', fill.set(Color.H, 200));
|
|
this.add('level1-stroke', fill.dec(Color.L, 30));
|
|
this.add('fill', Color.createHSL(200, 50, 90));
|
|
this.add('stroke', Color.createHSL(200, 0, 30));
|
|
this.add('connection', Color.createHSL(60, 75, 75));
|
|
});
|
|
this.gaps = 50;
|
|
this.mindTree = this.generateMindObject();
|
|
},
|
|
generateMindObject: function( prevLevelObject ) {
|
|
var levelObject, connection;
|
|
var level = prevLevelObject ? prevLevelObject.level + 1 : 0;
|
|
|
|
levelObject = this.generateLevelObject( level );
|
|
levelObject.drag();
|
|
levelObject.level = level;
|
|
levelObject.children = [];
|
|
|
|
this.addShape( levelObject );
|
|
|
|
if( prevLevelObject ) {
|
|
this.addChildTo( levelObject, prevLevelObject );
|
|
levelObject.parent = prevLevelObject;
|
|
connection = new BezierConnection(levelObject, prevLevelObject);
|
|
connection.stroke(this.palette.get('connection'));
|
|
this.addShape( connection );
|
|
}
|
|
var me = this;
|
|
levelObject.on('mousedown', function() {
|
|
me.select(levelObject);
|
|
});
|
|
return levelObject;
|
|
},
|
|
addChildTo: function( levelObject, prevLevelObject ) {
|
|
var yValues = [];
|
|
var delta = levelObject.getHeight() + this.gaps;
|
|
var me = this;
|
|
|
|
levelObject.setCenterX( prevLevelObject.getCenterX() + levelObject.getWidth() + 200 );
|
|
|
|
if(prevLevelObject.children.length == 0) {
|
|
levelObject.setCenterY( prevLevelObject.getCenterY() );
|
|
prevLevelObject.children.push(levelObject);
|
|
return;
|
|
}
|
|
|
|
utils.each(prevLevelObject.children, function(child) {
|
|
yValues.push(child.getCenterY());
|
|
});
|
|
|
|
var levelValue = Math.max.apply(Math, yValues) + delta;
|
|
levelObject.setCenterY( levelValue );
|
|
yValues.push(levelValue);
|
|
|
|
prevLevelObject.children.push(levelObject);
|
|
|
|
utils.each(prevLevelObject.children, function(child, index) {
|
|
me.updateTreePosition( child, delta / 2 );
|
|
});
|
|
},
|
|
updateTreePosition: function ( levelObject, dy ) {
|
|
levelObject.setCenterY(levelObject.getCenterY() - dy);
|
|
var me = this;
|
|
utils.each( levelObject.children, function (child) {
|
|
me.updateTreePosition( child, dy );
|
|
} );
|
|
},
|
|
generateLevelObject: function(level) {
|
|
switch(level) {
|
|
case 0:
|
|
return new MindRect(200, 200, 0, -100, 10)
|
|
.fill(this.palette.get('level0-fill'));
|
|
case 1:
|
|
return new MindRect(200, 100, 0, 0, 5)
|
|
.fill(this.palette.get('level1-fill'));
|
|
default:
|
|
return new MindRect(200, 80, 0, 0, 3)
|
|
.fill(this.palette.get('fill'));
|
|
}
|
|
},
|
|
select: function (levelObject) {
|
|
if(this.selected) {
|
|
this.selected.stroke('none');
|
|
}
|
|
this.selected = levelObject.stroke('yellow', 5);
|
|
},
|
|
nextObject: function () {
|
|
if(this.selected && this.selected.parent) {
|
|
var nextObject = this.generateMindObject(this.selected.parent);
|
|
this.select(nextObject);
|
|
return nextObject;
|
|
}
|
|
},
|
|
nextLevel: function () {
|
|
if(this.selected) {
|
|
var nextLevel = this.generateMindObject(this.selected);
|
|
this.select(nextLevel);
|
|
return nextLevel;
|
|
}
|
|
}
|
|
});
|
|
|
|
var paper = new Paper(document.body);
|
|
paper.setViewBox(-1000, -600, 2000, 1200);
|
|
paper.drag();
|
|
|
|
var mc = new MindContainer(-1000, -600, 2000, 1200);
|
|
paper.addShape(mc);
|
|
|
|
document.body.addEventListener('keydown', function(e) {
|
|
switch(e.keyCode) {
|
|
case 13:
|
|
e.preventDefault();
|
|
return mc.nextObject();
|
|
case 9:
|
|
e.preventDefault();
|
|
return mc.nextLevel();
|
|
}
|
|
});
|
|
document.body.addEventListener('mousewheel', function(e) {
|
|
var viewport = paper.getViewPort();
|
|
if(e.wheelDelta > 0) {
|
|
viewport.zoom = viewport.zoom * 0.95;
|
|
} else {
|
|
viewport.zoom = viewport.zoom / 0.95;
|
|
}
|
|
paper.setViewPort(viewport);
|
|
});
|
|
});
|
|
</script>
|
|
<style>
|
|
body, div, html {
|
|
margin: 0;
|
|
padding: 0;
|
|
overflow: hidden;
|
|
background: #333;
|
|
height: 100%;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body></body>
|
|
<script>
|
|
seajs.use('demo');
|
|
</script>
|
|
</html>
|