diff --git a/app/src/app.module.ts b/app/src/app.module.ts index ff0dba57..53c10bfb 100644 --- a/app/src/app.module.ts +++ b/app/src/app.module.ts @@ -19,16 +19,16 @@ import { DockingService } from 'services/docking' import { AppComponent } from 'components/app' import { CheckboxComponent } from 'components/checkbox' -import { HotkeyInputComponent } from 'components/hotkeyInput' -import { HotkeyDisplayComponent } from 'components/hotkeyDisplay' -import { HotkeyHintComponent } from 'components/hotkeyHint' -import { HotkeyInputModalComponent } from 'components/hotkeyInputModal' -import { SettingsPaneComponent } from 'components/settingsPane' import { TabBodyComponent } from 'components/tabBody' import { TabHeaderComponent } from 'components/tabHeader' import { TerminalTabComponent } from 'components/terminalTab' +import { TitleBarComponent } from 'components/titleBar' +let plugins = [ + require('./settings').default, +] + @NgModule({ imports: [ BrowserModule, @@ -36,7 +36,7 @@ import { TerminalTabComponent } from 'components/terminalTab' FormsModule, ToasterModule, NgbModule.forRoot(), - ], + ].concat(plugins), providers: [ ConfigService, DockingService, @@ -51,21 +51,15 @@ import { TerminalTabComponent } from 'components/terminalTab' SessionsService, ], entryComponents: [ - HotkeyInputModalComponent, - SettingsPaneComponent, TerminalTabComponent, ], declarations: [ AppComponent, CheckboxComponent, - HotkeyDisplayComponent, - HotkeyHintComponent, - HotkeyInputComponent, - HotkeyInputModalComponent, - SettingsPaneComponent, TabBodyComponent, TabHeaderComponent, TerminalTabComponent, + TitleBarComponent, ], bootstrap: [ AppComponent, diff --git a/app/src/components/app.less b/app/src/components/app.less index a25165ba..c1855161 100644 --- a/app/src/components/app.less +++ b/app/src/components/app.less @@ -29,42 +29,9 @@ background: @body-bg; } -@titlebar-height: 30px; @tabs-height: 40px; @tab-border-radius: 4px; -.titlebar { - flex: 0 0 @titlebar-height; - display: flex; - height: @titlebar-height; - background: @title-bg; - - .title { - flex: auto; - padding-left: 15px; - line-height: @titlebar-height; - -webkit-app-region: drag; - } - - button { - border: none; - box-shadow: none; - border-radius: 0; - font-size: 8px; - width: 40px; - padding: 0; - line-height: @titlebar-height; - text-align: center; - - &:not(:hover):not(:active) { - background: transparent; - } - } - - .btn-close { - font-size: 12px; - } -} :host > .spacer { flex: 0 0 5px; diff --git a/app/src/components/app.pug b/app/src/components/app.pug index c3fd8952..f8429b2e 100644 --- a/app/src/components/app.pug +++ b/app/src/components/app.pug @@ -1,11 +1,4 @@ -.titlebar(*ngIf='!config.store.appearance.useNativeFrame && config.store.appearance.dock == "off"') - .title((dblclick)='hostApp.toggleMaximize()') Term - button.btn.btn-secondary.btn-minimize((click)='hostApp.minimize()') - i.fa.fa-window-minimize - button.btn.btn-secondary.btn-maximize((click)='hostApp.toggleMaximize()') - i.fa.fa-window-maximize - button.btn.btn-secondary.btn-close((click)='hostApp.quit()') - i.fa.fa-close +title-bar(*ngIf='!config.store.appearance.useNativeFrame && config.store.appearance.dock == "off"') .spacer @@ -32,10 +25,9 @@ [model]='tab', [class.scrollable]='tab.scrollable', ) - //-terminal(*ngIf='tab.type == "terminal"', [session]='tab.session', '[(title)]'='tab.name') - //-settings-pane(*ngIf='tab.type == "settings"') -hotkey-hint +// TODO +//hotkey-hint toaster-container([toasterconfig]="toasterconfig") template(ngbModalContainer) diff --git a/app/src/components/app.ts b/app/src/components/app.ts index 2742a92f..c16d1c6d 100644 --- a/app/src/components/app.ts +++ b/app/src/components/app.ts @@ -9,8 +9,9 @@ import { QuitterService } from 'services/quitter' import { ConfigService } from 'services/config' import { DockingService } from 'services/docking' import { SessionsService } from 'services/sessions' +import { PluginDispatcherService } from 'services/pluginDispatcher' -import { Tab, SettingsTab, TerminalTab } from 'models/tab' +import { Tab, TerminalTab } from 'models/tab' import 'angular2-toaster/lib/toaster.css' import 'global.less' @@ -53,6 +54,7 @@ export class AppComponent { public hostApp: HostAppService, public hotkeys: HotkeysService, public config: ConfigService, + private pluginDispatcher: PluginDispatcherService, log: LogService, _quitter: QuitterService, ) { @@ -214,6 +216,7 @@ export class AppComponent { } showSettings() { + const SettingsTab = this.pluginDispatcher.temp let settingsTab = this.tabs.find((x) => x instanceof SettingsTab) if (!settingsTab) { settingsTab = new SettingsTab() diff --git a/app/src/components/titleBar.pug b/app/src/components/titleBar.pug new file mode 100644 index 00000000..6465a857 --- /dev/null +++ b/app/src/components/titleBar.pug @@ -0,0 +1,7 @@ +.title((dblclick)='hostApp.toggleMaximize()') Term +button.btn.btn-secondary.btn-minimize((click)='hostApp.minimize()') + i.fa.fa-window-minimize +button.btn.btn-secondary.btn-maximize((click)='hostApp.toggleMaximize()') + i.fa.fa-window-maximize +button.btn.btn-secondary.btn-close((click)='hostApp.quit()') + i.fa.fa-close diff --git a/app/src/components/titleBar.scss b/app/src/components/titleBar.scss new file mode 100644 index 00000000..550c9500 --- /dev/null +++ b/app/src/components/titleBar.scss @@ -0,0 +1,35 @@ +@import '~variables.scss'; + +$titlebar-height: 30px; + +:host { + flex: 0 0 $titlebar-height; + display: flex; + + .title { + flex: auto; + padding-left: 15px; + line-height: $titlebar-height; + -webkit-app-region: drag; + } + + button { + flex: none; + border: none; + box-shadow: none; + border-radius: 0; + font-size: 8px; + width: 40px; + padding: 0; + line-height: $titlebar-height; + text-align: center; + + &:not(:hover):not(:active) { + background: transparent; + } + } + + .btn-close { + font-size: 12px; + } +} diff --git a/app/src/components/titleBar.ts b/app/src/components/titleBar.ts new file mode 100644 index 00000000..a8c9347c --- /dev/null +++ b/app/src/components/titleBar.ts @@ -0,0 +1,12 @@ +import { Component } from '@angular/core' +import { HostAppService } from 'services/hostApp' + +@Component({ + selector: 'title-bar', + template: require('./titleBar.pug'), + styles: [require('./titleBar.scss')], +}) +export class TitleBarComponent { + constructor (public hostApp: HostAppService) { + } +} diff --git a/app/src/models/tab.ts b/app/src/models/tab.ts index 894dd778..a60b03bf 100644 --- a/app/src/models/tab.ts +++ b/app/src/models/tab.ts @@ -2,7 +2,7 @@ import { EventEmitter } from '@angular/core' import { BaseTabComponent } from 'components/baseTab' import { Session } from 'services/sessions' -declare type ComponentType = new (...args: any[]) => BaseTabComponent +export declare type ComponentType = new (...args: any[]) => BaseTabComponent export class Tab { id: number @@ -24,23 +24,6 @@ export class Tab { getComponentType (): ComponentType { return null } - - destroy (): void { } -} - - -import { SettingsPaneComponent } from 'components/settingsPane' - -export class SettingsTab extends Tab { - constructor () { - super() - this.title = 'Settings' - this.scrollable = true - } - - getComponentType (): ComponentType { - return SettingsPaneComponent - } } @@ -54,6 +37,4 @@ export class TerminalTab extends Tab { getComponentType (): ComponentType { return TerminalTabComponent } - - onFocus (): void { } } diff --git a/app/src/services/pluginDispatcher.ts b/app/src/services/pluginDispatcher.ts index 23f9a71d..cb2b6826 100644 --- a/app/src/services/pluginDispatcher.ts +++ b/app/src/services/pluginDispatcher.ts @@ -6,7 +6,8 @@ import { ElectronService } from 'services/electron' @Injectable() export class PluginDispatcherService { plugins = [] - + temp: any + constructor ( private config: ConfigService, private electron: ElectronService, diff --git a/app/src/components/hotkeyDisplay.less b/app/src/settings/components/hotkeyDisplay.less similarity index 100% rename from app/src/components/hotkeyDisplay.less rename to app/src/settings/components/hotkeyDisplay.less diff --git a/app/src/components/hotkeyDisplay.pug b/app/src/settings/components/hotkeyDisplay.pug similarity index 100% rename from app/src/components/hotkeyDisplay.pug rename to app/src/settings/components/hotkeyDisplay.pug diff --git a/app/src/components/hotkeyDisplay.ts b/app/src/settings/components/hotkeyDisplay.ts similarity index 100% rename from app/src/components/hotkeyDisplay.ts rename to app/src/settings/components/hotkeyDisplay.ts diff --git a/app/src/components/hotkeyHint.less b/app/src/settings/components/hotkeyHint.less similarity index 100% rename from app/src/components/hotkeyHint.less rename to app/src/settings/components/hotkeyHint.less diff --git a/app/src/components/hotkeyHint.pug b/app/src/settings/components/hotkeyHint.pug similarity index 100% rename from app/src/components/hotkeyHint.pug rename to app/src/settings/components/hotkeyHint.pug diff --git a/app/src/components/hotkeyHint.ts b/app/src/settings/components/hotkeyHint.ts similarity index 100% rename from app/src/components/hotkeyHint.ts rename to app/src/settings/components/hotkeyHint.ts diff --git a/app/src/components/hotkeyInput.less b/app/src/settings/components/hotkeyInput.less similarity index 100% rename from app/src/components/hotkeyInput.less rename to app/src/settings/components/hotkeyInput.less diff --git a/app/src/components/hotkeyInput.ts b/app/src/settings/components/hotkeyInput.ts similarity index 100% rename from app/src/components/hotkeyInput.ts rename to app/src/settings/components/hotkeyInput.ts diff --git a/app/src/components/hotkeyInputModal.less b/app/src/settings/components/hotkeyInputModal.less similarity index 100% rename from app/src/components/hotkeyInputModal.less rename to app/src/settings/components/hotkeyInputModal.less diff --git a/app/src/components/hotkeyInputModal.pug b/app/src/settings/components/hotkeyInputModal.pug similarity index 100% rename from app/src/components/hotkeyInputModal.pug rename to app/src/settings/components/hotkeyInputModal.pug diff --git a/app/src/components/hotkeyInputModal.ts b/app/src/settings/components/hotkeyInputModal.ts similarity index 100% rename from app/src/components/hotkeyInputModal.ts rename to app/src/settings/components/hotkeyInputModal.ts diff --git a/app/src/components/settingsPane.less b/app/src/settings/components/settingsPane.less similarity index 100% rename from app/src/components/settingsPane.less rename to app/src/settings/components/settingsPane.less diff --git a/app/src/components/settingsPane.pug b/app/src/settings/components/settingsPane.pug similarity index 81% rename from app/src/components/settingsPane.pug rename to app/src/settings/components/settingsPane.pug index 1a278466..529074f5 100644 --- a/app/src/components/settingsPane.pug +++ b/app/src/settings/components/settingsPane.pug @@ -27,11 +27,11 @@ ngb-tabset(type='tabs') | Custom small.form-text.text-muted Whether a custom window or an OS native window should be used - .form-group - label Dock the terminal - br - .row - .col.col-auto + .row + .col.col-auto + .form-group + label Dock the terminal + br div( '[(ngModel)]'='config.store.appearance.dock' '(ngModelChange)'='config.save(); docking.dock()' @@ -67,7 +67,31 @@ ngb-tabset(type='tabs') [value]='"bottom"' ) | Bottom - .col + + .form-group(*ngIf='config.store.appearance.dock != "off"') + label Display on + br + div( + '[(ngModel)]'='config.store.appearance.dockScreen' + '(ngModelChange)'='config.save(); docking.dock()' + ngbRadioGroup + ) + label.btn.btn-secondary + input( + type='radio', + [value]='"current"' + ) + | Current + label.btn.btn-secondary(*ngFor='let screen of docking.getScreens()') + input( + type='radio', + [value]='screen.id' + ) + | {{screen.name}} + .col.col-auto + .form-group(*ngIf='config.store.appearance.dock != "off"') + label Docked terminal size + br input( type='range', '[(ngModel)]'='config.store.appearance.dockFill', @@ -76,25 +100,6 @@ ngb-tabset(type='tabs') max='1', step='0.01' ) - br - div( - *ngIf='config.store.appearance.dock != "off"', - '[(ngModel)]'='config.store.appearance.dockScreen' - '(ngModelChange)'='config.save(); docking.dock()' - ngbRadioGroup - ) - label.btn.btn-secondary - input( - type='radio', - [value]='"current"' - ) - | Current - label.btn.btn-secondary(*ngFor='let screen of docking.getScreens()') - input( - type='radio', - [value]='screen.id' - ) - | {{screen.name}} ngb-tab template(ngbTabTitle) diff --git a/app/src/components/settingsPane.ts b/app/src/settings/components/settingsPane.ts similarity index 98% rename from app/src/components/settingsPane.ts rename to app/src/settings/components/settingsPane.ts index 2c1f319d..1f7afd68 100644 --- a/app/src/components/settingsPane.ts +++ b/app/src/settings/components/settingsPane.ts @@ -10,7 +10,7 @@ import 'rxjs/add/operator/distinctUntilChanged' const childProcessPromise = nodeRequire('child-process-promise') import { BaseTabComponent } from 'components/baseTab' -import { SettingsTab } from 'models/tab' +import { SettingsTab } from '../tab' @Component({ diff --git a/app/src/settings/index.ts b/app/src/settings/index.ts new file mode 100644 index 00000000..3e4ace27 --- /dev/null +++ b/app/src/settings/index.ts @@ -0,0 +1,42 @@ +import { BrowserModule } from '@angular/platform-browser' +import { NgModule } from '@angular/core' +import { FormsModule } from '@angular/forms' +import { NgbModule } from '@ng-bootstrap/ng-bootstrap' + +import { HotkeyInputComponent } from './components/hotkeyInput' +import { HotkeyDisplayComponent } from './components/hotkeyDisplay' +import { HotkeyHintComponent } from './components/hotkeyHint' +import { HotkeyInputModalComponent } from './components/hotkeyInputModal' +import { SettingsPaneComponent } from './components/settingsPane' +import { PluginDispatcherService } from 'services/pluginDispatcher' + +import { SettingsTab } from './tab' + +@NgModule({ + imports: [ + BrowserModule, + FormsModule, + NgbModule, + ], + providers: [ + ], + entryComponents: [ + HotkeyInputModalComponent, + SettingsPaneComponent, + ], + declarations: [ + HotkeyDisplayComponent, + HotkeyHintComponent, + HotkeyInputComponent, + HotkeyInputModalComponent, + SettingsPaneComponent, + ], +}) +class SettingsModule { + constructor (pluginDispatcher: PluginDispatcherService) { + pluginDispatcher.temp = SettingsTab + } +} + + +export default SettingsModule diff --git a/app/src/settings/tab.ts b/app/src/settings/tab.ts new file mode 100644 index 00000000..1066a5eb --- /dev/null +++ b/app/src/settings/tab.ts @@ -0,0 +1,14 @@ +import { Tab, ComponentType } from '../models/tab' +import { SettingsPaneComponent } from './components/settingsPane' + +export class SettingsTab extends Tab { + constructor () { + super() + this.title = 'Settings' + this.scrollable = true + } + + getComponentType (): ComponentType { + return SettingsPaneComponent + } +} diff --git a/app/src/theme.scss b/app/src/theme.scss index 6cd94beb..830b4c29 100644 --- a/app/src/theme.scss +++ b/app/src/theme.scss @@ -65,6 +65,18 @@ ngb-tabset .tab-content { } $tab-border-radius: 5px; +$button-hover-bg: rgba(0, 0, 0, .25); +$button-active-bg: rgba(0, 0, 0, .5); + +title-bar { + background: $body-bg2; + + button { + &:hover { background: $button-hover-bg !important; } + &:active { background: $button-active-bg !important; } + } +} + .tabs tab-header { background: $body-bg; @@ -80,13 +92,8 @@ $tab-border-radius: 5px; border: none; transition: 0.25s all; - &:hover { - background: rgba(0, 0, 0, .25) !important; - } - - &:active { - background: rgba(0, 0, 0, .5) !important; - } + &:hover { background: $button-hover-bg !important; } + &:active { background: $button-active-bg !important; } } } diff --git a/tslint.json b/tslint.json index 10547ddc..27b277b5 100644 --- a/tslint.json +++ b/tslint.json @@ -10,8 +10,10 @@ "no-eval": true, "no-invalid-this": true, "no-shadowed-variable": true, + "no-undef": true, "no-unused-expression": true, "no-unused-new": true, + "no-unused-variable": true, "no-use-before-declare": true, "no-var-keyword": true, "new-parens": true diff --git a/webpack.config.js b/webpack.config.js index 45aa7017..c6d0e71b 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -43,22 +43,22 @@ module.exports = { { test: /\.less$/, loader: "style-loader!css-loader!less-loader", - exclude: [/app\/src\/components\//], + exclude: [/app\/.*components\//], }, { test: /\.less$/, loader: "to-string-loader!css-loader!less-loader", - include: [/app\/src\/components\//], + include: [/app\/.*components\//], }, { test: /\.scss$/, use: ['style-loader', 'css-loader', 'sass-loader'], - exclude: [/app\/src\/components\//], + exclude: [/app\/.*components\//], }, { test: /\.scss$/, use: ['to-string-loader', 'css-loader', 'sass-loader'], - include: [/app\/src\/components\//], + include: [/app\/.*components\//], }, { test: /\.(png|svg)$/,