layering Object

by InferOn

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.5.0/fabric.min.js"></script>
<div class="container">
    <div class="row">
<div class="span2">
    <div id="btnGroup" class="btn-group">
        <button id="btnCreateCircle" class="btn btn-small" data-toggle="tooltip" title="Circle" rel="tooltip"><i class="fa fa-adjust"></i></button>
        <button id="btnCreateText" class="btn btn-small" data-toggle="tooltip" title="Text" rel="tooltip"><i class="fa fa-font"></i></button>
        <button id="btnCreateImage" class="btn btn-small" data-toggle="tooltip" title="Image" rel="tooltip"><i class="fa fa-image"></i></button>
       <button id="remove" class="btn btn-small deleteBtn" data-toggle="tooltip" title="delete" rel="tooltip"><i class="fa fa-remove"></i></button> 
    </div>
    
    <ul id="containerLayers">
    </ul>
</div>
<div class="span10">
    <canvas id="c" width="400" height="400"></canvas>
</div>
</div>
</div>

CSS

@import url('http://code.jquery.com/ui/1.9.0/themes/base/jquery-ui.css');
@import url('http://twitter.github.com/bootstrap/assets/css/bootstrap.css');
    
canvas{
  border-width: 1px;
  border-style: solid;
  border-color: #000;
  margin: 5px; 
}
#btnGroup{
  margin: 5px 5px 10px 3px;
}
#containerLayers { 
    list-style-type: none; 
    margin: 0; 
    padding: 0; 
    width: 100%; 
}
#containerLayers li { 
    margin: 0 3px 3px 3px; 
    padding: 0.4em; 
    padding-left: 1.5em;
    height: 15px;
    cursor: move;
}
#containerLayers li span { 
    position: absolute; 
    margin-left: -1.3em; 
}
li{
    border: 1px solid black;
}
.actived{
    border: 1px solid red;
}

JavaScript

// Bootstrap tooltip
var objectArray = new Array();
// http://www.paulirish.com/2009/random-hex-color-code-snippets/
function randomColor(){
  return '#'+Math.floor(Math.random()*16777215).toString(16);
}

// Fabric canvas
var canvas = new fabric.Canvas('c');
var imageSource = "http://fabricjs.com/lib/pug.jpg";

$('#remove').on('click', function () {
    deleteObjects();
    $(".deleteBtn").remove();
});

$("#btnCreateCircle").click(function(evt){
  // remove active state of each layer
  $("li").removeClass("actived");
  canvas.deactivateAll();
    
  // object
  var circle = new fabric.Circle({
    left: 100,
    top: 100,
    radius: 25,
    fill: randomColor(),
    hasRotatingPoint: true
  });
  canvas.add(circle);
  objectArray.push(circle);
  canvas.setActiveObject(circle);
  canvas.renderAll();
    
  // layer
  var id = canvas.getObjects().length - 1;
  $("#containerLayers").prepend('<li id="'+ id +'" class="ui-state-default actived"><span class="ui-icon ui-icon-arrow-2-n-s"></span> item ' + id + '</li>');
  $("#"+id).click(function(evt){
    if($(this).hasClass("actived")){
      // remove active state of all layers and objects
      $("li").removeClass("actived");
      canvas.deactivateAll();
      canvas.renderAll();            
    }
    else{
      // remove active state of all layers and objects
      $("li").removeClass("actived");
      canvas.deactivateAll();
      canvas.renderAll();
      // activate layer and object      
      $(this).addClass("actived");
      var obj = canvas.item(id);
      canvas.setActiveObject(obj);
      canvas.renderAll();        
    }        
  });    
    
  circle.on('selected', function() {
    $("li").removeClass("actived");
    $("#"+id).addClass("actived");
  });
    
});

$("#btnCreateText").click(function(evt){
  // remove active state of each layer
  $("li").removeClass("actived");
  canvas.deactivateAll();
    
  // object
  var text = new fabric.Text('Text', { 
    left: 100,
    top: 100,
   ...