feat: add gradent selector

This commit is contained in:
David Brenn 2025-08-12 14:18:12 +02:00
parent 2e339b7557
commit 660868df06
5 changed files with 47 additions and 4 deletions

View file

@ -180,6 +180,9 @@
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="gradient_selector"/>
</item>
</layout>
</widget>
</item>

View file

@ -373,16 +373,22 @@ class Preferences(QDialog):
qconnect(self.form.resetWindowSizes.clicked, self.on_reset_window_sizes)
self.form.color_blind.setChecked(self.mw.pm.color_blind())
qconnect(self.form.color_blind.stateChanged, self.on_my_checkbox_changed)
qconnect(self.form.color_blind.stateChanged, self.on_color_blind_checkbox_changed)
self.form.gradient_selector.setVisible(not is_win)
self.form.gradient_selector.addItems(["Default","Viridis","Inferno","Magma","Plasma","Cividis",])
self.form.gradient_selector.setCurrentIndex(self.mw.pm.get_gradient_index())
qconnect(
self.form.gradient_selector.currentIndexChanged,
self.mw.pm.set_gradient_index,
)
self.setup_language()
self.setup_video_driver()
self.setupOptions()
def on_my_checkbox_changed(self, state: int) -> None:
print("color_blind state changed", state)
def on_color_blind_checkbox_changed(self, state: int) -> None:
if state == 2:
# checkbox is checked
self.mw.pm.set_color_blind(True)

View file

@ -540,6 +540,12 @@ create table if not exists profiles
def color_blind(self) -> bool:
return self.meta.get("color_blind", False)
def set_gradient_index(self, index: int) -> None:
self.meta["gradient_index"] = index
def get_gradient_index(self) -> int:
return self.meta.get("gradient_index", 0)
def reduce_motion(self) -> bool:
return self.meta.get("reduce_motion", True)

View file

@ -142,6 +142,9 @@ class NewDeckStats(QDialog):
def on_load_finished(success: bool) -> None:
if success:
is_color_blind = self.mw.pm.color_blind()
selected_gradient = self.mw.pm.get_gradient_index()
js_code = f"window.selectedGradient = {str(selected_gradient).lower()};"
self.form.web.eval(js_code)
js_code = f"window.colorBlindMode = {str(is_color_blind).lower()};"
self.form.web.eval(js_code)
# Disconnect after running once to avoid multiple triggers

View file

@ -10,7 +10,7 @@ import * as tr from "@generated/ftl";
import { localizedNumber } from "@tslib/i18n";
import { dayLabel } from "@tslib/time";
import type { Bin } from "d3";
import { bin, extent, interpolateGreens, scaleLinear, scaleSequential, sum, interpolateViridis } from "d3";
import { bin, extent, interpolateGreens, scaleLinear, scaleSequential, sum, interpolateViridis, interpolateInferno, interpolateMagma, interpolatePlasma,interpolateCividis } from "d3";
import type { SearchDispatch, TableDatum } from "./graph-helpers";
import { getNumericMapBinValue, GraphRange, numericMap } from "./graph-helpers";
@ -123,7 +123,32 @@ export function buildHistogram(
adjustedRange = scaleLinear().range([0.7, 0.3]);
}
const selectedGradient = (window as any).selectedGradient;
console.log("Gradient selector:", selectedGradient);
switch (selectedGradient) {
case 0:
colourScale = scaleSequential((n) => interpolateGreens(adjustedRange(n)!)).domain([xMin!, xMax!]);
break;
case 1:
colourScale = scaleSequential((n) => interpolateViridis(adjustedRange(n)!)).domain([xMin!, xMax!]);
break;
case 2:
colourScale = scaleSequential((n) => interpolateInferno(adjustedRange(n)!)).domain([xMin!, xMax!]);
break;
case 3:
colourScale = scaleSequential((n) => interpolateMagma(adjustedRange(n)!)).domain([xMin!, xMax!]);
break;
case 4:
colourScale = scaleSequential((n) => interpolatePlasma(adjustedRange(n)!)).domain([xMin!, xMax!]);
break;
case 5:
colourScale = scaleSequential((n) => interpolateCividis(adjustedRange(n)!)).domain([xMin!, xMax!]);
break;
default:
colourScale = scaleSequential((n) => interpolateGreens(adjustedRange(n)!)).domain([xMin!, xMax!]);
break;
}
const total = sum(bins as any, getNumericMapBinValue);