| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 | <!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>
 |