songs2slides

A tool that automatically finds song lyrics and creates lyric slideshows
git clone https://git.ashermorgan.net/songs2slides/
Log | Files | Refs | README

commit b72016334f3922c5177f74da729dd1c02c5c5602
parent 99dbe7c5896aa2b43998b4a16b4233e74d918841
Author: AsherMorgan <59518073+AsherMorgan@users.noreply.github.com>
Date:   Thu, 11 Jun 2020 08:28:36 -0700

Implement standalone settings page.

Diffstat:
MSongs2Slides/routes.py | 9++++++++-
ASongs2Slides/static/global.css | 31+++++++++++++++++++++++++++++++
MSongs2Slides/static/index.css | 68++++----------------------------------------------------------------
MSongs2Slides/static/index.js | 107-------------------------------------------------------------------------------
ASongs2Slides/static/settings.css | 26++++++++++++++++++++++++++
ASongs2Slides/static/settings.js | 99+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MSongs2Slides/templates/index.html | 112++-----------------------------------------------------------------------------
ASongs2Slides/templates/settings.html | 128+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
8 files changed, 298 insertions(+), 282 deletions(-)

diff --git a/Songs2Slides/routes.py b/Songs2Slides/routes.py @@ -16,9 +16,16 @@ def index(): +# Settings page +@app.route("/settings/", methods=["GET"]) +def settings(): + return render_template("settings.html") + + + # Settings JSON file @app.route("/settings.json", methods=["GET"]) -def settings(): +def settingsJSON(): return jsonify(defaultSettings) diff --git a/Songs2Slides/static/global.css b/Songs2Slides/static/global.css @@ -0,0 +1,31 @@ +/******** Global styles ********/ +body { + text-align: center; + font-family: Arial, Helvetica, sans-serif; + touch-action: manipulation; + margin-top: 80px; +} + +h1 { + margin-top: 15px; + margin-bottom: 15px; +} + +#header { + position: fixed; + top: 0px; + left: 0px; + width: 100%; + background-color: #ffff50; +} + + +.container { + margin: auto; + padding: 10px; + background-color: #F0F0F0; +} + +button { + height: 25px; +} diff --git a/Songs2Slides/static/index.css b/Songs2Slides/static/index.css @@ -1,43 +1,13 @@ -/******** Other styles ********/ -body { - text-align: center; - font-family: Arial, Helvetica, sans-serif; - touch-action: manipulation; - margin-top: 80px; -} - -h1 { - margin-top: 15px; - margin-bottom: 15px; -} - -#header { - position: fixed; - top: 0px; - left: 0px; - width: 100%; - background-color: #ffff50; -} - - -.container { - margin: auto; - padding: 10px; - background-color: #F0F0F0; -} - -button { - height: 25px; -} - - - /******** Songs styles ********/ #songsContainer { width: fit-content; width: -moz-fit-content; } +h3 { + margin-top: 0px; +} + .song { width: fit-content; width: -moz-fit-content; @@ -119,32 +89,3 @@ button { float: right; font-size: 15px; } - - - -/******** Settings styles ********/ -#settings { - max-width: 300px; - text-align: left; - line-height: 30px; -} - -h3:first-child { - margin-top: 0px; -} - -h3 { - margin-bottom: 0px; -} - -input[type="number"] { - width: 75px; -} - -#settingsFooter { - margin-top: 15px; -} - -#resetButton { - float: right; -} -\ No newline at end of file diff --git a/Songs2Slides/static/index.js b/Songs2Slides/static/index.js @@ -5,119 +5,12 @@ setId = 0; // Next valid song id number // Finishes setting up the page function onLoad() { - // Load settings - if (localStorage.getItem("settings") == null) { - resetSettings(); - } - else { - loadSettings(JSON.parse(localStorage.getItem("settings"))); - } - // Add song AddSong(); } -// Shows settings interface -function showSettings() { - document.getElementById("songsContainer").hidden = true; - document.getElementById("lyricsContainer").hidden = true; - document.getElementById("thankyou").hidden = true; - document.getElementById("settings").hidden = false; -} - - - -// Loads settings -function loadSettings(settings) { - // Parsing settings - document.getElementById("title-slides").checked = settings["title-slides"]; - document.getElementById("lines-per-slide").value = settings["lines-per-slide"]; - document.getElementById("remove-parentheses").checked = settings["remove-parentheses"]; - - // Slide settings - document.getElementById("slide-width").value = settings["slide-width"]; - document.getElementById("slide-height").value = settings["slide-height"]; - document.getElementById("slide-color").value = settings["slide-color"]; - - // Margin settings - document.getElementById("margin-left").value = settings["margin-left"]; - document.getElementById("margin-right").value = settings["margin-right"]; - document.getElementById("margin-top").value = settings["margin-top"]; - document.getElementById("margin-bottom").value = settings["margin-bottom"]; - - // Font settings - document.getElementById("font-family").value = settings["font-family"]; - document.getElementById("font-size").value = settings["font-size"]; - document.getElementById("font-bold").checked = settings["font-bold"]; - document.getElementById("font-italic").checked = settings["font-italic"]; - document.getElementById("font-color").value = settings["font-color"]; - - // Pharagraph settings - document.getElementById("vertical-alignment").value = settings["vertical-alignment"]; - document.getElementById("line-spacing").value = settings["line-spacing"]; - document.getElementById("word-wrap").checked = settings["word-wrap"]; -} - - - -// Saves settings to local storage -function saveSettings() { - // Get settings - const settings = { - // Parsing settings - "title-slides": document.getElementById("title-slides").checked, - "lines-per-slide": Number(document.getElementById("lines-per-slide").value), - "remove-parentheses": document.getElementById("remove-parentheses").checked, - - // Slide settings - "slide-width": Number(document.getElementById("slide-width").value), - "slide-height": Number(document.getElementById("slide-height").value), - "slide-color": document.getElementById("slide-color").value, - - // Margin settings - "margin-left": Number(document.getElementById("margin-left").value), - "margin-right": Number(document.getElementById("margin-right").value), - "margin-top": Number(document.getElementById("margin-top").value), - "margin-bottom": Number(document.getElementById("margin-bottom").value), - - // Font settings - "font-family": document.getElementById("font-family").value, - "font-size": Number(document.getElementById("font-size").value), - "font-bold": document.getElementById("font-bold").checked, - "font-italic": document.getElementById("font-italic").checked, - "font-color": document.getElementById("font-color").value, - - // Pharagraph settings - "vertical-alignment": document.getElementById("vertical-alignment").value, - "line-spacing": Number(document.getElementById("line-spacing").value), - "word-wrap": document.getElementById("word-wrap").checked, - } - - // Save settings - localStorage.setItem("settings", JSON.stringify(settings)); -} - - - -// Resets all settings to their default values -async function resetSettings() { - // Send POST request - const rawResponse = await fetch("/settings.json", { - method: 'GET' - }); - const json = await rawResponse.json(); - - // Load changes - loadSettings(json); - - // Save changes - localStorage.setItem("settings", JSON.stringify(json)); -} - - - // Adds a song function AddSong() { // Create row diff --git a/Songs2Slides/static/settings.css b/Songs2Slides/static/settings.css @@ -0,0 +1,26 @@ +/******** Settings styles ********/ +#settings { + max-width: 300px; + text-align: left; + line-height: 30px; +} + +h3:first-child { + margin-top: 0px; +} + +h3 { + margin-bottom: 0px; +} + +input[type="number"] { + width: 75px; +} + +#settingsFooter { + margin-top: 15px; +} + +#resetButton { + float: right; +} diff --git a/Songs2Slides/static/settings.js b/Songs2Slides/static/settings.js @@ -0,0 +1,99 @@ +// Finishes setting up the page +function onLoad() { + // Load settings + if (localStorage.getItem("settings") == null) { + resetSettings(); + } + else { + loadSettings(JSON.parse(localStorage.getItem("settings"))); + } +} + + + +// Loads settings +function loadSettings(settings) { + // Parsing settings + document.getElementById("title-slides").checked = settings["title-slides"]; + document.getElementById("lines-per-slide").value = settings["lines-per-slide"]; + document.getElementById("remove-parentheses").checked = settings["remove-parentheses"]; + + // Slide settings + document.getElementById("slide-width").value = settings["slide-width"]; + document.getElementById("slide-height").value = settings["slide-height"]; + document.getElementById("slide-color").value = settings["slide-color"]; + + // Margin settings + document.getElementById("margin-left").value = settings["margin-left"]; + document.getElementById("margin-right").value = settings["margin-right"]; + document.getElementById("margin-top").value = settings["margin-top"]; + document.getElementById("margin-bottom").value = settings["margin-bottom"]; + + // Font settings + document.getElementById("font-family").value = settings["font-family"]; + document.getElementById("font-size").value = settings["font-size"]; + document.getElementById("font-bold").checked = settings["font-bold"]; + document.getElementById("font-italic").checked = settings["font-italic"]; + document.getElementById("font-color").value = settings["font-color"]; + + // Pharagraph settings + document.getElementById("vertical-alignment").value = settings["vertical-alignment"]; + document.getElementById("line-spacing").value = settings["line-spacing"]; + document.getElementById("word-wrap").checked = settings["word-wrap"]; +} + + + +// Saves settings to local storage +function saveSettings() { + // Get settings + const settings = { + // Parsing settings + "title-slides": document.getElementById("title-slides").checked, + "lines-per-slide": Number(document.getElementById("lines-per-slide").value), + "remove-parentheses": document.getElementById("remove-parentheses").checked, + + // Slide settings + "slide-width": Number(document.getElementById("slide-width").value), + "slide-height": Number(document.getElementById("slide-height").value), + "slide-color": document.getElementById("slide-color").value, + + // Margin settings + "margin-left": Number(document.getElementById("margin-left").value), + "margin-right": Number(document.getElementById("margin-right").value), + "margin-top": Number(document.getElementById("margin-top").value), + "margin-bottom": Number(document.getElementById("margin-bottom").value), + + // Font settings + "font-family": document.getElementById("font-family").value, + "font-size": Number(document.getElementById("font-size").value), + "font-bold": document.getElementById("font-bold").checked, + "font-italic": document.getElementById("font-italic").checked, + "font-color": document.getElementById("font-color").value, + + // Pharagraph settings + "vertical-alignment": document.getElementById("vertical-alignment").value, + "line-spacing": Number(document.getElementById("line-spacing").value), + "word-wrap": document.getElementById("word-wrap").checked, + } + + // Save settings + localStorage.setItem("settings", JSON.stringify(settings)); +} + + + +// Resets all settings to their default values +async function resetSettings() { + // Send POST request + const rawResponse = await fetch("/settings.json", { + method: 'GET' + }); + const json = await rawResponse.json(); + + // Load changes + loadSettings(json); + + // Save changes + localStorage.setItem("settings", JSON.stringify(json)); +} diff --git a/Songs2Slides/templates/index.html b/Songs2Slides/templates/index.html @@ -4,6 +4,7 @@ <title>Songs2Slides</title> <meta name="description" content="Quickly and easily create lyric powerpoints from a list of songs."> <meta name="viewport" content="width=device-width, user-scalable=no"/> + <link rel="stylesheet" href="{{ url_for('static', filename='global.css') }}"></link> <link rel="stylesheet" href="{{ url_for('static', filename='index.css') }}"></link> <script src="{{ url_for('static', filename='index.js') }}"></script> </head> @@ -29,7 +30,7 @@ </div> <div id="songsButtons"> - <a href="javascript:showSettings();">Settings</a> + <a href="/settings/">Settings</a> <button id="reviewButton" onclick="ReviewLyrics();">Next</button> </div> </div> @@ -62,114 +63,5 @@ <p>Thankyou for using Songs2Slides</p> <p>Click <a href="javascript:Reset()">here</a> to create another PowerPoint.</p> </div> - - <div id="settings" class="container" hidden> - <h3>Parsing</h3> - <div> - Add title slides: - <input type="checkbox" id="title-slides" onchange="saveSettings();"/> - </div> - <div> - Default lines per slide: - <input type="number" id="lines-per-slide" onchange="saveSettings();"/> - </div> - <div> - Remove content in parentheses: - <input type="checkbox" id="remove-parentheses" onchange="saveSettings();"/> - </div> - - <h3>Slide settings</h3> - <div> - Width (Inches): - <input type="number" id="slide-width" onchange="saveSettings();"/> - </div> - <div> - Height (Inches): - <input type="number" id="slide-height" onchange="saveSettings();"/> - </div> - <div> - Background color: - <input type="color" id="slide-color" onchange="saveSettings();"/> - </div> - - <h3>Margin settings</h3> - <div> - Left (Inches): - <input type="number" id="margin-left" onchange="saveSettings();"/> - </div> - <div> - Right (Inches): - <input type="number" id="margin-right" onchange="saveSettings();"/> - </div> - <div> - Top (Inches): - <input type="number" id="margin-top" onchange="saveSettings();"/> - </div> - <div> - Bottom (Inches): - <input type="number" id="margin-bottom" onchange="saveSettings();"/> - </div> - - <h3>Font settings</h3> - <div> - Family: - <input id="font-family" list="fonts" onchange="saveSettings();"> - <datalist id="fonts"> - <option>Arial</option> - <option>Century</option> - <option>Century Gothic</option> - <option>Calibri</option> - <option>Comic Sans MS</option> - <option>Courier New</option> - <option>Georgia</option> - <option>Impact</option> - <option>Rockwell</option> - <option>Segoe UI</option> - <option>Tahoma</option> - <option>Times New Roman</option> - <option>Trebuchet MS</option> - <option>Verdana</option> - </datalist> - </div> - <div> - Size: - <input type="number" id="font-size" onchange="saveSettings();"/> - </div> - <div> - Bold: - <input type="checkbox" id = "font-bold" onchange="saveSettings();"/> - </div> - <div> - Italic: - <input type="checkbox" id="font-italic" onchange="saveSettings();"/> - </div> - <div> - Color: - <input type="color" id="font-color" onchange="saveSettings();"/> - </div> - - <h3>Pharagraph settings</h3> - <div> - Vertical Alignment: - <select id="vertical-alignment" onchange="saveSettings();"> - <option>Top</option> - <option>Middle</option> - <option>Bottom</option> - </select> - </div> - <div> - Line spacing: - <input type="number" id="line-spacing" onchange="saveSettings();"/> - </div> - <div> - Word wrap: - <input type="checkbox" id="word-wrap" onchange="saveSettings();"/> - </div> - - <div id="settingsFooter"> - <a href="javascript:Back();">Back</a> - <button id="resetButton" onclick="resetSettings();">Reset</button> - </div> - </div> </body> </html> \ No newline at end of file diff --git a/Songs2Slides/templates/settings.html b/Songs2Slides/templates/settings.html @@ -0,0 +1,127 @@ +<!DOCTYPE html> +<html> + <head> + <title>Songs2Slides</title> + <meta name="description" content="Quickly and easily create lyric powerpoints from a list of songs."> + <meta name="viewport" content="width=device-width, user-scalable=no"/> + <link rel="stylesheet" href="{{ url_for('static', filename='global.css') }}"></link> + <link rel="stylesheet" href="{{ url_for('static', filename='settings.css') }}"></link> + <script src="{{ url_for('static', filename='settings.js') }}"></script> + </head> + <body onload="onLoad();"> + <div id="header"> + <h1>Songs2Slides</h1> + </div> + + <h2>Settings</h2> + + <div id="settings" class="container"> + <h3>Parsing</h3> + <div> + Add title slides: + <input type="checkbox" id="title-slides" onchange="saveSettings();"/> + </div> + <div> + Default lines per slide: + <input type="number" id="lines-per-slide" onchange="saveSettings();"/> + </div> + <div> + Remove content in parentheses: + <input type="checkbox" id="remove-parentheses" onchange="saveSettings();"/> + </div> + + <h3>Slide settings</h3> + <div> + Width (Inches): + <input type="number" id="slide-width" onchange="saveSettings();"/> + </div> + <div> + Height (Inches): + <input type="number" id="slide-height" onchange="saveSettings();"/> + </div> + <div> + Background color: + <input type="color" id="slide-color" onchange="saveSettings();"/> + </div> + + <h3>Margin settings</h3> + <div> + Left (Inches): + <input type="number" id="margin-left" onchange="saveSettings();"/> + </div> + <div> + Right (Inches): + <input type="number" id="margin-right" onchange="saveSettings();"/> + </div> + <div> + Top (Inches): + <input type="number" id="margin-top" onchange="saveSettings();"/> + </div> + <div> + Bottom (Inches): + <input type="number" id="margin-bottom" onchange="saveSettings();"/> + </div> + + <h3>Font settings</h3> + <div> + Family: + <input id="font-family" list="fonts" onchange="saveSettings();"> + <datalist id="fonts"> + <option>Arial</option> + <option>Century</option> + <option>Century Gothic</option> + <option>Calibri</option> + <option>Comic Sans MS</option> + <option>Courier New</option> + <option>Georgia</option> + <option>Impact</option> + <option>Rockwell</option> + <option>Segoe UI</option> + <option>Tahoma</option> + <option>Times New Roman</option> + <option>Trebuchet MS</option> + <option>Verdana</option> + </datalist> + </div> + <div> + Size: + <input type="number" id="font-size" onchange="saveSettings();"/> + </div> + <div> + Bold: + <input type="checkbox" id = "font-bold" onchange="saveSettings();"/> + </div> + <div> + Italic: + <input type="checkbox" id="font-italic" onchange="saveSettings();"/> + </div> + <div> + Color: + <input type="color" id="font-color" onchange="saveSettings();"/> + </div> + + <h3>Pharagraph settings</h3> + <div> + Vertical Alignment: + <select id="vertical-alignment" onchange="saveSettings();"> + <option>Top</option> + <option>Middle</option> + <option>Bottom</option> + </select> + </div> + <div> + Line spacing: + <input type="number" id="line-spacing" onchange="saveSettings();"/> + </div> + <div> + Word wrap: + <input type="checkbox" id="word-wrap" onchange="saveSettings();"/> + </div> + + <div id="settingsFooter"> + <a href="../">Back</a> + <button id="resetButton" onclick="resetSettings();">Reset</button> + </div> + </div> + </body> +</html> +\ No newline at end of file