Skip to content
Snippets Groups Projects
Commit 87148630 authored by AndiMajore's avatar AndiMajore
Browse files

updating expression overlay

parent 90f94609
No related branches found
No related tags found
No related merge requests found
......@@ -89,7 +89,7 @@ export function rgbaToHex(rgba) {
// https://stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb
function componentToHex(c) {
const hex = c.toString(16);
return hex.length == 1 ? '0' + hex : hex;
return hex.length === 1 ? '0' + hex : hex;
}
export function rgbToHex(rgb) {
......@@ -100,6 +100,14 @@ export function rgbToHex(rgb) {
return '#' + componentToHex(r) + componentToHex(g) + componentToHex(b);
}
export function rgbaWithoutAToHex(rgb) {
const inParts = rgb.substring(rgb.indexOf('(')).split(','),
r = parseInt(trim(inParts[0].substring(1)), 10),
g = parseInt(trim(inParts[1]), 10),
b = parseInt(trim(inParts[2]), 10);
return '#' + componentToHex(r) + componentToHex(g) + componentToHex(b);
}
// https://stackoverflow.com/questions/1573053/javascript-function-to-convert-color-names-to-hex-codes/47355187#47355187
export function standardizeColor(str) {
var ctx = document.createElement('canvas').getContext('2d');
......@@ -144,41 +152,79 @@ export function RGBAtoRGBwithoutA(rgbaString) {
return `rgb(${RGBA.red},${RGBA.green},${RGBA.blue})`;
}
export function RGBAtoRGB(rgbaString) {
function hexToRGBA(hex, alpha) {
let r;
let g;
let b;
if (hex.length < 5) {
r = parseInt(hex.slice(1, 2) + hex.slice(1, 2), 16);
g = parseInt(hex.slice(2, 3) + hex.slice(2, 3), 16);
b = parseInt(hex.slice(3, 4) + hex.slice(3, 4), 16);
} else {
r = parseInt(hex.slice(1, 3), 16);
g = parseInt(hex.slice(3, 5), 16);
b = parseInt(hex.slice(5, 7), 16);
}
if (alpha) {
return 'rgba(' + (isNaN(r) ? 0 : r) + ', ' + (isNaN(g) ? 0 : g) + ', ' + (isNaN(b) ? 0 : b) + ', ' + alpha + ')';
} else {
return 'rgb(' + (isNaN(r) ? 0 : r) + ', ' + isNaN(g) ? 0 : g + ', ' + isNaN(b) ? 0 : b + ')';
}
}
// https://gist.github.com/JordanDelcros/518396da1c13f75ee057?permalink_comment_id=2075095#gistcomment-2075095
export function blendColors(args: any) {
let base = [0, 0, 0, 0];
let mix;
for (let added of args) {
added = RGBAtoArray(added);
if (typeof added[3] === 'undefined') {
added[3] = 1;
}
// check if both alpha channels exist.
if (base[3] && added[3]) {
mix = [0, 0, 0, 0];
// alpha
mix[3] = 1 - (1 - added[3]) * (1 - base[3]);
// red
mix[0] = Math.round((added[0] * added[3] / mix[3]) + (base[0] * base[3] * (1 - added[3]) / mix[3]));
// green
mix[1] = Math.round((added[1] * added[3] / mix[3]) + (base[1] * base[3] * (1 - added[3]) / mix[3]));
// blue
mix[2] = Math.round((added[2] * added[3] / mix[3]) + (base[2] * base[3] * (1 - added[3]) / mix[3]));
} else if (added) {
mix = added;
} else {
mix = base;
}
base = mix;
}
return 'rgba(' + mix[0] + ', ' + mix[1] + ', ' + mix[2] + ', ' + mix[3] + ')';
}
export function RGBAtoArray(rgbaString) {
const rgbaStringSplit = rgbaString.slice(5, -1).split(',');
const RGBA = {
red: rgbaStringSplit[0],
green: rgbaStringSplit[1],
blue: rgbaStringSplit[2],
alpha: rgbaStringSplit[3]
};
// assume white background
const bg = {red: 255, green: 255, blue: 255};
const RGB = {red: undefined, green: undefined, blue: undefined};
const alpha = 1 - RGBA.alpha;
RGB.red = Math.round((RGBA.alpha * (RGBA.red / 255) + (alpha * (bg.red / 255))) * 255);
RGB.green = Math.round((RGBA.alpha * (RGBA.green / 255) + (alpha * (bg.green / 255))) * 255);
RGB.blue = Math.round((RGBA.alpha * (RGBA.blue / 255) + (alpha * (bg.blue / 255))) * 255);
return `rgb(${RGB.red},${RGB.green},${RGB.blue})`;
return [
rgbaStringSplit[0],
rgbaStringSplit[1],
rgbaStringSplit[2],
rgbaStringSplit[3]
];
}
export function pieChartContextRenderer({ctx, x, y, state: {selected, hover}, style, label}) {
ctx.drawPieLabel = function(style, x, y, label) {
ctx.font = 'normal 12px sans-serif';
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.fillStyle = 'black';
ctx.fillStyle = window.getComputedStyle(document.documentElement).getPropertyValue('--drgstn-text-primary');
ctx.fillText(label, x, y + style.size + 12);
};
ctx.drawPie = function(style, x, y, state: { selected, hover }) {
const selection = RGBAtoRGBwithoutA(style.borderColor) !== RGBAtoRGBwithoutA(style.color);
const total = 1;
// draw shadow
const selectedColor = style.borderColor;
if (selected) {
style.borderColor = style.color;
}
function startShadow() {
if (style.shadow) {
ctx.save();
ctx.shadowColor = style.shadowColor;
......@@ -186,60 +232,67 @@ export function pieChartContextRenderer({ctx, x, y, state: {selected, hover}, st
ctx.shadowOffsetY = style.shadowY;
ctx.shadowBlur = 10;
}
// draw white background circle
}
function endShadow() {
if (style.shadow) {
// removing shadow application of future fill or stroke calls
ctx.restore();
}
}
ctx.drawPie = function(style, x, y, state: { selected, hover }) {
const selection = RGBAtoRGBwithoutA(style.borderColor) !== RGBAtoRGBwithoutA(style.color);
const bgOpacity = 0.15;
const fgOpacity = 0.5;
const lineOpacity = 0.6;
const fullCircle = 2 * Math.PI;
const fallbackColor = '#FF0000';
const colorOrFallback = style.color ? style.color : fallbackColor;
let outerBorderColor = style.borderColor;
if (selection) {
outerBorderColor = style.borderColor ? rgbaWithoutAToHex(style.borderColor) : fallbackColor;
}
if (selected) {
style.borderColor = style.color;
}
ctx.beginPath();
ctx.fillStyle = 'white';
// or fill like background of graph panel
// ctx.fillStyle= window.getComputedStyle(document.documentElement).getPropertyValue('--drgstn-panel');
ctx.arc(x, y, style.size - 1, 0, 2 * Math.PI, false);
// fill like background of graph panel
ctx.fillStyle = RGBAtoRGBwithoutA(blendColors([hexToRGBA(window.getComputedStyle(document.documentElement).getPropertyValue('--drgstn-panel'), 1), hexToRGBA(colorOrFallback, bgOpacity)]));
startShadow();
ctx.fill();
endShadow();
ctx.stroke();
// prepare pi-chart
ctx.fillStyle = style.color ? style.color : 'rgba(255, 0, 0, 1)';
// set alpha value to 1
ctx.fillStyle = RGBAtoRGB(ctx.fillStyle);
ctx.fillStyle = hexToRGBA(colorOrFallback, fgOpacity);
ctx.beginPath();
ctx.moveTo(x, y);
const len = style.opacity / total * 2 * Math.PI;
ctx.arc(x, y, style.size - 1, 0, len, false);
ctx.lineTo(x, y);
ctx.arc(x, y, style.size - 1, 0, style.opacity * fullCircle, false);
ctx.fill();
if (style.shadow) {
// removing shadow application of future fill or stroke calls
ctx.restore();
}
ctx.strokeStyle = style.borderColor ? style.borderColor : 'black';
if (selection) {
ctx.strokeStyle = selectedColor ? selectedColor : 'balck';
}
ctx.lineTo(x, y);
ctx.lineWidth = selected ? 3 : 2;
if (style.opacity !== total) {
if (style.opacity < 1) {
// avoid the inner line when circle is complete
ctx.strokeStyle = hexToRGBA(outerBorderColor, lineOpacity);
ctx.stroke();
}
ctx.strokeStyle = RGBAtoRGBwithoutA(ctx.strokeStyle);
// draw the surrounding border circle
// draw outer circle
ctx.strokeStyle = outerBorderColor;
ctx.beginPath();
ctx.arc(x, y, style.size - (selected ? 0 : 1), 0, 2 * Math.PI);
// ctx.strokeStyle = style.borderColor ? style.borderColor : 'black';
// // set alpha value to 1
// ctx.strokeStyle = RGBAtoRGBwithoutA(ctx.strokeStyle);
ctx.arc(x, y, style.size - (selected ? 0 : 1), 0, fullCircle);
ctx.stroke();
if (selection) {
ctx.strokeStyle = selectedColor ? selectedColor : 'black';
} else {
ctx.strokeStyle = style.color ? style.color : 'black';
}
// draw inner circle (double circle if selected)
if (selected || selection) {
ctx.beginPath();
ctx.strokeStyle = style.color ? style.color : 'black';
ctx.strokeStyle = RGBAtoRGBwithoutA(ctx.strokeStyle);
ctx.arc(x, y, style.size - 2, 0, 2 * Math.PI);
// ctx.strokeStyle = style.borderColor ? style.borderColor : 'black';
// // set alpha value to 1
// ctx.strokeStyle = RGBAtoRGBwithoutA(ctx.strokeStyle);
ctx.strokeStyle = hexToRGBA(colorOrFallback, lineOpacity);
ctx.arc(x, y, style.size - 2, 0, fullCircle);
ctx.stroke();
}
};
......
......@@ -59,7 +59,7 @@ Export As Graphml Button<br>
<br>
<br>
<b>Datasets</b>
<input type="checkbox" onclick=changeLicenced(this.checked)/> Use licenced datasets<br>
<input type="checkbox" onclick=changeLicenced(this.checked)> Use licenced datasets<br>
<div>
<i>Protein-Protein Interactions</i>
<select name="Protein-Protein Interactions" onchange="applyDataset()" id="ppi-dataset">
......@@ -111,8 +111,8 @@ Export As Graphml Button<br>
<div style="max-width: 80vw; width: 1276px; height: 500px">
<drugst-one id="tatata"
groups='{ "nodeGroups" : { "selectedNode": { "borderWidth": 3,"borderWidthSelected": 4,"color": { "border": "#ff1818","highlight": {"border": "#ff1818"}},"font": { "color": "#F8981","size": 14 }},"Protein":{"shape":"circle","groupName":"Protein","type":"Protein","color":"#172b4d","font":{"color":"#ffffff"}}}}'
config='{"identifier":"symbol","title":"ROBUST output network", "taskDrugName": "Drug Search", "showLegendNodes": true, "showLegendEdges": true, "showSidebar": "left", "showOverview": true, "legendPos": "left", "legendClass": "legend", "showQuery": true, "showItemSelector": true,"showSimpleAnalysis": false,"showAdvAnalysis": true,"showSelection": true,"showTasks": true,"showNetworkMenu": "right","showLegend": true,"showNetworkMenuButtonExpression": true, "showNetworkMenuButtonScreenshot": true,"showNetworkMenuButtonExportGraphml": true,"showNetworkMenuButtonAdjacentDrugs": true,"showNetworkMenuButtonCenter": true,"showConnectGenes": false,"networkMenuButtonAdjacentDrugsLabel": "Drugs","showNetworkMenuButtonAdjacentDisordersProteins": true,"networkMenuButtonAdjacentDisordersProteinsLabel": "Disorders (protein)","showNetworkMenuButtonAdjacentDisordersDrugs": true,"networkMenuButtonAdjacentDisordersDrugsLabel": "Disorders (drug)","showNetworkMenuButtonAnimation": true,"networkMenuButtonAnimationLabel": "Animation", "autofillEdges": true, "physicsOn": false,"useNedrexLicenced": true,"selfReferences": false, "interactionDrugProtein": "NeDRex", "indicationDrugDisorder": "NeDRex","nodeShadow": true,"edgeShadow": true, "algorithms": {"drug": ["trustrank", "closeness", "degree", "proximity"], "drug-target": ["trustrank", "multisteiner", "keypathwayminer", "degree", "closeness", "betweenness"]}, "associatedProteinDisorder": "NeDRex", "expandNetworkMenu": true}'
groups='{ "edgeGroups":{"default":{"color":"#000000","groupName":"default edge"}}, "nodeGroups" : { "selectedNode": { "borderWidth": 3,"borderWidthSelected": 4,"color": { "border": "#C80BFD","highlight": {"border": "#C80BFD"}},"font": { "color": "#0000000","size": 14 }},"Protein":{"shape":"circle","groupName":"Protein","type":"Protein","color":"#C99AFFFF","font":{"color":"#FFFFFF"}}}}'
config='{"identifier":"symbol","title":"ROBUST output network", "taskDrugName": "Drug Search", "showLegendNodes": true, "showLegendEdges": true, "showSidebar": "left", "showOverview": true, "legendPos": "left", "legendClass": "legend", "showQuery": true, "showItemSelector": true,"showSimpleAnalysis": false,"showAdvAnalysis": true,"showSelection": true,"showTasks": true,"showNetworkMenu": "right","showLegend": true,"showNetworkMenuButtonExpression": true, "showNetworkMenuButtonScreenshot": true,"showNetworkMenuButtonExportGraphml": true,"showNetworkMenuButtonAdjacentDrugs": true,"showNetworkMenuButtonCenter": true,"showConnectGenes": false,"networkMenuButtonAdjacentDrugsLabel": "Drugs","showNetworkMenuButtonAdjacentDisordersProteins": true,"networkMenuButtonAdjacentDisordersProteinsLabel": "Disorders (protein)","showNetworkMenuButtonAdjacentDisordersDrugs": true,"networkMenuButtonAdjacentDisordersDrugsLabel": "Disorders (drug)","showNetworkMenuButtonAnimation": true,"networkMenuButtonAnimationLabel": "Animation", "autofillEdges": true, "physicsOn": false,"useNedrexLicenced": true,"selfReferences": false, "interactionDrugProtein": "NeDRex", "indicationDrugDisorder": "NeDRex","nodeShadow": true,"edgeShadow": false, "algorithms": {"drug": ["trustrank", "closeness", "degree", "proximity"], "drug-target": ["trustrank", "multisteiner", "keypathwayminer", "degree", "closeness", "betweenness"]}, "associatedProteinDisorder": "NeDRex", "expandNetworkMenu": true}'
network='{"nodes": [{"id":"PSEN1","group":"Protein","label":"PSEN1"},{"id":"PSEN2","group":"Protein","label":"PSEN2"},{"id":"APP","group":"Protein","label":"APP"},{"id":"APOE","group":"Protein","label":"APOE"},{"id":"RNF32","group":"Protein","label":"RNF32"},{"id":"STX5","group":"Protein","label":"STX5"},{"id":"TRAF3IP1","group":"Protein","label":"TRAF3IP1"},{"id":"PHB1","group":"Protein","label":"PHB1"},{"id":"MAPT","group":"Protein","label":"MAPT"},{"id":"ESR1","group":"Protein","label":"ESR1"},{"id":"IRF3","group":"Protein","label":"IRF3"},{"id":"DYNC1H1","group":"Protein","label":"DYNC1H1"},{"id":"CUL3","group":"Protein","label":"CUL3"},{"id":"HMGB1","group":"Protein","label":"HMGB1"},{"id":"DNAJC7","group":"Protein","label":"DNAJC7"},{"id":"NEFM","group":"Protein","label":"NEFM"},{"id":"DISC1","group":"Protein","label":"DISC1"},{"id":"PPP5C","group":"Protein","label":"PPP5C"},{"id":"CTNNB1","group":"Protein","label":"CTNNB1"},{"id":"KRAS","group":"Protein","label":"KRAS"}]}'
></drugst-one>
......@@ -171,7 +171,7 @@ Export As Graphml Button<br>
}
function initTaskEventListener() {
let color1 = '#ff1818'
let color1 = '#c80bfd'
document.getElementsByTagName("drugst-one")[0].addEventListener("taskEvent", (event) => {
console.log(event.detail)
})
......@@ -241,6 +241,9 @@ Export As Graphml Button<br>
</body>
</html>
<style>
/*:root {--drgstn-font-family: Oxygen}*/
:root {
/*--drgstn-panel: #000;*/
/*--drgstn-text-primary: #fff;*/
}
</style>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment