mirror of
https://github.com/node-red/node-red.git
synced 2023-10-10 13:36:53 +02:00
[groups] Add better colour picker for group fill/stroke
This commit is contained in:
parent
5cd2791506
commit
58696c6ad4
@ -151,6 +151,7 @@ module.exports = function(grunt) {
|
|||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/common/stack.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/common/stack.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/common/toggleButton.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/common/toggleButton.js",
|
||||||
|
"packages/node_modules/@node-red/editor-client/src/js/ui/common/colorPicker.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/actions.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/actions.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js",
|
||||||
"packages/node_modules/@node-red/editor-client/src/js/ui/diff.js",
|
"packages/node_modules/@node-red/editor-client/src/js/ui/diff.js",
|
||||||
|
@ -14,7 +14,9 @@
|
|||||||
"back": "Back",
|
"back": "Back",
|
||||||
"next": "Next",
|
"next": "Next",
|
||||||
"clone": "Clone project",
|
"clone": "Clone project",
|
||||||
"cont": "Continue"
|
"cont": "Continue",
|
||||||
|
"stroke": "Stroke",
|
||||||
|
"fill": "Fill"
|
||||||
},
|
},
|
||||||
"type": {
|
"type": {
|
||||||
"string": "string",
|
"string": "string",
|
||||||
|
@ -825,99 +825,6 @@ RED.editor = (function() {
|
|||||||
searchInput.trigger("focus");
|
searchInput.trigger("focus");
|
||||||
}
|
}
|
||||||
|
|
||||||
function createColorPicker(colorRow, color) {
|
|
||||||
|
|
||||||
var colorButton = $('<button type="button" class="red-ui-button red-ui-editor-node-appearance-button">').appendTo(colorRow);
|
|
||||||
$('<i class="fa fa-caret-down"></i>').appendTo(colorButton);
|
|
||||||
|
|
||||||
var colorDisp = $('<div>',{class:"red-ui-search-result-node"}).appendTo(colorButton);
|
|
||||||
|
|
||||||
var selector = $("<input/>", {
|
|
||||||
id: "red-ui-editor-node-color",
|
|
||||||
type: "text",
|
|
||||||
value: color
|
|
||||||
}).css({
|
|
||||||
marginLeft: "10px",
|
|
||||||
width: "150px",
|
|
||||||
}).appendTo(colorRow);
|
|
||||||
|
|
||||||
selector.on("change", function (e) {
|
|
||||||
var color = selector.val();
|
|
||||||
$(".red-ui-editor-node-appearance-button .red-ui-search-result-node").css({
|
|
||||||
"background-color": color
|
|
||||||
});
|
|
||||||
});
|
|
||||||
selector.trigger("change");
|
|
||||||
colorButton.on("click", function (e) {
|
|
||||||
var recommendedColors = [
|
|
||||||
"#DDAA99",
|
|
||||||
"#3FADB5", "#87A980", "#A6BBCF",
|
|
||||||
"#AAAA66", "#C0C0C0", "#C0DEED",
|
|
||||||
"#C7E9C0", "#D7D7A0", "#D8BFD8",
|
|
||||||
"#DAC4B4", "#DEB887", "#DEBD5C",
|
|
||||||
"#E2D96E", "#E6E0F8", "#E7E7AE",
|
|
||||||
"#E9967A", "#F3B567", "#FDD0A2",
|
|
||||||
"#FDF0C2", "#FFAAAA", "#FFCC66",
|
|
||||||
"#FFF0F0", "#FFFFFF"
|
|
||||||
].map(function(c) {
|
|
||||||
var r = parseInt(c.substring(1, 3), 16) / 255;
|
|
||||||
var g = parseInt(c.substring(3, 5), 16) / 255;
|
|
||||||
var b = parseInt(c.substring(5, 7), 16) / 255;
|
|
||||||
return {
|
|
||||||
hex: c,
|
|
||||||
r: r,
|
|
||||||
g: g,
|
|
||||||
b: b,
|
|
||||||
l: 0.3 * r + 0.59 * g + 0.11 * b
|
|
||||||
}
|
|
||||||
});
|
|
||||||
// Sort by luminosity.
|
|
||||||
recommendedColors.sort(function (a, b) {
|
|
||||||
return a.l - b.l;
|
|
||||||
});
|
|
||||||
|
|
||||||
var numColors = recommendedColors.length;
|
|
||||||
var width = 30;
|
|
||||||
var height = 30;
|
|
||||||
var margin = 2;
|
|
||||||
var perRow = 6;
|
|
||||||
var picker = $("<div/>", {
|
|
||||||
class: "red-ui-color-picker"
|
|
||||||
}).css({
|
|
||||||
width: ((width+margin+margin)*perRow)+"px",
|
|
||||||
height: Math.ceil(numColors/perRow)*(height+margin+margin)+"+px"
|
|
||||||
});
|
|
||||||
var count = 0;
|
|
||||||
var row = null;
|
|
||||||
recommendedColors.forEach(function (col) {
|
|
||||||
if ((count % perRow) == 0) {
|
|
||||||
row = $("<div/>").appendTo(picker);
|
|
||||||
}
|
|
||||||
var button = $("<button/>", {
|
|
||||||
}).css({
|
|
||||||
width: width+"px",
|
|
||||||
height: height+"px",
|
|
||||||
margin: margin+"px",
|
|
||||||
backgroundColor: col.hex,
|
|
||||||
"border-style": "solid",
|
|
||||||
"border-width": "1px",
|
|
||||||
"border-color": col.luma<0.92?col.hex:'#ccc'
|
|
||||||
}).appendTo(row);
|
|
||||||
button.on("click", function (e) {
|
|
||||||
e.preventDefault();
|
|
||||||
colorPanel.hide();
|
|
||||||
selector.val(col.hex);
|
|
||||||
selector.trigger("change");
|
|
||||||
});
|
|
||||||
count++;
|
|
||||||
});
|
|
||||||
var colorPanel = RED.popover.panel(picker);
|
|
||||||
colorPanel.show({
|
|
||||||
target: colorButton
|
|
||||||
})
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function buildAppearanceForm(container,node) {
|
function buildAppearanceForm(container,node) {
|
||||||
var dialogForm = $('<form class="dialog-form form-horizontal" autocomplete="off"></form>').appendTo(container);
|
var dialogForm = $('<form class="dialog-form form-horizontal" autocomplete="off"></form>').appendTo(container);
|
||||||
|
|
||||||
@ -1003,7 +910,30 @@ RED.editor = (function() {
|
|||||||
class: "form-row"
|
class: "form-row"
|
||||||
}).appendTo(dialogForm);
|
}).appendTo(dialogForm);
|
||||||
$("<label/>").text(RED._("editor.color")).appendTo(colorRow);
|
$("<label/>").text(RED._("editor.color")).appendTo(colorRow);
|
||||||
createColorPicker(colorRow, color);
|
|
||||||
|
var recommendedColors = [
|
||||||
|
"#DDAA99",
|
||||||
|
"#3FADB5", "#87A980", "#A6BBCF",
|
||||||
|
"#AAAA66", "#C0C0C0", "#C0DEED",
|
||||||
|
"#C7E9C0", "#D7D7A0", "#D8BFD8",
|
||||||
|
"#DAC4B4", "#DEB887", "#DEBD5C",
|
||||||
|
"#E2D96E", "#E6E0F8", "#E7E7AE",
|
||||||
|
"#E9967A", "#F3B567", "#FDD0A2",
|
||||||
|
"#FDF0C2", "#FFAAAA", "#FFCC66",
|
||||||
|
"#FFF0F0", "#FFFFFF"
|
||||||
|
]
|
||||||
|
|
||||||
|
RED.colorPicker.create({
|
||||||
|
id: "red-ui-editor-node-color",
|
||||||
|
value: color,
|
||||||
|
palette: recommendedColors,
|
||||||
|
sortPalette: function (a, b) {return a.l - b.l;}
|
||||||
|
}).appendTo(colorRow);
|
||||||
|
|
||||||
|
$("#red-ui-editor-node-color").on('change', function(ev) {
|
||||||
|
// Horribly out of scope...
|
||||||
|
nodeDiv.css('backgroundColor',$(this).val());
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -22,18 +22,46 @@ RED.group = (function() {
|
|||||||
'<input type="text" id="node-input-name" data-i18n="[placeholder]common.label.name">'+
|
'<input type="text" id="node-input-name" data-i18n="[placeholder]common.label.name">'+
|
||||||
'</div>'+
|
'</div>'+
|
||||||
|
|
||||||
'<div class="form-row">'+
|
'<div class="form-row" id="node-input-row-style-stroke">'+
|
||||||
'<label for="node-input-style-stroke" data-i18n="[append]editor:group.label.stroke">Stroke</label>'+
|
'<label for="node-input-style-stroke" data-i18n="editor:common.label.stroke"></label>'+
|
||||||
'<input type="text" id="node-input-style-stroke">'+
|
|
||||||
'</div>'+
|
'</div>'+
|
||||||
|
|
||||||
'<div class="form-row">'+
|
'<div class="form-row" id="node-input-row-style-fill">'+
|
||||||
'<label for="node-input-style-fill" data-i18n="[append]editor:group.label.fill">Fill</label>'+
|
'<label for="node-input-style-fill" data-i18n="editor:common.label.fill"></label>'+
|
||||||
'<input type="text" id="node-input-style-fill">'+
|
|
||||||
'</div>'+
|
'</div>'+
|
||||||
|
|
||||||
'</script>';
|
'</script>';
|
||||||
|
|
||||||
|
var colorPalette = [
|
||||||
|
"#ff0000",
|
||||||
|
"#ffC000",
|
||||||
|
"#ffff00",
|
||||||
|
"#92d04f",
|
||||||
|
"#0070c0",
|
||||||
|
"#001f60",
|
||||||
|
"#6f2fa0",
|
||||||
|
"#000000",
|
||||||
|
"#777777"
|
||||||
|
]
|
||||||
|
var colorSteps = 3;
|
||||||
|
var colorCount = colorPalette.length;
|
||||||
|
for (var i=0,len=colorPalette.length*colorSteps;i<len;i++) {
|
||||||
|
var ci = i%colorCount;
|
||||||
|
var j = Math.floor(i/colorCount)+1;
|
||||||
|
var c = colorPalette[ci];
|
||||||
|
var r = parseInt(c.substring(1, 3), 16);
|
||||||
|
var g = parseInt(c.substring(3, 5), 16);
|
||||||
|
var b = parseInt(c.substring(5, 7), 16);
|
||||||
|
var dr = (255-r)/(colorSteps+((ci===colorCount-1) ?0:1));
|
||||||
|
var dg = (255-g)/(colorSteps+((ci===colorCount-1) ?0:1));
|
||||||
|
var db = (255-b)/(colorSteps+((ci===colorCount-1) ?0:1));
|
||||||
|
r = Math.min(255,Math.floor(r+j*dr));
|
||||||
|
g = Math.min(255,Math.floor(g+j*dg));
|
||||||
|
b = Math.min(255,Math.floor(b+j*db));
|
||||||
|
colorPalette.push('#'+((r<<16) + (g<<8) + b).toString(16).padStart(6,'0'));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
var groupDef = {
|
var groupDef = {
|
||||||
defaults:{
|
defaults:{
|
||||||
name:{value:""},
|
name:{value:""},
|
||||||
@ -43,14 +71,37 @@ RED.group = (function() {
|
|||||||
category: "config",
|
category: "config",
|
||||||
oneditprepare: function() {
|
oneditprepare: function() {
|
||||||
var style = this.style || {};
|
var style = this.style || {};
|
||||||
$("#node-input-style-stroke").val(style.stroke || "#eeeeee")
|
RED.colorPicker.create({
|
||||||
$("#node-input-style-fill").val(style.fill || "none")
|
id:"node-input-style-stroke",
|
||||||
|
value: style.stroke || "#c0c0c0",
|
||||||
|
palette: colorPalette,
|
||||||
|
cellPerRow: colorCount,
|
||||||
|
cellWidth: 16,
|
||||||
|
cellHeight: 16,
|
||||||
|
cellMargin: 3,
|
||||||
|
none: true,
|
||||||
|
opacity: style['stroke-opacity'] || 1.0
|
||||||
|
}).appendTo("#node-input-row-style-stroke");
|
||||||
|
RED.colorPicker.create({
|
||||||
|
id:"node-input-style-fill",
|
||||||
|
value: style.fill || "#c0c0c0",
|
||||||
|
palette: colorPalette,
|
||||||
|
cellPerRow: colorCount,
|
||||||
|
cellWidth: 16,
|
||||||
|
cellHeight: 16,
|
||||||
|
cellMargin: 3,
|
||||||
|
none: true,
|
||||||
|
opacity: style['fill-opacity'] || 1.0
|
||||||
|
}).appendTo("#node-input-row-style-fill");
|
||||||
},
|
},
|
||||||
oneditresize: function(size) {
|
oneditresize: function(size) {
|
||||||
},
|
},
|
||||||
oneditsave: function() {
|
oneditsave: function() {
|
||||||
this.style.stroke = $("#node-input-style-stroke").val();
|
this.style.stroke = $("#node-input-style-stroke").val();
|
||||||
this.style.fill = $("#node-input-style-fill").val();
|
this.style.fill = $("#node-input-style-fill").val();
|
||||||
|
this.style["stroke-opacity"] = $("#node-input-style-stroke-opacity").val();
|
||||||
|
this.style["fill-opacity"] = $("#node-input-style-fill-opacity").val();
|
||||||
|
|
||||||
},
|
},
|
||||||
set:{
|
set:{
|
||||||
module: "node-red"
|
module: "node-red"
|
||||||
|
@ -4154,9 +4154,10 @@ if (DEBUG_EVENTS) { console.warn("nodeMouseDown", mouse_mode,d); }
|
|||||||
.attr("width",d.w)
|
.attr("width",d.w)
|
||||||
.attr("height",d.h)
|
.attr("height",d.h)
|
||||||
.style("stroke",function(d) { /*if (d.selected) { return "#ff7f0e" } */return d.style.stroke || "none"})
|
.style("stroke",function(d) { /*if (d.selected) { return "#ff7f0e" } */return d.style.stroke || "none"})
|
||||||
|
.style("stroke-opacity", function(d) { return d.style.hasOwnProperty('stroke-opacity') ? d.style['stroke-opacity'] : 1})
|
||||||
.style("stroke-dasharray", function(d) { return (d.active||d.hovered)?"10 4":"none"})
|
.style("stroke-dasharray", function(d) { return (d.active||d.hovered)?"10 4":"none"})
|
||||||
.style("fill", function(d) { return d.style.fill || "none"})
|
.style("fill", function(d) { return d.style.fill || "none"})
|
||||||
.style("fill-opacity", 1)
|
.style("fill-opacity", function(d) { return d.style.hasOwnProperty('fill-opacity') ? d.style['fill-opacity'] : 1})
|
||||||
|
|
||||||
// g.selectAll(".red-ui-flow-group-handle-0")
|
// g.selectAll(".red-ui-flow-group-handle-0")
|
||||||
// .style("opacity",function(d) { return d.selected?1:0})
|
// .style("opacity",function(d) { return d.selected?1:0})
|
||||||
|
@ -410,7 +410,84 @@ button.red-ui-button.red-ui-editor-node-appearance-button {
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.red-ui-color-picker {
|
||||||
|
input[type="text"] {
|
||||||
|
border-radius:0;
|
||||||
|
width: 100%;
|
||||||
|
margin-bottom: 0;
|
||||||
|
border: none;
|
||||||
|
border-bottom: 1px solid $form-input-border-color;
|
||||||
|
}
|
||||||
|
small {
|
||||||
|
color: $secondary-text-color;
|
||||||
|
margin-left: 5px;
|
||||||
|
margin-right: 4px;
|
||||||
|
display: inline-block;
|
||||||
|
min-width: 35px;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
background: $primary-background;
|
||||||
|
}
|
||||||
|
.red-ui-color-picker-cell {
|
||||||
|
padding: 0;
|
||||||
|
border-style: solid;
|
||||||
|
border-width: 1px;
|
||||||
|
border-color: $secondary-border-color;
|
||||||
|
}
|
||||||
|
.red-ui-color-picker-swatch {
|
||||||
|
position: absolute;
|
||||||
|
top:0;right:0;left:0;bottom:0;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.red-ui-color-picker-cell-none {
|
||||||
|
height: 100%;
|
||||||
|
background-color: #FFF;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
background-position: 0 0, 50% 50%;
|
||||||
|
background-image: linear-gradient(45deg, transparent 45%, $secondary-border-color 45%, $secondary-border-color 55%, transparent 55%, transparent),linear-gradient(-45deg, transparent 45%, $secondary-border-color 45%, $secondary-border-color 55%, transparent 55%, transparent)
|
||||||
|
}
|
||||||
|
.red-ui-search-result-node .red-ui-color-picker-cell-none {
|
||||||
|
border-radius: 4px;
|
||||||
|
background-size: 50% 50%;
|
||||||
|
background-image: linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee), linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 75%, #eee);
|
||||||
|
}
|
||||||
|
|
||||||
|
.red-ui-color-picker-opacity-slider {
|
||||||
|
position:relative;
|
||||||
|
vertical-align: middle;
|
||||||
|
display: inline-block;
|
||||||
|
width: calc(100% - 50px);
|
||||||
|
height: 14px;
|
||||||
|
margin: 6px 3px 8px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
background-color: white;
|
||||||
|
background-image:
|
||||||
|
linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, #eee 25%),
|
||||||
|
linear-gradient(-45deg, #eee 25%, transparent 25%, transparent 75%, #eee 25%);
|
||||||
|
background-size: 6px 6px;
|
||||||
|
}
|
||||||
|
.red-ui-color-picker-opacity-slider-overlay {
|
||||||
|
position: absolute;
|
||||||
|
top:0;right:0;left:0;bottom:0;
|
||||||
|
background-image:linear-gradient(90deg, transparent 0%, #f00 100%);
|
||||||
|
background-size: 100% 100%;
|
||||||
|
border: 1px solid $primary-border-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.red-ui-button-small.red-ui-color-picker-opacity-slider-handle {
|
||||||
|
z-Index: 10;
|
||||||
|
top: -4px;
|
||||||
|
cursor: pointer;
|
||||||
|
min-width: 0;
|
||||||
|
width: 10px;
|
||||||
|
height: 22px;
|
||||||
|
padding: 0;
|
||||||
|
border: 1px solid $primary-border-color;
|
||||||
|
border-radius: 1px;
|
||||||
|
background: $secondary-background;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
.red-ui-icon-picker {
|
.red-ui-icon-picker {
|
||||||
select {
|
select {
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
|
Loading…
Reference in New Issue
Block a user