diff --git a/static/js/annotationPanel.js b/static/js/annotationPanel.js index 428afcc..ffae227 100644 --- a/static/js/annotationPanel.js +++ b/static/js/annotationPanel.js @@ -10,6 +10,10 @@ oml.ui.annotationPanel = function() { title: 'add', tooltip: Ox._('Add Quote'), type: 'image' + }).bindEvent({ + click: function() { + oml.$ui.viewer.postMessage('addAnnotation', {}) + } }).appendTo($bar); var $menuButton = Ox.MenuButton({ @@ -50,6 +54,12 @@ oml.ui.annotationPanel = function() { orientation: 'vertical' }); + that.updateSelection = function(selection) { + $button.options({ + disabled: !selection + }) + } + return that; }; diff --git a/static/js/viewer.js b/static/js/viewer.js index d0a4e70..36ad0d8 100644 --- a/static/js/viewer.js +++ b/static/js/viewer.js @@ -110,6 +110,8 @@ oml.ui.viewer = function() { } else if (event == 'deselectAnnotation') { var $annotation = oml.$ui.annotationFolder.find('#a-' + data.id)[0] $annotation && $annotation.deselect() + } else if (event == 'selection') { + oml.$ui.annotationPanel.updateSelection(data) } else { console.log('got', event, data) that.triggerEvent(event, data); diff --git a/static/reader/epub.js b/static/reader/epub.js index 12f2483..14a309d 100644 --- a/static/reader/epub.js +++ b/static/reader/epub.js @@ -18,6 +18,8 @@ Ox.load({ if (annotation) { reader.rendition.display(annotation.cfiRange) } + } else if (event == 'addAnnotation') { + createAnnotation() } else if (event == 'addAnnotations') { data.annotations.forEach(function(annotation) { annotations.push(annotation) @@ -29,6 +31,29 @@ Ox.load({ }) }) + +function createAnnotation() { + console.log('createAnnotation', currentSelection) + if (currentSelection) { + /* + var range = currentSelection.contents.window.getSelection().getRangeAt(0) + console.log( + currentSelection.cfiRange, + reader.rendition.book.section().cfiFromRange(range).toString() + ) + //currentSelection.cfiRange = reader.rendition.book.section().cfiFromRange(range).toString() + */ + renderAnnotation(currentSelection) + currentSelection.contents.window.getSelection().removeAllRanges(); + delete currentSelection.contents + addAnnotation(currentSelection) + document.querySelectorAll('.epubjs-hl.selected').forEach(function(other) { + other.classList.remove('selected') + }) + currentSelection = null + } +} + function addAnnotation(annotation) { annotations.push(annotation) Ox.$parent.postMessage('addAnnotation', annotation) @@ -125,22 +150,7 @@ document.onreadystatechange = function () { if (selected) { deselectAllAnnotations() } - /* - var range = currentSelection.contents.window.getSelection().getRangeAt(0) - console.log( - currentSelection.cfiRange, - reader.rendition.book.section().cfiFromRange(range).toString() - ) - //currentSelection.cfiRange = reader.rendition.book.section().cfiFromRange(range).toString() - */ - renderAnnotation(currentSelection) - currentSelection.contents.window.getSelection().removeAllRanges(); - delete currentSelection.contents - addAnnotation(currentSelection) - document.querySelectorAll('.epubjs-hl.selected').forEach(function(other) { - other.classList.remove('selected') - }) - currentSelection = null + createAnnotation() } else if (selected) { console.log('editNote?', selected.dataset.id) @@ -162,7 +172,16 @@ document.onreadystatechange = function () { localStorage.epubFontSize = fontSize event.preventDefault() } - console.log(fontSize) + }).on('mouseup', function(event) { + if (currentSelection) { + var selection = window.getSelection() + if (selection.isCollapsed) { + currentSelection = null + } + if (!currentSelection) { + Ox.$parent.postMessage('selection', false) + } + } }) rendition.on("mark", function(cfiRange, contents) { console.log('!! mark', cfiRange) @@ -175,6 +194,7 @@ document.onreadystatechange = function () { text: text, contents: contents } + Ox.$parent.postMessage('selection', text ? true : false) }) }); } diff --git a/static/reader/pdf.js b/static/reader/pdf.js index d0cd52f..164fba9 100644 --- a/static/reader/pdf.js +++ b/static/reader/pdf.js @@ -27,6 +27,8 @@ Ox.load({ } }, delay) selectAnnotation(data.id) + } else if (event == 'addAnnotation') { + createAnnotation() } else if (event == 'addAnnotations') { data.annotations.forEach(function(annotation) { annotations.push(annotation) @@ -47,13 +49,7 @@ window.addEventListener('keydown', function(event) { } else if (event.key == 'n' || event.keyCode == 13) { var selected = document.querySelector('.oml-annotation.selected') if (!window.getSelection().isCollapsed) { - if (selected) { - deselectAllAnnotations() - } - var annot = getHighlight() - renderAnnotation(annot) - addAnnotation(annot) - window.getSelection().removeAllRanges(); + createAnnotation() } else if (selected) { console.log('editNote?', selected.dataset.id) } @@ -61,6 +57,14 @@ window.addEventListener('keydown', function(event) { event.preventDefault() } }) +window.addEventListener('mouseup', function(event) { + var selection = window.getSelection() + if (selection.isCollapsed) { + Ox.$parent.postMessage('selection', false) + } else { + Ox.$parent.postMessage('selection', true) + } +}) function bindEvents() { if (!window.PDFViewerApplication || !window.PDFViewerApplication.eventBus) { @@ -95,6 +99,18 @@ function getHighlight() { }; } +function createAnnotation() { + var selected = document.querySelector('.oml-annotation.selected') + if (selected) { + deselectAllAnnotations() + } + var annot = getHighlight() + renderAnnotation(annot) + addAnnotation(annot) + window.getSelection().removeAllRanges(); +} + + function renderAnnotation(annotation) { var pageIndex = annotation.page - 1; var page = PDFViewerApplication.pdfViewer.getPageView(pageIndex);