mirror of
https://github.com/tengge1/ShadowEditor.git
synced 2026-01-25 15:08:11 +00:00
468 lines
12 KiB
JavaScript
468 lines
12 KiB
JavaScript
import Component from './Component';
|
|
|
|
/**
|
|
* 侧边栏
|
|
* @param {*} options
|
|
*/
|
|
function Sidebar(options) {
|
|
Component.call(this, options);
|
|
|
|
this.margin = 2;
|
|
this.padding = 4;
|
|
}
|
|
|
|
Sidebar.prototype = Object.create(Component.prototype);
|
|
Sidebar.prototype.constructor = Sidebar;
|
|
|
|
Sidebar.prototype.render = function () {
|
|
var svg = d3.select(this.parent);
|
|
var defs = svg.select('defs');
|
|
|
|
var group = svg.append('g');
|
|
|
|
// 背景参考图
|
|
group.append('image')
|
|
.attr('x', 0)
|
|
.attr('y', 0)
|
|
.attr('width', 1920)
|
|
.attr('height', 969)
|
|
.attr('href', 'assets/panel1.png')
|
|
.attr('opacity', '0.5');
|
|
|
|
// 背景
|
|
// group.append('rect')
|
|
// .attr('x', 0)
|
|
// .attr('y', 0)
|
|
// .attr('width', 270)
|
|
// .attr('height', 969)
|
|
// .attr('fill', 'rgba(0,0,0,0.5)');
|
|
|
|
// 时间
|
|
group.append('text')
|
|
.text('14:21')
|
|
.attr('x', 25)
|
|
.attr('y', 38)
|
|
.attr('font-size', 22)
|
|
.attr('text-anchor', 'start') // start, middle, end; see: https://segmentfault.com/a/1190000009293590?utm_source=tag-newest
|
|
.attr('fill', '#fff');
|
|
|
|
// 时间、日期分割竖线
|
|
group.append('line')
|
|
.attr('x1', 87)
|
|
.attr('y1', 21)
|
|
.attr('x2', 87)
|
|
.attr('y2', 42)
|
|
.attr('stroke', '#4d88a7')
|
|
.attr('stroke-width', 2);
|
|
|
|
// 星期
|
|
group.append('text')
|
|
.text('星期日')
|
|
.attr('x', 95)
|
|
.attr('y', 28)
|
|
.attr('font-size', 14)
|
|
.attr('fill', '#fff');
|
|
|
|
// 日期
|
|
group.append('text')
|
|
.text('2019-04-21')
|
|
.attr('x', 95)
|
|
.attr('y', 45)
|
|
.attr('font-size', 14)
|
|
.attr('fill', '#fff');
|
|
|
|
// 边框
|
|
group.append('path')
|
|
.attr('d', 'm180,11 l0,35 l-10,10 L9,56 l0,183 l40,30 l0,193 M32,472 l0,18 l-23,20 l0,310')
|
|
.attr('stroke', '#3a6a84')
|
|
.attr('stroke-width', 2)
|
|
.attr('fill', 'none');
|
|
|
|
// 选项卡
|
|
var tabDef = defs.append('path')
|
|
.attr('id', 'tabDef')
|
|
.attr('d', 'M0,0 L32,22 L32,60 L0,38 Z')
|
|
.attr('fill', '#6c6f6e');
|
|
|
|
var tabSelectDef = defs.append('path')
|
|
.attr('id', 'tabSelectDef')
|
|
.attr('d', 'M0,0 L32,22 L32,60 L0,38 Z')
|
|
.attr('fill', '#356899');
|
|
|
|
var tab1 = group.append('g')
|
|
.attr('transform', 'translate(14,58)');
|
|
|
|
tab1.append('use')
|
|
.attr('href', '#tabSelectDef');
|
|
|
|
tab1.append('image')
|
|
.attr('x', 5)
|
|
.attr('y', 20)
|
|
.attr('width', 24)
|
|
.attr('height', 24)
|
|
.attr('href', 'assets/svg/home.svg');
|
|
|
|
var tab2 = group.append('g')
|
|
.attr('transform', 'translate(14,104)');
|
|
|
|
tab2.append('use')
|
|
.attr('href', '#tabDef');
|
|
|
|
tab2.append('image')
|
|
.attr('x', 5)
|
|
.attr('y', 20)
|
|
.attr('width', 24)
|
|
.attr('height', 24)
|
|
.attr('href', 'assets/svg/plane.svg');
|
|
|
|
var tab3 = group.append('g')
|
|
.attr('transform', 'translate(14,150)');
|
|
|
|
tab3.append('use')
|
|
.attr('href', '#tabDef');
|
|
|
|
tab3.append('image')
|
|
.attr('x', 5)
|
|
.attr('y', 20)
|
|
.attr('width', 24)
|
|
.attr('height', 24)
|
|
.attr('href', 'assets/svg/water.svg');
|
|
|
|
var tab4 = group.append('g')
|
|
.attr('transform', 'translate(14,196)');
|
|
|
|
tab4.append('use')
|
|
.attr('href', '#tabDef');
|
|
|
|
tab4.append('image')
|
|
.attr('x', 5)
|
|
.attr('y', 20)
|
|
.attr('width', 24)
|
|
.attr('height', 24)
|
|
.attr('href', 'assets/svg/guard.svg');
|
|
|
|
var header = group.append('g')
|
|
.attr('transform', 'translate(15,276)');
|
|
|
|
header.append('path')
|
|
.attr('d', 'M0,0 L12,0 L25,10 L25,185 L12,195 L0,195 Z')
|
|
.attr('fill', '#185185');
|
|
|
|
header.append('text')
|
|
.text('首都机场')
|
|
.attr('x', 12)
|
|
.attr('y', 85)
|
|
.attr('text-anchor', 'middle')
|
|
.attr('writing-mode', 'tb')
|
|
.attr('textlength', '90px')
|
|
.attr('lengthAdjust', 'spacing') // spacing, spacingAndGlyphs; see: https://blog.csdn.net/huanhuanq1209/article/details/71438629
|
|
.attr('fill', '#fff');
|
|
|
|
// 圆圈
|
|
var circle = group.append('g')
|
|
.attr('transform', 'translate(125,140)');
|
|
|
|
circle.append('circle')
|
|
.attr('cx', 0)
|
|
.attr('cy', 0)
|
|
.attr('r', 68)
|
|
.attr('fill', 'rgba(0,0,0,0.5)');
|
|
|
|
circle.append('circle')
|
|
.attr('cx', 0)
|
|
.attr('cy', 0)
|
|
.attr('r', 48)
|
|
.attr('stroke', '#517496')
|
|
.attr('stroke-width', 2)
|
|
.attr('fill', 'none');
|
|
|
|
circle.append('text')
|
|
.text('Time')
|
|
.attr('x', 0)
|
|
.attr('y', 0)
|
|
.attr('dy', 10)
|
|
.attr('font-size', 20)
|
|
.attr('text-anchor', 'middle')
|
|
.attr('fill', '#fff');
|
|
|
|
// 横线
|
|
group.append('path')
|
|
.attr('d', 'M90,222 L160,222')
|
|
.attr('stroke', '#3e7390')
|
|
.attr('stroke-width', 2);
|
|
|
|
// 小面板
|
|
defs.append('path')
|
|
.attr('id', 'smallPanel')
|
|
.attr('d', 'M0,0 L135,0 L142,8 L142,24 L12,24 L0,17 Z')
|
|
.attr('fill', 'rgba(0,0,0,0.5)');
|
|
|
|
var smallPanel1 = group.append('g')
|
|
.attr('transform', 'translate(60,240)');
|
|
|
|
smallPanel1.append('use')
|
|
.attr('href', '#smallPanel');
|
|
smallPanel1.append('text')
|
|
.text('正常停泊')
|
|
.attr('x', 18)
|
|
.attr('y', 17)
|
|
.attr('fill', '#fff')
|
|
.attr('font-size', 14);
|
|
smallPanel1.append('text')
|
|
.text('22')
|
|
.attr('x', 90)
|
|
.attr('y', 17)
|
|
.attr('fill', '#fff')
|
|
.attr('font-size', 14);
|
|
|
|
var smallPanel2 = group.append('g')
|
|
.attr('transform', 'translate(60,268)');
|
|
|
|
smallPanel2.append('use')
|
|
.attr('href', '#smallPanel');
|
|
smallPanel2.append('text')
|
|
.text('晚点起飞')
|
|
.attr('x', 18)
|
|
.attr('y', 17)
|
|
.attr('fill', '#fff')
|
|
.attr('font-size', 14);
|
|
smallPanel2.append('text')
|
|
.text('02')
|
|
.attr('x', 90)
|
|
.attr('y', 17)
|
|
.attr('fill', '#e4a74a')
|
|
.attr('font-size', 14);
|
|
|
|
var smallPanel3 = group.append('g')
|
|
.attr('transform', 'translate(60,301)');
|
|
|
|
smallPanel3.append('use')
|
|
.attr('href', '#smallPanel');
|
|
smallPanel3.append('text')
|
|
.text('计划停泊')
|
|
.attr('x', 18)
|
|
.attr('y', 17)
|
|
.attr('fill', '#fff')
|
|
.attr('font-size', 14);
|
|
smallPanel3.append('text')
|
|
.text('46')
|
|
.attr('x', 90)
|
|
.attr('y', 17)
|
|
.attr('fill', '#fff')
|
|
.attr('font-size', 14);
|
|
|
|
var smallPanel4 = group.append('g')
|
|
.attr('transform', 'translate(60,333)');
|
|
|
|
smallPanel4.append('use')
|
|
.attr('href', '#smallPanel');
|
|
smallPanel4.append('text')
|
|
.text('晚点到达')
|
|
.attr('x', 18)
|
|
.attr('y', 17)
|
|
.attr('fill', '#fff')
|
|
.attr('font-size', 14);
|
|
smallPanel4.append('text')
|
|
.text('02')
|
|
.attr('x', 90)
|
|
.attr('y', 17)
|
|
.attr('fill', '#d60c0c')
|
|
.attr('font-size', 14);
|
|
|
|
// 中等面板
|
|
var mediumPanelDef = defs.append('path')
|
|
.attr('id', 'mediumPanelDef')
|
|
.attr('d', 'M5,0 L160,0 L166,6 L166,33 L158,38 L158,91 L166,96 L166,125 L158,130 L5,130 L0,125 L0,96 L5,91 L5,36 L0,33 L0,6 Z')
|
|
.attr('fill', 'rgba(0,0,0,0.5)');
|
|
|
|
var mediumPanel = group.append('g')
|
|
.attr('transform', 'translate(54,363)');
|
|
|
|
mediumPanel.append('use')
|
|
.attr('href', '#mediumPanelDef');
|
|
|
|
mediumPanel.append('text')
|
|
.text('长途停车场')
|
|
.attr('x', 17)
|
|
.attr('y', 26)
|
|
.attr('fill', '#fff')
|
|
.attr('font-size', 14);
|
|
|
|
mediumPanel.append('text')
|
|
.text('56/90')
|
|
.attr('x', 140)
|
|
.attr('y', 26)
|
|
.attr('fill', '#fff')
|
|
.attr('font-size', 14)
|
|
.attr('text-anchor', 'end');
|
|
|
|
mediumPanel.append('line')
|
|
.attr('x1', 15)
|
|
.attr('y1', 36)
|
|
.attr('x2', 150)
|
|
.attr('y2', 36)
|
|
.attr('stroke', 'rgba(0,0,0,0.7)')
|
|
.attr('stroke-width', 2);
|
|
|
|
mediumPanel.append('text')
|
|
.text('公交停车场')
|
|
.attr('x', 17)
|
|
.attr('y', 58)
|
|
.attr('fill', '#fff')
|
|
.attr('font-size', 14);
|
|
|
|
mediumPanel.append('text')
|
|
.text('34/126')
|
|
.attr('x', 140)
|
|
.attr('y', 58)
|
|
.attr('fill', '#fff')
|
|
.attr('font-size', 14)
|
|
.attr('text-anchor', 'end');
|
|
|
|
mediumPanel.append('line')
|
|
.attr('x1', 15)
|
|
.attr('y1', 67)
|
|
.attr('x2', 150)
|
|
.attr('y2', 67)
|
|
.attr('stroke', 'rgba(0,0,0,0.7)')
|
|
.attr('stroke-width', 2);
|
|
|
|
mediumPanel.append('text')
|
|
.text('地上停车场')
|
|
.attr('x', 17)
|
|
.attr('y', 90)
|
|
.attr('fill', '#fff')
|
|
.attr('font-size', 14);
|
|
|
|
mediumPanel.append('text')
|
|
.text('256/560')
|
|
.attr('x', 140)
|
|
.attr('y', 90)
|
|
.attr('fill', '#fff')
|
|
.attr('font-size', 14)
|
|
.attr('text-anchor', 'end');
|
|
|
|
mediumPanel.append('line')
|
|
.attr('x1', 15)
|
|
.attr('y1', 100)
|
|
.attr('x2', 150)
|
|
.attr('y2', 100)
|
|
.attr('stroke', 'rgba(0,0,0,0.7)')
|
|
.attr('stroke-width', 2);
|
|
|
|
mediumPanel.append('text')
|
|
.text('地下停车场')
|
|
.attr('x', 17)
|
|
.attr('y', 122)
|
|
.attr('fill', '#fff')
|
|
.attr('font-size', 14);
|
|
|
|
mediumPanel.append('text')
|
|
.text('389/560')
|
|
.attr('x', 140)
|
|
.attr('y', 122)
|
|
.attr('fill', '#fff')
|
|
.attr('font-size', 14)
|
|
.attr('text-anchor', 'end');
|
|
|
|
// 仪表盘
|
|
var gaugeDef = defs.append('g')
|
|
.attr('id', 'gaugeDef');
|
|
|
|
gaugeDef.append('circle')
|
|
.attr('cx', 0)
|
|
.attr('cy', 0)
|
|
.attr('r', 37)
|
|
.attr('fill', 'rgba(0,0,0,0.5)');
|
|
|
|
gaugeDef.append('circle')
|
|
.attr('cx', 0)
|
|
.attr('cy', 0)
|
|
.attr('r', 32)
|
|
.attr('stroke', '#6da2ee')
|
|
.attr('stroke-width', 2)
|
|
.attr('fill', 'none');
|
|
|
|
var gauge1 = group.append('g')
|
|
.attr('transform', 'translate(50,550)');
|
|
|
|
gauge1.append('use')
|
|
.attr('href', '#gaugeDef');
|
|
|
|
gauge1.append('text')
|
|
.text('66%')
|
|
.attr('y', -10)
|
|
.attr('font-size', 22)
|
|
.attr('text-anchor', 'middle')
|
|
.attr('fill', '#4bc8f5');
|
|
|
|
gauge1.append('text')
|
|
.text('设备')
|
|
.attr('y', 10)
|
|
.attr('font-size', 14)
|
|
.attr('text-anchor', 'middle')
|
|
.attr('fill', '#fff');
|
|
|
|
gauge1.append('text')
|
|
.text('在线率')
|
|
.attr('y', 26)
|
|
.attr('font-size', 14)
|
|
.attr('text-anchor', 'middle')
|
|
.attr('fill', '#fff');
|
|
|
|
var gauge2 = group.append('g')
|
|
.attr('transform', 'translate(131,550)');
|
|
|
|
gauge2.append('use')
|
|
.attr('href', '#gaugeDef');
|
|
|
|
gauge2.append('text')
|
|
.text('67')
|
|
.attr('y', -10)
|
|
.attr('font-size', 22)
|
|
.attr('text-anchor', 'middle')
|
|
.attr('fill', '#4bc8f5');
|
|
|
|
gauge2.append('text')
|
|
.text('修复')
|
|
.attr('y', 10)
|
|
.attr('font-size', 14)
|
|
.attr('text-anchor', 'middle')
|
|
.attr('fill', '#fff');
|
|
|
|
gauge2.append('text')
|
|
.text('故障数')
|
|
.attr('y', 26)
|
|
.attr('font-size', 14)
|
|
.attr('text-anchor', 'middle')
|
|
.attr('fill', '#fff');
|
|
|
|
var gauge3 = group.append('g')
|
|
.attr('transform', 'translate(220,550)');
|
|
|
|
gauge3.append('use')
|
|
.attr('href', '#gaugeDef');
|
|
|
|
gauge3.append('text')
|
|
.text('23')
|
|
.attr('y', -10)
|
|
.attr('font-size', 22)
|
|
.attr('text-anchor', 'middle')
|
|
.attr('fill', '#4bc8f5');
|
|
|
|
gauge3.append('text')
|
|
.text('剩余')
|
|
.attr('y', 10)
|
|
.attr('font-size', 14)
|
|
.attr('text-anchor', 'middle')
|
|
.attr('fill', '#fff');
|
|
|
|
gauge3.append('text')
|
|
.text('故障数')
|
|
.attr('y', 26)
|
|
.attr('font-size', 14)
|
|
.attr('text-anchor', 'middle')
|
|
.attr('fill', '#fff');
|
|
};
|
|
|
|
export default Sidebar; |