Browse Source

Работа над SettingsPage

Book Pauk 6 years ago
parent
commit
69e2879058

+ 19 - 1
client/components/Reader/SettingsPage/SettingsPage.vue

@@ -10,12 +10,30 @@
                     <el-tab-pane label="Вид">
                         <el-form :model="form" size="mini" label-width="100px">
                             <el-form-item>
-                                Название раздела
+                                Цвет
                             </el-form-item>
                             <el-form-item label="item">
                                 <el-input v-model="form.item"></el-input>
                             </el-form-item>
                         </el-form>
+
+                        <el-form :model="form" size="mini" label-width="100px">
+                            <el-form-item>
+                                Шрифт
+                            </el-form-item>
+                        </el-form>
+
+                        <el-form :model="form" size="mini" label-width="100px">
+                            <el-form-item>
+                                Текст
+                            </el-form-item>
+                        </el-form>
+
+                        <el-form :model="form" size="mini" label-width="100px">
+                            <el-form-item>
+                                Строка статуса
+                            </el-form-item>
+                        </el-form>
                     </el-tab-pane>
                     <el-tab-pane label="Листание">
                         

+ 54 - 27
client/components/Reader/TextPage/TextPage.vue

@@ -41,6 +41,9 @@ export default @Component({
             this.debouncedEmitPosChange(newValue);
             this.draw();
         },
+        settings: function() {
+            this.loadSettings();
+        },
     },
 })
 class TextPage extends Vue {
@@ -148,7 +151,7 @@ class TextPage extends Vue {
         fontsLoadingStyle.left = (this.realWidth - this.measureText(flText, {}))/2 + 'px';
 
         //stuff
-        this.statusBarColor = this.hex2rgba(this.textColor, this.statusBarColorAlpha);
+        this.statusBarColor = this.hex2rgba(this.textColor || '#000000', this.statusBarColorAlpha);
         this.currentTransition = '';
         this.pageChangeDirectionDown = true;
         this.fontShift = (this.fontShifts[this.fontName] ? this.fontShifts[this.fontName] : 0)/100;
@@ -224,6 +227,48 @@ class TextPage extends Vue {
         this.fontsLoading = false;
     }
 
+    getSettings() {
+        const settings = this.settings;
+
+        this.textColor = settings.textColor;
+        this.backgroundColor = settings.backgroundColor;
+        this.fontStyle = settings.fontStyle;// 'italic'
+        this.fontWeight = settings.fontWeight;// 'bold'
+        this.fontSize = settings.fontSize;// px
+        this.fontName = settings.fontName;
+        this.fontCssUrl = settings.fontCssUrl;
+        this.fontVertShift = settings.fontVertShift;
+
+        this.lineInterval = settings.lineInterval;// px, межстрочный интервал
+        this.textAlignJustify = settings.textAlignJustify;// выравнивание по ширине
+        this.p = settings.p;// px, отступ параграфа
+        this.indent = settings.indent;// px, отступ всего текста слева и справа
+        this.wordWrap = settings.wordWrap;
+        this.keepLastToFirst = settings.keepLastToFirst;// перенос последней строки в первую при листании
+
+        this.showStatusBar = settings.showStatusBar;
+        this.statusBarTop = settings.statusBarTop;// top, bottom
+        this.statusBarHeight = settings.statusBarHeight;// px
+        this.statusBarColorAlpha = settings.statusBarColorAlpha;
+
+        this.pageChangeTransition = settings.pageChangeTransition;// '' - нет, downShift, rightShift, thaw - протаивание, blink - мерцание
+        this.pageChangeTransitionSpeed = settings.pageChangeTransitionSpeed; //0-100%
+    }
+
+    loadSettings() {
+        (async() => {
+            let fontName = this.fontName;
+
+            this.getSettings();
+            this.calcDrawProps();
+
+            if (fontName != this.fontName)
+                await this.loadFonts();
+
+            this.draw();
+        })();
+    }
+
     showBook() {
         this.$refs.main.focus();
 
@@ -236,30 +281,7 @@ class TextPage extends Vue {
         this.linesUp = null;
         this.linesDown = null;
 
-        //default draw props
-        this.textColor = '#000000';
-        this.backgroundColor = '#478355';
-        this.fontStyle = '';// 'bold','italic'
-        this.fontSize = 36;// px
-        this.fontName = 'GEO_1';
-        this.fontCssUrl = '';
-        this.fontVertShift = 0;
-
-        this.lineInterval = 6;// px, межстрочный интервал
-        this.textAlignJustify = true;// выравнивание по ширине
-        this.p = 50;// px, отступ параграфа
-        this.indent = 15;// px, отступ всего текста слева и справа
-        this.wordWrap = true;
-        this.keepLastToFirst = true;// перенос последней строки в первую при листании
-
-        this.showStatusBar = true;
-        this.statusBarTop = false;// top, bottom
-        this.statusBarHeight = 19;// px
-        this.statusBarColorAlpha = 0.4;
-
-        this.pageChangeTransition = '';// '' - нет, downShift, rightShift, thaw - протаивание, blink - мерцание
-        this.pageChangeTransitionSpeed = 50; //0-100%
-
+        this.getSettings();
         this.calcDrawProps();
         this.draw();// пока не загрузили, очистим канвас
 
@@ -286,6 +308,7 @@ class TextPage extends Vue {
                 this.$root.$emit('set-app-title', this.title);
 
                 this.parsed = this.book.parsed;
+
                 this.calcDrawProps();
 
                 await this.loadFonts();
@@ -312,12 +335,16 @@ class TextPage extends Vue {
         this.draw();
     }
 
+    get settings() {
+        return this.$store.state.reader.settings;
+    }
+
     get font() {
-        return `${this.fontStyle} ${this.fontSize}px ${this.fontName}`;
+        return `${this.fontStyle} ${this.fontWeight} ${this.fontSize}px ${this.fontName}`;
     }
 
     fontByStyle(style) {
-        return `${style.italic ? 'italic' : ''} ${style.bold ? 'bold' : ''} ${this.fontSize}px ${this.fontName}`;
+        return `${style.italic ? 'italic' : this.fontStyle} ${style.bold ? 'bold' : this.fontWeight} ${this.fontSize}px ${this.fontName}`;
     }
 
     draw() {

+ 27 - 0
client/store/modules/reader.js

@@ -4,6 +4,33 @@ import Vue from 'vue';
 const state = {
     toolBarActive: true,
     openedBook: {},
+    settings: {
+        textColor: '#000000',
+        backgroundColor: '#EBE2C9',
+        fontStyle: '',// 'italic'
+        fontWeight: '',// 'bold'
+        fontSize: 20,// px
+        fontName: 'ReaderDefault',
+        fontCssUrl: '',
+        fontVertShift: 0,
+
+        lineInterval: 3,// px, межстрочный интервал
+        textAlignJustify: true,// выравнивание по ширине
+        p: 25,// px, отступ параграфа
+        indent: 15,// px, отступ всего текста слева и справа
+        wordWrap: true,//перенос по слогам
+        keepLastToFirst: true,// перенос последней строки в первую при листании
+
+        showStatusBar: true,
+        statusBarTop: false,// top, bottom
+        statusBarHeight: 19,// px
+        statusBarColorAlpha: 0.4,
+
+        pageChangeTransition: '',// '' - нет, downShift, rightShift, thaw - протаивание, blink - мерцание
+        pageChangeTransitionSpeed: 50, //0-100%
+
+        allowUrlParamBookPos: true,
+    },
 };
 
 // getters