From 68bda8725348f3aff0d2dc1e0a6fd8ed751de6e7 Mon Sep 17 00:00:00 2001 From: punkfairie Date: Sun, 14 May 2023 15:44:52 -0700 Subject: [PATCH] Custom colors! --- package-lock.json | 36 ++++++- package.json | 4 +- settings.html | 4 +- src/assets/index.css | 2 +- src/models/Journal.ts | 217 +++++++++++++++++++++-------------------- src/models/Settings.ts | 93 +++++++++++++++++- src/models/UI.js | 11 +++ src/renderer.js | 22 ++--- src/settings.js | 16 +++ 9 files changed, 269 insertions(+), 136 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8008c5c..62c3777 100755 --- a/package-lock.json +++ b/package-lock.json @@ -14,9 +14,11 @@ "electron-squirrel-startup": "^1.0.0", "elite-matrix": "^1.0.0", "glob": "^10.2.2", + "ini": "^4.1.0", "lodash-es": "^4.17.21", "reverse-line-reader": "^0.2.6", - "tail": "^2.2.6" + "tail": "^2.2.6", + "xml-js": "^1.6.11" }, "devDependencies": { "@electron-forge/cli": "^6.1.1", @@ -3796,6 +3798,12 @@ "node": ">=0.10.0" } }, + "node_modules/global-prefix/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, "node_modules/global-prefix/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -4075,10 +4083,12 @@ "dev": true }, "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.0.tgz", + "integrity": "sha512-HLR38RSF2iulAzc3I/sma4CoYxQP844rPYCNfzGDOHqa/YqVlwuuZgBx6M50/X8dKgzk0cm1qRg3+47mK2N+cQ==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, "node_modules/interpret": { "version": "3.1.1", @@ -5982,6 +5992,11 @@ "node": ">=14.0.0" } }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, "node_modules/semver": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", @@ -6951,6 +6966,17 @@ } } }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, "node_modules/xmlbuilder": { "version": "15.1.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", diff --git a/package.json b/package.json index e70a87a..1c52690 100755 --- a/package.json +++ b/package.json @@ -45,8 +45,10 @@ "electron-squirrel-startup": "^1.0.0", "elite-matrix": "^1.0.0", "glob": "^10.2.2", + "ini": "^4.1.0", "lodash-es": "^4.17.21", "reverse-line-reader": "^0.2.6", - "tail": "^2.2.6" + "tail": "^2.2.6", + "xml-js": "^1.6.11" } } diff --git a/settings.html b/settings.html index 3386612..82b57ce 100644 --- a/settings.html +++ b/settings.html @@ -45,9 +45,9 @@
-
+
+
diff --git a/src/assets/index.css b/src/assets/index.css index 4a1c905..d26aba8 100755 --- a/src/assets/index.css +++ b/src/assets/index.css @@ -98,7 +98,7 @@ div.charted b.inactive { } .highlighted { - color: var(--secondary-dark); + color: var(--background); background: var(--main); } diff --git a/src/models/Journal.ts b/src/models/Journal.ts index 37f4de9..3a1ecc5 100755 --- a/src/models/Journal.ts +++ b/src/models/Journal.ts @@ -1,38 +1,38 @@ -import type { Tail as TailType } from 'tail' -import type { autoScan, completeFsdJump, detailedScan, journalEntry, navRoute, planetScan } from "../@types/journalLines" +import type { Tail as TailType } from 'tail'; +import type { autoScan, completeFsdJump, detailedScan, journalEntry, navRoute, planetScan } from "../@types/journalLines"; -const EventEmitter = require('node:events') -import * as _ from 'lodash-es' -const path = require('node:path') -const { readFile } = require('node:fs/promises') -const reverseLineReader = require('reverse-line-reader') -const Tail = require('tail').Tail +const EventEmitter = require('node:events'); +import * as _ from 'lodash-es'; +const path = require('node:path'); +const { readFile } = require('node:fs/promises'); +const reverseLineReader = require('reverse-line-reader'); +const Tail = require('tail').Tail; -import { System } from "./System" -import { Log } from "./Log" -import { Body } from "./Body" +import { System } from "./System"; +import { Log } from "./Log"; +import { Body } from "./Body"; export class Journal extends EventEmitter { - #path: string - testing: string - location: System - navRoute: System[] + #path: string; + testing: string; + location: System; + navRoute: System[]; constructor(journalPath: string) { - super() + super(); - this.#path = journalPath - this.location = new System() - this.navRoute = [] + this.#path = journalPath; + this.location = new System(); + this.navRoute = []; // Start ReverseLineReader chain here. - Log.write(`Journal initialized. Attempting to find current location.`) - this.#getLastFsdJump() + Log.write(`Journal initialized. Attempting to find current location.`); + this.#getLastFsdJump(); // -> IF no FSD Jump: this.#getLastLocation() // --> this.#getScannedBodies() - this.testing = this.#path + this.testing = this.#path; } /* --------------------------------------------------------------------- #getLastFsdJump ---- */ @@ -42,22 +42,23 @@ export class Journal extends EventEmitter { #getLastFsdJump(): void { reverseLineReader.eachLine(this.#path, (raw: string) => { if (raw) { //skip blank line at end of file - const line: journalEntry = JSON.parse(raw) + const line: journalEntry = JSON.parse(raw); if (line.event === 'FSDJump') { - this.location = new System((line as completeFsdJump)) - Log.write(`Current location set to ${this.location.name}.`) - this.emit('ENTERED_NEW_SYSTEM') - return false + this.location = new System((line as completeFsdJump)); + Log.write(`Current location set to ${this.location.name}.`); + this.emit('ENTERED_NEW_SYSTEM'); + return false; } } }).then(() => { if (this.location.name === 'Unknown') { - Log.write('Unable to find last hyperspace jump. Searching for last known location.') - this.#getLastLocation() + Log + .write('Unable to find last hyperspace jump. Searching for last known location.'); + this.#getLastLocation(); } else { - Log.write('Attempting to find scanned bodies in current system.') - this.#getScannedBodies() + Log.write('Attempting to find scanned bodies in current system.'); + this.#getScannedBodies(); } }) } @@ -69,27 +70,27 @@ export class Journal extends EventEmitter { reverseLineReader.eachLine(this.#path, (raw: string, last: boolean) => { // Extra check just to be sure. if (this.location.name !== 'Unknown') { - return false + return false; } if (raw) { - const line: journalEntry = JSON.parse(raw) + const line: journalEntry = JSON.parse(raw); if (line.event === 'Location') { - this.location = new System((line as completeFsdJump)) - Log.write(`Current location set to ${this.location.name}.`) - this.emit('ENTERED_NEW_SYSTEM') - return false + this.location = new System((line as completeFsdJump)); + Log.write(`Current location set to ${this.location.name}.`); + this.emit('ENTERED_NEW_SYSTEM'); + return false; } else if (last) { - Log.write('WARNING: Unable to find last known location.') - return false + Log.write('WARNING: Unable to find last known location.'); + return false; } } }).then(() => { if (this.location.name !== 'Unknown') { - Log.write('Attempting to find scanned bodies in current system.') - this.#getScannedBodies() + Log.write('Attempting to find scanned bodies in current system.'); + this.#getScannedBodies(); } }) } @@ -102,38 +103,38 @@ export class Journal extends EventEmitter { reverseLineReader.eachLine(this.#path, (raw: string) => { if (raw) { - const line: journalEntry = JSON.parse(raw) + const line: journalEntry = JSON.parse(raw); // Check if previous line was ScanType = Detailed, and handle that. if (dssLine) { if (line.event === 'SAAScanComplete') { // This was a DSS, so add to list with DSS flag set to true. - this.location.bodies.push(new Body(dssLine, true)) + this.location.bodies.push(new Body(dssLine, true)); } else { // Else, check that the body hasn't already been added (by a DSS scan line). - const dupChecker = {'BodyName': dssLine.BodyName, 'BodyID': dssLine.BodyID} - const r = _.find(this.location.bodies, dupChecker) + const dupChecker = {'BodyName': dssLine.BodyName, 'BodyID': dssLine.BodyID}; + const r = _.find(this.location.bodies, dupChecker); if (r === undefined) { // Body was not already logged, so add to list. - this.location.bodies.push(new Body(dssLine)) + this.location.bodies.push(new Body(dssLine)); } } // Finally, clear the variable. - dssLine = null + dssLine = null; } // Now move on to evaluating the current line. if (line.event === 'Scan' && 'ScanType' in line) { - // If ScanType = Detailed and body is not a star, save the line so we can check - // the one immediately above for event = SAAScanComplete, which indicates this + // If ScanType = Detailed and body is not a star, save the line so we can check + // the one immediately above for event = SAAScanComplete, which indicates this // was a DSS. if (line.ScanType === 'Detailed' && !('StarType' in line)) { - dssLine = (line as detailedScan) + dssLine = (line as detailedScan); } else if ('StarType' in line) { // Save stars to bodies list. - this.location.bodies.push(new Body((line as autoScan|detailedScan))) + this.location.bodies.push(new Body((line as autoScan|detailedScan))); } else if (line.ScanType === 'AutoScan') { // Save auto/discovery scan bodies. // Check if planet, and then do the duplicate check (otherwise it's an @@ -142,33 +143,33 @@ export class Journal extends EventEmitter { const dupChecker = { 'BodyName': (line as planetScan<'AutoScan'>).BodyName, 'BodyID': (line as planetScan<'AutoScan'>).BodyID, - } - const r = _.find(this.location.bodies, dupChecker) + }; + const r = _.find(this.location.bodies, dupChecker); if (r === undefined) { - this.location.bodies.push(new Body((line as autoScan))) + this.location.bodies.push(new Body((line as autoScan))); } } else { // Asteroids. - this.location.bodies.push(new Body((line as autoScan))) + this.location.bodies.push(new Body((line as autoScan))); } } } else if (line.event === 'FSDJump') { // Stop evaluating once we reach the beginning of current system entries. - return false + return false; } } }).then(() => { if (this.location.bodies.length > 0) { - Log.write('No scanned bodies found in current system.') - this.emit('BUILD_BODY_LIST') + Log.write('No scanned bodies found in current system.'); + this.emit('BUILD_BODY_LIST'); } else { - Log.write('Scanned bodies found.') + Log.write('Scanned bodies found.'); } - Log.write('Checking for nav route.') - this.#getNavRoute() + Log.write('Checking for nav route.'); + this.#getNavRoute(); }) } @@ -176,40 +177,40 @@ export class Journal extends EventEmitter { async #getNavRoute(): Promise { this.navRoute = [] // Clear previous route, to catch overwritten routes. - let routeFile: string|null = null + let routeFile: string|null = null; try { - const filePath: string = path.dirname(this.#path) + '/NavRoute.json' - routeFile = await readFile(filePath, {encoding: 'utf8'}) + const filePath: string = path.dirname(this.#path) + '/NavRoute.json'; + routeFile = await readFile(filePath, {encoding: 'utf8'}); } catch (err) { - Log.write(`Error reading nav route file: ${err.message}.`) + Log.write(`Error reading nav route file: ${err.message}.`); } if (routeFile) { - const route: navRoute = JSON.parse(routeFile) + const route: navRoute = JSON.parse(routeFile); // system -> skip // CURRENT -> push = true; skip // system -> push - let push: boolean = false + let push: boolean = false; route.Route.forEach((system) => { if (!push && system.SystemAddress === this.location.SystemAddress) { - push = true + push = true; } if (push && system.SystemAddress !== this.location.SystemAddress) { - this.navRoute.push(new System(system)) + this.navRoute.push(new System(system)); } }) if (this.navRoute.length > 0) { - Log.write('Nav route set.') + Log.write('Nav route set.'); } else { - Log.write('No nav route found.') + Log.write('No nav route found.'); } // Call this no matter what, so that cleared routes are properly dealt with. - this.emit('SET_NAV_ROUTE') + this.emit('SET_NAV_ROUTE'); } } @@ -217,63 +218,63 @@ export class Journal extends EventEmitter { // Watch the journal for changes. watch(): void { - const tail: TailType = new Tail(this.#path, {useWatchFile: true}) + const tail: TailType = new Tail(this.#path, {useWatchFile: true}); - Log.write(`Watching ${path.basename(this.#path)}...`) + Log.write(`Watching ${path.basename(this.#path)}...`); - tail.on('line', (data) => data ? this.#parseLine(data) : undefined) - tail.on('error', (err) => Log.write(`Tail error in Journal.watch(): ${err}`)) + tail.on('line', (data) => data ? this.#parseLine(data) : undefined); + tail.on('error', (err) => Log.write(`Tail error in Journal.watch(): ${err}`)); } /* ------------------------------------------------------------------------ #parseLine() ---- */ // Parse and handle journal lines. #parseLine(raw: string) { - const line: journalEntry = JSON.parse(raw) - let dssFlag: boolean = false + const line: journalEntry = JSON.parse(raw); + let dssFlag: boolean = false; switch (line.event) { // Hyperspace jump started (3.. 2.. 1..) case 'StartJump': { if ('JumpType' in line && line.JumpType === 'Hyperspace') { - this.emit('ENTERING_WITCH_SPACE') + this.emit('ENTERING_WITCH_SPACE'); } - break + break; } // CMDR jumped to new system, so update current location. case 'FSDJump': { - this.#handleFsdJump((line as completeFsdJump)) - break + this.#handleFsdJump((line as completeFsdJump)); + break; } // CMDR completed DSS scan, so set flag for when next line processes and we want to // figure out what kind of scan occurred. case 'SAAScanComplete': { - dssFlag = true - break + dssFlag = true; + break; } // A scan occurred, so let's hand that info off to the appropriate function and then // reset the DSS flag. case 'Scan': { - this.#handleScanLine((line as autoScan|detailedScan), dssFlag) - dssFlag = false - break + this.#handleScanLine((line as autoScan|detailedScan), dssFlag); + dssFlag = false; + break; } // CMDR set a new nav route. case 'NavRoute': { - this.#getNavRoute() - break + this.#getNavRoute(); + break; } // CMDR cleared the nav route. case 'NavRouteClear': { - this.navRoute = [] - Log.write('Nav route cleared.') - this.emit('SET_NAV_ROUTE') - break + this.navRoute = []; + Log.write('Nav route cleared.'); + this.emit('SET_NAV_ROUTE'); + break; } } } @@ -281,49 +282,49 @@ export class Journal extends EventEmitter { /* ---------------------------------------------------------------------- #handleFsdJump ---- */ #handleFsdJump(line: completeFsdJump): void { - this.location = new System(line) - Log.write(`FSD Jump detected, current location updated to ${this.location.name}.`) + this.location = new System(line); + Log.write(`FSD Jump detected, current location updated to ${this.location.name}.`); if (this.navRoute.length > 0) { _.remove(this.navRoute, (system) => { - return system.SystemAddress === this.location.SystemAddress + return system.SystemAddress === this.location.SystemAddress; }) } - this.emit('ENTERED_NEW_SYSTEM') + this.emit('ENTERED_NEW_SYSTEM'); } /* --------------------------------------------------------------------- #handleScanLine ---- */ #handleScanLine(line: autoScan|detailedScan, DSS: boolean = false) { - const dupChecker = {'BodyName': line.BodyName, 'BodyID': line.BodyID} - let body: Body|null = null + const dupChecker = {'BodyName': line.BodyName, 'BodyID': line.BodyID}; + let body: Body|null = null; // If it's a DSS scan, then we should have already added the body to the list. But we'll // check to make sure. if (DSS) { // Using findIndex() rather than find() so we can edit the body if found. - const bodyIndex: number = _.findIndex(this.location.bodies, dupChecker) + const bodyIndex: number = _.findIndex(this.location.bodies, dupChecker); if (bodyIndex > -1) { // Body was found in list, so simply toggle the DSS flag. - this.location.bodies[bodyIndex].DSSDone = true + this.location.bodies[bodyIndex].DSSDone = true; } else { // Body was missed on initial journal scan, so add it to the list. - body = new Body(line, true) - this.location.bodies.push(body) + body = new Body(line, true); + this.location.bodies.push(body); } } else { // Otherwise it's an FSS or auto scan, and needs to be added to the list. // Probably overkill, but do a duplicate check just in case. - const r = _.find(this.location.bodies, dupChecker) + const r = _.find(this.location.bodies, dupChecker); if (r === undefined) { - body = new Body(line) - this.location.bodies.push(body) + body = new Body(line); + this.location.bodies.push(body); } } - Log.write(`Scan detected. Body: ${line.BodyName}.`) - this.emit('BODY_SCANNED', body, DSS) + Log.write(`Scan detected. Body: ${line.BodyName}.`); + this.emit('BODY_SCANNED', body, DSS); } } \ No newline at end of file diff --git a/src/models/Settings.ts b/src/models/Settings.ts index ffd5c78..a76d074 100644 --- a/src/models/Settings.ts +++ b/src/models/Settings.ts @@ -1,17 +1,22 @@ +import { EliteMatrix } from "elite-matrix"; +const EventEmitter = require('node:events'); const fs = require('node:fs/promises'); const { statSync, writeFileSync, readFileSync } = require('node:fs'); +const ini = require('ini'); const os = require('node:os'); const path = require('node:path'); +const { setTimeout } = require('node:timers/promises'); +const xmlJS = require('xml-js'); -import { EliteMatrix } from "elite-matrix"; import { Log } from "./Log"; interface settingsFile { minValue: number, maxDistance: number, + matrixFile: string, } -export class Settings { +export class Settings extends EventEmitter { static #instance: Settings; #file: string; @@ -20,10 +25,12 @@ export class Settings { minValue: number; maxDistance: number; - #matrixFile?: string; + #matrixFile: null|string; matrix?: EliteMatrix; private constructor(isPackaged: boolean) { + super(); + if (!isPackaged && os.platform() === 'linux') { this.#file = '/mnt/c/Users/marle/ed-safari-settings.json'; } else { @@ -39,6 +46,7 @@ export class Settings { const contents: string = JSON.stringify({ minValue: 500000, maxDistance: 10000, + matrixFile: '', }); writeFileSync(this.#file, contents); @@ -49,8 +57,12 @@ export class Settings { const contents: settingsFile = JSON.parse(readFileSync(this.#file, { encoding: 'utf8' })); this.minValue = contents.minValue; this.maxDistance = contents.maxDistance; - + this.#matrixFile = contents.matrixFile; this.#writing = false; + + if (this.#matrixFile) { + this.#setMatrix(); + } } static get(isPackaged: boolean = false): Settings { @@ -74,6 +86,10 @@ export class Settings { this.#writing = false; Log.write('Settings saved!'); + + // Update Settings props. + await this.#read(); + return true; } catch (err) { Log.write(err); @@ -83,4 +99,73 @@ export class Settings { return false; } } + + /* ------------------------------------------------------------------------------- #read ---- */ + + async #read(): Promise { + try { + const file: string = await fs.readFile(this.#file, { encoding: 'utf8' }); + const contents: settingsFile = JSON.parse(file); + + this.minValue = contents.minValue; + this.maxDistance = contents.maxDistance; + this.#matrixFile = contents.matrixFile; + + if (this.#matrixFile) { + await this.#setMatrix(); + Log.write('Custom colors set!'); + } + + return true; + } catch (err) { + Log.write(err); + return false; + } + } + + /* -------------------------------------------------------------------------- #setMatrix ---- */ + + async #setMatrix(): Promise { + const file: string = await fs.readFile(this.#matrixFile, { encoding: 'utf8' }); + + let matrixRed: [number, number, number]; + let matrixGreen: [number, number, number]; + let matrixBlue: [number, number, number]; + + if (path.basename(this.#matrixFile) === 'GraphicsConfiguration.xml') { + const options = { + trim: true, + ignoreDeclaration: true, + ignoreAttributes: true, + compact: true, + textKey: '$' + }; + const contents = xmlJS.xml2js(file, options); + + let matrix = [ + contents.GraphicsConfig.GUIColour.Default.MatrixRed.$, + contents.GraphicsConfig.GUIColour.Default.MatrixGreen.$, + contents.GraphicsConfig.GUIColour.Default.MatrixBlue.$, + ]; + + matrix = matrix.map(v => v.replace(/\s/g, '').split(',')); + + matrixRed = matrix[0].length === 3 ? matrix[0] : [1,0,0]; + matrixGreen = matrix[1].length === 3 ? matrix[1] : [0,1,0]; + matrixBlue = matrix[2].length === 3 ? matrix[2] : [0,0,1]; + + this.matrix = new EliteMatrix(matrixRed, matrixGreen, matrixBlue); + + } else if (path.basename(this.#matrixFile) === 'XML-Profile.ini') { + const contents = (ini.parse(file)).constants; + + matrixRed = [contents.x150, contents.y150, contents.z150]; + matrixGreen = [contents.x151, contents.y151, contents.z151]; + matrixBlue = [contents.x152, contents.y152, contents.z152]; + + this.matrix = new EliteMatrix(matrixRed, matrixGreen, matrixBlue); + } + + this.emit('CUSTOM_COLORS_SET'); + } } \ No newline at end of file diff --git a/src/models/UI.js b/src/models/UI.js index 3c41d47..f42fb01 100755 --- a/src/models/UI.js +++ b/src/models/UI.js @@ -9,6 +9,17 @@ export class UI { return Intl.NumberFormat().format(Math.round(number)); } + /* --------------------------------------------------------------------------- setColors ---- */ + + static setColors(matrix) { + const body = $('body'); + body.css('--main', matrix.filterColor('#F5A804')); + body.css('--accent-dark', matrix.filterColor('#000e5f')); + body.css('--accent-light', matrix.filterColor('#17cbd4')); + body.css('--secondary-light', matrix.filterColor('#EAA529')); + body.css('--secondary-dark', matrix.filterColor('#370C03')); + } + /* --------------------------------------------------------------------- enterWitchSpace ---- */ static enterWitchSpace() { diff --git a/src/renderer.js b/src/renderer.js index 3822e3f..4debcc2 100755 --- a/src/renderer.js +++ b/src/renderer.js @@ -35,6 +35,12 @@ if (!journal) { safari.watchJournalDir(); journal.watch(); +/* ------------------------------------------------------------------------------ set colors ---- */ + +settings.on('CUSTOM_COLORS_SET', () => { + UI.setColors(settings.matrix); +}); + /* -------------------------------------------------------------------- close window handler ---- */ $('#closeBtn').on('click', () => { @@ -129,18 +135,4 @@ edsm.on('SYSTEM_APPRAISED', (system) => { if (systemRow.length > 0) { UI.setValue(systemRow, system.estimatedValueMapped); } -}); - -// const matrixRed = [1.2, 0.05, 0.07]; -// const matrixGreen = [0.13, 1, 1.18]; -// const matrixBlue = [0.4, 1.29, 2]; - -// const matrix = new EliteMatrix(matrixRed, matrixGreen, matrixBlue); -// const hex = matrix.filterColor('#f5a804'); -// const rgb = matrix.filterColor([245, 168, 4]); -// console.log(`rgb(${rgb})`) -// $('body').css('--main', `rgb(${rgb})`); -// $('body').css('--accent-dark', matrix.filterColor('#000e5f')); -// $('body').css('--accent-light', matrix.filterColor('#17cbd4')); -// $('body').css('--secondary-light', matrix.filterColor('#EAA529')); -// $('body').css('--secondary-dark', matrix.filterColor('#370C03')); \ No newline at end of file +}); \ No newline at end of file diff --git a/src/settings.js b/src/settings.js index b1fc068..6bdb7ff 100644 --- a/src/settings.js +++ b/src/settings.js @@ -5,12 +5,23 @@ import './assets/ldom.min'; const { ipcRenderer } = require('electron'); const { setTimeout } = require('node:timers/promises'); +const { basename } = require('node:path'); import { Settings } from './models/Settings'; import { UI } from './models/UI'; const settings = Settings.get(); +if (settings.matrix) { + UI.setColors(settings.matrix); +} + +/* ------------------------------------------------------------------------------ set colors ---- */ + +settings.on('CUSTOM_COLORS_SET', () => { + UI.setColors(settings.matrix); +}); + /* -------------------------------------------------------------------- close window handler ---- */ $('#closeBtn').on('click', () => { @@ -61,6 +72,11 @@ $('form').on('submit', async function (event) { errors = true; } + const fileName = basename(data.matrixFile); + if (fileName !== 'XML-Profile.ini' || fileName !== 'GraphicsConfiguration.xml') { + UI.addFormError('#matrixFile', 'Invalid file.'); + } + // TODO re-enable submit button if errors. // If no errors, save.