被忽视的TWaver功能(1)

简介:

应客户需求写个Demo,Demo中包括一些经常使用的功能。包括解析JSON数据生成TWaver中的网元和连线。网元右下角带上不同标识的小图标,连线须要是二次曲线。弹出菜单和信息板。跟大家分享下。先上图让大家看看效果(大家在学习的同一时候,是否能发现这次Demo有所不同)

解析JSON数据生成TWaver中的网元和连线
以下是Demo中用到的JSON数据格式例子

1 var topo_data = [
2     {"element""node""name""网关""id""gateway1""image""group","icon""icon_wall"},
3     {"element""node""name""网关""id""gateway2""image":"subnetwork""icon""icon_wall"},
4     {"element""link""from""cloud""to""center1""name":"包括关系"},
5     {"element""link""from""gather2""to""firewall""arrow""11"
6 ];

依据element推断创建何种对象,是网元还是连线;image设置网元图片的名称(这些图片都是事先须要注冊。假设使用TWaver内置的图片,则不须要。直接使用TWaver的图片注冊名称就可以。比如twaver.Defaults.IMAGE_GROUP),icon设置网元上的标识,arrow设置连线的箭头方向,以下上代码

1 function createElement(item){
2     var element;
3     if(item.element == 'link'){
4         var from = this.box.getDataById(item.from);
5         var to = this.box.getDataById(item.to);
6         var link = new MyLink(from, to);
7         if(item.arrow){
8             if(item.arrow=="10" || item.arrow=="11") link.setStyle('arrow.from'true);
9             if(item.arrow=="01" || item.arrow=="11") link.setStyle('arrow.to'true);
10         }              
11         this.box.add(link);
12         element=link;
13     }
14     if(item.element =='node'){
15         var node = new twaver.Node(item.id);
16         if(item.image){
17             node.setImage(item.image);
18             if(item.image=='group') node.setImage(twaver.Defaults.IMAGE_GROUP);
19             if(item.image=='subnetwork') node.setImage(twaver.Defaults.IMAGE_SUBNETWORK);
20         }              
21         if(item.icon){
22             node.setStyle('icons.names', [item.icon]);
23             node.setStyle('icons.position''bottomright.topleft');
24         }               
25         node.setStyle('shadow.blur',10);
26         node.setStyle('shadow.xoffset',5);
27         node.setStyle('shadow.yoffset',5);
28         this.box.add(node);
29         element=node;
30     }
31  
32     if(element){
33         element.setStyle('label.font''11px "Microsoft Yahei"');
34         element.setName(item.name);
35     }
36 }

网元右下角带上不同标识的小图标
在TWaver里这个很easy,使用网元自带的IconAttachment就能实现。在上面的代码中,处理icon部分实用到,icon的names能够是一个数组,同一时候放多个图标;还能够设置图标的X或Y轴上Y的偏移量,很多其它属性能够參考TWaver文档

1 node.setStyle('icons.names', [item.icon]);
2 node.setStyle('icons.position''bottomright.topleft');

来个大图赞赏赞赏

连线须要是二次曲线
这个须要重写LinkUI,仅仅须要重写getLinkPoints的方法就能够。默认此方法返回是的是from和to两个点。假设须要二次曲线,那就须要一共3个点。这里计算from和to的中心点,并做了一个偏移,方法最后返回的是一个list。第一个元素是from点,第二个元素是包括中间点和to点的list,假设须要连线是贝塞尔曲线第二个元素应是包括3个元素的list,TWaver内部做了个识别

1 getLinkPoints: function () {
2     MyLinkUI.superClass.getLinkPoints.call(this);
3  
4     var f = this.getFromPoint();
5     var t = this.getToPoint();
6  
7     var points = new twaver.List();
8     points.add(f);
9     points.add(t);
10  
11     this._lineLength = _twaver.math.calculateLineLength(points);
12     var offset = this._lineLength/10;
13     var m = {
14         x: (f.x+t.x)/2 + offset,
15         y: (f.y+t.y)/2 + offset,
16     }
17     var cps = new twaver.List();
18     cps.add(m);
19     cps.add(t);
20  
21     points.removeAt(1);
22     points.add(cps);
23     this._linkPoints = points;
24  
25     return this._linkPoints;
26 }

弹出菜单和信息板
弹出菜单使用TWaver的PopupMenu机制,轻松搞定,直接上代码

1 var popupMenu = new twaver.controls.PopupMenu(network);
2 popupMenu.setMenuItems([
3     { label: '加入设备'},
4     { label: '删除设备'},
5     { separator: true},
6     { label: '具体信息...'},
7 ]);
8 popupMenu.onMenuItemRendered = function (div, menuItem) {
9     div.childNodes[1].style['font-family']="'Microsoft Yahei', 'Open Sans',sans-serif";
10     div.childNodes[1].style['font-size']='12px';
11 };


信息板并不须要TWaver的机制,仅仅须要监听network的事件,控制DOM就能够实现。能够每次生成一个div显示,也缓存一个div,通过CSS控制它的display属性。依据详细需求所定。

这里缓存了一个div,依据点击的网元不同,改动div上的标题和图标

1 this.network.addInteractionListener(function(e){
2 if(e.kind == 'clickElement' && e.element && e.element.getClassName() =='twaver.Node' && e.element.getName()){
3     var titleImg = document.getElementById('titleImg');
4     var ei = twaver.Util.getImageAsset(e.element.getImage())._cache;
5     titleImg.src = ei.toDataURL();
6  
7     var titleTxt = document.getElementById('titleTxt');
8     var txt = '';
9     if(e.element.getName()){
10         txt = e.element.getName();
11     }
12     titleTxt.innerHTML = txt;
13     var s = dialog.style;
14     s.display = 'block';
15     s.left = e.event.x+'px';
16     s.top = e.event.y+'px';
17 else {
18     dialog.style.display = 'none';
19 }
20 });


开头括弧中问题,大家肯定已经明确。指的是网元的图标发生了。是不是比以往更加美丽了,感谢大家的支持。





本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5143132.html,如需转载请自行联系原作者
相关文章
|
Web App开发 编解码 监控
防御性设计和开发
“防御性编程(Defensive programming)是防御式设计的一种具体体现,它是为了保证,对程序的不可预见的使用,不会造成程序功能上的损坏。它可以被看作是为了减少或消除墨菲定律效力的想法。”
744 0
防御性设计和开发
|
2月前
|
安全 前端开发 PHP
采用PHP开发的医院安全(不良)事件系统源码 医院不良事件有哪些?又该怎样分类呢?也许这篇文章能给予你答案。
医疗安全不容忽视! 医疗不良事件有哪些?又该怎样分类呢?也许这篇文章能给予你答案。
35 1
采用PHP开发的医院安全(不良)事件系统源码 医院不良事件有哪些?又该怎样分类呢?也许这篇文章能给予你答案。
|
2月前
|
程序员 测试技术
程序员难以一次性写好代码并持续修复Bug,主要源于软件的高复杂性、需求不确定性、测试局限性和技术能力限制。
【5月更文挑战第11天】程序员难以一次性写好代码并持续修复Bug,主要源于软件的高复杂性、需求不确定性、测试局限性和技术能力限制。复杂的系统易产生意外问题,需求变化导致初始设计难完备,测试无法覆盖所有情况,而技术更新和个体能力差异也会引入错误。因此,持续调试和优化是保证软件质量的关键步骤。
28 0
|
12月前
如何彻底的理解需求,做出更好的软件
如何彻底的理解需求,做出更好的软件
49 0
|
Unix Java Linux
系统的混乱并业务本身之复杂,我们并不擅长处理『简单』
![](https://ata2-img.oss-cn-zhangjiakou.aliyuncs.com/neweditor/846d5052-1e21-4f9c-8f52-aaa37cacc407.png) # 前言 一群高智商青年在餐厅吃饭,餐桌上一个瓶盖标识为盐的瓶子里装得是胡椒粉,而标识为胡椒粉的瓶子里装得却是盐,他们想出了一个充满才气的方案来完成对调--仅需要一张餐巾纸、一根吸管和两个
48613 10
系统的混乱并业务本身之复杂,我们并不擅长处理『简单』
|
Unix Java Linux
系统的混乱并非业务本身之复杂,我们并不擅长处理『简单』
软件工程最大的成本在于维护,为了未来可扩展、为了未来更灵活,我们往往会增加很多很多奇奇怪怪可有可无的代码,增加这些代码可能只需要几分钟,但移除这些代码花费的精力与承担的风险,却数倍于此。我们不断 YY 着所谓的未来,却让现在越来越糟。系统的混乱并非业务本身之复杂,我们并不擅长处理『简单』。
1128 1
系统的混乱并非业务本身之复杂,我们并不擅长处理『简单』
|
安全
程序人生 - 从一个喷嚏的威力来了解,口罩的重要性与必要性
程序人生 - 从一个喷嚏的威力来了解,口罩的重要性与必要性
97 0
程序人生 - 从一个喷嚏的威力来了解,口罩的重要性与必要性
|
程序员 API 数据库
重构你的不良编程陋习
保持代码整洁和高效并不容易,作为一名开发者,可能会有那么几天,所从事的开发项目会让人感到沮丧。也可能会有几天只想复制和粘贴代码,写出曾经写过的最程序化、重复性最强的垃圾代码,然后下班回家。
75 0
|
缓存 负载均衡 算法
一对一源码开发,减少用户焦虑的三大优化要点
一对一源码开发,减少用户焦虑的三大优化要点