Custom menu example
by rixo
HTML
<link rel="stylesheet" href="http://cdn.sencha.io/ext-4.2.0-gpl/resources/css/ext-all.css">
<script src="//cdnjs.cloudflare.com/ajax/libs/raphael/2.1.0/raphael-min.js"></script>
<div id="holder"></div>
CSS
.myContextMenu .x-menu-body {
background: #fff;
padding: 1;
}
.myContextMenu ul {
padding: 0;
margin: 0;
text-align: center;
}
.myContextMenu ul li {
list-style-type: none;
}
.myContextMenu ul li:nth-child(odd) {
background-color: #e6e6e6;
}
.myContextMenu a:hover {
background-color: #ccf;
}
.myContextMenu a {
text-decoration: none;
color: #000;
display: block;
padding: .5em 0;
}
JavaScript
// --- Creating a ball (see http://raphaeljs.com/ball.html)
Raphael.fn.ball = function (x, y, r, hue) {
hue = hue || 0;
return this.set(
this.ellipse(x, y + r - r / 5, r, r / 2).attr({fill: "rhsb(" + hue + ", 1, .25)-hsb(" + hue + ", 1, .25)", stroke: "none", opacity: 0}),
this.ellipse(x, y, r, r).attr({fill: "r(.5,.9)hsb(" + hue + ", 1, .75)-hsb(" + hue + ", .5, .25)", stroke: "none"}),
this.ellipse(x, y, r - r / 5, r - r / 20).attr({stroke: "none", fill: "r(.5,.1)#ccc-#ccc", opacity: 0})
);
};
var R = Raphael("holder"), x = 310, y = 180, r = 150;
var ball = R.ball(x, y, r, Math.random());
// --- Creatin a custom menu
var menu = Ext.create('Ext.menu.Menu', {
plain: true
,cls: 'myContextMenu'
,items: [{
xtype: 'component'
,html: ['<ul id="rect_menu" class="contextMenu">',
'<li><a href="call_to_js_function">Set aaa</a></li>',
'<li><a href="call_to_js_function">Set xxx</a></li>',
'<li><a href="call_to_js_function">Set ccc</a></li>',
'</ul>'].join('')
}]
});
// --- Adding menu handler to all ball's elements
//var node = document.getElementById('test');
var contextMenuHandler = function(e) {
menu.showAt(e.getXY());
e.preventDefault();
};
Ext.each(ball, function(raphaelElement) {
Ext.fly(raphaelElement.node).on({
contextmenu: contextMenuHandler
});
});