fantasia-archive/src/components/appHeader/AppControl.vue

725 lines
21 KiB
Vue
Raw Normal View History

2021-02-26 14:50:46 +13:00
<template>
<div
2021-04-03 12:33:49 +13:00
:class="{'AppControl': !isFrontpage}"
2021-02-26 14:50:46 +13:00
>
2021-03-18 10:26:08 +13:00
<!-- New document dialog -->
<newDocumentDialog
:dialog-trigger="newObjectDialogTrigger"
@trigger-dialog-close="newObjectDialogClose"
/>
<!-- Existing document dialog -->
<existingDocumentDialog
:dialog-trigger="existingObjectDialogTrigger"
@trigger-dialog-close="existingObjectDialogClose"
/>
2021-03-04 13:27:07 +13:00
<!-- Project close dialog -->
2021-02-26 14:50:46 +13:00
<projectCloseCheckDialog
:dialog-trigger="projectCloseCheckDialogTrigger"
:dialog-mode="'projectClose'"
@trigger-dialog-close="projectCloseCheckDialogClose"
/>
2021-03-04 13:27:07 +13:00
<!-- Keybind dialog -->
<keybindCheatsheetDialog
:dialog-trigger="keybindsDialogTrigger"
@trigger-dialog-close="keybindsDialogClose"
/>
<!-- Import project dialog -->
<importProjectCheckDialog
:dialog-trigger="importProjectDialogTrigger"
@trigger-dialog-close="importProjectDialogClose"
/>
<!-- Merge project dialog -->
<mergeProjectCheckDialog
:dialog-trigger="mergeProjectDialogTrigger"
@trigger-dialog-close="mergeProjectDialogClose"
/>
2021-03-04 13:27:07 +13:00
<!-- New project dialog -->
<newProjectCheckDialog
:dialog-trigger="newProjectDialogTrigger"
@trigger-dialog-close="newProjectDialogClose"
/>
<!-- About app dialog -->
<aboutAppDialog
:dialog-trigger="aboutAppDialogTrigger"
@trigger-dialog-close="aboutAppDialogClose"
/>
2021-03-06 08:08:55 +13:00
<!-- Changelog dialog -->
<changeLogDialog
:dialog-trigger="changeLogDialogTrigger"
@trigger-dialog-close="changeLogDialogClose"
/>
2021-03-18 10:26:08 +13:00
<!-- Program settings dialog -->
<programSettingsDialog
:dialog-trigger="programSettingsDialogTrigger"
@trigger-dialog-close="programSettingsDialogClose"
/>
2021-03-06 08:08:55 +13:00
<!-- Advanced search guide dialog -->
<advancedSearchGuideDialog
:dialog-trigger="advancedSearchGuideDialogTrigger"
@trigger-dialog-close="advancedSearchGuideDialogClose"
/>
<!-- Tips, Tricks & Trivia dialog -->
<tipsTricksTriviaDialog
:dialog-trigger="tipsTricksDialogTrigger"
@trigger-dialog-close="tipsTricksDialogClose"
/>
<!-- License dialog -->
<licenseDialog
:dialog-trigger="licenseDialogTrigger"
@trigger-dialog-close="licenseDialogClose"
/>
2021-02-26 14:50:46 +13:00
<q-btn-group
flat
class="AppControl__buttons"
>
<!-- Options button -->
<q-btn
flat
:ripple="false"
dark
size='md'
no-caps
2021-03-18 10:26:08 +13:00
@click="programSettingsDialogAssignUID"
2021-02-26 14:50:46 +13:00
>
2021-03-18 10:26:08 +13:00
<q-img
:src="appLogo"
style="height: 26px; width: 26px; margin: 0 -9px;"
/>
<q-tooltip anchor="center right" self="center left" :delay="500">
Program settings
</q-tooltip>
2021-02-26 14:50:46 +13:00
2021-03-18 10:26:08 +13:00
</q-btn>
<q-separator color="primary" vertical dark style="opacity: 0.1;" />
2021-02-26 14:50:46 +13:00
<!-- Project button-->
<q-btn
flat
:ripple="false"
dark
size='md'
no-caps
>
Project
<q-menu
@show="checkProjectStatus"
anchor="bottom left"
class="bg-gunmetal-light"
dark
2021-03-04 13:27:07 +13:00
square
2021-02-26 14:50:46 +13:00
>
<q-list class="bg-gunmetal-light" dark>
2021-03-04 13:27:07 +13:00
2021-03-18 10:26:08 +13:00
<q-item
v-close-popup
clickable
active
active-class="bg-gunmetal-light text-cultured"
class="noHigh"
@click="newObjectAssignUID"
:disable="!projectExists || isFrontpage"
>
<q-item-section>Quick-add new document</q-item-section>
<q-item-section avatar>
<q-icon name="mdi-text-box-plus-outline" />
</q-item-section>
</q-item>
<q-item
v-close-popup
clickable
active
active-class="bg-gunmetal-light text-cultured"
class="noHigh"
@click="existingObjectAssignUID"
:disable="!projectExists || isFrontpage"
>
<q-item-section>Quick-search existing document</q-item-section>
<q-item-section avatar>
<q-icon name="mdi-database-search" />
</q-item-section>
</q-item>
<q-separator dark />
2021-03-04 13:27:07 +13:00
<q-item
2021-02-26 14:50:46 +13:00
v-close-popup
clickable
active
active-class="bg-gunmetal-light text-cultured"
2021-03-04 13:27:07 +13:00
class="noHigh"
@click="newProjectAssignUID"
2021-02-26 14:50:46 +13:00
>
2021-03-04 13:27:07 +13:00
<q-item-section>New project</q-item-section>
2021-03-18 10:26:08 +13:00
<q-item-section avatar>
<q-icon name="mdi-plus" />
</q-item-section>
2021-02-26 14:50:46 +13:00
</q-item>
2021-03-04 13:27:07 +13:00
<q-separator dark />
2021-02-26 14:50:46 +13:00
<q-item
v-close-popup
clickable
active
active-class="bg-gunmetal-light text-cultured"
2021-03-04 13:27:07 +13:00
class="noHigh"
2021-03-08 11:07:40 +13:00
@click="commenceExport"
2021-02-26 14:50:46 +13:00
:disable="!projectExists"
>
2021-03-04 13:27:07 +13:00
<q-item-section>Export current project</q-item-section>
2021-03-18 10:26:08 +13:00
<q-item-section avatar>
<q-icon name="mdi-package-variant-closed" />
</q-item-section>
2021-03-04 13:27:07 +13:00
</q-item>
<q-item
v-close-popup
clickable
active
active-class="bg-gunmetal-light text-cultured"
class="noHigh"
@click="importProjectAssignUID"
>
<q-item-section>Import existing project</q-item-section>
2021-03-18 10:26:08 +13:00
<q-item-section avatar>
<q-icon name="mdi-package-variant" />
</q-item-section>
2021-02-26 14:50:46 +13:00
</q-item>
<q-item
v-close-popup
clickable
active
active-class="bg-gunmetal-light text-cultured"
class="noHigh"
@click="mergeProjectAssignUID"
:disable="!projectExists"
>
<q-item-section>Merge another project into the current one</q-item-section>
<q-item-section avatar>
<q-icon name="mdi-folder-plus-outline" />
</q-item-section>
</q-item>
2021-02-26 14:50:46 +13:00
<q-separator dark />
<q-item
v-close-popup
clickable
active
active-class="bg-gunmetal-light text-cultured"
2021-03-04 13:27:07 +13:00
class="noHigh"
@click="navigateToProjectPage"
:disable="!projectExists || isProjectPage"
>
<q-item-section>Resume project</q-item-section>
2021-03-18 10:26:08 +13:00
<q-item-section avatar>
<q-icon name="mdi-folder-open-outline" />
</q-item-section>
2021-03-04 13:27:07 +13:00
</q-item>
<q-item
v-close-popup
clickable
active
active-class="bg-gunmetal-light text-cultured"
class="noHigh"
2021-02-26 14:50:46 +13:00
@click="projectCloseCheckDialogAssignUID"
:disable="!projectExists || isFrontpage"
>
<q-item-section>Close project</q-item-section>
2021-03-18 10:26:08 +13:00
<q-item-section avatar>
<q-icon name="mdi-exit-to-app" />
</q-item-section>
2021-02-26 14:50:46 +13:00
</q-item>
</q-list>
</q-menu>
</q-btn>
<!-- Help button-->
<q-btn
flat
:ripple="false"
dark
size='md'
no-caps
>
2021-03-18 10:26:08 +13:00
Help, Settings & Info
2021-03-04 13:27:07 +13:00
<q-menu
anchor="bottom left"
class="bg-gunmetal-light"
dark
square
>
2021-02-26 14:50:46 +13:00
<q-list class="bg-gunmetal-light" dark>
2021-03-18 10:26:08 +13:00
<q-item
@click="programSettingsDialogAssignUID"
v-close-popup
clickable
active
active-class="bg-gunmetal-light text-cultured"
class="noHigh"
>
<q-item-section>Program settings</q-item-section>
<q-item-section avatar>
<q-icon name="mdi-tune" />
</q-item-section>
</q-item>
<q-separator dark />
2021-02-26 14:50:46 +13:00
<q-item
2021-03-04 13:27:07 +13:00
@click="keybindsDialogAssignUID"
v-close-popup
clickable
active
active-class="bg-gunmetal-light text-cultured"
class="noHigh"
>
<q-item-section>Show keybind cheatsheet</q-item-section>
2021-03-18 10:26:08 +13:00
<q-item-section avatar>
<q-icon name="mdi-keyboard-settings" />
</q-item-section>
2021-03-04 13:27:07 +13:00
</q-item>
2021-03-06 08:08:55 +13:00
<q-item
@click="advancedSearchGuideAssignUID"
v-close-popup
clickable
active
active-class="bg-gunmetal-light text-cultured"
class="noHigh"
>
<q-item-section>Advanced search guide</q-item-section>
2021-03-18 10:26:08 +13:00
<q-item-section avatar>
<q-icon name="mdi-file-question" />
</q-item-section>
2021-03-06 08:08:55 +13:00
</q-item>
<q-item
@click="tipsTricksAssignUID"
v-close-popup
clickable
active
active-class="bg-gunmetal-light text-cultured"
class="noHigh"
>
<q-item-section>Tips, Tricks & Trivia</q-item-section>
<q-item-section avatar>
<q-icon name="mdi-fire-alert" />
</q-item-section>
</q-item>
2021-03-06 08:08:55 +13:00
<q-separator dark />
<q-item
@click="changeLogDialogAssignUID"
v-close-popup
clickable
active
active-class="bg-gunmetal-light text-cultured"
class="noHigh"
>
<q-item-section>Changelog</q-item-section>
2021-03-18 10:26:08 +13:00
<q-item-section avatar>
<q-icon name="mdi-clipboard-text" />
</q-item-section>
2021-03-06 08:08:55 +13:00
</q-item>
<q-item
@click="aboutAppDialogAssignUID"
v-close-popup
clickable
active
active-class="bg-gunmetal-light text-cultured"
class="noHigh"
>
<q-item-section>About Fantasia Archive</q-item-section>
2021-03-18 10:26:08 +13:00
<q-item-section avatar>
<q-icon name="mdi-information-variant" />
</q-item-section>
</q-item>
<q-item
@click="licenseAssignUID"
v-close-popup
clickable
active
active-class="bg-gunmetal-light text-cultured"
class="noHigh"
>
<q-item-section>License</q-item-section>
<q-item-section avatar>
<q-icon name="mdi-script-text-outline" />
</q-item-section>
</q-item>
2021-03-04 13:27:07 +13:00
<q-separator dark />
<q-item
@click="toggleDevTools"
v-close-popup
clickable
active
active-class="bg-gunmetal-light text-cultured"
class="noHigh"
>
2021-02-26 14:50:46 +13:00
<q-item-section>Toggle developer tools</q-item-section>
2021-03-18 10:26:08 +13:00
<q-item-section avatar>
<q-icon name="mdi-code-tags" />
</q-item-section>
2021-02-26 14:50:46 +13:00
</q-item>
2021-03-04 13:27:07 +13:00
2021-02-26 14:50:46 +13:00
</q-list>
</q-menu>
</q-btn>
</q-btn-group>
</div>
</template>
<script lang="ts">
2021-04-03 12:33:49 +13:00
import { Component, Watch } from "vue-property-decorator"
2021-02-26 14:50:46 +13:00
import BaseClass from "src/BaseClass"
import projectCloseCheckDialog from "src/components/dialogs/ProjectCloseCheck.vue"
2021-03-04 13:27:07 +13:00
import keybindCheatsheetDialog from "src/components/dialogs/KeybindCheatsheet.vue"
import importProjectCheckDialog from "src/components/dialogs/ImportProjectCheck.vue"
import mergeProjectCheckDialog from "src/components/dialogs/MergeProjectCheck.vue"
2021-03-04 13:27:07 +13:00
import newProjectCheckDialog from "src/components/dialogs/NewProjectCheck.vue"
import aboutAppDialog from "src/components/dialogs/AboutApp.vue"
2021-03-06 08:08:55 +13:00
import changeLogDialog from "src/components/dialogs/ChangeLog.vue"
2021-03-18 10:26:08 +13:00
import programSettingsDialog from "src/components/dialogs/ProgramSettings.vue"
2021-03-06 08:08:55 +13:00
import advancedSearchGuideDialog from "src/components/dialogs/AdvancedSearchGuide.vue"
2021-03-18 10:26:08 +13:00
import newDocumentDialog from "src/components/dialogs/NewDocument.vue"
import existingDocumentDialog from "src/components/dialogs/ExistingDocument.vue"
import tipsTricksTriviaDialog from "src/components/dialogs/TipsTricksTrivia.vue"
import licenseDialog from "src/components/dialogs/License.vue"
2021-02-26 14:50:46 +13:00
2021-03-08 11:07:40 +13:00
import { Loading, QSpinnerGears } from "quasar"
2021-02-26 14:50:46 +13:00
import { retrieveCurrentProjectName, exportProject } from "src/scripts/projectManagement/projectManagent"
import { toggleDevTools } from "src/scripts/utilities/devTools"
2021-03-18 10:26:08 +13:00
import appLogo from "src/assets/appLogo.png"
2021-02-26 14:50:46 +13:00
@Component({
2021-03-04 13:27:07 +13:00
components: {
projectCloseCheckDialog,
keybindCheatsheetDialog,
importProjectCheckDialog,
mergeProjectCheckDialog,
newProjectCheckDialog,
2021-03-06 08:08:55 +13:00
aboutAppDialog,
changeLogDialog,
2021-03-18 10:26:08 +13:00
advancedSearchGuideDialog,
programSettingsDialog,
newDocumentDialog,
existingDocumentDialog,
tipsTricksTriviaDialog,
licenseDialog
2021-03-04 13:27:07 +13:00
}
2021-02-26 14:50:46 +13:00
})
export default class AppControl extends BaseClass {
2021-04-03 12:33:49 +13:00
/****************************************************************/
// Import handling
/****************************************************************/
2021-02-26 14:50:46 +13:00
2021-04-03 12:33:49 +13:00
/**
* Toggles the developer tools on and off
*/
2021-02-26 14:50:46 +13:00
toggleDevTools = toggleDevTools
2021-04-03 12:33:49 +13:00
/**
* Retrieves the current project name
*/
2021-02-26 14:50:46 +13:00
retrieveCurrentProjectName = retrieveCurrentProjectName
2021-04-03 12:33:49 +13:00
/**
* Just an image
*/
appLogo = appLogo
/****************************************************************/
// Basic component functionality
/****************************************************************/
/**
* Determines if the project exists or not
*/
2021-02-26 14:50:46 +13:00
projectExists: undefined | string | boolean = false
2021-04-03 12:33:49 +13:00
/**
* Determines if we are on frontpage or not
*/
2021-02-26 14:50:46 +13:00
isFrontpage = true
2021-04-03 12:33:49 +13:00
/**
* Determines if we are on project page or not
*/
2021-02-26 14:50:46 +13:00
isProjectPage = true
2021-04-03 12:33:49 +13:00
/**
* Current project name
*/
projectName = ""
2021-03-18 10:26:08 +13:00
2021-02-26 14:50:46 +13:00
created () {
this.checkProjectStatus().catch(e => console.log(e))
}
2021-04-03 12:33:49 +13:00
async checkProjectStatus () {
this.projectName = await retrieveCurrentProjectName()
this.projectExists = !!(await retrieveCurrentProjectName())
this.isFrontpage = (this.$route.path === "/")
this.isProjectPage = (this.$route.path === "/project")
}
/****************************************************************/
// Local keybinds
/****************************************************************/
@Watch("SGET_getCurrentKeyBindData", { deep: true })
processKeyPush () {
// Keybind cheatsheet
if (this.determineKeyBind("openKeybindsCheatsheet") && !this.SGET_getDialogsState) {
this.keybindsDialogAssignUID()
}
// App options
if (this.determineKeyBind("openAppOptions") && !this.SGET_getDialogsState) {
this.programSettingsDialogAssignUID()
}
}
/****************************************************************/
// Navigate to project page action
/****************************************************************/
navigateToProjectPage () {
this.$router.push({ path: "/project" }).catch((e: {name: string}) => {
if (e && e.name !== "NavigationDuplicated") {
console.log(e)
}
})
}
/****************************************************************/
// Export project action
/****************************************************************/
2021-03-08 11:07:40 +13:00
async commenceExport () {
const projectName = await retrieveCurrentProjectName()
const setup = {
message: "<h4>Exporting current project...</h4>",
spinnerColor: "primary",
messageColor: "cultured",
spinnerSize: 120,
backgroundColor: "dark",
// @ts-ignore
spinner: QSpinnerGears
}
exportProject(projectName, Loading, setup, this.$q)
}
2021-04-03 12:33:49 +13:00
/****************************************************************/
// Close project dialog
/****************************************************************/
2021-02-26 14:50:46 +13:00
projectCloseCheckDialogTrigger: string | false = false
projectCloseCheckDialogClose () {
this.projectCloseCheckDialogTrigger = false
}
projectCloseCheckDialogAssignUID () {
this.projectCloseCheckDialogTrigger = this.generateUID()
}
2021-04-03 12:33:49 +13:00
/****************************************************************/
// Import project dialog
/****************************************************************/
2021-03-04 13:27:07 +13:00
importProjectDialogTrigger: string | false = false
importProjectDialogClose () {
this.importProjectDialogTrigger = false
}
importProjectAssignUID () {
this.importProjectDialogTrigger = this.generateUID()
}
/****************************************************************/
// Merge project dialog
/****************************************************************/
mergeProjectDialogTrigger: string | false = false
mergeProjectDialogClose () {
this.mergeProjectDialogTrigger = false
}
mergeProjectAssignUID () {
this.mergeProjectDialogTrigger = this.generateUID()
}
2021-04-03 12:33:49 +13:00
/****************************************************************/
// New project dialog
/****************************************************************/
2021-03-04 13:27:07 +13:00
newProjectDialogTrigger: string | false = false
newProjectDialogClose () {
this.newProjectDialogTrigger = false
}
newProjectAssignUID () {
this.newProjectDialogTrigger = this.generateUID()
}
/****************************************************************/
// Keybings cheatsheet dialog
/****************************************************************/
keybindsDialogTrigger: string | false = false
keybindsDialogClose () {
this.keybindsDialogTrigger = false
}
keybindsDialogAssignUID () {
this.keybindsDialogTrigger = this.generateUID()
}
/****************************************************************/
// About app dialog
/****************************************************************/
aboutAppDialogTrigger: string | false = false
aboutAppDialogClose () {
this.aboutAppDialogTrigger = false
}
aboutAppDialogAssignUID () {
this.aboutAppDialogTrigger = this.generateUID()
}
2021-03-06 08:08:55 +13:00
/****************************************************************/
// Changelog dialog
/****************************************************************/
changeLogDialogTrigger: string | false = false
changeLogDialogClose () {
this.changeLogDialogTrigger = false
}
changeLogDialogAssignUID () {
this.changeLogDialogTrigger = this.generateUID()
}
2021-03-18 10:26:08 +13:00
/****************************************************************/
// Program settings dialog
/****************************************************************/
programSettingsDialogTrigger: string | false = false
programSettingsDialogClose () {
this.programSettingsDialogTrigger = false
}
programSettingsDialogAssignUID () {
this.programSettingsDialogTrigger = this.generateUID()
}
2021-03-06 08:08:55 +13:00
/****************************************************************/
// Advanced search guide dialog
/****************************************************************/
advancedSearchGuideDialogTrigger: string | false = false
advancedSearchGuideDialogClose () {
this.advancedSearchGuideDialogTrigger = false
}
advancedSearchGuideAssignUID () {
this.advancedSearchGuideDialogTrigger = this.generateUID()
}
2021-03-18 10:26:08 +13:00
/****************************************************************/
// New document dialog
/****************************************************************/
newObjectDialogTrigger: string | false = false
newObjectDialogClose () {
this.newObjectDialogTrigger = false
}
newObjectAssignUID () {
this.newObjectDialogTrigger = this.generateUID()
}
/****************************************************************/
// Existing document dialog
/****************************************************************/
existingObjectDialogTrigger: string | false = false
existingObjectDialogClose () {
this.existingObjectDialogTrigger = false
}
existingObjectAssignUID () {
this.existingObjectDialogTrigger = this.generateUID()
}
/****************************************************************/
// Tips, Tricka & Trivia dialog
/****************************************************************/
tipsTricksDialogTrigger: string | false = false
tipsTricksDialogClose () {
this.tipsTricksDialogTrigger = false
}
tipsTricksAssignUID () {
this.tipsTricksDialogTrigger = this.generateUID()
}
/****************************************************************/
// License dialog
/****************************************************************/
licenseDialogTrigger: string | false = false
licenseDialogClose () {
this.licenseDialogTrigger = false
}
licenseAssignUID () {
this.licenseDialogTrigger = this.generateUID()
}
2021-02-26 14:50:46 +13:00
}
</script>
<style lang="scss" scoped>
.AppControl {
background: rgba(0, 0, 0, 0.1);
&__buttons {
height: 40px;
2021-02-28 06:00:57 +13:00
-webkit-app-region: no-drag;
2021-02-26 14:50:46 +13:00
}
}
</style>