From 5765e3182254ec272bbd5105b728087327917f09 Mon Sep 17 00:00:00 2001 From: Alexander Serdyukov Date: Fri, 20 Feb 2026 03:51:19 +0400 Subject: [PATCH 01/27] Fixed typing issues in visual options component --- package-lock.json | 1 + .../components/sidebar/SavedVisualOptions.vue | 250 ++++++++++-------- 2 files changed, 137 insertions(+), 114 deletions(-) diff --git a/package-lock.json b/package-lock.json index 44d6006..1e4785e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,6 +7,7 @@ "": { "name": "hict", "version": "0.1.1", + "license": "MIT", "dependencies": { "@popperjs/core": "^2.11.6", "@thednp/color-picker": "^2.0.0-alpha9", diff --git a/src/app/ui/components/sidebar/SavedVisualOptions.vue b/src/app/ui/components/sidebar/SavedVisualOptions.vue index 089fd69..032cd41 100644 --- a/src/app/ui/components/sidebar/SavedVisualOptions.vue +++ b/src/app/ui/components/sidebar/SavedVisualOptions.vue @@ -75,7 +75,7 @@ diff --git a/src/app/ui/components/sidebar/SavedVisualOptions.vue b/src/app/ui/components/sidebar/SavedVisualOptions.vue index bcfe7ba..07f04b1 100644 --- a/src/app/ui/components/sidebar/SavedVisualOptions.vue +++ b/src/app/ui/components/sidebar/SavedVisualOptions.vue @@ -65,6 +65,7 @@ :option_id="opt.option_id" :visualization-options="opt.options" :background-color="opt.backgroundColor" + :track-styles="opt.trackStyles" :name="opt.name" @remove="removeOption" @rename="renameOption" @@ -78,6 +79,7 @@ import { ContactMapManager } from "@/app/core/mapmanagers/ContactMapManager"; import { Ref, ref, shallowRef, triggerRef, onMounted } from "vue"; import SavedVisualOptionsElement from "./SavedVisualOptionsElement.vue"; import VisualizationOptions from "@/app/core/visualization/VisualizationOptions"; +import type { TrackStylePresetBundle } from "@/app/core/tracks/TrackStylePreset"; import { useVisualizationOptionsStore } from "@/app/stores/visualizationOptionsStore"; import { storeToRefs } from "pinia"; import { toast } from "vue-sonner"; @@ -109,6 +111,7 @@ const savedOptions = shallowRef( name: string; options: VisualizationOptions; backgroundColor: ColorTranslator; + trackStyles?: TrackStylePresetBundle; } >() ); @@ -142,6 +145,7 @@ function saveOptions() { name: `Preset ${id}`, options: visualizationOptionsStore.asVisualizationOptions(), backgroundColor: mapBackgroundColor.value as ColorTranslator, + trackStyles: props.mapManager.getLayersManager().getTrackStylePreset(), }); bumpSavedOptions(); } @@ -165,6 +169,7 @@ function exportOptions() { options: VisualizationOptions; backgroundColor: string; // <-- stable name: string; + trackStyles?: TrackStylePresetBundle; }[] = []; savedOptions.value.forEach((v) => @@ -173,6 +178,7 @@ function exportOptions() { options: v.options, name: v.name, backgroundColor: colorToString(v.backgroundColor), + trackStyles: v.trackStyles, }) ); @@ -278,12 +284,14 @@ function importJSONResults(jsonPreResult: unknown) { options: VisualizationOptions; backgroundColor?: string | ColorTranslator; name?: string; + trackStyles?: TrackStylePresetBundle; }[]; savedVisualizationPresets?: { option_id: number; options: VisualizationOptions; backgroundColor?: string | ColorTranslator; name?: string; + trackStyles?: TrackStylePresetBundle; }[]; }; }; @@ -312,6 +320,7 @@ function importJSONResults(jsonPreResult: unknown) { option_id: newId, options: option.options, backgroundColor, + trackStyles: option.trackStyles, name: option.name ?? `Imported preset ${newId}`, }; savedOptions.value.set(newOption.option_id, newOption); diff --git a/src/app/ui/components/sidebar/SavedVisualOptionsElement.vue b/src/app/ui/components/sidebar/SavedVisualOptionsElement.vue index c710b88..585bb16 100644 --- a/src/app/ui/components/sidebar/SavedVisualOptionsElement.vue +++ b/src/app/ui/components/sidebar/SavedVisualOptionsElement.vue @@ -67,6 +67,7 @@ diff --git a/src/app/ui/components/sidebar/SideBar.vue b/src/app/ui/components/sidebar/SideBar.vue index a860e25..6f39115 100644 --- a/src/app/ui/components/sidebar/SideBar.vue +++ b/src/app/ui/components/sidebar/SideBar.vue @@ -36,6 +36,11 @@ v-bind:key="layer.name" v-bind:layer-name="layer.name" :getDefaultColor="layer.getStyle" + :getLabelSize="layer.getLabelSize" + :getLabelOffsetMultiplier="layer.getLabelOffsetMultiplier" + :getLabelBold="layer.getLabelBold" + :getLabelOutline="layer.getLabelOutline" + :getLabelOutlineWidth="layer.getLabelOutlineWidth" :enableStyleEditor="layer.enableStyleEditor" @onColorChanged="onColorChanged" @onBorderStyleChanged="onBorderStyleChanged" @@ -120,7 +125,12 @@ class LayerDescriptor { public name: string, public getStyle?: () => Style | undefined, public layer_manager?: unknown, - public enableStyleEditor: boolean = false + public enableStyleEditor: boolean = false, + public getLabelSize?: () => number, + public getLabelOffsetMultiplier?: () => number, + public getLabelBold?: () => boolean, + public getLabelOutline?: () => boolean, + public getLabelOutlineWidth?: () => number ) {} } @@ -132,7 +142,28 @@ const layers: Ref = ref([ ?.getLayersManager() .track2DHolder.contigBordersTrack.getStyle(), undefined, - true + true, + () => + props.mapManager + ?.getLayersManager() + .track2DHolder.contigBordersTrack.getLabelSize() ?? 12, + () => + props.mapManager + ?.getLayersManager() + .track2DHolder.contigBordersTrack.getLabelOffsetMultiplier() ?? 1.25 + , + () => + props.mapManager + ?.getLayersManager() + .track2DHolder.contigBordersTrack.getLabelBold() ?? true, + () => + props.mapManager + ?.getLayersManager() + .track2DHolder.contigBordersTrack.getLabelOutline() ?? true, + () => + props.mapManager + ?.getLayersManager() + .track2DHolder.contigBordersTrack.getLabelOutlineWidth() ?? 2 ), new LayerDescriptor( "Scaffolds", @@ -141,9 +172,83 @@ const layers: Ref = ref([ ?.getLayersManager() .track2DHolder.scaffoldBordersTrack.getStyle(), undefined, - true + true, + () => + props.mapManager + ?.getLayersManager() + .track2DHolder.scaffoldBordersTrack.getLabelSize() ?? 12, + () => + props.mapManager + ?.getLayersManager() + .track2DHolder.scaffoldBordersTrack.getLabelOffsetMultiplier() ?? 1.25 + , + () => + props.mapManager + ?.getLayersManager() + .track2DHolder.scaffoldBordersTrack.getLabelBold() ?? true, + () => + props.mapManager + ?.getLayersManager() + .track2DHolder.scaffoldBordersTrack.getLabelOutline() ?? true, + () => + props.mapManager + ?.getLayersManager() + .track2DHolder.scaffoldBordersTrack.getLabelOutlineWidth() ?? 2 + ), + new LayerDescriptor( + "Cnames", + undefined, + undefined, + true, + () => + props.mapManager + ?.getLayersManager() + .track2DHolder.contigBordersTrack.getLabelSize() ?? 12, + () => + props.mapManager + ?.getLayersManager() + .track2DHolder.contigBordersTrack.getLabelOffsetMultiplier() ?? 1.25 + , + () => + props.mapManager + ?.getLayersManager() + .track2DHolder.contigBordersTrack.getLabelBold() ?? true, + () => + props.mapManager + ?.getLayersManager() + .track2DHolder.contigBordersTrack.getLabelOutline() ?? true, + () => + props.mapManager + ?.getLayersManager() + .track2DHolder.contigBordersTrack.getLabelOutlineWidth() ?? 2 + ), + new LayerDescriptor( + "Snames", + undefined, + undefined, + true, + () => + props.mapManager + ?.getLayersManager() + .track2DHolder.scaffoldBordersTrack.getLabelSize() ?? 12, + () => + props.mapManager + ?.getLayersManager() + .track2DHolder.scaffoldBordersTrack.getLabelOffsetMultiplier() ?? 1.25 + , + () => + props.mapManager + ?.getLayersManager() + .track2DHolder.scaffoldBordersTrack.getLabelBold() ?? true, + () => + props.mapManager + ?.getLayersManager() + .track2DHolder.scaffoldBordersTrack.getLabelOutline() ?? true, + () => + props.mapManager + ?.getLayersManager() + .track2DHolder.scaffoldBordersTrack.getLabelOutlineWidth() ?? 2 ), - new LayerDescriptor("Gridlines"), new LayerDescriptor("Background", () => backgroundColorStyle.value), ]); @@ -155,6 +260,9 @@ function onColorChanged(layerName: string, newColor: ColorTranslator) { case "Scaffolds": getEventManager()?.onScanffoldBorderColorChanged(newColor.RGBA); break; + case "Cnames": + case "Snames": + break; case "Background": stylesStore.setMapBackground(newColor); break; @@ -176,6 +284,12 @@ function onBorderStyleChanged(layerName: string, style: BorderStyle) { case "Scaffolds": getEventManager()?.onScanffoldBorderStyleChanged(style); break; + case "Cnames": + getEventManager()?.onContigNamePlacementChanged(style); + break; + case "Snames": + getEventManager()?.onScaffoldNamePlacementChanged(style); + break; default: // alert(`Method for ${layerName} is undefined`); toast.error(`Method for ${layerName} is undefined`); @@ -186,16 +300,53 @@ function onBorderStyleChanged(layerName: string, style: BorderStyle) { function onStyleChanged( layerName: string, borderWidth: number, - fillColor: ColorTranslator + fillColor: ColorTranslator, + labelSize: number, + labelOffsetMultiplier: number, + labelBold: boolean, + labelOutline: boolean, + labelOutlineWidth: number ) { switch (layerName) { case "Contigs": getEventManager()?.onContigBorderWidthChanged(borderWidth); getEventManager()?.onContigFillColorChanged(fillColor.RGBA); + getEventManager()?.onContigLabelSizeChanged(labelSize); + getEventManager()?.onContigLabelOffsetMultiplierChanged( + labelOffsetMultiplier + ); + getEventManager()?.onContigLabelBoldChanged(labelBold); + getEventManager()?.onContigLabelOutlineChanged(labelOutline); + getEventManager()?.onContigLabelOutlineWidthChanged(labelOutlineWidth); break; case "Scaffolds": getEventManager()?.onScaffoldBorderWidthChanged(borderWidth); getEventManager()?.onScaffoldFillColorChanged(fillColor.RGBA); + getEventManager()?.onScaffoldLabelSizeChanged(labelSize); + getEventManager()?.onScaffoldLabelOffsetMultiplierChanged( + labelOffsetMultiplier + ); + getEventManager()?.onScaffoldLabelBoldChanged(labelBold); + getEventManager()?.onScaffoldLabelOutlineChanged(labelOutline); + getEventManager()?.onScaffoldLabelOutlineWidthChanged(labelOutlineWidth); + break; + case "Cnames": + getEventManager()?.onContigLabelSizeChanged(labelSize); + getEventManager()?.onContigLabelOffsetMultiplierChanged( + labelOffsetMultiplier + ); + getEventManager()?.onContigLabelBoldChanged(labelBold); + getEventManager()?.onContigLabelOutlineChanged(labelOutline); + getEventManager()?.onContigLabelOutlineWidthChanged(labelOutlineWidth); + break; + case "Snames": + getEventManager()?.onScaffoldLabelSizeChanged(labelSize); + getEventManager()?.onScaffoldLabelOffsetMultiplierChanged( + labelOffsetMultiplier + ); + getEventManager()?.onScaffoldLabelBoldChanged(labelBold); + getEventManager()?.onScaffoldLabelOutlineChanged(labelOutline); + getEventManager()?.onScaffoldLabelOutlineWidthChanged(labelOutlineWidth); break; default: toast.error(`Method for ${layerName} is undefined`); diff --git a/src/app/ui/components/upper_ribbon/CoolerConverter.vue b/src/app/ui/components/upper_ribbon/CoolerConverter.vue index 46011d4..c5cbadc 100644 --- a/src/app/ui/components/upper_ribbon/CoolerConverter.vue +++ b/src/app/ui/components/upper_ribbon/CoolerConverter.vue @@ -39,19 +39,157 @@ >