From 66d8c0ed11c262660a91d7e82b4b62e918502a67 Mon Sep 17 00:00:00 2001 From: yflory <yann.flory@xwiki.com> Date: Fri, 16 Jun 2017 15:11:32 +0200 Subject: [PATCH] Add a preview mode to the slide app --- www/slide/inner.html | 21 +++++++++--------- www/slide/main.js | 27 ++++++++++++++++++++++- www/slide/slide.css | 47 ++++++++++++++++++++++++++++++++++----- www/slide/slide.js | 25 ++++++++++++++++----- www/slide/slide.less | 52 +++++++++++++++++++++++++++++++++++++++----- 5 files changed, 144 insertions(+), 28 deletions(-) diff --git a/www/slide/inner.html b/www/slide/inner.html index 8fde658df..1726cd2f1 100644 --- a/www/slide/inner.html +++ b/www/slide/inner.html @@ -40,18 +40,19 @@ <div id="bar"></div> <!-- <textarea></textarea>--> <div id="cme_toolbox" class="toolbar-container"></div> - <textarea id="editor1" name="editor1"></textarea> - - <span class="cp slide"> - <div id="modal"> - <div id="button_exit" class="button"><span class="fa fa-times"></span></div> - <div id="button_left" class="button"><span class="fa fa-chevron-left"></span></div> - <div id="button_right" class="button"><span class="fa fa-chevron-right"></span></div> - <div id="content"></div> + <div id="editorContainer"> + <textarea id="editor1" name="editor1"></textarea> + <div class="cp slide" tabindex="2"> + <div id="modal"> + <div id="button_exit" class="button"><span class="fa fa-times"></span></div> + <div id="button_left" class="button"><span class="fa fa-chevron-left"></span></div> + <div id="button_right" class="button"><span class="fa fa-chevron-right"></span></div> + <div id="content"></div> + </div> + <div id="print"></div> + </div> </div> - <div id="print"></div> - </span> <div id="nope"></div> <div id="colorPicker_check"></div> </body> diff --git a/www/slide/main.js b/www/slide/main.js index ad6b8652b..18cb06be1 100644 --- a/www/slide/main.js +++ b/www/slide/main.js @@ -425,6 +425,25 @@ define([ $('body').append(createFileDialog()); }).appendTo($rightside); + var $previewButton = APP.$previewButton = Cryptpad.createButton(null, true); + $previewButton.removeClass('fa-question').addClass('fa-eye'); + $previewButton.attr('title', Messages.previewButtonTitle); + $previewButton.click(function () { + var $c = $iframe.find('#editorContainer'); + if ($c.hasClass('preview')) { + Cryptpad.setPadAttribute('previewMode', false, function (e) { + if (e) { return console.log(e); } + }); + return void $c.removeClass('preview'); + } + Cryptpad.setPadAttribute('previewMode', true, function (e) { + if (e) { return console.log(e); } + }); + $c.addClass('preview'); + Slide.updateFontSize(); + }); + $rightside.append($previewButton); + var $printButton = $('<button>', { title: Messages.printButtonTitle, 'class': 'rightside-button fa fa-print', @@ -558,9 +577,15 @@ define([ if (Cryptpad.initialName && Title.isDefaultTitle()) { Title.updateTitle(Cryptpad.initialName); - onLocal(); } + Cryptpad.getPadAttribute('previewMode', function (e, data) { + if (e) { return void console.error(e); } + if (data === true && APP.$previewButton) { + APP.$previewButton.click(); + } + }); + Slide.onChange(function (o, n, l) { if (n !== null) { document.title = Title.title + ' (' + (++n) + '/' + l + ')'; diff --git a/www/slide/slide.css b/www/slide/slide.css index 51eb88edd..6bf7e459b 100644 --- a/www/slide/slide.css +++ b/www/slide/slide.css @@ -71,6 +71,41 @@ body .CodeMirror-focused .cm-matchhighlight { visibility: visible; } } +#editorContainer { + flex: 1; + display: flex; + flex-flow: row; + height: 100%; + overflow: hidden; +} +#editorContainer .CodeMirror { + resize: none; + width: 100vw; +} +#editorContainer.preview .CodeMirror { + width: 50vw; +} +.preview .cp { + flex: 1; + overflow: hidden; +} +.preview .cp div#modal { + position: relative; + top: auto; + left: auto; + width: auto; + display: block; + height: 100%; +} +.preview .cp div#modal #content .slide-container { + width: 100%; +} +.preview .cp div#modal #content .slide-frame { + width: 50vw; + height: 28.125vw; + max-height: 100vh; + max-width: 177.78vh; +} .cp { /* Slide position (print mode) */ /* Slide position (present mode) */ @@ -114,6 +149,8 @@ body .CodeMirror-focused .cm-matchhighlight { } .cp div.modal, .cp div#modal { + background-color: black; + color: white; /* Navigation buttons */ box-sizing: border-box; z-index: 9001; @@ -161,8 +198,6 @@ body .CodeMirror-focused .cm-matchhighlight { top: 0px; left: 0px; z-index: 100; - background-color: black; - color: white; height: 100vh; width: 100%; } @@ -174,10 +209,6 @@ body .CodeMirror-focused .cm-matchhighlight { overflow: visible; white-space: nowrap; } -.cp div.modal #content.transition, -.cp div#modal #content.transition { - transition: margin-left 1s; -} .cp div.modal #content .slide-frame, .cp div#modal #content .slide-frame { display: inline-block; @@ -207,6 +238,10 @@ body .CodeMirror-focused .cm-matchhighlight { text-align: center; vertical-align: top; } +.cp div.modal #content.transition .slide-container, +.cp div#modal #content.transition .slide-container { + transition: margin-left 1s; +} .cp div.modal .center, .cp div#modal .center { position: relative; diff --git a/www/slide/slide.js b/www/slide/slide.js index 731e5b8ee..ed0f0ab2c 100644 --- a/www/slide/slide.js +++ b/www/slide/slide.js @@ -41,12 +41,20 @@ define([ var updateFontSize = Slide.updateFontSize = function() { // 20vh // 20 * 16 / 9vw - if ($(window).width() > 16/9*$(window).height()) { - $content.css('font-size', '20vh'); + var wbase = 20; + var vh = 20; + var $elem = $(window); + if (!Slide.shown) { + wbase = 10; + vh *= $content.height()/$(window).height(); + $elem = $content; + } + if ($elem.width() > 16/9*$elem.height()) { + $content.css('font-size', vh+'vh'); // $print.css('font-size', '20vh'); return; } - $content.css('font-size', (20*9/16)+'vw'); + $content.css('font-size', (wbase*9/16)+'vw'); // $print.css('font-size', (20*9/16)+'vw'); }; @@ -86,7 +94,8 @@ define([ } //$content.find('.' + slideClass).hide(); //$content.find('.' + slideClass + ':eq( ' + i + ' )').show(); - $content.css('margin-left', -(i*100)+'vw'); + //$content.css('margin-left', -(i*100)+'vw'); + $content.find('.slide-container').first().css('margin-left', -(i*100)+'%'); updateFontSize(); change(Slide.lastIndex, Slide.index); }; @@ -134,7 +143,9 @@ define([ }; Slide.update = function (content, init) { - if (!Slide.shown && !init) { return; } + console.log(content, init); + updateFontSize(); + //if (!init) { return; } if (!content) { content = ''; } var old = Slide.content; Slide.content = content.replace(/\n\s*\-\-\-\s*\n/g, '\n\n'+separator+'\n\n'); @@ -198,13 +209,15 @@ define([ $modal.trigger(ev); }); $modal.find('#button_right').click(function () { + console.log('right'); var ev = $.Event("keyup"); ev.which = 39; $modal.trigger(ev); }); + $pad.contents().find('.CodeMirror').keyup(function (e) { e.stopPropagation(); }); $(ifrw).on('keyup', function (e) { - if (!Slide.shown) { return; } + //if (!Slide.shown) { return; } if (e.ctrlKey) { return; } switch(e.which) { case 33: // pageup diff --git a/www/slide/slide.less b/www/slide/slide.less index 67db16e10..1a6d6e333 100644 --- a/www/slide/slide.less +++ b/www/slide/slide.less @@ -77,6 +77,46 @@ body { } +#editorContainer { + flex: 1; + display: flex; + flex-flow: row; + height: 100%; + overflow: hidden; + .CodeMirror { + resize: none; + width: 100vw; + } + &.preview { + .CodeMirror { + //resize: horizontal; + width: 50vw; + } + } +} +.preview .cp { + flex: 1; + overflow: hidden; + div#modal { + position: relative; + top: auto; + left: auto; + width: auto; + display: block; + height: 100%; + #content { + .slide-container { + width: 100%; + } + .slide-frame { + width: 50vw; + height: 28.125vw; // height:width ratio = 9/16 = .5625 + max-height: 100vh; + max-width: 177.78vh; // 16/9 = 1.778 + } + } + } +} .cp { /* Slide position (print mode) */ @@ -123,6 +163,8 @@ body { /* Slide position (present mode) */ div.modal, div#modal { display: none; + background-color: black; + color: white; /* Navigation buttons */ .button { @@ -155,15 +197,10 @@ div.modal, div#modal { top: 0px; left: 0px; z-index: 100; - background-color: black; - color: white; height: 100vh; width: 100%; } #content { - &.transition { - transition: margin-left 1s; - } font-size: 20vh; position: relative; height: 100%; @@ -198,6 +235,11 @@ div.modal, div#modal { text-align: center; vertical-align: top; } + &.transition { + .slide-container { + transition: margin-left 1s; + } + } } box-sizing: border-box;