diff --git a/css/tools.css b/css/tools.css
index 66224346..07e9aeb8 100644
--- a/css/tools.css
+++ b/css/tools.css
@@ -78,6 +78,10 @@
background-image: url(../img/tools/wand.png);
}
+.tool-icon.tool-colorpicker {
+ background-image: url(../img/tools/dropper.png);
+}
+
/*.tool-icon.tool-palette {
background-image: url(../img/tools/color-palette.png);
}*/
@@ -126,6 +130,10 @@
cursor: url(../img/tools/wand.png) 15 15, pointer;
}
+.tool-colorpicker .drawing-canvas-container:hover {
+ cursor: url(../img/tools/dropper.png) 0 15, pointer;
+}
+
.tool-grid,
.tool-grid label,
.tool-grid input {
diff --git a/img/tools/dropper.png b/img/tools/dropper.png
new file mode 100644
index 00000000..2a161fae
Binary files /dev/null and b/img/tools/dropper.png differ
diff --git a/index.html b/index.html
index 59869064..c7753760 100644
--- a/index.html
+++ b/index.html
@@ -80,7 +80,7 @@
-
+
@@ -133,6 +133,7 @@
+
diff --git a/js/Events.js b/js/Events.js
index cdf31c42..ab065356 100644
--- a/js/Events.js
+++ b/js/Events.js
@@ -2,7 +2,10 @@ Events = {
TOOL_SELECTED : "TOOL_SELECTED",
TOOL_RELEASED : "TOOL_RELEASED",
- COLOR_SELECTED: "COLOR_SELECTED",
+ PRIMARY_COLOR_SELECTED: "PRIMARY_COLOR_SELECTED",
+ PRIMARY_COLOR_UPDATED: "PRIMARY_COLOR_UPDATED",
+ SECONDARY_COLOR_SELECTED: "SECONDARY_COLOR_SELECTED",
+ SECONDARY_COLOR_UPDATED: "SECONDARY_COLOR_UPDATED",
/**
* When this event is emitted, a request is sent to the localstorage
diff --git a/js/controller/DrawingController.js b/js/controller/DrawingController.js
index 94069b9e..422fc4bc 100644
--- a/js/controller/DrawingController.js
+++ b/js/controller/DrawingController.js
@@ -43,13 +43,19 @@
this.currentToolBehavior = toolBehavior;
}, this));
- $.subscribe(Events.COLOR_SELECTED, $.proxy(function(evt, color, isPrimary) {
- console.log("Color selected: ", color);
- if (isPrimary) {
- this.primaryColor = color;
- } else {
- this.secondaryColor = color;
- }
+ /**
+ * TODO(grosbouddha): Primary/secondary color state are kept in this general controller.
+ * Find a better place to store that. Perhaps PaletteController?
+ */
+ $.subscribe(Events.PRIMARY_COLOR_SELECTED, $.proxy(function(evt, color) {
+ console.log("Primary color selected: ", color);
+ this.primaryColor = color;
+ $.publish(Events.PRIMARY_COLOR_UPDATED, [color]);
+ }, this));
+ $.subscribe(Events.SECONDARY_COLOR_SELECTED, $.proxy(function(evt, color) {
+ console.log("Secondary color selected: ", color);
+ this.secondaryColor = color;
+ $.publish(Events.SECONDARY_COLOR_UPDATED, [color]);
}, this));
$(window).resize($.proxy(this.startDPIUpdateTimer_, this));
diff --git a/js/controller/PaletteController.js b/js/controller/PaletteController.js
index bca36b94..a1dd161a 100644
--- a/js/controller/PaletteController.js
+++ b/js/controller/PaletteController.js
@@ -11,7 +11,12 @@
*/
ns.PaletteController.prototype.onPickerChange_ = function(evt, isPrimary) {
var inputPicker = $(evt.target);
- $.publish(Events.COLOR_SELECTED, [inputPicker.val(), evt.data.isPrimary]);
+ if(evt.data.isPrimary) {
+ $.publish(Events.PRIMARY_COLOR_SELECTED, [inputPicker.val()]);
+ }
+ else {
+ $.publish(Events.SECONDARY_COLOR_SELECTED, [inputPicker.val()]);
+ }
};
/**
@@ -57,12 +62,12 @@
*/
ns.PaletteController.prototype.onPaletteColorClick_ = function (event) {
var selectedColor = $(event.target).data("color");
- if (event.which == 1) { // left button
- this.updateColorPicker_(selectedColor, $('#color-picker'));
- $.publish(Events.COLOR_SELECTED, [selectedColor, true]);
- } else if (event.which == 3) { // right button
- this.updateColorPicker_(selectedColor, $('#secondary-color-picker'));
- $.publish(Events.COLOR_SELECTED, [selectedColor, false]);
+ var isLeftClick = (event.which == 1);
+ var isRightClick = (event.which == 3);
+ if (isLeftClick) {
+ $.publish(Events.PRIMARY_COLOR_SELECTED, [selectedColor]);
+ } else if (isRightClick) {
+ $.publish(Events.SECONDARY_COLOR_SELECTED, [selectedColor]);
}
};
@@ -106,7 +111,14 @@
this.paletteRoot.mouseup($.proxy(this.onPaletteColorClick_, this));
- $.subscribe(Events.COLOR_SELECTED, $.proxy(function(evt, color) {
+ $.subscribe(Events.PRIMARY_COLOR_UPDATED, $.proxy(function(evt, color) {
+ this.updateColorPicker_(color, $('#color-picker'));
+ this.addColorToPalette_(color);
+ this.createPaletteMarkup_();
+ }, this));
+
+ $.subscribe(Events.SECONDARY_COLOR_UPDATED, $.proxy(function(evt, color) {
+ this.updateColorPicker_(color, $('#secondary-color-picker'));
this.addColorToPalette_(color);
this.createPaletteMarkup_();
}, this));
diff --git a/js/controller/ToolController.js b/js/controller/ToolController.js
index 5fe0f50c..921cb9af 100644
--- a/js/controller/ToolController.js
+++ b/js/controller/ToolController.js
@@ -14,7 +14,8 @@
"circle" : new pskl.drawingtools.Circle(),
"move" : new pskl.drawingtools.Move(),
"rectangleSelect" : new pskl.drawingtools.RectangleSelect(),
- "shapeSelect" : new pskl.drawingtools.ShapeSelect()
+ "shapeSelect" : new pskl.drawingtools.ShapeSelect(),
+ "colorPicker" : new pskl.drawingtools.ColorPicker()
};
this.currentSelectedTool = this.toolInstances.simplePen;
diff --git a/js/drawingtools/ColorPicker.js b/js/drawingtools/ColorPicker.js
new file mode 100644
index 00000000..a786daed
--- /dev/null
+++ b/js/drawingtools/ColorPicker.js
@@ -0,0 +1,25 @@
+/*
+ * @provide pskl.drawingtools.ColorPicker
+ *
+ * @require pskl.utils
+ */
+(function() {
+ var ns = $.namespace("pskl.drawingtools");
+
+ ns.ColorPicker = function() {
+ this.toolId = "tool-colorpicker";
+ this.helpText = "Color picker";
+ };
+
+ pskl.utils.inherit(ns.ColorPicker, ns.BaseTool);
+
+ /**
+ * @override
+ */
+ ns.ColorPicker.prototype.applyToolAt = function(col, row, color, frame, overlay) {
+ if (frame.containsPixel(col, row)) {
+ var sampledColor = frame.getPixel(col, row);
+ $.publish(Events.PRIMARY_COLOR_SELECTED, [sampledColor]);
+ }
+ };
+})();