Minor: Refactor the code-base for better organization and compartmentalization. (#934)
* Clean up unused code * Fix media player formatting issue for labels with new line characteres. * Refactor the media player handlers into a class. * More code cleanup and organize shared weather utils into distinct classes. * Flatten some nesting. * Move weather manager in dedicated class and build HTTP Utility class for Rest API calling. * Remove logs * Rebase master merge * Reorg code (WIP) * More reorg * Delete utility scripts * Reorg options * Finish moving all options over * Fix typescript issues * Update options imports to default * missed update * Screw barrel files honestly, work of the devil. * Only initialize power profiles if power-profiles-daemon is running. * Fix window positioning and weather service naming * style dir * More organization * Restructure types to be closer to their source * Remove lib types and constants * Update basic weather object to be saner with extensibility. * Service updates * Fix initialization strategy for services. * Fix Config Manager to only emit changed objects and added missing temp converters. * Update storage service to handle unit changes. * Added cpu temp sensor auto-discovery * Added missing JSDocs to services * remove unused * Migrate to network service. * Fix network password issue. * Move out password input into helper * Rename password mask constant to be less double-negativey. * Dropdown menu rename * Added a component to edit JSON in the settings dialog (rough/WIP) * Align settings * Add and style JSON Editor. * Adjust padding * perf(shortcuts): ⚡ avoid unnecessary polling when shortcuts are disabled Stops the recording poller when shortcuts are disabled, preventing redundant polling and reducing resource usage. * Fix types and return value if shortcut not enabled. * Move the swww daemon checking process outside of the wallpaper service into a dedicated deamon lifecyle processor. * Add more string formatters and use title case for weather status (as it was). * Fix startup errors. * Rgba fix * Remove zod from dependencies --------- Co-authored-by: KernelDiego <gonzalezdiego.contact@gmail.com>
This commit is contained in:
@@ -1,58 +1,59 @@
|
||||
import { ColorMapKey, HexColor, MatugenColors } from '../../lib/options/options.types';
|
||||
import { ColorMapKey, HexColor, MatugenColors } from '../../lib/options/types';
|
||||
import { getMatugenVariations } from './variations';
|
||||
import { bash, dependencies, Notify, isAnImage } from '../../lib/utils';
|
||||
import options from '../../options';
|
||||
import icons from '../../lib/icons/icons';
|
||||
import { defaultColorMap } from 'src/lib/types/defaults/options.types';
|
||||
import { SystemUtilities } from 'src/core/system/SystemUtilities';
|
||||
import options from 'src/configuration';
|
||||
import { isAnImage } from 'src/lib/validation/images';
|
||||
import { defaultColorMap } from './defaults';
|
||||
|
||||
const MATUGEN_ENABLED = options.theme.matugen;
|
||||
const MATUGEN_SETTINGS = options.theme.matugen_settings;
|
||||
|
||||
interface SystemDependencies {
|
||||
checkDependencies(dep: string): boolean;
|
||||
executeCommand(cmd: string): Promise<string>;
|
||||
notify(notification: { summary: string; body: string; iconName: string }): void;
|
||||
isValidImage(path: string): boolean;
|
||||
}
|
||||
/**
|
||||
* Service that integrates with Matugen to generate color schemes from wallpapers
|
||||
*/
|
||||
export class MatugenService {
|
||||
private static _instance: MatugenService;
|
||||
|
||||
class DefaultSystemDependencies implements SystemDependencies {
|
||||
public checkDependencies(dep: string): boolean {
|
||||
return dependencies(dep);
|
||||
}
|
||||
|
||||
public async executeCommand(cmd: string): Promise<string> {
|
||||
return bash(cmd);
|
||||
}
|
||||
|
||||
public notify(notification: { summary: string; body: string; iconName: string }): void {
|
||||
Notify(notification);
|
||||
}
|
||||
|
||||
public isValidImage(path: string): boolean {
|
||||
return isAnImage(path);
|
||||
}
|
||||
}
|
||||
|
||||
class MatugenService {
|
||||
private _deps: SystemDependencies;
|
||||
|
||||
constructor(deps: SystemDependencies = new DefaultSystemDependencies()) {
|
||||
this._deps = deps;
|
||||
private constructor() {}
|
||||
|
||||
/**
|
||||
* Gets the singleton instance of the MatugenService
|
||||
*
|
||||
* @returns The MatugenService instance
|
||||
*/
|
||||
public static getInstance(): MatugenService {
|
||||
if (this._instance === undefined) {
|
||||
this._instance = new MatugenService();
|
||||
}
|
||||
|
||||
return this._instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Normalizes contrast value to be within Matugen's acceptable range
|
||||
*
|
||||
* @param contrast - The raw contrast value
|
||||
* @returns Normalized contrast value between -1 and 1
|
||||
*/
|
||||
private _normalizeContrast(contrast: number): number {
|
||||
return Math.max(-1, Math.min(1, contrast));
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates a color scheme from the current wallpaper using Matugen
|
||||
*
|
||||
* @returns The generated color palette or undefined if generation fails
|
||||
*/
|
||||
public async generateMatugenColors(): Promise<MatugenColors | undefined> {
|
||||
if (!MATUGEN_ENABLED.get() || !this._deps.checkDependencies('matugen')) {
|
||||
if (!MATUGEN_ENABLED.get() || !SystemUtilities.checkDependencies('matugen')) {
|
||||
return;
|
||||
}
|
||||
|
||||
const wallpaperPath = options.wallpaper.image.get();
|
||||
|
||||
if (!wallpaperPath || !this._deps.isValidImage(wallpaperPath)) {
|
||||
this._deps.notify({
|
||||
if (!wallpaperPath || !isAnImage(wallpaperPath)) {
|
||||
SystemUtilities.notify({
|
||||
summary: 'Matugen Failed',
|
||||
body: "Please select a wallpaper in 'Theming > General' first.",
|
||||
iconName: icons.ui.warning,
|
||||
@@ -68,13 +69,13 @@ class MatugenService {
|
||||
|
||||
const baseCommand = `matugen image -q "${wallpaperPath}" -t scheme-${schemeType} --contrast ${normalizedContrast}`;
|
||||
|
||||
const jsonResult = await this._deps.executeCommand(`${baseCommand} --dry-run --json hex`);
|
||||
await this._deps.executeCommand(baseCommand);
|
||||
const jsonResult = await SystemUtilities.bash(`${baseCommand} --dry-run --json hex`);
|
||||
await SystemUtilities.bash(baseCommand);
|
||||
|
||||
const parsedResult = JSON.parse(jsonResult);
|
||||
return parsedResult?.colors?.[mode];
|
||||
} catch (error) {
|
||||
this._deps.notify({
|
||||
SystemUtilities.notify({
|
||||
summary: 'Matugen Error',
|
||||
body: `An error occurred: ${error}`,
|
||||
iconName: icons.ui.info,
|
||||
@@ -84,10 +85,23 @@ class MatugenService {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates if a color string is a valid key in the default color map
|
||||
*
|
||||
* @param color - The color key to validate
|
||||
* @returns Whether the color is a valid ColorMapKey
|
||||
*/
|
||||
public isColorKeyValid(color: string): color is ColorMapKey {
|
||||
return Object.prototype.hasOwnProperty.call(defaultColorMap, color);
|
||||
}
|
||||
|
||||
/**
|
||||
* Maps a default color hex value to its Matugen-generated equivalent
|
||||
*
|
||||
* @param incomingHex - The original hex color to map
|
||||
* @param matugenColors - The Matugen color palette to use for mapping
|
||||
* @returns The mapped hex color or original if no mapping exists
|
||||
*/
|
||||
public getMatugenHex(incomingHex: HexColor, matugenColors?: MatugenColors): HexColor {
|
||||
if (!MATUGEN_ENABLED.get() || !matugenColors) {
|
||||
return incomingHex;
|
||||
@@ -110,7 +124,3 @@ class MatugenService {
|
||||
return incomingHex;
|
||||
}
|
||||
}
|
||||
|
||||
const matugenService = new MatugenService();
|
||||
|
||||
export { matugenService };
|
||||
|
||||
Reference in New Issue
Block a user