Selaa lähdekoodia

Feature #576: Added basic support for iframe embedding (#577)

* Feature #576: Added basic support for iframe embedding

- add parameter handler for embedded, controls, header and zoomControls
- add option to set zoom via parameter
- add feature to display compact zoomControl widget

* embedded demo: fix descriptions

* Fix change requests for pull request

* embedded_demo: fix typos/demo descriptions

* fix typo
Florian Hintermeier 5 vuotta sitten
vanhempi
commit
2f5c661ee9
3 muutettua tiedostoa jossa 208 lisäystä ja 41 poistoa
  1. 92 0
      demo/embedded_demo.html
  2. 9 9
      demo/index.html
  3. 107 32
      demo/index.js

+ 92 - 0
demo/embedded_demo.html

@@ -0,0 +1,92 @@
+<!doctype html>
+<html lang="en">
+
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+
+    <title>OpenSheetMusicDisplay as an embedded iframe</title>
+    <meta name="description" content="A showcase for OpenSheetMusicDisplay.">
+    <meta name="author" content="OpenSheetMusicDisplay contributors">
+
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js" type="text/javascript"></script>
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.3.0/semantic.min.js"
+        type="text/javascript"></script>
+    <link href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.3.0/semantic.css" media="all" rel="stylesheet" />
+    <link rel="icon" href="./favicon.ico?" type="image/x-icon" />
+</head>
+
+<body>
+    <br>
+    <div style="text-align: center;width: 60%;margin:0 auto">
+        <h1 class="ui centered header" id="header">
+            <img src="./favicon.ico?" class="ui image">
+
+        </h1>
+        <h2>
+            OpenSheetMusicDisplay as an embedded iframe
+        </h2>
+    </div>
+    <div style="padding: 40px;margin:0 auto">
+        <h3>
+            Use parameters:
+        </h3>
+        <p>
+            <table class="ui table celled ">
+                <tr>
+                    <th>Parameter</th>
+                    <th>Values</th>
+                    <th>Default</th>
+                    <th>Description</th>
+                </tr>
+                <tr>
+                    <td><b>embedded</b></td>
+                    <td></td>
+                    <td></td>
+                    <td>Activates the embedded mode: controls are hidden (unless other parameters specified) 
+                    </td>
+                </tr>
+                <tr>
+                    <td>showControls</td>
+                    <td>"0" and "1"</td>
+                    <td>"0" = OFF</td>
+                    <td>If active, the controls of OSMD are shown like usually.</td>
+                </tr>
+                <tr>
+                    <td>showZoomControl</td>
+                    <td>"0" and "1"</td>
+                    <td>"0" = OFF</td>
+                    <td>If showControls == 0 and showZoomControl == 1, a small zoomControl widget will be displayed to save space.</td>
+                </tr>
+                <tr>
+                    <td>showHeader</td>
+                    <td>"0" and "1"</td>
+                    <td>"0" = OFF</td>
+                    <td>If activated, the OSMD title will be rendered on top of the sheet</td>
+                </tr>
+                <tr>
+                    <td>zoom</td>
+                    <td>floating number between 0.1 and 5.0</td>
+                    <td>1.0</td>
+                    <td>If given, the OSMD zoom level will be set at loading time</td>
+                </tr>
+                <tr>
+                    <td>overflow</td>
+                    <td>"hidden" , "auto", "scroll", "visible"</td>
+                    <td>"auto"</td>
+                    <td>If given, this attribute will refresh the state of the css attribute overflow to control the scrollbar.</td>
+                </tr>
+            </table>
+    </div>
+    <div>
+        <center>
+            <h4>Example: http://localhost:8000/?embedded&showZoomControl=1&zoom=0.5</h4>
+            <iframe src="http://localhost:8000/?embedded&showZoomControl=1&zoom=0.5" width="800" height="1500"
+                frameborder="1"></iframe>
+        </center>
+    </div>
+
+
+</body>
+
+</html>

+ 9 - 9
demo/index.html

@@ -3,7 +3,7 @@
 <head>
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1">
-    
+
     <title><%= htmlWebpackPlugin.options.title %></title>
     <meta name="description" content="A showcase for OpenSheetMusicDisplay.">
     <meta name="author" content="OpenSheetMusicDisplay contributors">
@@ -14,12 +14,11 @@
     <link rel="icon" href="./favicon.ico?" type="image/x-icon"/>
 </head>
 <body>
-<br>
-<h1 class="ui centered header">
+<h1 class="ui centered header" id="header">
     <img src="./favicon.ico?" class="ui image">
     <%= htmlWebpackPlugin.options.title %>
 </h1>
-<div class="ui four column grid container">
+<div class="ui four column grid container" id="divControls">
     <div class="column">
         <h3 class="ui header">Select a sample:</h3>
         <select class="ui selection dropdown" id="selectSample" style="width:320px; height:38%"></select>
