|
@@ -1,13 +1,13 @@
|
|
<template>
|
|
<template>
|
|
- <div ref="main" class="main" @click="onMouseClick">
|
|
|
|
- <canvas v-show="canvasShowFirst" ref="canvasPrev" class="canvas" @mousedown.prevent.stop="onMouseDown" @mouseup.prevent.stop="onMouseUp"
|
|
|
|
|
|
+ <div ref="main" class="main" @click.capture="onMouseClick">
|
|
|
|
+ <canvas :style="canvasStyle1" ref="canvas1" class="canvas" @mousedown.prevent.stop="onMouseDown" @mouseup.prevent.stop="onMouseUp"
|
|
@wheel.prevent.stop="onMouseWheel"
|
|
@wheel.prevent.stop="onMouseWheel"
|
|
- @touchstart.prevent.stop="onTouchStart" @touchend.prevent.stop="onTouchEnd"
|
|
|
|
|
|
+ @touchstart.stop="onTouchStart" @touchend.stop="onTouchEnd" @touchcancel.prevent.stop="onTouchCancel"
|
|
oncontextmenu="return false;">
|
|
oncontextmenu="return false;">
|
|
</canvas>
|
|
</canvas>
|
|
- <canvas v-show="!canvasShowFirst" ref="canvasNext" class="canvas" @mousedown.prevent.stop="onMouseDown" @mouseup.prevent.stop="onMouseUp"
|
|
|
|
|
|
+ <canvas :style="canvasStyle2" ref="canvas2" class="canvas" @mousedown.prevent.stop="onMouseDown" @mouseup.prevent.stop="onMouseUp"
|
|
@wheel.prevent.stop="onMouseWheel"
|
|
@wheel.prevent.stop="onMouseWheel"
|
|
- @touchstart.prevent.stop="onTouchStart" @touchend.prevent.stop="onTouchEnd"
|
|
|
|
|
|
+ @touchstart.stop="onTouchStart" @touchend.stop="onTouchEnd" @touchcancel.prevent.stop="onTouchCancel"
|
|
oncontextmenu="return false;">
|
|
oncontextmenu="return false;">
|
|
</canvas>
|
|
</canvas>
|
|
</div>
|
|
</div>
|
|
@@ -32,7 +32,7 @@ export default @Component({
|
|
},
|
|
},
|
|
})
|
|
})
|
|
class TextPage extends Vue {
|
|
class TextPage extends Vue {
|
|
- canvasShowFirst = false;
|
|
|
|
|
|
+ activeCanvas = false;
|
|
|
|
|
|
lastBook = null;
|
|
lastBook = null;
|
|
bookPos = 0;
|
|
bookPos = 0;
|
|
@@ -63,8 +63,8 @@ class TextPage extends Vue {
|
|
}
|
|
}
|
|
|
|
|
|
mounted() {
|
|
mounted() {
|
|
- this.canvasPrev = this.$refs.canvasPrev;
|
|
|
|
- this.canvasNext = this.$refs.canvasNext;
|
|
|
|
|
|
+ this.canvas1 = this.$refs.canvas1;
|
|
|
|
+ this.canvas2 = this.$refs.canvas2;
|
|
}
|
|
}
|
|
|
|
|
|
hex2rgba(hex, alpha = 1) {
|
|
hex2rgba(hex, alpha = 1) {
|
|
@@ -73,37 +73,42 @@ class TextPage extends Vue {
|
|
}
|
|
}
|
|
|
|
|
|
async calcDrawProps() {
|
|
async calcDrawProps() {
|
|
- this.contextPrev = this.canvasPrev.getContext('2d');
|
|
|
|
- this.contextNext = this.canvasNext.getContext('2d');
|
|
|
|
|
|
+/* this.canvas1.style.left = '0px';
|
|
|
|
+ this.canvas1.style.top = '0px';
|
|
|
|
+ this.canvas2.style.left = '0px';
|
|
|
|
+ this.canvas2.style.top = '0px';
|
|
|
|
+*/
|
|
|
|
+ this.context1 = this.canvas1.getContext('2d');
|
|
|
|
+ this.context2 = this.canvas2.getContext('2d');
|
|
|
|
|
|
this.realWidth = this.$refs.main.clientWidth;
|
|
this.realWidth = this.$refs.main.clientWidth;
|
|
this.realHeight = this.$refs.main.clientHeight;
|
|
this.realHeight = this.$refs.main.clientHeight;
|
|
|
|
|
|
let ratio = window.devicePixelRatio;
|
|
let ratio = window.devicePixelRatio;
|
|
if (ratio) {
|
|
if (ratio) {
|
|
- this.canvasPrev.width = this.realWidth*ratio;
|
|
|
|
- this.canvasPrev.height = this.realHeight*ratio;
|
|
|
|
- this.canvasPrev.style.width = this.$refs.main.clientWidth + 'px';
|
|
|
|
- this.canvasPrev.style.height = this.$refs.main.clientHeight + 'px';
|
|
|
|
- this.contextPrev.scale(ratio, ratio);
|
|
|
|
-
|
|
|
|
- this.canvasNext.width = this.realWidth*ratio;
|
|
|
|
- this.canvasNext.height = this.realHeight*ratio;
|
|
|
|
- this.canvasNext.style.width = this.$refs.main.clientWidth + 'px';
|
|
|
|
- this.canvasNext.style.height = this.$refs.main.clientHeight + 'px';
|
|
|
|
- this.contextNext.scale(ratio, ratio);
|
|
|
|
|
|
+ this.canvas1.width = this.realWidth*ratio;
|
|
|
|
+ this.canvas1.height = this.realHeight*ratio;
|
|
|
|
+ this.canvas1.style.width = this.$refs.main.clientWidth + 'px';
|
|
|
|
+ this.canvas1.style.height = this.$refs.main.clientHeight + 'px';
|
|
|
|
+ this.context1.scale(ratio, ratio);
|
|
|
|
+
|
|
|
|
+ this.canvas2.width = this.realWidth*ratio;
|
|
|
|
+ this.canvas2.height = this.realHeight*ratio;
|
|
|
|
+ this.canvas2.style.width = this.$refs.main.clientWidth + 'px';
|
|
|
|
+ this.canvas2.style.height = this.$refs.main.clientHeight + 'px';
|
|
|
|
+ this.context2.scale(ratio, ratio);
|
|
} else {
|
|
} else {
|
|
- this.canvasPrev.width = this.realWidth;
|
|
|
|
- this.canvasPrev.height = this.realHeight;
|
|
|
|
- this.canvasNext.width = this.realWidth;
|
|
|
|
- this.canvasNext.height = this.realHeight;
|
|
|
|
|
|
+ this.canvas1.width = this.realWidth;
|
|
|
|
+ this.canvas1.height = this.realHeight;
|
|
|
|
+ this.canvas2.width = this.realWidth;
|
|
|
|
+ this.canvas2.height = this.realHeight;
|
|
}
|
|
}
|
|
|
|
|
|
- this.contextPrev.textAlign = 'left';
|
|
|
|
- this.contextNext.textAlign = 'left';
|
|
|
|
- this.contextPrev.textBaseline = 'bottom';
|
|
|
|
- this.contextNext.textBaseline = 'bottom';
|
|
|
|
- this.canvasShowFirst = false;
|
|
|
|
|
|
+ this.context1.textAlign = 'left';
|
|
|
|
+ this.context2.textAlign = 'left';
|
|
|
|
+ this.context1.textBaseline = 'bottom';
|
|
|
|
+ this.context2.textBaseline = 'bottom';
|
|
|
|
+ this.activeCanvas = false;
|
|
|
|
|
|
this.w = this.realWidth - 2*this.indent;
|
|
this.w = this.realWidth - 2*this.indent;
|
|
this.h = this.realHeight - (this.showStatusBar ? this.statusBarHeight : 0);
|
|
this.h = this.realHeight - (this.showStatusBar ? this.statusBarHeight : 0);
|
|
@@ -115,7 +120,7 @@ class TextPage extends Vue {
|
|
this.parsed.w = this.w;// px, ширина текста
|
|
this.parsed.w = this.w;// px, ширина текста
|
|
this.parsed.font = this.font;
|
|
this.parsed.font = this.font;
|
|
this.parsed.wordWrap = this.wordWrap;
|
|
this.parsed.wordWrap = this.wordWrap;
|
|
- this.parsed.context = this.contextPrev;
|
|
|
|
|
|
+ this.parsed.context = this.context1;
|
|
this.parsed.fontByStyle = this.fontByStyle;
|
|
this.parsed.fontByStyle = this.fontByStyle;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -226,11 +231,19 @@ class TextPage extends Vue {
|
|
}
|
|
}
|
|
|
|
|
|
get context() {
|
|
get context() {
|
|
- return (this.canvasShowFirst ? this.contextPrev : this.contextNext);
|
|
|
|
|
|
+ return (this.activeCanvas ? this.context1 : this.context2);
|
|
}
|
|
}
|
|
|
|
|
|
get canvas() {
|
|
get canvas() {
|
|
- return (this.canvasShowFirst ? this.canvasPrev : this.canvasNext);
|
|
|
|
|
|
+ return (this.activeCanvas ? this.canvas1 : this.canvas2);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ get canvasStyle1() {
|
|
|
|
+ return (this.activeCanvas ? {display: 'block'} : {display: 'none'});
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ get canvasStyle2() {
|
|
|
|
+ return (this.activeCanvas ? {display: 'none'} : {display: 'block'});
|
|
}
|
|
}
|
|
|
|
|
|
draw(immediate) {
|
|
draw(immediate) {
|
|
@@ -239,7 +252,7 @@ class TextPage extends Vue {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- this.canvasShowFirst = !this.canvasShowFirst;
|
|
|
|
|
|
+ this.activeCanvas = !this.activeCanvas;
|
|
const context = this.context;
|
|
const context = this.context;
|
|
|
|
|
|
if (immediate) {
|
|
if (immediate) {
|
|
@@ -414,7 +427,7 @@ class TextPage extends Vue {
|
|
if (i >= 0 && this.linesDown.length > i) {
|
|
if (i >= 0 && this.linesDown.length > i) {
|
|
this.bookPosPrepared = this.linesDown[i].begin;
|
|
this.bookPosPrepared = this.linesDown[i].begin;
|
|
|
|
|
|
- const ctx = (!this.canvasShowFirst ? this.contextPrev : this.contextNext);
|
|
|
|
|
|
+ const ctx = (!this.activeCanvas ? this.context1 : this.context2);
|
|
this.drawPage(ctx, this.bookPosPrepared, true);
|
|
this.drawPage(ctx, this.bookPosPrepared, true);
|
|
|
|
|
|
this.pagePrepared = true;
|
|
this.pagePrepared = true;
|
|
@@ -520,8 +533,8 @@ class TextPage extends Vue {
|
|
this.repX = pointX;
|
|
this.repX = pointX;
|
|
this.repY = pointY;
|
|
this.repY = pointY;
|
|
|
|
|
|
- if (!this.repDoing) {
|
|
|
|
- this.repDoing = true;
|
|
|
|
|
|
+ if (!this.repInit && this.repDoing) {
|
|
|
|
+ this.repInit = true;
|
|
let delay = 400;
|
|
let delay = 400;
|
|
while (this.repDoing) {
|
|
while (this.repDoing) {
|
|
this.handleClick(pointX, pointY);
|
|
this.handleClick(pointX, pointY);
|
|
@@ -529,7 +542,7 @@ class TextPage extends Vue {
|
|
if (delay > 15)
|
|
if (delay > 15)
|
|
delay *= 0.8;
|
|
delay *= 0.8;
|
|
}
|
|
}
|
|
- this.repDoing = false;
|
|
|
|
|
|
+ this.repInit = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -543,8 +556,10 @@ class TextPage extends Vue {
|
|
const touch = event.touches[0];
|
|
const touch = event.touches[0];
|
|
const x = touch.pageX - this.canvas.offsetLeft;
|
|
const x = touch.pageX - this.canvas.offsetLeft;
|
|
const y = touch.pageY - this.canvas.offsetTop;
|
|
const y = touch.pageY - this.canvas.offsetTop;
|
|
- if (this.handleClick(x, y))
|
|
|
|
|
|
+ if (this.handleClick(x, y)) {
|
|
|
|
+ this.repDoing = true;
|
|
this.debouncedStartClickRepeat(x, y);
|
|
this.debouncedStartClickRepeat(x, y);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -552,13 +567,19 @@ class TextPage extends Vue {
|
|
this.endClickRepeat();
|
|
this.endClickRepeat();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ onTouchCancel() {
|
|
|
|
+ this.endClickRepeat();
|
|
|
|
+ }
|
|
|
|
+
|
|
onMouseDown(event) {
|
|
onMouseDown(event) {
|
|
this.endClickRepeat();
|
|
this.endClickRepeat();
|
|
if (event.button == 0) {
|
|
if (event.button == 0) {
|
|
const x = event.pageX - this.canvas.offsetLeft;
|
|
const x = event.pageX - this.canvas.offsetLeft;
|
|
const y = event.pageY - this.canvas.offsetTop;
|
|
const y = event.pageY - this.canvas.offsetTop;
|
|
- if (this.handleClick(x, y))
|
|
|
|
|
|
+ if (this.handleClick(x, y)) {
|
|
|
|
+ this.repDoing = true;
|
|
this.debouncedStartClickRepeat(x, y);
|
|
this.debouncedStartClickRepeat(x, y);
|
|
|
|
+ }
|
|
} else if (event.button == 2) {
|
|
} else if (event.button == 2) {
|
|
this.doToolBarToggle();
|
|
this.doToolBarToggle();
|
|
}
|
|
}
|
|
@@ -600,7 +621,6 @@ class TextPage extends Vue {
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
}
|
|
}
|
|
|
|
|
|
handleClick(pointX, pointY) {
|
|
handleClick(pointX, pointY) {
|
|
@@ -651,7 +671,7 @@ class TextPage extends Vue {
|
|
// Nothing
|
|
// Nothing
|
|
}
|
|
}
|
|
|
|
|
|
- return !!action;
|
|
|
|
|
|
+ return (action && action != 'Menu');
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|