- Add convert_and_reorder_colors() for hex to RGB conversion - Add msg.json example with new list-based select format - Support color order reordering based on device settings
54 lines
2.3 KiB
Python
54 lines
2.3 KiB
Python
def convert_and_reorder_colors(colors, settings_or_color_order):
|
|
"""Convert hex color strings to RGB tuples and reorder based on device color order.
|
|
|
|
Args:
|
|
colors: List of colors, either hex strings like "#FF0000" or RGB tuples like (255, 0, 0)
|
|
settings_or_color_order: Either a Settings object or a color_order string (e.g., "rgb", "grb")
|
|
|
|
Returns:
|
|
List of RGB tuples reordered according to device color order
|
|
"""
|
|
# Get channel order from settings or color_order string
|
|
if hasattr(settings_or_color_order, 'get_rgb_channel_order'):
|
|
# It's a Settings object
|
|
channel_order = settings_or_color_order.get_rgb_channel_order()
|
|
elif isinstance(settings_or_color_order, str):
|
|
# It's a color_order string, convert to channel order
|
|
color_order = settings_or_color_order.lower()
|
|
color_orders = {
|
|
"rgb": (1, 3, 5),
|
|
"rbg": (1, 5, 3),
|
|
"grb": (3, 1, 5),
|
|
"gbr": (3, 5, 1),
|
|
"brg": (5, 1, 3),
|
|
"bgr": (5, 3, 1)
|
|
}
|
|
hex_indices = color_orders.get(color_order, (1, 3, 5))
|
|
# Map hex string positions to RGB channel indices
|
|
hex_to_channel = {1: 0, 3: 1, 5: 2}
|
|
channel_order = tuple(hex_to_channel[pos] for pos in hex_indices)
|
|
else:
|
|
# Assume it's already a channel order tuple
|
|
channel_order = settings_or_color_order
|
|
|
|
converted_colors = []
|
|
for color in colors:
|
|
# Convert "#RRGGBB" to (R, G, B)
|
|
if isinstance(color, str) and color.startswith("#"):
|
|
r = int(color[1:3], 16)
|
|
g = int(color[3:5], 16)
|
|
b = int(color[5:7], 16)
|
|
rgb = (r, g, b)
|
|
# Reorder based on device color order
|
|
reordered = (rgb[channel_order[0]], rgb[channel_order[1]], rgb[channel_order[2]])
|
|
converted_colors.append(reordered)
|
|
elif isinstance(color, (list, tuple)) and len(color) == 3:
|
|
# Already a tuple/list, just reorder
|
|
rgb = tuple(color)
|
|
reordered = (rgb[channel_order[0]], rgb[channel_order[1]], rgb[channel_order[2]])
|
|
converted_colors.append(reordered)
|
|
else:
|
|
# Keep as-is if not recognized format
|
|
converted_colors.append(color)
|
|
return converted_colors
|