Добавлен компонент SetPositionPage - установка позиции в тексте

This commit is contained in:
Book Pauk
2019-01-28 04:57:45 +07:00
parent 5b69c7cfca
commit 312f20d2bd
3 changed files with 140 additions and 12 deletions

View File

@@ -54,6 +54,8 @@
</keep-alive> </keep-alive>
<HistoryPage v-if="historyActive" ref="historyPage" @load-book="loadBook" @history-toggle="historyToggle"></HistoryPage> <HistoryPage v-if="historyActive" ref="historyPage" @load-book="loadBook" @history-toggle="historyToggle"></HistoryPage>
<SetPositionPage v-if="setPositionActive" ref="setPositionPage" @set-position-toggle="setPositionToggle" @book-pos-changed="bookPosChanged"></SetPositionPage>
</el-main> </el-main>
</el-container> </el-container>
</template> </template>
@@ -63,10 +65,12 @@
import Vue from 'vue'; import Vue from 'vue';
import Component from 'vue-class-component'; import Component from 'vue-class-component';
import LoaderPage from './LoaderPage/LoaderPage.vue'; import LoaderPage from './LoaderPage/LoaderPage.vue';
import HistoryPage from './HistoryPage/HistoryPage.vue';
import TextPage from './TextPage/TextPage.vue'; import TextPage from './TextPage/TextPage.vue';
import ProgressPage from './ProgressPage/ProgressPage.vue'; import ProgressPage from './ProgressPage/ProgressPage.vue';
import HistoryPage from './HistoryPage/HistoryPage.vue';
import SetPositionPage from './SetPositionPage/SetPositionPage.vue';
import bookManager from './share/bookManager'; import bookManager from './share/bookManager';
import readerApi from '../../api/reader'; import readerApi from '../../api/reader';
import {sleep} from '../../share/utils'; import {sleep} from '../../share/utils';
@@ -74,9 +78,10 @@ import {sleep} from '../../share/utils';
export default @Component({ export default @Component({
components: { components: {
LoaderPage, LoaderPage,
HistoryPage,
TextPage, TextPage,
ProgressPage ProgressPage,
HistoryPage,
SetPositionPage,
}, },
watch: { watch: {
bookPos: function(newValue) { bookPos: function(newValue) {
@@ -104,11 +109,12 @@ export default @Component({
}) })
class Reader extends Vue { class Reader extends Vue {
loaderActive = false; loaderActive = false;
historyActive = false;
progressActive = false; progressActive = false;
fullScreenActive = false; fullScreenActive = false;
historyActive = false;
setPositionActive = false;
bookPos = null; bookPos = null;
allowUrlParamBookPos = true; allowUrlParamBookPos = true;
showRefreshIcon = true; showRefreshIcon = true;
@@ -122,7 +128,7 @@ class Reader extends Vue {
this.lastActivePage = false; this.lastActivePage = false;
document.addEventListener('fullscreenchange', (event) => { document.addEventListener('fullscreenchange', () => {
this.fullScreenActive = (document.fullscreenElement !== null); this.fullScreenActive = (document.fullscreenElement !== null);
}); });
} }
@@ -175,7 +181,8 @@ class Reader extends Vue {
} }
bookPosChanged(event) { bookPosChanged(event) {
this.bookPosSeen = event.bookPosSeen; if (event.bookPosSeen !== undefined)
this.bookPosSeen = event.bookPosSeen;
this.bookPos = event.bookPos; this.bookPos = event.bookPos;
this.updateRoute(); this.updateRoute();
} }
@@ -223,17 +230,30 @@ class Reader extends Vue {
this.historyActive = !this.historyActive; this.historyActive = !this.historyActive;
} }
setPositionToggle() {
this.setPositionActive = !this.setPositionActive;
if (this.setPositionActive) {
this.$nextTick(() => {
this.$refs.setPositionPage.sliderMax = this.lastOpenedBook.textLength - 1;
this.$refs.setPositionPage.sliderValue = this.lastOpenedBook.bookPos;
});
}
}
buttonClick(button) { buttonClick(button) {
switch (button) { switch (button) {
case 'loader': case 'loader':
this.loaderToggle(); this.loaderToggle();
break; break;
case 'history':
this.historyToggle();
break;
case 'fullScreen': case 'fullScreen':
this.fullScreenToggle(); this.fullScreenToggle();
break; break;
case 'history':
this.historyToggle();
break;
case 'setPosition':
this.setPositionToggle();
break;
case 'refresh': case 'refresh':
if (this.lastOpenedBook) { if (this.lastOpenedBook) {
this.loadBook({url: this.lastOpenedBook.url, force: true}); this.loadBook({url: this.lastOpenedBook.url, force: true});
@@ -247,8 +267,9 @@ class Reader extends Vue {
const classActive = { 'tool-button-active': true, 'tool-button-active:hover': true }; const classActive = { 'tool-button-active': true, 'tool-button-active:hover': true };
switch (button) { switch (button) {
case 'loader': return (this.loaderActive ? classActive : {}); case 'loader': return (this.loaderActive ? classActive : {});
case 'history': return (this.historyActive ? classActive : {});
case 'fullScreen': return (this.fullScreenActive ? classActive : {}); case 'fullScreen': return (this.fullScreenActive ? classActive : {});
case 'history': return (this.historyActive ? classActive : {});
case 'setPosition': return (this.setPositionActive ? classActive : {});
} }
return {}; return {};
} }
@@ -416,6 +437,9 @@ class Reader extends Vue {
if (this.historyActive) if (this.historyActive)
handled = this.$refs.historyPage.keyHook(event); handled = this.$refs.historyPage.keyHook(event);
if (this.setPositionActive)
handled = this.$refs.setPositionPage.keyHook(event);
if (!handled && this.$refs.page && this.$refs.page.keyHook) if (!handled && this.$refs.page && this.$refs.page.keyHook)
handled = this.$refs.page.keyHook(event); handled = this.$refs.page.keyHook(event);
@@ -427,6 +451,9 @@ class Reader extends Vue {
case 'KeyH': case 'KeyH':
this.historyToggle(); this.historyToggle();
break; break;
case 'KeyP':
this.setPositionToggle();
break;
} }
} }
} }

View File

@@ -0,0 +1,98 @@
<template>
<div ref="main" class="main" @click="close">
<div class="clickStop" @click.stop>
<Window @close="close">
<template slot="header">
Установить позицию
</template>
<div class="slider">
<el-slider v-model="sliderValue" :max="sliderMax" :format-tooltip="formatTooltip"></el-slider>
</div>
</Window>
</div>
</div>
</template>
<script>
//-----------------------------------------------------------------------------
import Vue from 'vue';
import Component from 'vue-class-component';
import _ from 'lodash';
import Window from '../../share/Window.vue';
export default @Component({
components: {
Window,
},
watch: {
sliderValue: function(newValue) {
this.debouncedEmitPosChange(newValue);
},
},
})
class SetPositionPage extends Vue {
sliderValue = null;
sliderMax = null;
created() {
this.commit = this.$store.commit;
this.reader = this.$store.state.reader;
this.debouncedEmitPosChange = _.debounce((newValue) => {
this.$emit('book-pos-changed', {bookPos: newValue});
}, 500);
}
formatTooltip(val) {
if (this.sliderMax)
return (val/this.sliderMax*100).toFixed(2) + '%';
else
return 0;
}
close() {
this.$emit('set-position-toggle');
}
keyHook(event) {
if (event.type == 'keydown' && (event.code == 'Escape' || event.code == 'KeyP')) {
this.close();
}
return true;
}
}
//-----------------------------------------------------------------------------
</script>
<style scoped>
.main {
position: absolute;
width: 100%;
height: 100%;
z-index: 40;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.clickStop {
width: 100%;
max-width: 600px;
height: 140px;
display: flex;
}
.slider {
margin: 20px;
background-color: #efefef;
border-radius: 15px;
}
.el-slider {
margin-right: 20px;
margin-left: 20px;
}
</style>

View File

@@ -59,6 +59,9 @@ import './theme/table-column.css';
import ElProgress from 'element-ui/lib/progress'; import ElProgress from 'element-ui/lib/progress';
import './theme/progress.css'; import './theme/progress.css';
import ElSlider from 'element-ui/lib/slider';
import './theme/slider.css';
import Notification from 'element-ui/lib/notification'; import Notification from 'element-ui/lib/notification';
import './theme/notification.css'; import './theme/notification.css';
@@ -72,7 +75,7 @@ const components = {
ElMenu, ElMenuItem, ElButton, ElCheckbox, ElTabs, ElTabPane, ElTooltip, ElMenu, ElMenuItem, ElButton, ElCheckbox, ElTabs, ElTabPane, ElTooltip,
ElContainer, ElAside, ElMain, ElHeader, ElContainer, ElAside, ElMain, ElHeader,
ElInput, ElTable, ElTableColumn, ElInput, ElTable, ElTableColumn,
ElProgress ElProgress, ElSlider
}; };
for (let name in components) { for (let name in components) {