@@ -69,10 +68,10 @@
                 </div>
             </div>
         </div>
-    </div>         
-    <div class="column">
+    </div>
+    <div class="column" id="zoomControls">
         <h3 class="ui header">Zoom controls:</h3>
-        <div class="ui buttons">
+        <div class="ui buttons" id="zoomControlsButtons">
             <div class="ui button" id="zoom-in-btn">
                 <i class="search plus icon"></i>
             </div>
@@ -120,14 +119,15 @@
         <div>
             <div class="ui vertical buttons">
                 <div class="ui button" id="debug-re-render-btn">Re-render</div>
-                
+
             </div>
             <div class="ui vertical buttons">
-                <div class="ui button" id="debug-clear-btn"">Clear</div>
+                <div class="ui button" id="debug-clear-btn">Clear</div>
             </div>
         </div>
     </div>
 </div>
+<div id="optionalControls"></div>
 <table cellspacing="0" style="max-width:700px;">
     <tr id="error-tr">
         <td></td>

+ 107 - 32
demo/index.js

@@ -49,6 +49,9 @@ import { OpenSheetMusicDisplay } from '../src/OpenSheetMusicDisplay/OpenSheetMus
 
     zoom = 1.0,
     // HTML Elements in the page
+    divControls,
+    zoomControls,
+    header,
     err,
     error_tr,
     canvas,
@@ -81,10 +84,43 @@ import { OpenSheetMusicDisplay } from '../src/OpenSheetMusicDisplay/OpenSheetMus
     var drawPartNamesOptionStashedValue = true;
     var drawPartNamesOptionNeedsReset = false;
 
