mirror of
https://github.com/futurepress/epub.js.git
synced 2025-10-05 15:32:55 +02:00
Views -> Controllers, Moved previousLocationCfi logic to Reader, Bookmarks in Reader
This commit is contained in:
parent
3bfadb2abc
commit
e4be17a428
24 changed files with 1363 additions and 1003 deletions
57
reader/controllers/bookmarks_controller.js
Normal file
57
reader/controllers/bookmarks_controller.js
Normal file
|
@ -0,0 +1,57 @@
|
|||
EPUBJS.reader.BookmarksController = function() {
|
||||
var book = this.book;
|
||||
|
||||
var $bookmarks = $("#bookmarksView"),
|
||||
$list = $bookmarks.find("#bookmarks");
|
||||
|
||||
var docfrag = document.createDocumentFragment();
|
||||
|
||||
var show = function() {
|
||||
$bookmarks.show();
|
||||
};
|
||||
|
||||
var hide = function() {
|
||||
$bookmarks.hide();
|
||||
};
|
||||
|
||||
var createBookmarkItem = function(cfi) {
|
||||
var listitem = document.createElement("li"),
|
||||
link = document.createElement("a");
|
||||
|
||||
listitem.classList.add('list_item');
|
||||
|
||||
//-- TODO: Parse Cfi
|
||||
link.textContent = cfi;
|
||||
link.href = cfi;
|
||||
|
||||
link.classList.add('bookmark_link');
|
||||
|
||||
link.addEventListener("click", function(event){
|
||||
var cfi = this.getAttribute('href');
|
||||
book.gotoCfi(cfi);
|
||||
event.preventDefault();
|
||||
}, false);
|
||||
|
||||
listitem.appendChild(link);
|
||||
return listitem;
|
||||
};
|
||||
|
||||
this.settings.bookmarks.forEach(function(cfi) {
|
||||
var bookmark = createBookmarkItem(cfi);
|
||||
docfrag.appendChild(bookmark);
|
||||
});
|
||||
|
||||
$list.append(docfrag);
|
||||
|
||||
|
||||
|
||||
this.on("reader:bookmarked", function(cfi) {
|
||||
var item = createBookmarkItem(cfi);
|
||||
$list.append(item);
|
||||
});
|
||||
|
||||
return {
|
||||
"show" : show,
|
||||
"hide" : hide
|
||||
};
|
||||
};
|
74
reader/controllers/controls_controller.js
Normal file
74
reader/controllers/controls_controller.js
Normal file
|
@ -0,0 +1,74 @@
|
|||
EPUBJS.reader.ControlsController = function(book) {
|
||||
var reader = this;
|
||||
|
||||
var $store = $("#store"),
|
||||
$fullscreen = $("#fullscreen"),
|
||||
$fullscreenicon = $("#fullscreenicon"),
|
||||
$cancelfullscreenicon = $("#cancelfullscreenicon"),
|
||||
$slider = $("#slider"),
|
||||
$main = $("#main"),
|
||||
$sidebar = $("#sidebar"),
|
||||
$settings = $("#setting"),
|
||||
$bookmark = $("#bookmark");
|
||||
|
||||
var goOnline = function() {
|
||||
reader.offline = false;
|
||||
// $store.attr("src", $icon.data("save"));
|
||||
};
|
||||
|
||||
var goOffline = function() {
|
||||
reader.offline = true;
|
||||
// $store.attr("src", $icon.data("saved"));
|
||||
};
|
||||
|
||||
book.on("book:online", goOnline);
|
||||
book.on("book:offline", goOffline);
|
||||
|
||||
$slider.on("click", function () {
|
||||
if(reader.sidebarOpen) {
|
||||
reader.SidebarController.hide();
|
||||
$slider.addClass("icon-menu");
|
||||
$slider.removeClass("icon-right");
|
||||
} else {
|
||||
reader.SidebarController.show();
|
||||
$slider.addClass("icon-right");
|
||||
$slider.removeClass("icon-menu");
|
||||
}
|
||||
});
|
||||
|
||||
$fullscreen.on("click", function() {
|
||||
screenfull.toggle($('#container')[0]);
|
||||
$fullscreenicon.toggle();
|
||||
$cancelfullscreenicon.toggle();
|
||||
});
|
||||
|
||||
$settings.on("click", function() {
|
||||
reader.SettingsController.show();
|
||||
});
|
||||
|
||||
$bookmark.on("click", function() {
|
||||
$bookmark.addClass("icon-bookmark");
|
||||
$bookmark.removeClass("icon-bookmark-empty");
|
||||
reader.addBookmark(reader.book.getCurrentLocationCfi());
|
||||
});
|
||||
|
||||
book.on('renderer:pageChanged', function(cfi){
|
||||
//-- Check if bookmarked
|
||||
var bookmarked = reader.isBookmarked(cfi);
|
||||
|
||||
if(bookmarked === -1) { //-- Not bookmarked
|
||||
$bookmark
|
||||
.removeClass("icon-bookmark")
|
||||
.addClass("icon-bookmark-empty");
|
||||
} else { //-- Bookmarked
|
||||
$bookmark
|
||||
.addClass("icon-bookmark")
|
||||
.removeClass("icon-bookmark-empty");
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
return {
|
||||
|
||||
};
|
||||
};
|
14
reader/controllers/meta_controller.js
Normal file
14
reader/controllers/meta_controller.js
Normal file
|
@ -0,0 +1,14 @@
|
|||
EPUBJS.reader.MetaController = function(meta) {
|
||||
var title = meta.bookTitle,
|
||||
author = meta.creator;
|
||||
|
||||
var $title = $("#book-title"),
|
||||
$author = $("#chapter-title"),
|
||||
$dash = $("#title-seperator");
|
||||
|
||||
document.title = title+" – "+author;
|
||||
|
||||
$title.html(title);
|
||||
$author.html(author);
|
||||
$dash.show();
|
||||
};
|
87
reader/controllers/reader_controller.js
Normal file
87
reader/controllers/reader_controller.js
Normal file
|
@ -0,0 +1,87 @@
|
|||
EPUBJS.reader.ReaderController = function(book) {
|
||||
var $main = $("#main"),
|
||||
$divider = $("#divider"),
|
||||
$loader = $("#loader"),
|
||||
$next = $("#next"),
|
||||
$prev = $("#prev");
|
||||
|
||||
var slideIn = function() {
|
||||
$main.removeClass("closed");
|
||||
};
|
||||
|
||||
var slideOut = function() {
|
||||
$main.addClass("closed");
|
||||
};
|
||||
|
||||
var showLoader = function() {
|
||||
$loader.show();
|
||||
hideDivider();
|
||||
};
|
||||
|
||||
var hideLoader = function() {
|
||||
$loader.hide();
|
||||
|
||||
//-- If the book is using spreads, show the divider
|
||||
if(!book.single) {
|
||||
showDivider();
|
||||
}
|
||||
};
|
||||
|
||||
var showDivider = function() {
|
||||
$divider.addClass("show");
|
||||
};
|
||||
|
||||
var hideDivider = function() {
|
||||
$divider.removeClass("show");
|
||||
};
|
||||
|
||||
var keylock = false;
|
||||
|
||||
var arrowKeys = function(e) {
|
||||
if(e.keyCode == 37) {
|
||||
book.prevPage();
|
||||
$prev.addClass("active");
|
||||
|
||||
keylock = true;
|
||||
setTimeout(function(){
|
||||
keylock = false;
|
||||
$prev.removeClass("active");
|
||||
}, 100);
|
||||
|
||||
e.preventDefault();
|
||||
}
|
||||
if(e.keyCode == 39) {
|
||||
book.nextPage();
|
||||
$next.addClass("active");
|
||||
|
||||
keylock = true;
|
||||
setTimeout(function(){
|
||||
keylock = false;
|
||||
$next.removeClass("active");
|
||||
}, 100);
|
||||
|
||||
e.preventDefault();
|
||||
}
|
||||
}
|
||||
|
||||
document.addEventListener('keydown', arrowKeys, false);
|
||||
|
||||
$next.on("click", function(e){
|
||||
book.nextPage();
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
$prev.on("click", function(e){
|
||||
book.prevPage();
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
return {
|
||||
"slideOut" : slideOut,
|
||||
"slideIn" : slideIn,
|
||||
"showLoader" : showLoader,
|
||||
"hideLoader" : hideLoader,
|
||||
"showDivider" : showDivider,
|
||||
"hideDivider" : hideDivider
|
||||
};
|
||||
};
|
27
reader/controllers/settings_controller.js
Normal file
27
reader/controllers/settings_controller.js
Normal file
|
@ -0,0 +1,27 @@
|
|||
EPUBJS.reader.SettingsController = function() {
|
||||
var book = this.book;
|
||||
|
||||
var $settings = $("#settings-modal"),
|
||||
$overlay = $(".overlay");
|
||||
|
||||
var show = function() {
|
||||
$settings.addClass("md-show");
|
||||
};
|
||||
|
||||
var hide = function() {
|
||||
$settings.removeClass("md-show");
|
||||
};
|
||||
|
||||
$settings.find(".closer").on("click", function() {
|
||||
hide();
|
||||
});
|
||||
|
||||
$overlay.on("click", function() {
|
||||
hide();
|
||||
});
|
||||
|
||||
return {
|
||||
"show" : show,
|
||||
"hide" : hide
|
||||
};
|
||||
};
|
50
reader/controllers/sidebar_controller.js
Normal file
50
reader/controllers/sidebar_controller.js
Normal file
|
@ -0,0 +1,50 @@
|
|||
EPUBJS.reader.SidebarController = function(book) {
|
||||
var reader = this;
|
||||
|
||||
var $sidebar = $("#sidebar"),
|
||||
$panels = $("#panels");
|
||||
|
||||
var activePanel = "Toc";
|
||||
|
||||
var changePanelTo = function(viewName) {
|
||||
var controllerName = viewName + "Controller";
|
||||
|
||||
if(activePanel == viewName || typeof reader[controllerName] === 'undefined' ) return;
|
||||
reader[activePanel+ "Controller"].hide();
|
||||
reader[controllerName].show();
|
||||
activePanel = viewName;
|
||||
|
||||
$panels.find('.active').removeClass("active");
|
||||
$panels.find("#show-" + viewName ).addClass("active");
|
||||
};
|
||||
|
||||
var getActivePanel = function() {
|
||||
return activePanel;
|
||||
};
|
||||
|
||||
var show = function() {
|
||||
reader.sidebarOpen = true;
|
||||
reader.ReaderController.slideOut();
|
||||
$sidebar.addClass("open");
|
||||
}
|
||||
|
||||
var hide = function() {
|
||||
reader.sidebarOpen = false;
|
||||
reader.ReaderController.slideIn();
|
||||
$sidebar.removeClass("open");
|
||||
}
|
||||
|
||||
$panels.find(".show_view").on("click", function(event) {
|
||||
var view = $(this).data("view");
|
||||
|
||||
changePanelTo(view);
|
||||
event.preventDefault();
|
||||
});
|
||||
|
||||
return {
|
||||
'show' : show,
|
||||
'hide' : hide,
|
||||
'getActivePanel' : getActivePanel,
|
||||
'changePanelTo' : changePanelTo
|
||||
};
|
||||
};
|
114
reader/controllers/toc_controller.js
Normal file
114
reader/controllers/toc_controller.js
Normal file
|
@ -0,0 +1,114 @@
|
|||
EPUBJS.reader.TocController = function(toc) {
|
||||
var book = this.book;
|
||||
|
||||
var $list = $("#tocView"),
|
||||
docfrag = document.createDocumentFragment();
|
||||
|
||||
var currentChapter = false;
|
||||
|
||||
var generateTocItems = function(toc, level) {
|
||||
var container = document.createElement("ul");
|
||||
|
||||
if(!level) level = 1;
|
||||
|
||||
toc.forEach(function(chapter) {
|
||||
var listitem = document.createElement("li"),
|
||||
link = document.createElement("a");
|
||||
toggle = document.createElement("a");
|
||||
|
||||
var subitems;
|
||||
|
||||
listitem.id = "toc-"+chapter.id;
|
||||
listitem.classList.add('list_item');
|
||||
|
||||
link.textContent = chapter.label;
|
||||
link.href = chapter.href;
|
||||
|
||||
link.classList.add('toc_link');
|
||||
|
||||
listitem.appendChild(link);
|
||||
|
||||
if(chapter.subitems) {
|
||||
level++;
|
||||
subitems = generateTocItems(chapter.subitems, level);
|
||||
toggle.classList.add('toc_toggle');
|
||||
|
||||
listitem.insertBefore(toggle, link);
|
||||
listitem.appendChild(subitems);
|
||||
}
|
||||
|
||||
|
||||
container.appendChild(listitem);
|
||||
|
||||
});
|
||||
|
||||
return container;
|
||||
};
|
||||
|
||||
var onShow = function() {
|
||||
$list.show();
|
||||
};
|
||||
|
||||
var onHide = function() {
|
||||
$list.hide();
|
||||
};
|
||||
|
||||
var chapterChange = function(e) {
|
||||
var id = e.id,
|
||||
$item = $list.find("#toc-"+id),
|
||||
$current = $list.find(".currentChapter"),
|
||||
$open = $list.find('.openChapter');
|
||||
|
||||
if($item.length){
|
||||
|
||||
if($item != $current && $item.has(currentChapter).length > 0) {
|
||||
$current.removeClass("currentChapter");
|
||||
}
|
||||
|
||||
$item.addClass("currentChapter");
|
||||
|
||||
// $open.removeClass("openChapter");
|
||||
$item.parents('li').addClass("openChapter");
|
||||
}
|
||||
};
|
||||
|
||||
book.on('renderer:chapterDisplayed', chapterChange);
|
||||
|
||||
var tocitems = generateTocItems(toc);
|
||||
|
||||
docfrag.appendChild(tocitems);
|
||||
|
||||
$list.append(docfrag);
|
||||
$list.find(".toc_link").on("click", function(event){
|
||||
var url = this.getAttribute('href');
|
||||
|
||||
//-- Provide the Book with the url to show
|
||||
// The Url must be found in the books manifest
|
||||
book.goto(url);
|
||||
|
||||
$list.find(".currentChapter")
|
||||
.addClass("openChapter")
|
||||
.removeClass("currentChapter");
|
||||
|
||||
$(this).parent('li').addClass("currentChapter");
|
||||
|
||||
event.preventDefault();
|
||||
});
|
||||
|
||||
$list.find(".toc_toggle").on("click", function(event){
|
||||
var $el = $(this).parent('li'),
|
||||
open = $el.hasClass("openChapter");
|
||||
|
||||
if(open){
|
||||
$el.removeClass("openChapter");
|
||||
} else {
|
||||
$el.addClass("openChapter");
|
||||
}
|
||||
event.preventDefault();
|
||||
});
|
||||
|
||||
return {
|
||||
"show" : onShow,
|
||||
"hide" : onHide
|
||||
};
|
||||
};
|
Loading…
Add table
Add a link
Reference in a new issue