From 57a553037b8bb2a7ecd054781f6f8e6051d79856 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Sat, 18 Oct 2025 00:01:23 +0200 Subject: [PATCH] barwy kategorii --- app.py | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/app.py b/app.py index e53501a..0474504 100644 --- a/app.py +++ b/app.py @@ -11,7 +11,6 @@ import re import traceback import bcrypt import colorsys - from pillow_heif import register_heif_opener from datetime import datetime, timedelta, UTC, timezone from urllib.parse import urlparse, urlunparse @@ -885,13 +884,13 @@ def get_admin_expense_summary(): } -import hashlib, colorsys + def category_to_color(name: str, min_hue_gap_deg: int = 18) -> str: # Stabilny hash -> int hv = int(hashlib.md5(name.encode("utf-8")).hexdigest(), 16) - # Proste, ale skuteczne mieszanie bitów, by uniknąć lokalnych skupień + # Proste mieszanie bitów, by uniknąć lokalnych skupień def rotl(x, r, bits=128): r %= bits return ((x << r) | (x >> (bits - r))) & ((1 << bits) - 1) @@ -901,29 +900,26 @@ def category_to_color(name: str, min_hue_gap_deg: int = 18) -> str: # Pełne pokrycie koła barw 0..360 hue_deg = mix % 360 - # Odpychanie lokalne: mała korekta hue, aby podobne nazwy nie dawały prawie identycznych kolorów + # Odpychanie lokalne po hue, by podobne nazwy nie lądowały zbyt blisko gap = (rotl(mix, 17) % (2*min_hue_gap_deg)) - min_hue_gap_deg # [-gap, +gap] hue_deg = (hue_deg + gap) % 360 - # Ciemniejszy profil: mniej rażący na ekranie - # Bazowe S/L - s = 0.75 - l = 0.52 + # DARK profil: niższa jasność i nieco mniejsza saturacja + s = 0.70 + l = 0.45 - # Ograniczona wariacja, węższe widełki + # Wąska wariacja, żeby uniknąć „neonów” i zachować spójność s_var = ((rotl(mix, 29) % 5) - 2) / 100.0 # ±0.02 l_var = ((rotl(mix, 53) % 7) - 3) / 100.0 # ±0.03 - s = min(0.82, max(0.68, s + s_var)) - l = min(0.56, max(0.46, l + l_var)) + s = min(0.76, max(0.62, s + s_var)) + l = min(0.50, max(0.40, l + l_var)) - # Konwersja HLS->RGB (colorsys: H, L, S w [0..1]) + # Konwersja HLS->RGB (colorsys: H,L,S w [0..1]) h = hue_deg / 360.0 r, g, b = colorsys.hls_to_rgb(h, l, s) return f"#{int(round(r*255)):02x}{int(round(g*255)):02x}{int(round(b*255)):02x}" - - def get_total_expenses_grouped_by_category( show_all, range_type, start_date, end_date, user_id, category_id=None ):