mirror of https://github.com/xwiki-labs/cryptpad
Realtime palette + cursor corresponding to the brush
This commit is contained in:
parent
d07acc5364
commit
8e29e30a35
www/whiteboard
|
@ -41,6 +41,10 @@
|
|||
z-index: 100;
|
||||
border: 3px solid black;
|
||||
padding: 5px;
|
||||
vertical-align: top;
|
||||
}
|
||||
.selected {
|
||||
margin-right: 20px;
|
||||
}
|
||||
#copy {
|
||||
padding-left: 75px;
|
||||
|
@ -51,6 +55,7 @@
|
|||
display: inline-block;
|
||||
margin: 5px;
|
||||
border: 2px solid black;
|
||||
vertical-align: top;
|
||||
}
|
||||
#controls {
|
||||
display: block;
|
||||
|
@ -76,7 +81,7 @@
|
|||
<div id="controls">
|
||||
<button id="clear">Clear</button>
|
||||
<input id="width" type="range" value="5" min="1" max="100"></input><label for="width">5</label>
|
||||
<div id="colors"> </div>
|
||||
<div id="colors"><div class="selected-container"><span class="selected"></span></div> </div>
|
||||
</div>
|
||||
|
||||
<div id="loading">
|
||||
|
@ -88,6 +93,7 @@
|
|||
<p data-localization="loading"></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="cursors" style="display: none; background: white; text-align: center;"></div>
|
||||
<div id="pickers" style="display: none;"></div>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -43,13 +43,42 @@ define([
|
|||
var $canvas = $('canvas');
|
||||
var $controls = $('#controls');
|
||||
var $canvasContainer = $('canvas').parents('.canvas-container');
|
||||
var $pickers = $('#pickers');
|
||||
var $colors = $('#colors');
|
||||
var $cursors = $('#cursors');
|
||||
|
||||
var $width = $('#width');
|
||||
var $widthLabel = $('label[for="width"]');
|
||||
|
||||
var createCursor = function () {
|
||||
var w = canvas.freeDrawingBrush.width;
|
||||
var c = canvas.freeDrawingBrush.color;
|
||||
$cursors.html('<canvas width="'+w+'" height="'+w+'"></canvas>');
|
||||
var $ccanvas = $cursors.find('canvas');
|
||||
var ccanvas = $ccanvas[0];
|
||||
|
||||
var context = ccanvas.getContext('2d');
|
||||
var centerX = w / 2;
|
||||
var centerY = w / 2;
|
||||
var radius = w/2;
|
||||
|
||||
context.beginPath();
|
||||
context.arc(centerX, centerY, radius, 0, 2 * Math.PI, false);
|
||||
context.fillStyle = c;
|
||||
context.fill();
|
||||
//context.lineWidth = w/2;
|
||||
//context.strokeStyle = '#000000';
|
||||
//context.stroke();
|
||||
|
||||
var img = ccanvas.toDataURL("image/png");
|
||||
canvas.freeDrawingCursor = 'url('+img+') '+w/2+' '+w/2+', crosshair';
|
||||
};
|
||||
|
||||
var updateBrushWidth = function () {
|
||||
var val = $width.val();
|
||||
canvas.freeDrawingBrush.width = Number(val);
|
||||
$widthLabel.text(val);
|
||||
createCursor();
|
||||
};
|
||||
updateBrushWidth();
|
||||
|
||||
|
@ -58,6 +87,7 @@ define([
|
|||
var pickColor = function (current, cb) {
|
||||
// TODO find out why initial color is not being set
|
||||
// http://jsfiddle.net/j3hZB/
|
||||
console.log(current);
|
||||
var $picker = $('<input>', {
|
||||
type: 'color',
|
||||
value: '#FFFFFF',
|
||||
|
@ -68,7 +98,7 @@ define([
|
|||
.on('change', function () {
|
||||
var color = this.value;
|
||||
cb(color);
|
||||
});
|
||||
}).appendTo($pickers);
|
||||
setTimeout(function () {
|
||||
$picker.val(current);
|
||||
$picker.click();
|
||||
|
@ -80,33 +110,21 @@ define([
|
|||
module.$color.css({
|
||||
'color': c,
|
||||
});
|
||||
createCursor();
|
||||
};
|
||||
|
||||
var rgb2hex = function (rgb) {
|
||||
if (rgb.indexOf('#') === 0) { return rgb; }
|
||||
rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
|
||||
var hex = function (x) {
|
||||
return ("0" + parseInt(x).toString(16)).slice(-2);
|
||||
};
|
||||
return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
|
||||
};
|
||||
|
||||
// TODO add a better color palette
|
||||
var palette = ['red', 'blue', 'green', 'white', 'black', 'purple',
|
||||
'gray', 'beige', 'brown', 'cyan', 'darkcyan', 'gold', 'yellow', 'pink'];
|
||||
var $colors = $('#colors');
|
||||
palette.forEach(function (color, i) {
|
||||
var $color = $('<span>', {
|
||||
'class': 'palette-color',
|
||||
})
|
||||
.css({
|
||||
'background-color': color,
|
||||
})
|
||||
// FIXME double click doesn't seem to work in chromium currently
|
||||
.dblclick(function () {
|
||||
pickColor($color.css('background-color'), function (c) {
|
||||
$color.css({
|
||||
'background-color': c,
|
||||
});
|
||||
setColor(c);
|
||||
});
|
||||
// TODO commit chosen color to pad metadata:
|
||||
// json.metadata.palette[i]
|
||||
});
|
||||
|
||||
$colors.append($color);
|
||||
});
|
||||
|
||||
$('.palette-color').on('click', function () {
|
||||
var color = $(this).css('background-color');
|
||||
|
@ -183,6 +201,42 @@ define([
|
|||
transformFunction: JsonOT.transform,
|
||||
};
|
||||
|
||||
var addColorToPalette = function (color, i) {
|
||||
var $color = $('<span>', {
|
||||
'class': 'palette-color',
|
||||
})
|
||||
.css({
|
||||
'background-color': color,
|
||||
})
|
||||
.click(function () {
|
||||
var c = rgb2hex($color.css('background-color'));
|
||||
setColor(c);
|
||||
})
|
||||
// FIXME double click doesn't seem to work in chromium currently
|
||||
.dblclick(function (e) {
|
||||
e.preventDefault();
|
||||
pickColor(rgb2hex($color.css('background-color')), function (c) {
|
||||
$color.css({
|
||||
'background-color': c,
|
||||
});
|
||||
palette.splice(i, 1, c);
|
||||
config.onLocal();
|
||||
setColor(c);
|
||||
});
|
||||
// TODO commit chosen color to pad metadata:
|
||||
// json.metadata.palette[i]
|
||||
});
|
||||
|
||||
$colors.append($color);
|
||||
};
|
||||
palette.forEach(addColorToPalette);
|
||||
|
||||
var updatePalette = function (newPalette) {
|
||||
palette = newPalette;
|
||||
$colors.html(' ');
|
||||
palette.forEach(addColorToPalette);
|
||||
};
|
||||
|
||||
var suggestName = function (fallback) {
|
||||
if (document.title === defaultName) {
|
||||
return fallback || "";
|
||||
|
@ -327,8 +381,8 @@ define([
|
|||
updateTitle(json.metadata.title || defaultName);
|
||||
titleUpdated = true;
|
||||
}
|
||||
if (typeof(json.metadata.palette) !== 'object') {
|
||||
json.metadata.palette = {};
|
||||
if (typeof(json.metadata.palette) !== 'undefined') {
|
||||
updatePalette(json.metadata.palette);
|
||||
}
|
||||
}
|
||||
if (!titleUpdated) {
|
||||
|
@ -374,6 +428,7 @@ define([
|
|||
content: textValue,
|
||||
metadata: {
|
||||
users: userData,
|
||||
palette: palette,
|
||||
defaultTitle: defaultName
|
||||
}
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue