diff --git a/src/lang/en-US/langStrings.json b/src/lang/en-US/langStrings.json index f810a72c39..0909bbcc85 100644 --- a/src/lang/en-US/langStrings.json +++ b/src/lang/en-US/langStrings.json @@ -24,7 +24,9 @@ "remainingImages": "Retrieving urls:", "stopUrlRetrieving": "Stop", "exportSelections": "Export", - "importSelections": "Import" + "importSelections": "Import", + "backButton": "Back", + "logButton": "Log" }, "service": { "info": { @@ -285,7 +287,7 @@ "fuzzy_filter": "Filter images", "enabledProviders": "Enabled image providers", "selectLanguage": "Select language", - "selectTheme":"Select theme", + "selectTheme": "Select theme", "resetFuzzy_desc": "fuzzy list", "resetFuzzyCache_desc": "fuzzy cache", "resetFuzzy_btn": "Reset", @@ -477,7 +479,6 @@ "advanced": "Show advanced options", "noTitle": "No title!" } - }, "service": { "info": { diff --git a/src/lang/en-US/markdown/ea-desktop-parser-input.md b/src/lang/en-US/markdown/ea-desktop-parser-input.md index f8bb67d041..afcaf34a7d 100644 --- a/src/lang/en-US/markdown/ea-desktop-parser-input.md +++ b/src/lang/en-US/markdown/ea-desktop-parser-input.md @@ -1,9 +1,9 @@ # EA Desktop Parser specific inputs -## EA Desktop Games Directory +## EA Games Directory Override By default Steam ROM Manager assumes your `EA Desktop` games are installed at `C:\Program Files\EA Games\`. This field allows you to change that to wherever your games are installed, e.g. `D:\Games\EA Games`. -## Launch via EA Desktop +## Launch Games Via EA Desktop If enabled SRM will add a shortcut to `origin2://game/launch/?offerIds=${gameid}` instead of just the game's executable. This ensures the game launches via EA and will have access to online services. `This is required to add EA Play games. EA Play games will not be detected if this is not toggled on.` diff --git a/src/lib/parsers/glob-regex.parser.ts b/src/lib/parsers/glob-regex.parser.ts index 56b6f821e4..d9524215a9 100644 --- a/src/lib/parsers/glob-regex.parser.ts +++ b/src/lib/parsers/glob-regex.parser.ts @@ -30,6 +30,7 @@ export class GlobRegexParser implements GenericParser { 'glob-regex': { label: this.lang.inputTitle, placeholder: this.lang.inputPlaceholder, + required: true, inputType: 'text', validationFn: this.validate.bind(this), info: this.lang.docs__md.input.join('') diff --git a/src/lib/parsers/glob.parser.ts b/src/lib/parsers/glob.parser.ts index f10302989a..8e3f040b3f 100644 --- a/src/lib/parsers/glob.parser.ts +++ b/src/lib/parsers/glob.parser.ts @@ -26,6 +26,7 @@ export class GlobParser implements GenericParser { 'glob': { label: this.lang.inputTitle, placeholder: this.lang.inputPlaceholder, + required: true, inputType: 'text', validationFn: this.validate.bind(this), info: this.lang.docs__md.input.join('') diff --git a/src/models/nested-form.model.ts b/src/models/nested-form.model.ts index 4384045762..5f8bcc0650 100644 --- a/src/models/nested-form.model.ts +++ b/src/models/nested-form.model.ts @@ -45,6 +45,8 @@ export namespace NestedFormElement { /** Optional */ allowEmpty?: boolean /** Optional */ + required?: boolean + /** Optional */ onValidate?: NestedInputValidator; /** Optional */ onValidateObservable?: NestedInputValidatorObservable; @@ -71,6 +73,8 @@ export namespace NestedFormElement { /** Optional */ placeholder?: string; /** Optional */ + required?: boolean + /** Optional */ onValidate?: NestedInputValidator; /** Optional */ onValidateObservable?: NestedInputValidatorObservable; @@ -103,6 +107,8 @@ export namespace NestedFormElement { /** Optional */ placeholder?: string; /** Optional */ + required?: boolean + /** Optional */ error?: string; /** Optional */ onValidate?: NestedInputValidator; diff --git a/src/models/parser.model.ts b/src/models/parser.model.ts index 6f6a11ec92..4f60831525 100644 --- a/src/models/parser.model.ts +++ b/src/models/parser.model.ts @@ -54,6 +54,7 @@ export interface ParserInputField { label: string, placeholder?: string, inputType: 'text' | 'path' | 'dir' | 'toggle', + required?: boolean, info?: string, forcedInput?: string, validationFn?: (inputData: any) => null | string diff --git a/src/renderer/components/parsers.component.ts b/src/renderer/components/parsers.component.ts index c58a397559..ab52a8b66a 100644 --- a/src/renderer/components/parsers.component.ts +++ b/src/renderer/components/parsers.component.ts @@ -64,6 +64,7 @@ export class ParsersComponent implements AfterViewInit, OnDestroy { parserType: new NestedFormElement.Select({ label: this.lang.label.parserType, placeholder: this.lang.placeholder.parserType, + required: true, values: parserInfo.availableParsers, onValidate: (self, path) => this.parsersService.validate(path[0] as keyof UserConfiguration, self.value), onInfoClick: (self, path) => { @@ -81,6 +82,7 @@ export class ParsersComponent implements AfterViewInit, OnDestroy { }), configTitle: new NestedFormElement.Input({ placeholder: this.lang.placeholder.configTitle, + required: true, label: this.lang.label.configTitle, onValidate: (self, path) => this.parsersService.validate(path[0] as keyof UserConfiguration, self.value), onInfoClick: (self, path) => { @@ -88,26 +90,27 @@ export class ParsersComponent implements AfterViewInit, OnDestroy { this.currentDoc.content = this.lang.docs__md.configTitle.join(''); } }), - steamCategory: new NestedFormElement.Input({ - placeholder: this.lang.placeholder.steamCategory, - isHidden: () => this.isHiddenIfArtworkOnlyParser(), - label: this.lang.label.steamCategory, + steamDirectory: new NestedFormElement.Path({ + placeholder: this.lang.placeholder.steamDirectory, + directory: true, + required: true, + label: this.lang.label.steamDirectory, highlight: this.highlight.bind(this), onValidate: (self, path) => this.parsersService.validate(path[0] as keyof UserConfiguration, self.value), onInfoClick: (self, path) => { this.currentDoc.activePath = path.join(); - this.currentDoc.content = this.lang.docs__md.steamCategory.join(''); + this.currentDoc.content = this.lang.docs__md.steamDirectory.join(''); } }), - steamDirectory: new NestedFormElement.Path({ - placeholder: this.lang.placeholder.steamDirectory, - directory: true, - label: this.lang.label.steamDirectory, + steamCategory: new NestedFormElement.Input({ + placeholder: this.lang.placeholder.steamCategory, + isHidden: () => this.isHiddenIfArtworkOnlyParser(), + label: this.lang.label.steamCategory, highlight: this.highlight.bind(this), onValidate: (self, path) => this.parsersService.validate(path[0] as keyof UserConfiguration, self.value), onInfoClick: (self, path) => { this.currentDoc.activePath = path.join(); - this.currentDoc.content = this.lang.docs__md.steamDirectory.join(''); + this.currentDoc.content = this.lang.docs__md.steamCategory.join(''); } }), userAccounts: new NestedFormElement.Group({ @@ -132,6 +135,7 @@ export class ParsersComponent implements AfterViewInit, OnDestroy { }), romDirectory: new NestedFormElement.Path({ placeholder: this.lang.placeholder.romDirectory, + required: true, isHidden: () => this.isHiddenIfNotRomsParser(), directory: true, label: this.lang.label.romDirectory, @@ -147,11 +151,12 @@ export class ParsersComponent implements AfterViewInit, OnDestroy { isHidden: () => this.isHiddenIfNotRomsParser() }), executable: new NestedFormElement.Group({ + label: this.lang.label.executableLocation, isHidden: () => this.isHiddenIfNotRomsParser(), - label: this.lang.label.executableLocation, children: { path: new NestedFormElement.Path({ placeholder: this.lang.placeholder.executableLocation, + required: true, highlight: this.highlight.bind(this), onValidate: (self, path) => { let serialized: {[k: string]: any} = {}; @@ -222,6 +227,7 @@ export class ParsersComponent implements AfterViewInit, OnDestroy { if(input.inputType == 'path' || input.inputType == 'dir') { parserInputs[inputFieldName] = new NestedFormElement.Path({ placeholder: input.placeholder, + required: !!input.required, directory: input.inputType=='dir' ? true : false, initialValue: input.forcedInput !== undefined ? input.forcedInput : null, highlight: this.highlight.bind(this), @@ -247,6 +253,7 @@ export class ParsersComponent implements AfterViewInit, OnDestroy { initialValue: input.forcedInput !== undefined ? input.forcedInput : null, highlight: this.highlight.bind(this), placeholder: input.placeholder, + required: !!input.required, label: input.label, isHidden: () => { return concat(of(this.userForm.get('parserType').value), this.userForm.get('parserType').valueChanges).pipe(map((pType: string) => { diff --git a/src/renderer/styles/ng-nested-form.component.scss b/src/renderer/styles/ng-nested-form.component.scss index d4eac6a6c3..ab2c1aa7d0 100644 --- a/src/renderer/styles/ng-nested-form.component.scss +++ b/src/renderer/styles/ng-nested-form.component.scss @@ -87,12 +87,23 @@ ng-nested-form { ng-text-input { @include ngTextInput(); @include ngTextInputColor(input, true); - grid-area: input; + &.required { + outline: 1px solid var(--color--accent); + .display{ + border: 0 + } + } } ng-select { grid-area: input; + &.required { + outline: 1px solid var(--color--accent); + .display{ + border: 0 + } + } } ng-toggle-button { diff --git a/src/renderer/styles/preview.component.scss b/src/renderer/styles/preview.component.scss index 6bac6dbe11..cb3d73e71e 100644 --- a/src/renderer/styles/preview.component.scss +++ b/src/renderer/styles/preview.component.scss @@ -32,6 +32,51 @@ 'lowerMenu lowerMenu'; grid-template-rows: auto auto auto auto 1fr auto; grid-template-columns: auto var(--details-width); + + .preview-description{ + height: 100%; + grid-area: entries; + z-index: 3; + width: 100%; + max-width: 94vw; + margin: 0 auto; + padding: 30px; + box-sizing: border-box; + color: var(--color-markdown-h1); + + div + div { + background: transparent; + } + .fake-btn{ + + @include button(); + @include clickButtonColor(click-button); + color: var(--color-click-button-text-hover); + background-color: var(--color-click-button-background-hover); + } + strong{ + color: var(--color-markdown-h1); + } + h1{ + line-height: 1.25; + margin: var(--margin-markdown-hx); + padding-bottom: 0.3em; + border-bottom: 1px solid var(--color-markdown-underline); + font-size: var(--font-markdown-h1); + font-family: var(--font-family-markdown-h1); + color: var(--color-markdown-h1); + margin-top: 0; + } + p{ + margin: 0 0 1rem 0; + color: var(--color-markdown-text); + } + ol{ + li{ + margin-bottom: 12px + } + } + } + .upperMenu { display: grid; border: 0.5em solid transparent; diff --git a/src/renderer/styles/themes.global.scss b/src/renderer/styles/themes.global.scss index 3585fd358c..5b759d77dd 100644 --- a/src/renderer/styles/themes.global.scss +++ b/src/renderer/styles/themes.global.scss @@ -3,10 +3,13 @@ } + + .Classic { .only-emudeck{ display: none !important } + --color--accent: #fff; --grid-app:"titlebar titlebar titlebar" "navarea navborder route"; --grid-app-rows :auto 1fr; --grid-app-columns: auto auto 1fr; @@ -580,8 +583,16 @@ &.EmuDeck.EmuDeck preview{ // grid-template-areas: "lowerMenu" "upperMenu" "entries"; // grid-template-rows: auto auto 1fr; + position:relative; + + .preview-description{ + padding: 0; + padding-top: 30px; + } + .entries{ background: var(--color-preview-menu-background); + z-index:2; } .lowerMenu{ justify-content: end; diff --git a/src/renderer/svg-components/image-lens.component.ts b/src/renderer/svg-components/image-lens.component.ts new file mode 100644 index 0000000000..671d919854 --- /dev/null +++ b/src/renderer/svg-components/image-lens.component.ts @@ -0,0 +1,45 @@ +import { Component, Input } from '@angular/core'; + + +@Component({ + selector: 'svg[image-lens]', + template: ` + + + + `, + host: { + viewBox: "0 0 512 512", + version: "1.1", + xmlns: "http://www.w3.org/2000/svg", + '[class.hover]': 'hover', + '[class.active]': 'active' + }, + styles: [` + :host{ + height: 1em; + vertical-align: middle; + background-color: var(--select-image-alert-background, transparent); + } + path{ + fill: var(--color-image-alert); + } + :host(.hover):hover{ + background-color: var(--select-image-alert-background-hover, transparent); + } + :host(.active):active{ + background-color: var(--select-image-alert-background-active, transparent); + } + :host(.hover):hover path{ + fill: var(--color-image-alert-hover); + } + :host(.active):active path{ + fill: var(--color-image-alert-active); + } + `] +}) +export class ImageLensComponent { + @Input() title: string; + @Input() hover: boolean; + @Input() active: boolean; +} \ No newline at end of file diff --git a/src/renderer/svg-components/index.ts b/src/renderer/svg-components/index.ts index d7d56dbe6d..0ae1537e88 100644 --- a/src/renderer/svg-components/index.ts +++ b/src/renderer/svg-components/index.ts @@ -4,5 +4,6 @@ export * from './select-arrow-down.component'; export * from './refresh-images.component'; export * from './save-image.component'; export * from './image-alert.component'; +export * from './image-lens.component'; export * from './add-images.component'; export * from './copy-icon.component'; diff --git a/src/renderer/templates/ng-nested-form.component.html b/src/renderer/templates/ng-nested-form.component.html index 0a50f43e5e..0159768180 100644 --- a/src/renderer/templates/ng-nested-form.component.html +++ b/src/renderer/templates/ng-nested-form.component.html @@ -29,20 +29,21 @@ (click)="child.onInfoClick(currentForm.controls[childrenKey], currentForm.controls[childrenKey]['__path'])"> {{child.label}} + * Required - +
{{child.buttonLabel}}
- + - + Browse diff --git a/src/renderer/templates/preview.component.html b/src/renderer/templates/preview.component.html index 254ed587f2..69a10c702f 100644 --- a/src/renderer/templates/preview.component.html +++ b/src/renderer/templates/preview.component.html @@ -1,3 +1,16 @@ +
+

Add your games to Steam

+

Follow these steps to add games to your Steam Library

+
    +
  1. Click on the Parse button to scan your games
  2. +
  3. Wait until all the images are downloaded
  4. +
  5. Click on Save to Steam and wait for the message "Done adding/merging entries". If you have a big library this could take some time
  6. +
+ +

If some games are showing incorrect info, press on the image and click on the ! icon to show alternatives

+

If you don't want to add all games click Exclude Apps and then select the ones you don't want and hit Save Exclusions

+
{{lang.generateAppList}}
+
0 ? ' (' + app.steamCategories.join(', ') + ')' : '')}}
- + @@ -179,7 +192,7 @@ {{app.configurationTitle + (app.steamCategories.length > 0 ? ' (' + app.steamCategories.join(', ') + ')' : '')}}
- + @@ -201,7 +214,7 @@
-
{{lang.generateAppList}}
+
{{lang.generateAppList}}
{{lang.saveAppList}}
{{lang.removeAppList}}
@@ -209,5 +222,6 @@
{{lang.importSelections}}
{{"Exclude Apps"}}
+
Log
Back