Просмотр исходного кода

[U] Detect background and color mode in main

Azalea (on HyDEV-Daisy) 2 лет назад
Родитель
Сommit
0a9ac6a351
1 измененных файлов с 44 добавлено и 24 удалено
  1. 44 24
      hyfetch/main.py

+ 44 - 24
hyfetch/main.py

@@ -4,13 +4,14 @@ from __future__ import annotations
 import argparse
 import argparse
 import json
 import json
 import random
 import random
-import re
-from itertools import permutations
 import traceback
 import traceback
-from typing import Iterable
+from itertools import permutations
 from math import ceil
 from math import ceil
+from typing import Iterable
 
 
-from .color_util import printc, color, clear_screen
+from . import termenv
+from .color_scale import Scale
+from .color_util import printc, color, clear_screen, AnsiMode
 from .constants import *
 from .constants import *
 from .models import Config
 from .models import Config
 from .neofetch_util import *
 from .neofetch_util import *
@@ -85,11 +86,25 @@ def create_config() -> Config:
 
 
     :return: Config object (automatically stored)
     :return: Config object (automatically stored)
     """
     """
+    # Detect terminal environment
+    det_bg = termenv.get_background_color()
+    det_ansi = termenv.detect_ansi_mode()
+
     asc = get_distro_ascii()
     asc = get_distro_ascii()
     asc_width, asc_lines = ascii_size(asc)
     asc_width, asc_lines = ascii_size(asc)
-    title = 'Welcome to &b&lhy&f&lfetch&r! Let\'s set up some colors first.'
+    logo = color("&b&lhyfetch&r" if det_bg is None or det_bg.is_light() else "&b&lhy&f&lfetch&r")
+    title = f'Welcome to {logo} Let\'s set up some colors first.'
     clear_screen(title)
     clear_screen(title)
 
 
+    option_counter = 1
+
+    def update_title(k: str, v: str):
+        nonlocal title, option_counter
+        if not k.endswith(":"):
+            k += ':'
+        title += f"\n&e{option_counter}. {k.ljust(30)} &r{v}"
+        option_counter += 1
+
     ##############################
     ##############################
     # 0. Check term size
     # 0. Check term size
     try:
     try:
@@ -104,11 +119,12 @@ def create_config() -> Config:
 
 
     ##############################
     ##############################
     # 1. Select color system
     # 1. Select color system
-    clear_screen(title)
-    term_len, term_lines = term_size()
-    try:
-        # Demonstrate RGB with a gradient. This requires numpy
-        from .color_scale import Scale
+    def select_color_system():
+        if det_ansi == 'rgb':
+            return 'rgb', 'Detected color mode'
+
+        clear_screen(title)
+        term_len, term_lines = term_size()
 
 
         scale2 = Scale(['#12c2e9', '#c471ed', '#f7797d'])
         scale2 = Scale(['#12c2e9', '#c471ed', '#f7797d'])
         _8bit = [scale2(i / term_len).to_ansi_8bit(False) for i in range(term_len)]
         _8bit = [scale2(i / term_len).to_ansi_8bit(False) for i in range(term_len)]
@@ -121,25 +137,29 @@ def create_config() -> Config:
         printc(f'&a1. Which &bcolor system &ado you want to use?')
         printc(f'&a1. Which &bcolor system &ado you want to use?')
         printc(f'(If you can\'t see colors under "RGB Color Testing", please choose 8bit)')
         printc(f'(If you can\'t see colors under "RGB Color Testing", please choose 8bit)')
         print()
         print()
-        color_system = literal_input('Your choice?', ['8bit', 'rgb'], 'rgb')
 
 
-    except ModuleNotFoundError:
-        # Numpy not found, skip gradient test, use fallback
-        color_system = literal_input('Which &acolor &bsystem &rdo you want to use?',
-                                     ['8bit', 'rgb'], 'rgb')
+        return literal_input('Your choice?', ['8bit', 'rgb'], 'rgb'), 'Selected color mode'
 
 
     # Override global color mode
     # Override global color mode
+    color_system, ttl = select_color_system()
     GLOBAL_CFG.color_mode = color_system
     GLOBAL_CFG.color_mode = color_system
-    title += f'\n&e1. Selected color mode: &r{color_system}'
+    update_title(ttl, color_system)
 
 
     ##############################
     ##############################
     # 2. Select light/dark mode
     # 2. Select light/dark mode
-    clear_screen(title)
-    light_dark = literal_input(f'2. Is your terminal in &gf(#85e7e9)light mode&r or &gf(#c471ed)dark mode&r?',
-                               ['light', 'dark'], 'dark')
-    is_light = light_dark == 'light'
+    def select_light_dark():
+        if det_bg is not None:
+            return det_bg.is_light(), 'Detected background color'
+
+        clear_screen(title)
+        inp = literal_input(f'2. Is your terminal in &blight mode&r or &4dark mode&r?',
+                            ['light', 'dark'], 'dark')
+        return inp == 'light', 'Selected background color'
+
+    is_light, ttl = select_light_dark()
+    light_dark = 'light' if is_light else 'dark'
     GLOBAL_CFG.is_light = is_light
     GLOBAL_CFG.is_light = is_light
-    title += f'\n&e2. Light/Dark:          &r{light_dark}'
+    update_title(ttl, light_dark)
 
 
     ##############################
     ##############################
     # 3. Choose preset
     # 3. Choose preset
@@ -198,7 +218,7 @@ def create_config() -> Config:
             page -= 1
             page -= 1
         else:
         else:
             _prs = PRESETS[preset]
             _prs = PRESETS[preset]
-            title += f'\n&e3. Selected flag:       &r{_prs.color_text(preset)}'
+            update_title('Selected flag', _prs.set_light_dl_def(light_dark).color_text(preset))
             break
             break
 
 
     #############################
     #############################
@@ -236,7 +256,7 @@ def create_config() -> Config:
 
 
     if lightness:
     if lightness:
         _prs = _prs.set_light_dl(lightness, light_dark)
         _prs = _prs.set_light_dl(lightness, light_dark)
-    title += f'\n&e4. Brightness:          &r{f"{lightness:.2f}" if lightness else "unset"}'
+    update_title('Selected Brightness', f"{lightness:.2f}" if lightness else f"unset = {def_lightness * 100:.0f}%")
 
 
     #############################
     #############################
     # 5. Color arrangement
     # 5. Color arrangement
@@ -302,7 +322,7 @@ def create_config() -> Config:
 
 
         break
         break
 
 
-    title += f'\n&e5. Color Alignment:     &r{color_alignment}'
+    update_title('Color alignment', color_alignment)
 
 
     # Create config
     # Create config
     clear_screen(title)
     clear_screen(title)