You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

218 lines
5.5 KiB

var canvas
var context
var getFromWeb = true
var mouseDown = false
var scale = .6
var outset = 15
var columnWidth = 256
var maxHeight = 256
var lastLink = null
var lastLinkStr = null
var labelback = {}
var loadedImages = 0
var images = {}
var imagesLength = 0;
function recContains(rec, value) {
if (!value.length)
return 0
var lc = value.toLowerCase()
if (rec.name.toLowerCase().indexOf(lc) >= 0)
return 1
if (rec.code.toLowerCase().indexOf(lc) >= 0)
return 2
return 3
}
function setLink(recstr) {
var under
var link = recstr
if (!link.startsWith("Sk")) {
under = link.indexOf('_')
link = link.substring(under + 1)
}
under = link.lastIndexOf('_')
var len = link.length
if (under == len - 2) {
var letter = link[len - 1]
if ('a' <= letter && letter <= 'z') {
link = link.substr(0, len - 2)
} else if ('0' <= letter && letter <= '9') {
link = link.substr(0, len - 2)
}
}
lastLinkStr = link
}
function showLink() {
var link = lastLink.file + '#' + lastLinkStr
context.save()
context.font = "normal 16px Arial";
labelback.w = Math.max(labelback.w, context.measureText(link).width + 8)
context.beginPath()
context.rect(labelback.x, labelback.y, labelback.w, labelback.h)
context.fillStyle = "rgba(232,180,220, 1)"
context.fill()
context.fillStyle = "rgba(64,32,48, 1)"
context.fillText(link, labelback.x + 4, labelback.y + 16)
context.restore()
}
function imageIterator(callout, state) {
var row = outset + 30
var column = outset
for (var recstr in pngs) {
var rec = pngs[recstr]
var contains = recContains(rec, input.value)
if (3 == contains)
continue;
var height = rec.height < maxHeight ? rec.height : maxHeight
if (callout(state, column, row, height, contains, recstr))
break;
row += height + outset
if (row >= canvas.height / scale) {
row = 0
column += columnWidth + outset
if (column >= canvas.width / scale) {
break
}
}
}
}
function handleMouseOver(event) {
var callout = function(state, column, row, height, contains, recstr) {
if (state.x >= column && state.x <= column + columnWidth &&
state.y >= row && state.y <= row + height) {
document.body.style.cursor = "pointer"
lastLink = pngs[recstr]
setLink(recstr)
showLink()
return true
}
return false
}
var state = {
x: (event.clientX - 5) / scale,
y: (event.clientY - 7) / scale
}
document.body.style.cursor = ""
lastLink = null
imageIterator(callout, state)
}
function handleMouseClick() {
if (null != lastLink) {
var link = 'https://skia.org/user/api/' + lastLink.file + '#' + lastLinkStr
window.location = link
}
}
function doKeyPress(evt) {
idiv.style.height = 20
input.focus()
}
function drawImage(hash, x, y, w, h, contains) {
context.save()
context.transform(scale, 0, 0, scale, 0, 0)
context.save()
context.beginPath()
context.rect(x, y, w, h)
context.clip()
context.drawImage(images[hash], x, y)
context.restore()
context.beginPath()
context.rect(x, y, w, h)
context.strokeStyle = 1 == contains ? "red" : "black"
context.stroke()
context.restore()
}
function draw() {
var callout = function(state, column, row, height, contains, recstr) {
drawImage(pngs[recstr].hash, column, row, columnWidth, height, contains)
return false
}
imageIterator(callout, null)
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function redraw() {
context.strokeStyle = "white"
context.beginPath()
context.fillStyle = "white"
context.rect(0, 30, canvas.width, canvas.height)
context.fill()
context.rect((256 + outset) * scale, 0, canvas.width, 30)
context.fill()
for (var image in images) {
image.drawn = false
}
do {
draw();
if (loadedImages >= imagesLength)
break;
console.debug(" loadedImages:" + loadedImages + " imagesLength:" + imagesLength)
await sleep(1000);
} while (true)
}
function resize() {
setSize()
redraw()
}
function setSize() {
canvas.width = window.innerWidth - 20
canvas.height = window.innerHeight - 20
labelback.x = 0
labelback.y = canvas.height - 20
labelback.w = 0
labelback.h = 20
}
function loadImages() {
for (var recstr in pngs) {
var rec = pngs[recstr]
var image = new Image()
images[rec.hash] = image
if (getFromWeb)
image.src = 'https://fiddle.skia.org/i/'
image.src += rec.hash + '_raster.png'
image.onload = function () {
loadedImages += 1
}
imagesLength += 1;
}
}
function start() {
loadImages()
window.addEventListener('keypress', doKeyPress, true);
window.addEventListener('keydown', doKeyPress, true);
canvas = document.getElementById('canvas')
context = canvas.getContext('2d')
resize()
}
</script>
</head>
<body onLoad="start()" onresize="resize()">
<div style="height:0" id="idiv">
<input type="text" id="input" onkeypress="redraw()" onkeydown="redraw()"/>
</div>
<canvas id="canvas" width="750" height="500"
onmousedown="mouseDown = true"
onmouseup="mouseDown = false"
onmousemove="handleMouseOver(event)"
onclick="handleMouseClick()"
></canvas >
</body>
</html>