File: platform/plugins/Q/web/js/tools/pie.js
(function (Q, $) {
/**
* @module Q-tools
*/
/**
* This tool show round process bar.
* @class Q pie
* @constructor
* @param {Object} [options] Override various options for this tool
* @param {Number} [options.fraction] Value process
* @param {Number} [options.size] Circle size
* @param {Object} [options.bgImage] URL to image to put in background
* @param {Object} [options.color] Arc color
* @param {Object} [options.borderSize] Arc border size. The progress line width.
* @return {Q.Tool}
*/
Q.Tool.define("Q/pie", function (options) {
var tool = this;
var $toolElement = $(tool.element);
var state = tool.state;
options = options || {};
Q.addStylesheet('{{Q}}/css/pie.css');
// positioning tool box
tool.positionParent();
// rotate arcs according to fraction
tool.Q.onStateChanged('fraction').set(function () {
var angle = 360/(100/parseFloat(state.fraction));
var arcLeftAngle = angle > 180 ? angle - 180 + 45 : 45;
arcLeftAngle = angle > 360 ? 225 : arcLeftAngle;
var arcLeftDisplay = arcLeftAngle > 45 ? "block" : "none"; // only for Chrome
var arcRightAngle = angle < 180 ? angle + 45 : 180 + 45;
arcRightAngle = angle < 0 ? 45 : arcRightAngle;
$(".Q_pie_arc.Q_pie_arcLeft", $toolElement).css({transform: "rotate(" + arcLeftAngle + "deg)", display: arcLeftDisplay}); // Chrome incorrect calculate positions
$(".Q_pie_arc.Q_pie_arcRight", $toolElement).css("transform", "rotate(" + arcRightAngle + "deg)");
}, "Q/pie");
// set new size
tool.Q.onStateChanged('size').set(function () {
var size = state.size;
$(".Q_pie_box", $toolElement).css({width: size, height: size});
}, "Q/pie");
// set new Arc color
tool.Q.onStateChanged('color').set(function () {
var color = state.color;
$(".Q_pie_arc.Q_pie_arcLeft", $toolElement).css("border-color", color + " " + color + " transparent transparent");
$(".Q_pie_arc.Q_pie_arcRight", $toolElement).css("border-color", "transparent transparent " + color + " " + color);
}, "Q/pie");
// set new Arc borderSize
tool.Q.onStateChanged('borderSize').set(function () {
var borderSize = state.borderSize;
$(".Q_pie_arc, .Q_pie_shield", $toolElement).css("border-width", borderSize);
}, "Q/pie");
tool.refresh();
},
{
fraction: 0,
size: 80,
bgImage: "",
color: 'red',
borderSize: 5, // in px
clickPos: {
angle: 0,
anglePercent: 0
} // service param contain info about click event inside tool element
},
{
refresh: function () {
var tool = this;
var state = tool.state;
var $toolElement = $(tool.element);
var bgImage = state.bgImage ? "background-image: url("+state.bgImage+")" : "";
var fields = {
bgImage: bgImage
};
Q.Template.render(
'Q/pie/main',
fields,
function (err, html) {
if (err) return;
$toolElement.html(html);
// set arcs rotate
tool.stateChanged('fraction');
// set pie size
tool.stateChanged('size');
// set Arc color
tool.stateChanged('color');
// set Arc borderSize
tool.stateChanged('borderSize');
// set toolElement click event
$toolElement.on(Q.Pointer.click, function (event) {
var x = event.pageX - $toolElement.offset().left;
var y = event.pageY - $toolElement.offset().top;
var toolWidth = $toolElement.width();
var insideR = (toolWidth - state.borderSize * 2)/2; // radius of circle inside arcs
var outsideR = toolWidth/2; // radius of circle
var angle = Math.atan2(y - outsideR, x - outsideR)*180/Math.PI + 90;
angle = angle > 0 ? angle : 360 + angle;
var anglePercent = angle/360*100;
state.clickPos.angle = angle;
state.clickPos.anglePercent = anglePercent;
if(Math.sqrt((x - outsideR) * (x - outsideR) + (y - outsideR) * (y - outsideR)) < insideR){
state.clickPos.inside = true;
}else{
state.clickPos.inside = false;
//state.fraction = anglePercent;
//tool.stateChanged('fraction');
}
});
}
)
},
/**
* Positioning tool box in parent box
* @method positionParent
*/
positionParent: function(){
var tool = this;
// if size already set in params - exit
if(tool.state.size) return;
var parent = $(tool.element).parent();
var parentW = parent.width();
var parentH = parent.height();
tool.state.size = parentW > parentH ? parentH : parentW;
},
/**
* Set pie to initial position
* @method initPos
*/
initPos: function(){
var tool = this;
tool.state.fraction = 0;
tool.stateChanged('fraction');
}
}
);
Q.Template.set('Q/pie/main',
'<div class="Q_pie_box" style="{{bgImage}}">'
+ '<div class="Q_pie_shield"></div>'
+ '<div class="Q_pie_arcBox Q_pie_arcBoxRight"><div class="Q_pie_arc Q_pie_arcRight"></div></div>'
+ '<div class="Q_pie_arcBox Q_pie_arcBoxLeft"><div class="Q_pie_arc Q_pie_arcLeft"></div></div>'
+ '</div>'
);
})(Q, jQuery);