import pygame

pygame.init()
W, H = 800, 600
screen = pygame.display.set_mode((W, H))
pygame.display.set_caption("RGB配色练习工具")
clock = pygame.time.Clock()

# 字体兼容
def get_font(size):
    try:
        return pygame.font.SysFont("simhei", size)
    except:
        try:
            return pygame.font.SysFont("PingFang SC", size)
        except:
            return pygame.font.Font(None, size)

font_s = get_font(18)
font_m = get_font(24)
font_l = get_font(30)

# 初始颜色
r, g, b = 120, 160, 200
slider_w = 450
slider_h = 14
slider_x = 60
start_y = 80

# 预设配色方案 [(R,G,B),名称]
presets = [
    [(255,80,80), "暖红"],
    [(80,180,90), "青草绿"],
    [(60,130,220), "晴空蓝"],
    [(240,210,70), "暖黄"],
    [(160,90,200), "淡紫"],
    [(45,45,55), "深灰"],
    [(235,235,240), "米白"],
    [(210,120,70), "陶土色"]
]

active_slider = None

def draw_slider(y_pos, value, text):
    global active_slider
    # 滑轨
    pygame.draw.rect(screen, (70,70,85), (slider_x, y_pos, slider_w, slider_h), border_radius=6)
    # 进度
    rate = value / 255
    fill_w = int(slider_w * rate)
    pygame.draw.rect(screen, (120,180,255), (slider_x, y_pos, fill_w, slider_h), border_radius=6)
    # 滑块圆点
    cx = slider_x + fill_w
    cy = y_pos + slider_h//2
    pygame.draw.circle(screen, (255,255,255), (cx, cy), 9)
    pygame.draw.circle(screen, (30,30,40), (cx, cy), 9, 2)

    # 文字
    txt = font_m.render(f"{text}: {value}", True, (230,230,230))
    screen.blit(txt, (slider_x + slider_w + 20, y_pos-4))

    mx, my = pygame.mouse.get_pos()
    pressed = pygame.mouse.get_pressed()[0]
    rect = pygame.Rect(slider_x-8, y_pos-8, slider_w+16, slider_h+16)
    if pressed and rect.collidepoint(mx, my):
        active_slider = text
        new_val = int((mx - slider_x) / slider_w * 255)
        return max(0, min(255, new_val))
    return value

def rgb2hex(rgb):
    return f"#{rgb[0]:02X}{rgb[1]:02X}{rgb[2]:02X}"

running = True
while running:
    screen.fill((26,26,34))
    mx, my = pygame.mouse.get_pos()

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
            # 点击预设色块
            idx = 0
            px0, py0 = 60, 320
            for color, name in presets:
                rx = px0 + (idx % 4)*90
                ry = py0 + (idx //4)*65
                r_rect = pygame.Rect(rx, ry, 60,44)
                if r_rect.collidepoint(mx,my):
                    r,g,b = color
                idx += 1

    # 绘制滑动条
    r = draw_slider(start_y, r, "R")
    g = draw_slider(start_y+50, g, "G")
    b = draw_slider(start_y+100, b, "B")
    current_color = (r,g,b)

    # 预览大色块
    pygame.draw.rect(screen, current_color, (60, 160, 450, 130), border_radius=10)
    pygame.draw.rect(screen, (255,255,255), (60, 160, 450, 130), 3, border_radius=10)

    # 色值文字
    hex_str = rgb2hex(current_color)
    text1 = font_l.render(f"RGB({r}, {g}, {b})", True, (245,245,245))
    text2 = font_l.render(f"HEX {hex_str}", True, (245,245,245))
    screen.blit(text1, (540,170))
    screen.blit(text2, (540,220))

    # 预设配色标题
    tip = font_m.render("预设配色（点击直接选用）", True, (180,180,180))
    screen.blit(tip, (60, 295))

    # 绘制预设色块
    index = 0
    base_x, base_y = 60, 320
    for clr, name in presets:
        draw_x = base_x + (index % 4)*90
        draw_y = base_y + (index // 4)*65
        pygame.draw.rect(screen, clr, (draw_x, draw_y, 60,44), border_radius=6)
        pygame.draw.rect(screen, (255,255,255), (draw_x, draw_y, 60,44),2, border_radius=6)
        label = font_s.render(name, True, (220,220,220))
        screen.blit(label, (draw_x, draw_y+46))
        index +=1

    # 小提示
    hint = font_s.render("拖动滑块调色 | 练习色彩搭配", True, (130,130,145))
    screen.blit(hint, (60, H-40))

    pygame.display.flip()
    clock.tick(60)

pygame.quit()