Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>SVG</title>
- <link href="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
- </head>
- <body>
- <div class="col-lg-12">
- <div class="nav" data-name="layers">
- Layers
- </div>
- <div class="nav" data-name="tools">
- Tools
- </div>
- <div class="nav" data-name="brush">
- Brush
- </div>
- <div class="layers" style="display: none;">
- <div>
- Test Layer
- </div>
- <div>
- Test Layer 2
- </div>
- <div class="add-layer">
- Add a layer
- </div>
- </div>
- <div class="tools" style="display: none;">
- <div>
- Draw Rectangle
- </div>
- <div>
- Fill Shape
- </div>
- </div>
- <div class="brush" style="display: none;">
- <div>
- Stroke Color
- </div>
- <div>
- Stroke Width
- </div>
- <div>
- Stroke Pattern
- </div>
- <div>
- Fill Color
- </div>
- </div>
- </div>
- <div class="col-lg-12">
- <div class="mixSize" id="svgCanvas">
- <svg id="svgCanvasVisible" class="svg-editor" width="4096" height="3072" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg">
- </svg>
- </div>
- <div>
- <div>
- <h3>current layer to edit : </h3>
- <select name="editLayerSelect" id="editLayerSelect">
- </select>
- </div>
- <div>
- <h3>add a layer : </h3>
- <input type="text" name="newLayerName" value="" id="newLayerName"/><label class="btn btn-success" id="addALayer">Create</label>
- </div>
- <div>
- <h3>display layers : </h3>
- <div id="displayCheckboxes">
- <label for="layerDisplay"><input class="layerDisplayCheckbox" type="checkbox" value="layer1" name="layerDisplay" checked/>Layer 1</label>
- <label for="layerDisplay"><input class="layerDisplayCheckbox" type="checkbox" value="layer2" name="layerDisplay" checked/>Layer 2</label>
- </div>
- </div>
- <div>
- <h3>draw : </h3>
- <label class="buttonCreate btn btn-success" id="drawLine">Draw Line</label>
- <label class="buttonCreate btn btn-warning" id="drawEllipse">Draw Ellipse</label>
- <label class="buttonCreate btn btn-info" id="drawRect">Draw Rectangle</label>
- <label class="buttonCreate btn btn-danger" id="addText">Add some text</label>
- <label>Color : </label><input type="color" name="colorPick"/>
- </div>
- <div>
- <h3>Drag & drop items : </h3>
- <img src="http://www.ebcdsignaletique.com/upload/la020_0.jpg" style="width:32px;height:32px;"/>
- <img src="http://www.brandsoftheworld.com/sites/default/files/styles/logo-thumbnail/public/0024/9368/brand.gif" style="width:32px;height:32px;"/>
- </div>
- </div>
- </div>
- <style>
- svg.svg-editor{
- border: 1px dashed black;
- margin: auto;
- margin-top: 50px;
- display: block;
- position: relative;
- top: 50%;
- }
- svg.rectangle{
- cursor: crosshair;
- }
- .tool>g>*{
- fill: #F5F5F5;
- stroke: rgb(255,181,181);
- }
- g *:hover{
- stroke: rgb(181,181,255);
- fill: rgb(255,255,181);
- }
- @import url(http://fonts.googleapis.com/css?family=Open+Sans:400italic,400,700);
- .nav{
- width: 80px;
- padding-top: 4px;
- padding-bottom: 4px;
- width: 80px;
- text-align: center;
- color: #F1F1F1;
- font-family: 'Open Sans', sans-serif;
- background-color: rgb(20, 20, 20);
- transition:all ease 0.5s;
- display: inline-block;
- }
- .nav:hover{
- background-color: #B84E51;
- cursor: pointer;
- }
- .layers, .tools, .brush{
- width: 240px;
- max-height: 300px;
- background-color: rgb(50, 50, 50);
- position: fixed;
- z-index: 100;
- overflow: scroll;
- display: none;
- }
- .layers>div, .tools>div, .brush>div{
- padding-top: 8px;
- padding-bottom: 8px;
- text-indent: 1em;
- width: 100%;
- color: #F1F1F1;
- font-family: 'Open Sans', sans-serif;
- border-bottom: 1px solid rgb(20, 20, 20);
- font-size: 0.8em;
- cursor: pointer;
- transition:all ease 0.5s;
- }
- .layers>div:hover, .tools>div:hover, .brush>div:hover{
- background-color: rgb(35, 35, 35);
- }
- .layers>div:last-child{
- position: relative;
- bottom: 0;
- padding-top: 8px;
- padding-bottom: 8px;
- text-indent: 0;
- width: 100%;
- text-align: center;
- color: #F1F1F1;
- font-family: 'Open Sans', sans-serif;
- font-size: 0.8em;
- background-color: #B84E51;
- cursor: pointer;
- transition:all ease 0.5s;
- }
- .layers>div:last-child:hover{
- background-color: #973c3f;
- }
- body, html{
- width: 100%;
- height: 100%;
- margin: 0;
- background-color: #F5F5F5;
- }
- ::-webkit-scrollbar{
- width: 2px;
- height: 2px;
- }
- ::-webkit-scrollbar-thumb{
- background-color: #B84E51;
- }
- ::-webkit-scrollbar-track{
- background-color: rgb(50, 50, 50);
- -webkit-box-shadow: inset 0 0 4px rgba(0,0,0,0.1);
- }
- ::-webkit-scrollbar-thumb:hover{
- -webkit-box-shadow: inset 0 0 4px rgba(0,0,0,0.3);
- }
- </style>
- <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js" type="text/javascript"></script>
- <script src="http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js" type="text/javascript"></script>
- <script>
- function SVG_Editor(Element){
- var element, layers, activeLayer, brushes, activeBrush, tools, activeTool;
- var xpos, ypos;
- element = Element;
- layers = [];
- brushes = [];
- tools = [];
- this.addLayer = function(name){
- var layer = new Layer(name);
- element.appendChild(layer.getElement());
- layers.push(layer);
- activeLayer = layer;
- return layer;
- };
- this.removeLayer = function(index){
- element.removeChild(layer[index].getElement());
- layers = layers.splice(index, 1);
- };
- this.getLayer = function(index){
- return layers[index];
- };
- this.getLayers = function(){
- return layers;
- };
- this.addBrush = function(brush){
- brushes.push(brush);
- };
- this.getBrushes = function(){
- return brushes;
- };
- this.addTool = function(tool){
- tools.push(tool);
- };
- this.getTools = function(){
- return tools;
- };
- this.getActiveTool = function(){
- return activeTool;
- };
- this.getActiveBrush = function(){
- return activeBrush;
- };
- this.getActiveLayer = function(){
- return activeLayer;
- };
- this.elementSearch = function(search){
- for(i in layers){
- var shapes = layers[i].getShapes();
- for(j in shapes){
- if(shapes[j].getElement() === search){
- return shapes[j];
- }
- }
- }
- return false;
- }
- this.addBrush(new DefaultBrush());
- this.addTool(new DrawRectangle());
- this.addTool(new PaintBucket());
- activeBrush = this.getBrushes()[0];
- activeTool = this.getTools()[0];
- var self = this;
- element.addEventListener("click", function(event){
- if(self.getActiveTool().requiresElement()){
- var element = self.elementSearch(event.path[0]);
- self.getActiveTool().click(event, element);
- }else{
- self.getActiveTool().click(event, self.getActiveLayer(), self.getActiveBrush(), this);
- }
- });
- }
- function Layer(Name){
- var name, shapes, element;
- shapes = [];
- this.setName = function(Name){
- name = new LayerName(Name);
- };
- this.getElement = function(){
- return element;
- };
- this.addShape = function(shape, brush){
- shapes.push(shape);
- shape.draw(brush);
- element.appendChild(shape.getElement());
- return shape;
- };
- this.removeShape = function(index){
- element.removeChild(shapes[index].getElement());
- shapes = shapes.splice(index, 1);
- };
- this.getShapes = function(){
- return shapes;
- }
- this.setName(Name);
- createElement();
- function createElement(){
- element = document.createElementNS("http://www.w3.org/2000/svg", "g");
- element.classList.add("svg-editor-layer");
- element.setAttribute("name", name.getNormalizedName());
- var title = document.createElementNS("http://www.w3.org/2000/svg", "title");
- title.textContent = name.getName();
- element.appendChild(title);
- }
- }
- function Rectangle(X, Y, W, H){
- var element, width, height;
- var position = new Position(X, Y);
- this.getPosition = function(){
- return position;
- };
- this.setPosition = function(X, Y){
- position.setX(X);
- position.setY(Y);
- element.setAttributeNS(null, "x", X);
- element.setAttributeNS(null, "y", Y);
- };
- this.setDimensions = function(W, H){
- width = W;
- height = H;
- element.setAttributeNS(null, "width", width);
- element.setAttributeNS(null, "height", height);
- };
- this.draw = function(brush){
- element.setAttributeNS(null, "stroke-width", brush.getStrokeWidth());
- element.setAttributeNS(null, "stroke", brush.getStroke());
- element.setAttributeNS(null, "fill", brush.getFill());
- };
- this.getElement = function(){
- return element;
- };
- createElement();
- this.setDimensions(W, H);
- this.setPosition(position.getX(), position.getY());
- function createElement(){
- element = document.createElementNS("http://www.w3.org/2000/svg", "rect");
- }
- }
- function DefaultBrush(){
- var stroke = "#000000";
- var fill = "#FFFFFF";
- var strokeWidth = "5";
- var fillOpacity = "0";
- this.getStroke = function(){
- return stroke;
- };
- this.getFill = function(){
- return fill;
- };
- this.getStrokeWidth = function(){
- return strokeWidth;
- };
- this.getFillOpacity = function(){
- return fillOpacity;
- };
- this.setStroke = function(Stroke){
- stroke = Stroke;
- };
- this.setFill = function(Fill){
- fill = Fill;
- };
- this.setFillOpacity = function(Opacity){
- fillOpacity = Opacity;
- }
- this.setStrokeWidth = function(StrokeWidth){
- strokeWidth = StrokeWidth;
- };
- }
- // function GetEventX(event e){
- // return e.hasOwnProperty('offsetX') ? e.offsetX : e.layerX;
- //
- // // return (e.offsetX || e.clientX - $(e.target).offset().left);
- // }
- // function GetEventY(e){
- // return e.hasOwnProperty('offsetX') ? e.offsetY : e.layerY;
- // // ypos = ev.offsetY === undefined ? event.originalEvent.layerY : event.offsetY;
- // }
- function DrawRectangle(){
- var clicks = 0;
- var rectangle;
- this.click = function(event, layer, brush, svg){
- svg.classList.toggle("rectangle");
- svg.classList.toggle("tool");
- if(clicks % 2 === 0){
- rectangle = new Rectangle(event.hasOwnProperty('offsetX') ? event.layerX :event.offsetX ,event.hasOwnProperty('offsetY') ? event.layerY :event.offsetY, 0, 0);
- svg.addEventListener("mousemove", resize);
- console.log("offset x : "+event.hasOwnProperty('offsetX') ? event.layerX :event.offsetX );
- console.log("offset y : "+event.hasOwnProperty('offsetY') ? event.layerY : event.offsetY);
- layer.addShape(rectangle, brush);
- clicks++;
- }else{
- svg.removeEventListener("mousemove", resize);
- var position = rectangle.getPosition();
- console.log("POSITION : "+position);
- rectangle.setDimensions(event.hasOwnProperty('offsetX') ? event.layerX :event.offsetX - position.getX(), event.hasOwnProperty('offsetY') ? event.layerY :event.offsetY - position.getY());
- console.log("event offset x : "+event.hasOwnProperty('offsetX') ? event.layerX :event.offsetX);
- console.log("event offset y : "+event.hasOwnProperty('offsetY') ? event.layerY :event.offsetY);
- console.log("position : "+position);
- console.log("position get x : "+position.getX());
- console.log("position get y : "+position.getY());
- clicks++;
- }
- }
- this.requiresElement = function(){
- return false;
- }
- this.getName = function(){
- return "Draw Rectangle";
- }
- function resize(event){
- var position = rectangle.getPosition();
- var x = (event.hasOwnProperty('offsetX') ? event.layerX :event.offsetX)-position.getX();
- var y = (event.hasOwnProperty('offsetY') ? event.layerY :event.offsetY)-position.getY();
- var lastX = position.getX();
- var lastY = position.getY();
- console.log("actual x : "+x);
- console.log("actual y : "+y);
- if(x<0 || y<0){
- var newX = lastX;
- var newY = lastY;
- var width = rectangle.getWidth();
- var height = rectangle.getHeight();
- if(x<0){
- newX = lastX - x;
- width = x;
- }
- if(y<0){
- newY = lastY - y;
- height = y;
- }
- rectangle.setPosition(newX,newY);
- rectangle.setDimensions(width,height);
- }else{
- rectangle.setDimensions((event.hasOwnProperty('offsetX') ? event.layerX :event.offsetX) - position.getX(), (event.hasOwnProperty('offsetY') ? event.layerY :event.offsetY) - position.getY());
- }
- }
- }
- function PaintBucket(){
- var fill;
- this.setFill = function(Fill){
- fill = Fill;
- };
- this.getFill = function(){
- return fill;
- };
- this.click = function(event, element){
- element.getElement().setAttributeNS(null, "fill", this.getFill());
- };
- this.requiresElement = function(){
- return true;
- }
- this.getName = function(){
- return "Fill Shape";
- }
- this.setFill("#FF0000");
- }
- function Position(X, Y){
- var x = X;
- var y = Y;
- this.getX = function(){
- return x;
- };
- this.getY = function(){
- return Y;
- };
- this.setX = function(X){
- x = X;
- };
- this.setY = function(Y){
- y = Y;
- };
- }
- function LayerName(Name){
- var name = Name;
- this.getNormalizedName = function(){
- return name.replace(/\s+/g, '-').toLowerCase();
- };
- this.getName = function(){
- return name;
- };
- }
- function Tabs(){
- var content = {
- "layers": document.getElementsByClassName("layers")[0],
- "tools": document.getElementsByClassName("tools")[0],
- "brush": document.getElementsByClassName("brush")[0]
- };
- var tabs = {
- "layers": document.getElementsByClassName("nav")[0],
- "tools": document.getElementsByClassName("nav")[1],
- "brush": document.getElementsByClassName("nav")[2]
- };
- for(i in tabs){
- var self = this;
- tabs[i].dataset.name = i;
- tabs[i].addEventListener("click", function(event){
- self.show(this.dataset.name);
- });
- }
- this.show = function(which){
- var hide = content[which].style.display === "block";
- for(i in content){
- if(i !== "length"){
- content[i].style.display = 'none';
- }
- }
- content[which].style.display = hide ? 'none' : 'block';
- }
- }
- var editor = new SVG_Editor(document.querySelectorAll("svg.svg-editor")[0]);
- var tabs = new Tabs();
- var layer1 = editor.addLayer("Test Layer");
- var standardBrush = editor.getBrushes()[0];
- var shape1 = new Rectangle(20, 20, 64, 64);
- var shape2 = new Rectangle(40, 40, 64, 64);
- layer1.addShape(shape1, standardBrush);
- layer1.addShape(shape2, standardBrush);
- var layer2 = editor.addLayer("Test Layer 2");
- var shape3 = new Rectangle(30, 30, 64, 64);
- layer2.addShape(shape3, standardBrush);
- </script>
- </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement