Font.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. <template>
  2. <div class="fit sets-tab-panel">
  3. <!---------------------------------------------->
  4. <div class="hidden sets-part-header">
  5. Шрифт
  6. </div>
  7. <div class="sets-item row">
  8. <div class="sets-label label">
  9. Локальный/веб
  10. </div>
  11. <div class="col row">
  12. <q-select
  13. v-model="form.fontName" class="col-left" :options="fontsOptions" :disable="form.webFontName != ''"
  14. dropdown-icon="la la-angle-down la-sm"
  15. outlined dense emit-value map-options
  16. />
  17. <div class="q-px-sm" />
  18. <q-select
  19. v-model="form.webFontName" class="col" :options="webFontsOptions"
  20. dropdown-icon="la la-angle-down la-sm"
  21. outlined dense emit-value map-options
  22. >
  23. <q-tooltip :delay="1000" anchor="top middle" self="bottom middle" content-style="font-size: 80%">
  24. Веб шрифты дают большое разнообразие,<br>
  25. однако есть шанс, что шрифт будет загружаться<br>
  26. очень медленно или вовсе не загрузится
  27. </q-tooltip>
  28. </q-select>
  29. </div>
  30. </div>
  31. <div class="sets-item row">
  32. <div class="sets-label label">
  33. Размер
  34. </div>
  35. <div class="col row">
  36. <NumInput v-model="form.fontSize" class="col-left" :min="5" :max="200" />
  37. <div class="col q-pt-xs text-right">
  38. <a href="https://fonts.google.com/?subset=cyrillic" target="_blank">Примеры</a>
  39. </div>
  40. </div>
  41. </div>
  42. <div class="sets-item row">
  43. <div class="sets-label label">
  44. Сдвиг
  45. </div>
  46. <div class="col row">
  47. <NumInput v-model="vertShift" class="col-left" :min="-100" :max="100">
  48. <q-tooltip :delay="1000" anchor="top middle" self="bottom middle" content-style="font-size: 80%">
  49. Сдвиг шрифта по вертикали в процентах от размера.<br>
  50. Отрицательное значение сдвигает вверх, положительное -<br>
  51. вниз. Значение зависит от метрики шрифта.
  52. </q-tooltip>
  53. </NumInput>
  54. </div>
  55. </div>
  56. <div class="sets-item row">
  57. <div class="sets-label label">
  58. Стиль
  59. </div>
  60. <div class="col row">
  61. <q-checkbox v-model="fontBold" size="xs" label="Жирный" />
  62. <q-checkbox v-model="fontItalic" class="q-ml-sm" size="xs" label="Курсив" />
  63. </div>
  64. </div>
  65. </div>
  66. </template>
  67. <script>
  68. //-----------------------------------------------------------------------------
  69. import vueComponent from '../../../../vueComponent.js';
  70. import NumInput from '../../../../share/NumInput.vue';
  71. import rstore from '../../../../../store/modules/reader';
  72. const componentOptions = {
  73. components: {
  74. NumInput,
  75. },
  76. watch: {
  77. form: {
  78. handler() {
  79. this.formChanged();//no await
  80. },
  81. deep: true,
  82. },
  83. fontBold: function(newValue) {
  84. if (!this.isFormChanged)
  85. this.form.fontWeight = (newValue ? 'bold' : '');
  86. },
  87. fontItalic: function(newValue) {
  88. if (!this.isFormChanged)
  89. this.form.fontStyle = (newValue ? 'italic' : '');
  90. },
  91. vertShift: function(newValue) {
  92. if (!this.isFormChanged) {
  93. const font = (this.form.webFontName ? this.form.webFontName : this.form.fontName);
  94. if (this.form.fontShifts[font] != newValue || this.form.fontVertShift != newValue) {
  95. this.form.fontShifts = Object.assign({}, this.form.fontShifts, {[font]: newValue});
  96. this.form.fontVertShift = newValue;
  97. }
  98. }
  99. },
  100. },
  101. };
  102. class Font {
  103. _options = componentOptions;
  104. _props = {
  105. form: Object,
  106. };
  107. fontBold = false;
  108. fontItalic = false;
  109. vertShift = 0;
  110. webFonts = [];
  111. fonts = [];
  112. created() {
  113. this.formChanged();//no await
  114. }
  115. mounted() {
  116. }
  117. async formChanged() {
  118. this.isFormChanged = true;
  119. try {
  120. this.fontBold = (this.form.fontWeight == 'bold');
  121. this.fontItalic = (this.form.fontStyle == 'italic');
  122. this.fonts = rstore.fonts;
  123. this.webFonts = rstore.webFonts;
  124. const font = (this.form.webFontName ? this.form.webFontName : this.form.fontName);
  125. this.vertShift = this.form.fontShifts[font] || 0;
  126. } finally {
  127. await this.$nextTick();
  128. this.isFormChanged = false;
  129. }
  130. }
  131. get fontsOptions() {
  132. let result = [];
  133. this.fonts.forEach(font => {
  134. result.push({label: (font.label ? font.label : font.name), value: font.name});
  135. });
  136. return result;
  137. }
  138. get webFontsOptions() {
  139. let result = [{label: 'Нет', value: ''}];
  140. this.webFonts.forEach(font => {
  141. result.push({label: font.name, value: font.name});
  142. });
  143. return result;
  144. }
  145. }
  146. export default vueComponent(Font);
  147. //-----------------------------------------------------------------------------
  148. </script>
  149. <style scoped>
  150. .label {
  151. width: 110px;
  152. }
  153. .col-left {
  154. width: 150px;
  155. }
  156. </style>