diff --git a/examples/clay-official-website/build/clay/index.html b/examples/clay-official-website/build/clay/index.html index f68b2d1..2cbf9ce 100644 --- a/examples/clay-official-website/build/clay/index.html +++ b/examples/clay-official-website/build/clay/index.html @@ -166,6 +166,7 @@ { name: 'link', ...stringDefinition }, { name: 'cursorPointer', type: 'uint8_t' }, { name: 'disablePointerEvents', type: 'uint8_t' }, + { name: 'padding', type: 'uint16_t'} ]}; let renderCommandDefinition = { name: 'Clay_RenderCommand', @@ -425,10 +426,13 @@ if (!elementCache[renderCommand.id.value]) { let elementType = 'div'; switch (renderCommand.commandType.value & 0xff) { + case CLAY_RENDER_COMMAND_TYPE_TEXT: case CLAY_RENDER_COMMAND_TYPE_RECTANGLE: { - // if (readStructAtAddress(renderCommand.renderData.rectangle.value, rectangleRenderDataDefinition).link.length.value > 0) { TODO reimplement links - // elementType = 'a'; - // } + if (renderCommand.userData.value !== 0) { + if (readStructAtAddress(renderCommand.userData.value, customHTMLDataDefinition).link.length.value > 0) { + elementType = 'a'; + } + } break; } case CLAY_RENDER_COMMAND_TYPE_IMAGE: { @@ -549,7 +553,6 @@ } case (CLAY_RENDER_COMMAND_TYPE_TEXT): { let config = renderCommand.renderData.text; - let customData = readStructAtAddress(renderCommand.userData.value, customHTMLDataDefinition); let configMemory = JSON.stringify(config); let stringContents = new Uint8Array(memoryDataView.buffer.slice(config.stringContents.chars.value, config.stringContents.chars.value + config.stringContents.length.value)); if (configMemory !== elementData.previousMemoryConfig) { @@ -559,7 +562,24 @@ element.style.color = `rgba(${textColor.r.value}, ${textColor.g.value}, ${textColor.b.value}, ${textColor.a.value})`; element.style.fontFamily = fontsById[config.fontId.value]; element.style.fontSize = fontSize + 'px'; - element.style.pointerEvents = customData.disablePointerEvents.value ? 'none' : 'all'; + if (renderCommand.userData.value !== 0) { + let customData = readStructAtAddress(renderCommand.userData.value, customHTMLDataDefinition); + console.log(customData.disablePointerEvents.value); + element.style.pointerEvents = customData.disablePointerEvents.value ? 'none' : 'all'; + let linkContents = customData.link.length.value > 0 ? textDecoder.decode(new Uint8Array(memoryDataView.buffer.slice(customData.link.chars.value, customData.link.chars.value + customData.link.length.value))) : 0; + memoryDataView.setUint32(0, renderCommand.id.value, true); + if (linkContents.length > 0 && (window.mouseDownThisFrame || window.touchDown) && instance.exports.Clay_PointerOver(0)) { + window.location.href = linkContents; + } + if (linkContents.length > 0) { + element.href = linkContents; + } + + if (linkContents.length > 0 || customData.cursorPointer.value) { + element.style.pointerEvents = 'all'; + element.style.cursor = 'pointer'; + } + } elementData.previousMemoryConfig = configMemory; } if (stringContents.length !== elementData.previousMemoryText.length || MemoryIsDifferent(stringContents, elementData.previousMemoryText, stringContents.length)) { diff --git a/examples/clay-official-website/build/clay/index.wasm b/examples/clay-official-website/build/clay/index.wasm index 32882f5..c42e121 100755 Binary files a/examples/clay-official-website/build/clay/index.wasm and b/examples/clay-official-website/build/clay/index.wasm differ diff --git a/examples/clay-official-website/index.html b/examples/clay-official-website/index.html index f68b2d1..2c58034 100644 --- a/examples/clay-official-website/index.html +++ b/examples/clay-official-website/index.html @@ -166,6 +166,7 @@ { name: 'link', ...stringDefinition }, { name: 'cursorPointer', type: 'uint8_t' }, { name: 'disablePointerEvents', type: 'uint8_t' }, + { name: 'padding', type: 'uint16_t'} ]}; let renderCommandDefinition = { name: 'Clay_RenderCommand', @@ -425,10 +426,13 @@ if (!elementCache[renderCommand.id.value]) { let elementType = 'div'; switch (renderCommand.commandType.value & 0xff) { + case CLAY_RENDER_COMMAND_TYPE_TEXT: case CLAY_RENDER_COMMAND_TYPE_RECTANGLE: { - // if (readStructAtAddress(renderCommand.renderData.rectangle.value, rectangleRenderDataDefinition).link.length.value > 0) { TODO reimplement links - // elementType = 'a'; - // } + if (renderCommand.userData.value !== 0) { + if (readStructAtAddress(renderCommand.userData.value, customHTMLDataDefinition).link.length.value > 0) { + elementType = 'a'; + } + } break; } case CLAY_RENDER_COMMAND_TYPE_IMAGE: { @@ -549,7 +553,6 @@ } case (CLAY_RENDER_COMMAND_TYPE_TEXT): { let config = renderCommand.renderData.text; - let customData = readStructAtAddress(renderCommand.userData.value, customHTMLDataDefinition); let configMemory = JSON.stringify(config); let stringContents = new Uint8Array(memoryDataView.buffer.slice(config.stringContents.chars.value, config.stringContents.chars.value + config.stringContents.length.value)); if (configMemory !== elementData.previousMemoryConfig) { @@ -559,7 +562,23 @@ element.style.color = `rgba(${textColor.r.value}, ${textColor.g.value}, ${textColor.b.value}, ${textColor.a.value})`; element.style.fontFamily = fontsById[config.fontId.value]; element.style.fontSize = fontSize + 'px'; - element.style.pointerEvents = customData.disablePointerEvents.value ? 'none' : 'all'; + if (renderCommand.userData.value !== 0) { + let customData = readStructAtAddress(renderCommand.userData.value, customHTMLDataDefinition); + element.style.pointerEvents = customData.disablePointerEvents.value ? 'none' : 'all'; + let linkContents = customData.link.length.value > 0 ? textDecoder.decode(new Uint8Array(memoryDataView.buffer.slice(customData.link.chars.value, customData.link.chars.value + customData.link.length.value))) : 0; + memoryDataView.setUint32(0, renderCommand.id.value, true); + if (linkContents.length > 0 && (window.mouseDownThisFrame || window.touchDown) && instance.exports.Clay_PointerOver(0)) { + window.location.href = linkContents; + } + if (linkContents.length > 0) { + element.href = linkContents; + } + + if (linkContents.length > 0 || customData.cursorPointer.value) { + element.style.pointerEvents = 'all'; + element.style.cursor = 'pointer'; + } + } elementData.previousMemoryConfig = configMemory; } if (stringContents.length !== elementData.previousMemoryText.length || MemoryIsDifferent(stringContents, elementData.previousMemoryText, stringContents.length)) { diff --git a/examples/clay-official-website/main.c b/examples/clay-official-website/main.c index 3064c66..efe0a35 100644 --- a/examples/clay-official-website/main.c +++ b/examples/clay-official-website/main.c @@ -44,7 +44,7 @@ typedef struct { Arena frameArena = {}; -typedef struct { +typedef struct d { Clay_String link; bool cursorPointer; bool disablePointerEvents; @@ -345,11 +345,18 @@ Clay_RenderCommandArray CreateLayout(bool mobileScreen, float lerpValue) { CLAY_TEXT(CLAY_STRING("Clay"), &headerTextConfig); CLAY({ .id = CLAY_ID("Spacer"), .layout = { .sizing = { .width = CLAY_SIZING_GROW(0) } } }) {} if (!mobileScreen) { - CLAY({ .id = CLAY_ID("LinkExamplesOuter"), .layout = { .padding = {8, 8} }, .userData = FrameAllocateCustomData((CustomHTMLData) { .link = CLAY_STRING("https://github.com/nicbarker/clay/tree/main/examples") }) }) { - CLAY_TEXT(CLAY_STRING("Examples"), CLAY_TEXT_CONFIG({ .fontId = FONT_ID_BODY_24, .fontSize = 24, .textColor = {61, 26, 5, 255} })); + CLAY({ .id = CLAY_ID("LinkExamplesOuter"), .layout = { .padding = {8, 8} } }) { + CLAY_TEXT(CLAY_STRING("Examples"), CLAY_TEXT_CONFIG({ + .userData = FrameAllocateCustomData((CustomHTMLData) { + .link = CLAY_STRING("https://github.com/nicbarker/clay/tree/main/examples") + }), + .fontId = FONT_ID_BODY_24, .fontSize = 24, .textColor = {61, 26, 5, 255} })); } - CLAY({ .id = CLAY_ID("LinkDocsOuter"), .layout = { .padding = {8, 8} }, .userData = FrameAllocateCustomData((CustomHTMLData) { .link = CLAY_STRING("https://github.com/nicbarker/clay/blob/main/README.md") }) }) { - CLAY_TEXT(CLAY_STRING("Docs"), CLAY_TEXT_CONFIG({ .fontId = FONT_ID_BODY_24, .fontSize = 24, .textColor = {61, 26, 5, 255} })); + CLAY({ .id = CLAY_ID("LinkDocsOuter"), .layout = { .padding = {8, 8} } }) { + CLAY_TEXT(CLAY_STRING("Docs"), CLAY_TEXT_CONFIG({ + .userData = FrameAllocateCustomData((CustomHTMLData) { .link = CLAY_STRING("https://github.com/nicbarker/clay/blob/main/README.md") }), + .fontId = FONT_ID_BODY_24, .fontSize = 24, .textColor = {61, 26, 5, 255} }) + ); } } CLAY({ @@ -357,9 +364,11 @@ Clay_RenderCommandArray CreateLayout(bool mobileScreen, float lerpValue) { .backgroundColor = Clay_Hovered() ? COLOR_LIGHT_HOVER : COLOR_LIGHT, .border = { .width = {2, 2, 2, 2}, .color = COLOR_RED }, .cornerRadius = CLAY_CORNER_RADIUS(10), - .userData = FrameAllocateCustomData((CustomHTMLData) { .link = CLAY_STRING("https://github.com/nicbarker/clay/tree/main/examples") }), + .userData = FrameAllocateCustomData((CustomHTMLData) { .link = CLAY_STRING("https://discord.gg/b4FTWkxdvT") }), }) { - CLAY_TEXT(CLAY_STRING("Discord"), CLAY_TEXT_CONFIG({ .fontId = FONT_ID_BODY_24, .fontSize = 24, .textColor = {61, 26, 5, 255} })); + CLAY_TEXT(CLAY_STRING("Discord"), CLAY_TEXT_CONFIG({ + .userData = FrameAllocateCustomData((CustomHTMLData) { .disablePointerEvents = true }), + .fontId = FONT_ID_BODY_24, .fontSize = 24, .textColor = {61, 26, 5, 255} })); } CLAY({ .layout = { .padding = {16, 16, 6, 6} }, @@ -368,7 +377,9 @@ Clay_RenderCommandArray CreateLayout(bool mobileScreen, float lerpValue) { .cornerRadius = CLAY_CORNER_RADIUS(10), .userData = FrameAllocateCustomData((CustomHTMLData) { .link = CLAY_STRING("https://github.com/nicbarker/clay") }), }) { - CLAY_TEXT(CLAY_STRING("Github"), CLAY_TEXT_CONFIG({ .fontId = FONT_ID_BODY_24, .fontSize = 24, .textColor = {61, 26, 5, 255} })); + CLAY_TEXT(CLAY_STRING("Github"), CLAY_TEXT_CONFIG({ + .userData = FrameAllocateCustomData((CustomHTMLData) { .disablePointerEvents = true }), + .fontId = FONT_ID_BODY_24, .fontSize = 24, .textColor = {61, 26, 5, 255} })); } } Clay_LayoutConfig topBorderConfig = (Clay_LayoutConfig) { .sizing = { CLAY_SIZING_GROW(0), CLAY_SIZING_FIXED(4) }};