From e66f1d72de2311a4ad55f9af88eec08162ea349c Mon Sep 17 00:00:00 2001 From: thawk Date: Wed, 19 Jan 2022 17:52:45 +0800 Subject: [PATCH] add data-rel-inherit --- js/impress.js | 29 ++++++++++++++++++++++++++++- src/plugins/rel/rel.js | 32 +++++++++++++++++++++++++++++++- 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/js/impress.js b/js/impress.js index b8a4095ea..573d7b0bf 100644 --- a/js/impress.js +++ b/js/impress.js @@ -4125,9 +4125,10 @@ }; } + var ref = prev; if ( data.relTo ) { - var ref = document.getElementById( data.relTo ); + ref = document.getElementById( data.relTo ); if ( ref ) { // Test, if it is a previous step that already has some assigned position data @@ -4164,6 +4165,7 @@ } } + // While ``data-rel-reset="relative"`` or just ``data-rel-reset``, // ``data-rel-x/y/z`` and ``data-rel-rotate-x/y/z`` will have default value of 0, // instead of inherit from previous slide. @@ -4185,6 +4187,25 @@ if ( data.relReset === "all" ) { inheritRotation = false; } + } else if ( el.hasAttribute( "data-rel-inherit" ) ) { + var inheritFrom = null; + if ( data.relInherit ) { + + // If data-rel-inherit has value, it's the referenced node + inheritFrom = document.getElementById( data.relInherit ); + } + + if ( ! inheritFrom ) { + inheritFrom = ref; + } + + prev.relative.x = toNumberAdvanced( inheritFrom.getAttribute( "data-rel-x" ), 0 ); + prev.relative.y = toNumberAdvanced( inheritFrom.getAttribute( "data-rel-y" ), 0 ); + prev.relative.z = toNumberAdvanced( inheritFrom.getAttribute( "data-rel-z" ), 0 ); + prev.relative.rotate.x = toNumberAdvanced( inheritFrom.getAttribute( "data-rel-rotate-x" ), 0 ); + prev.relative.rotate.y = toNumberAdvanced( inheritFrom.getAttribute( "data-rel-rotate-y" ), 0 ); + prev.relative.rotate.z = toNumberAdvanced( inheritFrom.getAttribute( "data-rel-rotate-z" ), 0 ); + prev.relative.rotate.order = inheritFrom.getAttribute( "data-rel-rotate-order" ) || "xyz"; } var step = { @@ -4296,6 +4317,12 @@ el.setAttribute( "data-rotate-z", step.rotate.z ); el.setAttribute( "data-rotate-order", step.rotate.order ); el.setAttribute( "data-rel-position", step.relative.position ); + el.setAttribute( "data-rel-x", step.relative.x ); + el.setAttribute( "data-rel-y", step.relative.y ); + el.setAttribute( "data-rel-z", step.relative.z ); + el.setAttribute( "data-rel-rotate-x", step.relative.rotate.x ); + el.setAttribute( "data-rel-rotate-y", step.relative.rotate.y ); + el.setAttribute( "data-rel-rotate-z", step.relative.rotate.z ); prev = step; } }; diff --git a/src/plugins/rel/rel.js b/src/plugins/rel/rel.js index a0e9fb481..6a87071e7 100644 --- a/src/plugins/rel/rel.js +++ b/src/plugins/rel/rel.js @@ -72,9 +72,10 @@ }; } + var ref = prev; if ( data.relTo ) { - var ref = document.getElementById( data.relTo ); + ref = document.getElementById( data.relTo ); if ( ref ) { // Test, if it is a previous step that already has some assigned position data @@ -132,6 +133,29 @@ if ( data.relReset === "all" ) { inheritRotation = false; } + } else if ( el.hasAttribute( "data-rel-inherit" ) ) { + var inheritFrom = null; + if ( data.relInherit ) { + + // If data-rel-inherit has value, it's the referenced node + inheritFrom = document.getElementById( data.relInherit ); + } + + if ( !inheritFrom ) { + inheritFrom = ref; + } + + prev.relative.x = toNumberAdvanced( inheritFrom.getAttribute( "data-rel-x" ), 0 ); + prev.relative.y = toNumberAdvanced( inheritFrom.getAttribute( "data-rel-y" ), 0 ); + prev.relative.z = toNumberAdvanced( inheritFrom.getAttribute( "data-rel-z" ), 0 ); + prev.relative.rotate.x = + toNumberAdvanced( inheritFrom.getAttribute( "data-rel-rotate-x" ), 0 ); + prev.relative.rotate.y = + toNumberAdvanced( inheritFrom.getAttribute( "data-rel-rotate-y" ), 0 ); + prev.relative.rotate.z = + toNumberAdvanced( inheritFrom.getAttribute( "data-rel-rotate-z" ), 0 ); + prev.relative.rotate.order = + inheritFrom.getAttribute( "data-rel-rotate-order" ) || "xyz"; } var step = { @@ -243,6 +267,12 @@ el.setAttribute( "data-rotate-z", step.rotate.z ); el.setAttribute( "data-rotate-order", step.rotate.order ); el.setAttribute( "data-rel-position", step.relative.position ); + el.setAttribute( "data-rel-x", step.relative.x ); + el.setAttribute( "data-rel-y", step.relative.y ); + el.setAttribute( "data-rel-z", step.relative.z ); + el.setAttribute( "data-rel-rotate-x", step.relative.rotate.x ); + el.setAttribute( "data-rel-rotate-y", step.relative.rotate.y ); + el.setAttribute( "data-rel-rotate-z", step.relative.rotate.z ); prev = step; } };