123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- <template>
- <Window ref="window" width="600px" @close="close">
- <template #header>
- Настройки
- </template>
- <div class="col row">
- <div class="full-height">
- <q-tabs
- ref="tabs"
- v-model="selectedTab"
- class="bg-grey-3 text-grey-9"
- style="max-width: 130px"
-
- left-icon="la la-caret-up"
- right-icon="la la-caret-down"
- active-color="white"
- active-bg-color="primary"
- indicator-color="black"
- vertical
- no-caps
- stretch
- inline-label
- >
- <q-tab v-for="item in tabs" :key="item.name" class="tab row items-center" :name="item.name">
- <q-icon :name="item.icon" :color="selectedTab == item.name ? 'yellow' : 'teal-7'" size="24px" />
- <div class="q-ml-xs" style="font-size: 90%">
- {{ item.label }}
- </div>
- </q-tab>
- </q-tabs>
- </div>
- <div class="col fit">
- <!-- Профили --------------------------------------------------------------------->
- <ProfilesTab v-if="selectedTab == 'profiles'" :form="form" />
- <!-- Вид ------------------------------------------------------------------------->
- <ViewTab v-if="selectedTab == 'view'" :form="form" />
- <!-- Кнопки ---------------------------------------------------------------------->
- <ToolBarTab v-if="selectedTab == 'toolbar'" :form="form" />
- <!-- Управление ------------------------------------------------------------------>
- <KeysTab v-if="selectedTab == 'keys'" :form="form" />
- <!-- Листание -------------------------------------------------------------------->
- <PageMoveTab v-if="selectedTab == 'pagemove'" :form="form" />
- <!-- Конвертирование ------------------------------------------------------------->
- <ConvertTab v-if="selectedTab == 'convert'" :form="form" />
- <!-- Обновление ------------------------------------------------------------------>
- <UpdateTab v-if="selectedTab == 'update'" :form="form" />
- <!-- Прочее ---------------------------------------------------------------------->
- <OthersTab v-if="selectedTab == 'others'" :form="form" />
- <!-- Сброс ----------------------------------------------------------------------->
- <ResetTab v-if="selectedTab == 'reset'" :form="form" @tab-event="tabEvent" />
- </div>
- </div>
- </Window>
- </template>
- <script>
- //-----------------------------------------------------------------------------
- import vueComponent from '../../vueComponent.js';
- import { reactive } from 'vue';
- import _ from 'lodash';
- //stuff
- import Window from '../../share/Window.vue';
- import rstore from '../../../store/modules/reader';
- //pages
- import ProfilesTab from './ProfilesTab/ProfilesTab.vue';
- import ViewTab from './ViewTab/ViewTab.vue';
- import ToolBarTab from './ToolBarTab/ToolBarTab.vue';
- import KeysTab from './KeysTab/KeysTab.vue';
- import PageMoveTab from './PageMoveTab/PageMoveTab.vue';
- import ConvertTab from './ConvertTab/ConvertTab.vue';
- import UpdateTab from './UpdateTab/UpdateTab.vue';
- import OthersTab from './OthersTab/OthersTab.vue';
- import ResetTab from './ResetTab/ResetTab.vue';
- const componentOptions = {
- components: {
- Window,
- //pages
- ProfilesTab,
- ViewTab,
- ToolBarTab,
- KeysTab,
- PageMoveTab,
- ConvertTab,
- UpdateTab,
- OthersTab,
- ResetTab,
- },
- watch: {
- settings: function() {
- this.settingsChanged();//no await
- },
- form: {
- handler() {
- if (this.inited && !this.isSetsChanged) {
- this.debouncedCommitSettings();
- }
- },
- deep: true,
- },
- },
- };
- class SettingsPage {
- _options = componentOptions;
- form = {};
- tabs = [
- { name: 'profiles', icon: 'la la-users', label: 'Профили' },
- { name: 'view', icon: 'la la-eye', label: 'Вид'},
- { name: 'toolbar', icon: 'la la-grip-horizontal', label: 'Панель'},
- { name: 'keys', icon: 'la la-gamepad', label: 'Управление'},
- { name: 'pagemove', icon: 'la la-school', label: 'Листание'},
- { name: 'convert', icon: 'la la-magic', label: 'Конвертир.'},
- { name: 'update', icon: 'la la-retweet', label: 'Обновление'},
- { name: 'others', icon: 'la la-list-ul', label: 'Прочее'},
- { name: 'reset', icon: 'la la-broom', label: 'Сброс'},
- ];
- selectedTab = 'profiles';
- isSetsChanged = false;
- created() {
- this.commit = this.$store.commit;
- this.debouncedCommitSettings = _.debounce(() => {
- this.commit('reader/setSettings', _.cloneDeep(this.form));
- }, 50);
- this.settingsChanged();//no await
- }
- mounted() {
- }
- init() {
- this.$refs.window.init();
- this.inited = true;
- }
- async settingsChanged() {
- this.isSetsChanged = true;
- try {
- this.form = reactive(_.cloneDeep(this.settings));
- } finally {
- await this.$nextTick();
- this.isSetsChanged = false;
- }
- }
- get settings() {
- return this.$store.state.reader.settings;
- }
- close() {
- this.$emit('do-action', {action: 'settings'});
- }
- async setDefaults() {
- try {
- if (await this.$root.stdDialog.confirm('Подтвердите установку настроек по умолчанию:', ' ')) {
- this.form = _.cloneDeep(rstore.settingDefaults);
- }
- } catch (e) {
- //
- }
- }
- tabEvent(event) {
- if (!event || !event.action)
- return;
- switch (event.action) {
- case 'set-defaults': this.setDefaults(); break;
- }
- }
- keyHook(event) {
- if (!this.$root.stdDialog.active && event.type == 'keydown' && event.key == 'Escape') {
- this.close();
- }
- return true;
- }
- }
- export default vueComponent(SettingsPage);
- //-----------------------------------------------------------------------------
- </script>
- <style scoped>
- .tab {
- justify-content: initial;
- }
- </style>
- <style>
- .sets-tab-panel {
- overflow-x: hidden;
- overflow-y: auto;
- font-size: 90%;
- padding: 0 10px 15px 10px;
- }
- .sets-part-header {
- border-top: 2px solid #bbbbbb;
- font-weight: bold;
- font-size: 110%;
- margin-top: 15px;
- margin-bottom: 5px;
- }
- .sets-label {
- display: flex;
- flex-direction: column;
- justify-content: center;
- text-align: right;
- margin-right: 10px;
- overflow: hidden;
- }
- .sets-item {
- width: 100%;
- margin-top: 5px;
- margin-bottom: 5px;
- }
- .sets-button {
- margin: 3px 15px 3px 0;
- padding: 0 5px 0 5px;
- }
- </style>
|