mirror of
https://github.com/Eugeny/tabby.git
synced 2025-06-23 21:09:52 +00:00
132 lines
3.8 KiB
TypeScript
132 lines
3.8 KiB
TypeScript
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
|
import * as yaml from 'js-yaml'
|
|
import { debounce } from 'utils-decorators/dist/esm/debounce/debounce'
|
|
import { Component, Inject, Input, HostBinding, NgZone } from '@angular/core'
|
|
import {
|
|
ConfigService,
|
|
BaseTabComponent,
|
|
HostAppService,
|
|
Platform,
|
|
HomeBaseService,
|
|
UpdaterService,
|
|
PlatformService,
|
|
HostWindowService,
|
|
AppService,
|
|
LocaleService,
|
|
TranslateService,
|
|
} from 'tabby-core'
|
|
|
|
import { SettingsTabProvider } from '../api'
|
|
import { ReleaseNotesComponent } from './releaseNotesTab.component'
|
|
|
|
/** @hidden */
|
|
@Component({
|
|
selector: 'settings-tab',
|
|
template: require('./settingsTab.component.pug'),
|
|
styles: [
|
|
require('./settingsTab.component.scss'),
|
|
],
|
|
})
|
|
export class SettingsTabComponent extends BaseTabComponent {
|
|
@Input() activeTab: string
|
|
Platform = Platform
|
|
configDefaults: any
|
|
configFile: string
|
|
isShellIntegrationInstalled = false
|
|
checkingForUpdate = false
|
|
updateAvailable = false
|
|
showConfigDefaults = false
|
|
@HostBinding('class.pad-window-controls') padWindowControls = false
|
|
|
|
constructor (
|
|
public config: ConfigService,
|
|
public hostApp: HostAppService,
|
|
public hostWindow: HostWindowService,
|
|
public homeBase: HomeBaseService,
|
|
public platform: PlatformService,
|
|
public zone: NgZone,
|
|
public locale: LocaleService,
|
|
private updater: UpdaterService,
|
|
private app: AppService,
|
|
@Inject(SettingsTabProvider) public settingsProviders: SettingsTabProvider[],
|
|
translate: TranslateService,
|
|
) {
|
|
super()
|
|
this.setTitle(translate.instant('Settings'))
|
|
this.settingsProviders = config.enabledServices(this.settingsProviders)
|
|
this.settingsProviders = this.settingsProviders.filter(x => !!x.getComponentType())
|
|
this.settingsProviders.sort((a, b) => a.weight - b.weight + a.title.localeCompare(b.title))
|
|
|
|
this.configDefaults = yaml.dump(config.getDefaults())
|
|
|
|
const onConfigChange = () => {
|
|
this.configFile = config.readRaw()
|
|
this.padWindowControls = hostApp.platform === Platform.macOS
|
|
&& config.store.appearance.tabsLocation !== 'top'
|
|
}
|
|
|
|
this.subscribeUntilDestroyed(config.changed$, onConfigChange)
|
|
onConfigChange()
|
|
}
|
|
|
|
async ngOnInit () {
|
|
this.isShellIntegrationInstalled = await this.platform.isShellIntegrationInstalled()
|
|
}
|
|
|
|
async toggleShellIntegration () {
|
|
if (!this.isShellIntegrationInstalled) {
|
|
await this.platform.installShellIntegration()
|
|
} else {
|
|
await this.platform.uninstallShellIntegration()
|
|
}
|
|
this.isShellIntegrationInstalled = await this.platform.isShellIntegrationInstalled()
|
|
}
|
|
|
|
ngOnDestroy () {
|
|
this.config.save()
|
|
}
|
|
|
|
restartApp () {
|
|
this.hostApp.relaunch()
|
|
}
|
|
|
|
@debounce(500)
|
|
saveConfiguration (requireRestart?: boolean) {
|
|
this.config.save()
|
|
if (requireRestart) {
|
|
this.config.requestRestart()
|
|
}
|
|
}
|
|
|
|
saveConfigFile () {
|
|
if (this.isConfigFileValid()) {
|
|
this.config.writeRaw(this.configFile)
|
|
}
|
|
}
|
|
|
|
showConfigFile () {
|
|
this.platform.showItemInFolder(this.platform.getConfigPath()!)
|
|
}
|
|
|
|
isConfigFileValid () {
|
|
try {
|
|
yaml.load(this.configFile)
|
|
return true
|
|
} catch (_) {
|
|
return false
|
|
}
|
|
}
|
|
|
|
async checkForUpdates () {
|
|
this.checkingForUpdate = true
|
|
this.updateAvailable = await this.updater.check()
|
|
this.checkingForUpdate = false
|
|
}
|
|
|
|
showReleaseNotes () {
|
|
this.app.openNewTabRaw({
|
|
type: ReleaseNotesComponent,
|
|
})
|
|
}
|
|
}
|