120 lines
4.3 KiB
Python
120 lines
4.3 KiB
Python
import asyncio
|
|
import tkinter as tk
|
|
from tkinter import ttk
|
|
import json
|
|
from async_tkinter_loop import async_handler, async_mainloop
|
|
from networking import send_to_server
|
|
import color_utils
|
|
|
|
bg_color = "#2e2e2e"
|
|
|
|
class App:
|
|
def __init__(self) -> None:
|
|
self.root = tk.Tk()
|
|
self.root.attributes('-fullscreen', True)
|
|
self.root.configure(bg=bg_color) # Set background color
|
|
|
|
# List of servers (IP, Port)
|
|
self.lightgroups = {
|
|
"light1": {"ids": [0], "settings": {"color": "#00ff00"}},
|
|
"light2": {"ids": [0], "settings": {"color": "#ff0000"}}
|
|
}
|
|
|
|
# Create Notebook for tabs
|
|
self.notebook = ttk.Notebook(self.root)
|
|
self.notebook.pack(expand=1, fill="both")
|
|
|
|
# Create a tab for each server
|
|
self.tabs = {}
|
|
for key, value in self.lightgroups.items():
|
|
tab = ttk.Frame(self.notebook)
|
|
self.notebook.add(tab, text=key)
|
|
self.create_sliders(tab)
|
|
self.tabs[key] = tab
|
|
|
|
async_mainloop(self.root)
|
|
|
|
def create_sliders(self, tab):
|
|
"""Create sliders for each tab."""
|
|
slider_length = 800
|
|
slider_width = 50
|
|
|
|
# Red Slider
|
|
red_slider = tk.Scale(tab, from_=255, to=0, orient=tk.VERTICAL, length=slider_length, width=slider_width, label="Red")
|
|
red_slider.set(0)
|
|
red_slider.pack(side=tk.LEFT, padx=10)
|
|
red_slider.bind("<ButtonRelease-1>", lambda _: self.update_colour(tab))
|
|
|
|
# Green Slider
|
|
green_slider = tk.Scale(tab, from_=255, to=0, orient=tk.VERTICAL, length=slider_length, width=slider_width, label="Green")
|
|
green_slider.set(0)
|
|
green_slider.pack(side=tk.LEFT, padx=10)
|
|
green_slider.bind("<ButtonRelease-1>", lambda _: self.update_colour(tab))
|
|
|
|
# Blue Slider
|
|
blue_slider = tk.Scale(tab, from_=255, to=0, orient=tk.VERTICAL, length=slider_length, width=slider_width, label="Blue")
|
|
blue_slider.set(0)
|
|
blue_slider.pack(side=tk.LEFT, padx=10)
|
|
blue_slider.bind("<ButtonRelease-1>", lambda _: self.update_colour(tab))
|
|
|
|
# Brightness Slider
|
|
brightness_slider = tk.Scale(tab, from_=255, to=0, orient=tk.VERTICAL, length=slider_length, width=slider_width, label="Brightness")
|
|
brightness_slider.set(127)
|
|
brightness_slider.pack(side=tk.LEFT, padx=10)
|
|
brightness_slider.bind("<ButtonRelease-1>", lambda _: self.update_colour(tab))
|
|
|
|
tab.widgets = {
|
|
'red_slider': red_slider,
|
|
'green_slider': green_slider,
|
|
'blue_slider': blue_slider,
|
|
'brightness_slider': brightness_slider,
|
|
}
|
|
|
|
@async_handler
|
|
async def update_colour(self, tab):
|
|
"""Update color based on the slider values and send to the selected server."""
|
|
try:
|
|
# Retrieve slider values
|
|
red_slider = tab.widgets['red_slider']
|
|
green_slider = tab.widgets['green_slider']
|
|
blue_slider = tab.widgets['blue_slider']
|
|
brightness_slider = tab.widgets['brightness_slider']
|
|
|
|
r = red_slider.get()
|
|
g = green_slider.get()
|
|
b = blue_slider.get()
|
|
brightness = brightness_slider.get()
|
|
|
|
# Adjust brightness
|
|
color = color_utils.adjust_brightness((r, g, b), brightness)
|
|
print(f"Adjusted color: {color}, Brightness: {brightness}")
|
|
|
|
# Convert RGB to hex color
|
|
hex_color = f"#{color[0]:02x}{color[1]:02x}{color[2]:02x}"
|
|
|
|
# Get the selected server
|
|
selected_server = self.notebook.tab(self.notebook.select(), "text")
|
|
ids = self.lightgroups[selected_server]["ids"]
|
|
|
|
# Construct WebSocket payload
|
|
payload = {
|
|
"save": True,
|
|
"ids": [0],
|
|
"settings": {
|
|
"colors": [hex_color], # Use the dynamically calculated hex color
|
|
"brightness": brightness, # Use the brightness slider value
|
|
"pattern": "on"
|
|
}
|
|
}
|
|
|
|
# Send the payload to the server
|
|
await send_to_server(payload)
|
|
print(f"Sent payload: {payload}")
|
|
except Exception as e:
|
|
print(f"Error updating color: {e}")
|
|
# Optionally, display the error in the GUI
|
|
|
|
|
|
if __name__ == "__main__":
|
|
app = App()
|