|
@@ -1,75 +1,105 @@
|
|
|
<template>
|
|
|
<div class="column no-wrap">
|
|
|
- <div ref="header" class="header" v-show="toolBarActive">
|
|
|
+ <div v-show="toolBarActive" ref="header" class="header">
|
|
|
<div ref="buttons" class="row justify-between no-wrap">
|
|
|
<div>
|
|
|
- <button ref="loader" class="tool-button" :class="buttonActiveClass('loader')" @click="buttonClick('loader')" v-ripple>
|
|
|
- <q-icon name="la la-arrow-left" size="32px"/>
|
|
|
- <q-tooltip :delay="1500" anchor="bottom right" content-style="font-size: 80%">{{ rstore.readerActions['loader'] }}</q-tooltip>
|
|
|
+ <button ref="loader" v-ripple class="tool-button" :class="buttonActiveClass('loader')" @click="buttonClick('loader')">
|
|
|
+ <q-icon name="la la-arrow-left" size="32px" />
|
|
|
+ <q-tooltip :delay="1500" anchor="bottom right" content-style="font-size: 80%">
|
|
|
+ {{ rstore.readerActions['loader'] }}
|
|
|
+ </q-tooltip>
|
|
|
</button>
|
|
|
</div>
|
|
|
|
|
|
<div>
|
|
|
- <button ref="undoAction" v-show="showToolButton['undoAction']" class="tool-button" :class="buttonActiveClass('undoAction')" @click="buttonClick('undoAction')" v-ripple>
|
|
|
- <q-icon name="la la-angle-left" size="32px"/>
|
|
|
- <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">{{ rstore.readerActions['undoAction'] }}</q-tooltip>
|
|
|
+ <button v-show="showToolButton['undoAction']" ref="undoAction" v-ripple class="tool-button" :class="buttonActiveClass('undoAction')" @click="buttonClick('undoAction')">
|
|
|
+ <q-icon name="la la-angle-left" size="32px" />
|
|
|
+ <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">
|
|
|
+ {{ rstore.readerActions['undoAction'] }}
|
|
|
+ </q-tooltip>
|
|
|
</button>
|
|
|
- <button ref="redoAction" v-show="showToolButton['redoAction']" class="tool-button" :class="buttonActiveClass('redoAction')" @click="buttonClick('redoAction')" v-ripple>
|
|
|
- <q-icon name="la la-angle-right" size="32px"/>
|
|
|
- <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">{{ rstore.readerActions['redoAction'] }}</q-tooltip>
|
|
|
+ <button v-show="showToolButton['redoAction']" ref="redoAction" v-ripple class="tool-button" :class="buttonActiveClass('redoAction')" @click="buttonClick('redoAction')">
|
|
|
+ <q-icon name="la la-angle-right" size="32px" />
|
|
|
+ <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">
|
|
|
+ {{ rstore.readerActions['redoAction'] }}
|
|
|
+ </q-tooltip>
|
|
|
</button>
|
|
|
<div class="space"></div>
|
|
|
- <button ref="fullScreen" v-show="showToolButton['fullScreen']" class="tool-button" :class="buttonActiveClass('fullScreen')" @click="buttonClick('fullScreen')" v-ripple>
|
|
|
- <q-icon :name="(fullScreenActive ? 'la la-compress-arrows-alt': 'la la-expand-arrows-alt')" size="32px"/>
|
|
|
- <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">{{ rstore.readerActions['fullScreen'] }}</q-tooltip>
|
|
|
+ <button v-show="showToolButton['fullScreen']" ref="fullScreen" v-ripple class="tool-button" :class="buttonActiveClass('fullScreen')" @click="buttonClick('fullScreen')">
|
|
|
+ <q-icon :name="(fullScreenActive ? 'la la-compress-arrows-alt': 'la la-expand-arrows-alt')" size="32px" />
|
|
|
+ <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">
|
|
|
+ {{ rstore.readerActions['fullScreen'] }}
|
|
|
+ </q-tooltip>
|
|
|
</button>
|
|
|
- <button ref="scrolling" v-show="showToolButton['scrolling']" class="tool-button" :class="buttonActiveClass('scrolling')" @click="buttonClick('scrolling')" v-ripple>
|
|
|
- <q-icon name="la la-film" size="32px"/>
|
|
|
- <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">{{ rstore.readerActions['scrolling'] }}</q-tooltip>
|
|
|
+ <button v-show="showToolButton['scrolling']" ref="scrolling" v-ripple class="tool-button" :class="buttonActiveClass('scrolling')" @click="buttonClick('scrolling')">
|
|
|
+ <q-icon name="la la-film" size="32px" />
|
|
|
+ <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">
|
|
|
+ {{ rstore.readerActions['scrolling'] }}
|
|
|
+ </q-tooltip>
|
|
|
</button>
|
|
|
- <button ref="setPosition" v-show="showToolButton['setPosition']" class="tool-button" :class="buttonActiveClass('setPosition')" @click="buttonClick('setPosition')" v-ripple>
|
|
|
- <q-icon name="la la-angle-double-right" size="32px"/>
|
|
|
- <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">{{ rstore.readerActions['setPosition'] }}</q-tooltip>
|
|
|
+ <button v-show="showToolButton['setPosition']" ref="setPosition" v-ripple class="tool-button" :class="buttonActiveClass('setPosition')" @click="buttonClick('setPosition')">
|
|
|
+ <q-icon name="la la-angle-double-right" size="32px" />
|
|
|
+ <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">
|
|
|
+ {{ rstore.readerActions['setPosition'] }}
|
|
|
+ </q-tooltip>
|
|
|
</button>
|
|
|
- <button ref="search" v-show="showToolButton['search']" class="tool-button" :class="buttonActiveClass('search')" @click="buttonClick('search')" v-ripple>
|
|
|
- <q-icon name="la la-search" size="32px"/>
|
|
|
- <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">{{ rstore.readerActions['search'] }}</q-tooltip>
|
|
|
+ <button v-show="showToolButton['search']" ref="search" v-ripple class="tool-button" :class="buttonActiveClass('search')" @click="buttonClick('search')">
|
|
|
+ <q-icon name="la la-search" size="32px" />
|
|
|
+ <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">
|
|
|
+ {{ rstore.readerActions['search'] }}
|
|
|
+ </q-tooltip>
|
|
|
</button>
|
|
|
- <button ref="copyText" v-show="showToolButton['copyText']" class="tool-button" :class="buttonActiveClass('copyText')" @click="buttonClick('copyText')" v-ripple>
|
|
|
- <q-icon name="la la-copy" size="32px"/>
|
|
|
- <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">{{ rstore.readerActions['copyText'] }}</q-tooltip>
|
|
|
+ <button v-show="showToolButton['copyText']" ref="copyText" v-ripple class="tool-button" :class="buttonActiveClass('copyText')" @click="buttonClick('copyText')">
|
|
|
+ <q-icon name="la la-copy" size="32px" />
|
|
|
+ <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">
|
|
|
+ {{ rstore.readerActions['copyText'] }}
|
|
|
+ </q-tooltip>
|
|
|
</button>
|
|
|
- <button ref="convOptions" v-show="showToolButton['convOptions']" class="tool-button" :class="buttonActiveClass('convOptions')" @click="buttonClick('convOptions')" v-ripple>
|
|
|
- <q-icon name="la la-magic" size="32px"/>
|
|
|
- <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">{{ rstore.readerActions['convOptions'] }}</q-tooltip>
|
|
|
+ <button v-show="showToolButton['convOptions']" ref="convOptions" v-ripple class="tool-button" :class="buttonActiveClass('convOptions')" @click="buttonClick('convOptions')">
|
|
|
+ <q-icon name="la la-magic" size="32px" />
|
|
|
+ <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">
|
|
|
+ {{ rstore.readerActions['convOptions'] }}
|
|
|
+ </q-tooltip>
|
|
|
</button>
|
|
|
- <button ref="refresh" v-show="showToolButton['refresh']" class="tool-button" :class="buttonActiveClass('refresh')" @click="buttonClick('refresh')" v-ripple>
|
|
|
- <q-icon name="la la-sync" size="32px" :class="{clear: !showRefreshIcon}"/>
|
|
|
- <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">{{ rstore.readerActions['refresh'] }}</q-tooltip>
|
|
|
+ <button v-show="showToolButton['refresh']" ref="refresh" v-ripple class="tool-button" :class="buttonActiveClass('refresh')" @click="buttonClick('refresh')">
|
|
|
+ <q-icon name="la la-sync" size="32px" :class="{clear: !showRefreshIcon}" />
|
|
|
+ <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">
|
|
|
+ {{ rstore.readerActions['refresh'] }}
|
|
|
+ </q-tooltip>
|
|
|
</button>
|
|
|
<div class="space"></div>
|
|
|
- <button ref="contents" v-show="showToolButton['contents']" class="tool-button" :class="buttonActiveClass('contents')" @click="buttonClick('contents')" v-ripple>
|
|
|
- <q-icon name="la la-list" size="32px"/>
|
|
|
- <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">{{ rstore.readerActions['contents'] }}</q-tooltip>
|
|
|
+ <button v-show="showToolButton['contents']" ref="contents" v-ripple class="tool-button" :class="buttonActiveClass('contents')" @click="buttonClick('contents')">
|
|
|
+ <q-icon name="la la-list" size="32px" />
|
|
|
+ <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">
|
|
|
+ {{ rstore.readerActions['contents'] }}
|
|
|
+ </q-tooltip>
|
|
|
</button>
|
|
|
- <button ref="libs" v-show="mode == 'liberama.top' && showToolButton['libs']" class="tool-button" :class="buttonActiveClass('libs')" @click="buttonClick('libs')" v-ripple>
|
|
|
- <q-icon name="la la-sitemap" size="32px"/>
|
|
|
- <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">{{ rstore.readerActions['libs'] }}</q-tooltip>
|
|
|
+ <button v-show="mode == 'liberama.top' && showToolButton['libs']" ref="libs" v-ripple class="tool-button" :class="buttonActiveClass('libs')" @click="buttonClick('libs')">
|
|
|
+ <q-icon name="la la-sitemap" size="32px" />
|
|
|
+ <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">
|
|
|
+ {{ rstore.readerActions['libs'] }}
|
|
|
+ </q-tooltip>
|
|
|
</button>
|
|
|
- <button ref="recentBooks" v-show="showToolButton['recentBooks']" class="tool-button" :class="buttonActiveClass('recentBooks')" @click="buttonClick('recentBooks')" v-ripple>
|
|
|
- <q-icon name="la la-book-open" size="32px"/>
|
|
|
- <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">{{ rstore.readerActions['recentBooks'] }}</q-tooltip>
|
|
|
+ <button v-show="showToolButton['recentBooks']" ref="recentBooks" v-ripple class="tool-button" :class="buttonActiveClass('recentBooks')" @click="buttonClick('recentBooks')">
|
|
|
+ <q-icon name="la la-book-open" size="32px" />
|
|
|
+ <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">
|
|
|
+ {{ rstore.readerActions['recentBooks'] }}
|
|
|
+ </q-tooltip>
|
|
|
</button>
|
|
|
</div>
|
|
|
|
|
|
<div>
|
|
|
- <button ref="offlineMode" v-show="showToolButton['offlineMode']" class="tool-button" :class="buttonActiveClass('offlineMode')" @click="buttonClick('offlineMode')" v-ripple>
|
|
|
- <q-icon name="la la-unlink" size="32px"/>
|
|
|
- <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">{{ rstore.readerActions['offlineMode'] }}</q-tooltip>
|
|
|
+ <button v-show="showToolButton['offlineMode']" ref="offlineMode" v-ripple class="tool-button" :class="buttonActiveClass('offlineMode')" @click="buttonClick('offlineMode')">
|
|
|
+ <q-icon name="la la-unlink" size="32px" />
|
|
|
+ <q-tooltip :delay="1500" anchor="bottom middle" content-style="font-size: 80%">
|
|
|
+ {{ rstore.readerActions['offlineMode'] }}
|
|
|
+ </q-tooltip>
|
|
|
</button>
|
|
|
- <button ref="settings" class="tool-button" :class="buttonActiveClass('settings')" @click="buttonClick('settings')" v-ripple>
|
|
|
- <q-icon name="la la-cog" size="32px"/>
|
|
|
- <q-tooltip :delay="1500" anchor="bottom left" content-style="font-size: 80%">{{ rstore.readerActions['settings'] }}</q-tooltip>
|
|
|
+ <button ref="settings" v-ripple class="tool-button" :class="buttonActiveClass('settings')" @click="buttonClick('settings')">
|
|
|
+ <q-icon name="la la-cog" size="32px" />
|
|
|
+ <q-tooltip :delay="1500" anchor="bottom left" content-style="font-size: 80%">
|
|
|
+ {{ rstore.readerActions['settings'] }}
|
|
|
+ </q-tooltip>
|
|
|
</button>
|
|
|
</div>
|
|
|
</div>
|
|
@@ -77,7 +107,10 @@
|
|
|
|
|
|
<div class="main col row relative-position">
|
|
|
<keep-alive>
|
|
|
- <component ref="page" class="col" :is="activePage"
|
|
|
+ <component
|
|
|
+ :is="activePage"
|
|
|
+ ref="page"
|
|
|
+ class="col"
|
|
|
@load-book="loadBook"
|
|
|
@load-file="loadFile"
|
|
|
@book-pos-changed="bookPosChanged"
|
|
@@ -86,21 +119,23 @@
|
|
|
</keep-alive>
|
|
|
|
|
|
<SetPositionPage v-if="setPositionActive" ref="setPositionPage" @set-position-toggle="setPositionToggle" @book-pos-changed="bookPosChanged"></SetPositionPage>
|
|
|
- <SearchPage v-show="searchActive" ref="searchPage"
|
|
|
+ <SearchPage
|
|
|
+ v-show="searchActive"
|
|
|
+ ref="searchPage"
|
|
|
@do-action="doAction"
|
|
|
@book-pos-changed="bookPosChanged"
|
|
|
@start-text-search="startTextSearch"
|
|
|
- @stop-text-search="stopTextSearch">
|
|
|
- </SearchPage>
|
|
|
+ @stop-text-search="stopTextSearch"
|
|
|
+ ></SearchPage>
|
|
|
<CopyTextPage v-if="copyTextActive" ref="copyTextPage" @do-action="doAction"></CopyTextPage>
|
|
|
<LibsPage v-show="hidden" ref="libsPage" @load-book="loadBook" @libs-close="libsClose" @do-action="doAction"></LibsPage>
|
|
|
<RecentBooksPage v-show="recentBooksActive" ref="recentBooksPage" @load-book="loadBook" @recent-books-close="recentBooksClose"></RecentBooksPage>
|
|
|
<SettingsPage v-show="settingsActive" ref="settingsPage" @do-action="doAction"></SettingsPage>
|
|
|
<HelpPage v-if="helpActive" ref="helpPage" @do-action="doAction"></HelpPage>
|
|
|
<ClickMapPage v-show="clickMapActive" ref="clickMapPage"></ClickMapPage>
|
|
|
- <ServerStorage v-show="hidden" ref="serverStorage"></ServerStorage>
|
|
|
<ContentsPage v-show="contentsActive" ref="contentsPage" :book-pos="bookPos" :is-visible="contentsActive" @do-action="doAction" @book-pos-changed="bookPosChanged"></ContentsPage>
|
|
|
|
|
|
+ <ServerStorage v-show="hidden" ref="serverStorage"></ServerStorage>
|
|
|
<ReaderDialogs ref="dialogs" @donate-toggle="donateToggle" @version-history-toggle="versionHistoryToggle"></ReaderDialogs>
|
|
|
</div>
|
|
|
</div>
|
|
@@ -108,8 +143,8 @@
|
|
|
|
|
|
<script>
|
|
|
//-----------------------------------------------------------------------------
|
|
|
-import Vue from 'vue';
|
|
|
-import Component from 'vue-class-component';
|
|
|
+import vueComponent from '../vueComponent.js';
|
|
|
+
|
|
|
import _ from 'lodash';
|
|
|
import {Buffer} from 'safe-buffer';
|
|
|
|
|
@@ -125,9 +160,9 @@ import RecentBooksPage from './RecentBooksPage/RecentBooksPage.vue';
|
|
|
import SettingsPage from './SettingsPage/SettingsPage.vue';
|
|
|
import HelpPage from './HelpPage/HelpPage.vue';
|
|
|
import ClickMapPage from './ClickMapPage/ClickMapPage.vue';
|
|
|
-import ServerStorage from './ServerStorage/ServerStorage.vue';
|
|
|
import ContentsPage from './ContentsPage/ContentsPage.vue';
|
|
|
|
|
|
+import ServerStorage from './ServerStorage/ServerStorage.vue';
|
|
|
import ReaderDialogs from './ReaderDialogs/ReaderDialogs.vue';
|
|
|
|
|
|
import bookManager from './share/bookManager';
|
|
@@ -141,7 +176,7 @@ import miscApi from '../../api/misc';
|
|
|
import {versionHistory} from './versionHistory';
|
|
|
import * as utils from '../../share/utils';
|
|
|
|
|
|
-export default @Component({
|
|
|
+const componentOptions = {
|
|
|
components: {
|
|
|
LoaderPage,
|
|
|
TextPage,
|
|
@@ -155,9 +190,9 @@ export default @Component({
|
|
|
SettingsPage,
|
|
|
HelpPage,
|
|
|
ClickMapPage,
|
|
|
- ServerStorage,
|
|
|
ContentsPage,
|
|
|
|
|
|
+ ServerStorage,
|
|
|
ReaderDialogs,
|
|
|
},
|
|
|
watch: {
|
|
@@ -202,24 +237,30 @@ export default @Component({
|
|
|
this.stopScrolling();
|
|
|
},
|
|
|
},
|
|
|
-})
|
|
|
-class Reader extends Vue {
|
|
|
+};
|
|
|
+
|
|
|
+class Reader {
|
|
|
+ _options = componentOptions;
|
|
|
+
|
|
|
rstore = {};
|
|
|
+
|
|
|
loaderActive = false;
|
|
|
- offlineModeActive = false;
|
|
|
- progressActive = false;
|
|
|
fullScreenActive = false;
|
|
|
-
|
|
|
- scrollingActive = false;
|
|
|
setPositionActive = false;
|
|
|
searchActive = false;
|
|
|
copyTextActive = false;
|
|
|
+ convOptionsActive = false;
|
|
|
+ refreshActive = false;
|
|
|
+ contentsActive = false;
|
|
|
libsActive = false;
|
|
|
recentBooksActive = false;
|
|
|
+ offlineModeActive = false;
|
|
|
settingsActive = false;
|
|
|
- helpActive = false;
|
|
|
+
|
|
|
clickMapActive = false;
|
|
|
- contentsActive = false;
|
|
|
+ helpActive = false;
|
|
|
+ scrollingActive = false;
|
|
|
+ progressActive = false;
|
|
|
|
|
|
bookPos = null;
|
|
|
allowUrlParamBookPos = false;
|
|
@@ -243,10 +284,19 @@ class Reader extends Vue {
|
|
|
this.reader = this.$store.state.reader;
|
|
|
this.config = this.$store.state.config;
|
|
|
|
|
|
- this.$root.addKeyHook(this.keyHook);
|
|
|
+ this.$root.addEventHook('key', this.keyHook);
|
|
|
|
|
|
this.lastActivePage = false;
|
|
|
|
|
|
+ this.$watch(
|
|
|
+ () => this.$route.path,
|
|
|
+ (newValue) => {
|
|
|
+ if (newValue == '/reader') {
|
|
|
+ this.updateRoute();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ );
|
|
|
+
|
|
|
this.debouncedSetRecentBook = _.debounce(async(newValue) => {
|
|
|
const recent = this.mostRecentBook();
|
|
|
if (recent && (recent.bookPos != newValue || recent.bookPosSeen !== this.bookPosSeen)) {
|
|
@@ -281,7 +331,7 @@ class Reader extends Vue {
|
|
|
await bookManager.init(this.settings);
|
|
|
bookManager.addEventListener(this.bookManagerEvent);
|
|
|
|
|
|
- if (this.$root.rootRoute() == '/reader') {
|
|
|
+ if (this.$root.getRootRoute() == '/reader') {
|
|
|
if (this.routeParamUrl) {
|
|
|
await this.loadBook({url: this.routeParamUrl, bookPos: this.routeParamPos, force: this.routeParamRefresh});
|
|
|
} else {
|
|
@@ -566,7 +616,7 @@ class Reader extends Vue {
|
|
|
|
|
|
toolBarToggle() {
|
|
|
this.commit('reader/setToolBarActive', !this.toolBarActive);
|
|
|
- this.$root.$emit('resize');
|
|
|
+ this.$root.eventHook('resize');
|
|
|
}
|
|
|
|
|
|
fullScreenToggle() {
|
|
@@ -876,7 +926,7 @@ class Reader extends Vue {
|
|
|
}
|
|
|
|
|
|
get activePage() {
|
|
|
- let result = '';
|
|
|
+ let result = undefined;
|
|
|
|
|
|
if (this.progressActive)
|
|
|
result = 'ProgressPage';
|
|
@@ -891,7 +941,7 @@ class Reader extends Vue {
|
|
|
}
|
|
|
|
|
|
if (result != 'TextPage') {
|
|
|
- this.$root.$emit('set-app-title');
|
|
|
+ this.$root.setAppTitle();
|
|
|
}
|
|
|
|
|
|
// на LoaderPage всегда показываем toolBar
|
|
@@ -906,7 +956,7 @@ class Reader extends Vue {
|
|
|
const isParsed = await bookManager.hasBookParsed(last);
|
|
|
|
|
|
if (!isParsed) {
|
|
|
- this.$root.$emit('set-app-title');
|
|
|
+ this.$root.setAppTitle();
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -1232,7 +1282,7 @@ class Reader extends Vue {
|
|
|
|
|
|
keyHook(event) {
|
|
|
let result = false;
|
|
|
- if (this.$root.rootRoute() == '/reader') {
|
|
|
+ if (this.$root.getRootRoute() == '/reader') {
|
|
|
if (this.$root.stdDialog.active)
|
|
|
return result;
|
|
|
|
|
@@ -1278,6 +1328,8 @@ class Reader extends Vue {
|
|
|
return result;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+export default vueComponent(Reader);
|
|
|
//-----------------------------------------------------------------------------
|
|
|
</script>
|
|
|
|