+    var showControls = true;
+    var showZoomControl = true;
+    var showHeader = true;
     // Initialization code
     function init() {
         var name, option;
 
+        // Handle window parameter
+        var paramEmbedded = findGetParameter('embedded');
+        var paramShowControls = findGetParameter('showControls');
+        var paramShowZoomControl = findGetParameter('showZoomControl');
+        var paramShowHeader = findGetParameter('showHeader');
+        var paramZoom = findGetParameter('zoom');
+        var paramOverflow = findGetParameter('overflow');
+        var paramOpenUrl = findGetParameter('openUrl');
+
+        if (paramEmbedded !== undefined) {
+            showControls = (paramShowControls === '1');
+            showZoomControl = (paramShowZoomControl === '1');
+            showHeader = (paramShowHeader === '1');
+        }
+        if (paramZoom !== undefined) {
+            if (paramZoom > 0.1 && paramZoom < 5.0) {
+                zoom = paramZoom;
+                console.log('Set zoom to ' + zoom);
+            }
+        }
+
+        if (paramOverflow !== undefined && typeof paramOverflow === 'string') {
+            if (paramOverflow === 'hidden' || paramOverflow === 'auto' || paramOverflow === 'scroll' || paramOverflow === 'visible') {
+                document.body.style.overflow = paramOverflow;
+            }
+        }
+
+        divControls = document.getElementById('divControls');
+        zoomControls = document.getElementById('zoomControls');
+        header = document.getElementById('header');
         err = document.getElementById("error-td");
         error_tr = document.getElementById("error-tr");
         zoomDiv = document.getElementById("zoom-str");
@@ -106,9 +142,30 @@ import { OpenSheetMusicDisplay } from '../src/OpenSheetMusicDisplay/OpenSheetMus
         debugReRenderBtn = document.getElementById("debug-re-render-btn");
         debugClearBtn = document.getElementById("debug-clear-btn");
 
+        if (!showControls) {
+            divControls.style.display = 'none';
+        }
+        if (!showHeader) {
+            header.style.display = 'none';
+        }
         // Hide error
         error();
 
+        if (!showControls && showZoomControl) {
+            const zoomControlsButtons = document.getElementById('zoomControlsButtons');
+            const zoomControlsString = document.getElementById('zoom-str');
+            const optionalControls = document.getElementById('optionalControls');
+            optionalControls.appendChild(zoomControlsButtons);
+            optionalControls.appendChild(zoomControlsString);
+            optionalControls.style.position = 'absolute';
+            optionalControls.style.zIndex = '10';
+            optionalControls.style.right = '10px';
+            optionalControls.style.padding = '10px';
+
+            zoomControlsString.style.display = 'inline';
+            zoomControlsString.style.padding = '10px';
+        }
+
         // Create select
         for (name in samples) {
             if (samples.hasOwnProperty(name)) {
@@ -138,25 +195,25 @@ import { OpenSheetMusicDisplay } from '../src/OpenSheetMusicDisplay/OpenSheetMus
         };
 
         if (skylineDebug) {
-            skylineDebug.onclick = function() {
+            skylineDebug.onclick = function () {
                 openSheetMusicDisplay.DrawSkyLine = !openSheetMusicDisplay.DrawSkyLine;
             }
         }
 
         if (bottomlineDebug) {
-            bottomlineDebug.onclick = function() {
+            bottomlineDebug.onclick = function () {
                 openSheetMusicDisplay.DrawBottomLine = !openSheetMusicDisplay.DrawBottomLine;
             }
         }
 
         if (debugReRenderBtn) {
-            debugReRenderBtn.onclick = function() {
+            debugReRenderBtn.onclick = function () {
                 rerender();
             }
         }
 
         if (debugClearBtn) {
-            debugClearBtn.onclick = function() {
+            debugClearBtn.onclick = function () {
                 openSheetMusicDisplay.clear();
             }
         }
@@ -198,27 +255,27 @@ import { OpenSheetMusicDisplay } from '../src/OpenSheetMusicDisplay/OpenSheetMus
         openSheetMusicDisplay.setLogLevel('info');
         document.body.appendChild(canvas);
 
-        window.addEventListener("keydown", function(e) {
+        window.addEventListener("keydown", function (e) {
             var event = window.event ? window.event : e;
             if (event.keyCode === 39) {
                 openSheetMusicDisplay.cursor.next();
             }
         });
-        nextCursorBtn.addEventListener("click", function() {
+        nextCursorBtn.addEventListener("click", function () {
             openSheetMusicDisplay.cursor.next();
         });
-        resetCursorBtn.addEventListener("click", function() {
+        resetCursorBtn.addEventListener("click", function () {
             openSheetMusicDisplay.cursor.reset();
         });
         if (followCursorCheckbox) {
-            followCursorCheckbox.onclick = function() {
+            followCursorCheckbox.onclick = function () {
                 openSheetMusicDisplay.FollowCursor = !openSheetMusicDisplay.FollowCursor;
             }
         }
-        hideCursorBtn.addEventListener("click", function() {
+        hideCursorBtn.addEventListener("click", function () {
             openSheetMusicDisplay.cursor.hide();
         });
-        showCursorBtn.addEventListener("click", function() {
+        showCursorBtn.addEventListener("click", function () {
             if (openSheetMusicDisplay.cursor) {
                 openSheetMusicDisplay.cursor.show();
             } else {
@@ -226,18 +283,18 @@ import { OpenSheetMusicDisplay } from '../src/OpenSheetMusicDisplay/OpenSheetMus
             }
         });
 
-        backendSelect.addEventListener("change", function(e) {
+        backendSelect.addEventListener("change", function (e) {
             var value = e.target.value;
             var createNewOsmd = true;
 
             if (createNewOsmd) {
                 // clears the canvas element
                 canvas.innerHTML = "";
-                openSheetMusicDisplay = new OpenSheetMusicDisplay(canvas, {backend: value});
+                openSheetMusicDisplay = new OpenSheetMusicDisplay(canvas, { backend: value });
                 openSheetMusicDisplay.setLogLevel('info');
             } else {
                 // alternative, doesn't work yet, see setOptions():
-                openSheetMusicDisplay.setOptions({backend: value});
+                openSheetMusicDisplay.setOptions({ backend: value });
             }
 
             selectSampleOnChange();
@@ -245,6 +302,22 @@ import { OpenSheetMusicDisplay } from '../src/OpenSheetMusicDisplay/OpenSheetMus
         });
     }
 
+    function findGetParameter(parameterName) {
+        let result = undefined;
+        let tmp = [];
+        location.search
+            .substr(1)
+            .split('&')
+            .forEach(function (item) {
+                tmp = item.split('=');
+                if (tmp[0] === parameterName) {
+                    result = decodeURIComponent(tmp[1]);
+                    console.log('Found param:' + parameterName + ' = ' + result);
+                }
+            });
+        return result;
+    }
+
     function selectBoundingOnChange(evt) {
         var value = evt.target.value;
         openSheetMusicDisplay.DrawBoundingBox = value;
@@ -257,23 +330,24 @@ import { OpenSheetMusicDisplay } from '../src/OpenSheetMusicDisplay/OpenSheetMus
         if (!isCustom) {
             str = sampleFolder + selectSample.value;
         }
-        zoom = 1.0;
+        // zoom = 1.0;
 
         setSampleSpecificOptions(str, isCustom);
-        
+
         openSheetMusicDisplay.load(str).then(
-            function() {
+            function () {
                 // This gives you access to the osmd object in the console. Do not use in productive code
                 window.osmd = openSheetMusicDisplay;
+                openSheetMusicDisplay.zoom = zoom;
                 return openSheetMusicDisplay.render();
             },
-            function(e) {
+            function (e) {
                 errorLoadingOrRenderingSheet(e, "rendering");
             }
         ).then(
-            function() {
+            function () {
                 return onLoadingEnd(isCustom);
-            }, function(e) {
+            }, function (e) {
                 errorLoadingOrRenderingSheet(e, "loading");
                 onLoadingEnd(isCustom);
             }
@@ -327,23 +401,24 @@ import { OpenSheetMusicDisplay } from '../src/OpenSheetMusicDisplay/OpenSheetMus
             openSheetMusicDisplay.setOptions({ // set default values. better would be to restore to stashed values, but unnecessarily complex for demo
                 coloringMode: 0,
                 colorStemsLikeNoteheads: false,
-                coloringSetCustom: null});
+                coloringSetCustom: null
+            });
             autoCustomColoringOptionNeedsReset = false;
         }
         if (!isCustom && str.includes("autobeam")) {
             autobeamOptionStashedValue = openSheetMusicDisplay.EngravingRules.AutoBeamNotes; // stash previously set value, to restore later
             autobeamOptionNeedsReset = true;
-            openSheetMusicDisplay.setOptions({autoBeam: true});
+            openSheetMusicDisplay.setOptions({ autoBeam: true });
         } else if (autobeamOptionNeedsReset) {
-            openSheetMusicDisplay.setOptions({autoBeam: autobeamOptionStashedValue});
+            openSheetMusicDisplay.setOptions({ autoBeam: autobeamOptionStashedValue });
             autobeamOptionNeedsReset = false;
         }
         if (!isCustom && str.includes("Schubert_An_die_Musik")) { // TODO weird layout bug here with part names. but shouldn't be in score anyways
             drawPartNamesOptionStashedValue = openSheetMusicDisplay.EngravingRules.RenderPartNames;
-            openSheetMusicDisplay.setOptions({drawPartNames: false}); // TODO sets osmd.drawingParameters.DrawPartNames! also check EngravingRules.RenderPartAbbreviations, was false
+            openSheetMusicDisplay.setOptions({ drawPartNames: false }); // TODO sets osmd.drawingParameters.DrawPartNames! also check EngravingRules.RenderPartAbbreviations, was false
             drawPartNamesOptionNeedsReset = true;
         } else if (drawPartNamesOptionNeedsReset) {
-            openSheetMusicDisplay.setOptions({drawPartNames: drawPartNamesOptionStashedValue});
+            openSheetMusicDisplay.setOptions({ drawPartNames: drawPartNamesOptionStashedValue });
             drawPartNamesOptionNeedsReset = false;
         }
     }
@@ -373,7 +448,7 @@ import { OpenSheetMusicDisplay } from '../src/OpenSheetMusicDisplay/OpenSheetMus
 
     function scale() {
         disable();
-        window.setTimeout(function(){
+        window.setTimeout(function () {
             openSheetMusicDisplay.zoom = zoom;
             openSheetMusicDisplay.render();
             enable();
@@ -382,7 +457,7 @@ import { OpenSheetMusicDisplay } from '../src/OpenSheetMusicDisplay/OpenSheetMus
 
     function rerender() {
         disable();
-        window.setTimeout(function(){
+        window.setTimeout(function () {
             if (openSheetMusicDisplay.IsReadyToRender()) {
                 openSheetMusicDisplay.render();
             } else {
@@ -415,21 +490,21 @@ import { OpenSheetMusicDisplay } from '../src/OpenSheetMusicDisplay/OpenSheetMus
     }
 
     // Register events: load, drag&drop
-    window.addEventListener("load", function() {
+    window.addEventListener("load", function () {
         init();
         selectSampleOnChange();
     });
-    window.addEventListener("dragenter", function(event) {
+    window.addEventListener("dragenter", function (event) {
         event.preventDefault();
         disable();
     });
-    window.addEventListener("dragover", function(event) {
+    window.addEventListener("dragover", function (event) {
         event.preventDefault();
     });
-    window.addEventListener("dragleave", function(event) {
+    window.addEventListener("dragleave", function (event) {
         enable();
     });
-    window.addEventListener("drop", function(event) {
+    window.addEventListener("drop", function (event) {
         event.preventDefault();
         if (!event.dataTransfer || !event.dataTransfer.files || event.dataTransfer.files.length === 0) {
             return;
@@ -446,7 +521,7 @@ import { OpenSheetMusicDisplay } from '../src/OpenSheetMusicDisplay/OpenSheetMus
         if (filename.toLowerCase().indexOf(".xml") > 0
             || filename.toLowerCase().indexOf(".musicxml") > 0) {
             reader.readAsText(event.dataTransfer.files[0]);
-        } else if (event.dataTransfer.files[0].name.toLowerCase().indexOf(".mxl") > 0){
+        } else if (event.dataTransfer.files[0].name.toLowerCase().indexOf(".mxl") > 0) {
             reader.readAsBinaryString(event.dataTransfer.files[0]);
         }
         else {