|
|
|
@ -5,7 +5,7 @@ from typing import Union
|
|
|
|
|
import wx
|
|
|
|
|
import wx.lib.scrolledpanel as scrolled
|
|
|
|
|
|
|
|
|
|
from tinge import Tinge, HueBridge, HueGroup, HueLight, HueUtils, is_bridge
|
|
|
|
|
from tinge import HueBridge, HueGroup, HueLight, HueUtils, Tinge, is_bridge
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Hui(wx.Frame):
|
|
|
|
@ -14,7 +14,6 @@ class Hui(wx.Frame):
|
|
|
|
|
Args:
|
|
|
|
|
wx (Frame): Parent class
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
def redraw(*args):
|
|
|
|
|
"""Decorator used for redrawing the widgets in the sizer
|
|
|
|
|
|
|
|
|
@ -43,7 +42,8 @@ class Hui(wx.Frame):
|
|
|
|
|
self.cur_bridge: Union[None, HueBridge] = None
|
|
|
|
|
self.cur_group: Union[None, HueGroup] = None
|
|
|
|
|
# create a panel in the frame
|
|
|
|
|
self.pnl: scrolled.ScrolledPanel = scrolled.ScrolledPanel(self, -1, style=wx.VSCROLL)
|
|
|
|
|
self.pnl: scrolled.ScrolledPanel = scrolled.ScrolledPanel(
|
|
|
|
|
self, -1, style=wx.VSCROLL)
|
|
|
|
|
self.pnl.SetupScrolling()
|
|
|
|
|
# and create a sizer to manage the layout of child widgets
|
|
|
|
|
self.sizer: wx.BoxSizer = wx.BoxSizer(wx.VERTICAL)
|
|
|
|
@ -66,9 +66,12 @@ class Hui(wx.Frame):
|
|
|
|
|
btn: wx.Button = wx.Button(self.pnl, label=str(bridge))
|
|
|
|
|
self.sizer.Add(btn, 0, wx.EXPAND)
|
|
|
|
|
self.Bind(wx.EVT_BUTTON,
|
|
|
|
|
lambda event, mbridge=bridge: self.goto_bridge(mbridge), btn)
|
|
|
|
|
lambda event, mbridge=bridge: self.goto_bridge(
|
|
|
|
|
mbridge),
|
|
|
|
|
btn)
|
|
|
|
|
else:
|
|
|
|
|
label = "{} {} ({})".format(self.m_unreachable_icon, str(bridge), "unreachable")
|
|
|
|
|
label = "{} {} ({})".format(self.m_unreachable_icon,
|
|
|
|
|
str(bridge), "unreachable")
|
|
|
|
|
btn: wx.Button = wx.Button(self.pnl, label=label)
|
|
|
|
|
self.sizer.Add(btn, 0, wx.EXPAND)
|
|
|
|
|
|
|
|
|
@ -76,8 +79,8 @@ class Hui(wx.Frame):
|
|
|
|
|
label = "Discover bridge"
|
|
|
|
|
btn: wx.Button = wx.Button(self.pnl, label=label)
|
|
|
|
|
self.sizer.Add(btn, 0, wx.EXPAND)
|
|
|
|
|
self.Bind(wx.EVT_BUTTON,
|
|
|
|
|
lambda event: self.discover_new_bridges(), btn)
|
|
|
|
|
self.Bind(wx.EVT_BUTTON, lambda event: self.discover_new_bridges(),
|
|
|
|
|
btn)
|
|
|
|
|
|
|
|
|
|
@redraw
|
|
|
|
|
def add_groups(self, groups: list[HueGroup]):
|
|
|
|
@ -91,10 +94,11 @@ class Hui(wx.Frame):
|
|
|
|
|
|
|
|
|
|
has_unattached: bool = len(self.cur_bridge.unattached_lights) > 0
|
|
|
|
|
self.sizer.Add(bridge_btn, 0, wx.EXPAND)
|
|
|
|
|
self.Bind(wx.EVT_BUTTON,
|
|
|
|
|
lambda event: self.add_bridges(), bridge_btn)
|
|
|
|
|
self.Bind(wx.EVT_BUTTON, lambda event: self.add_bridges(), bridge_btn)
|
|
|
|
|
if has_unattached:
|
|
|
|
|
group_label: wx.StaticText = wx.StaticText(self.pnl, label=" ⚯ Groups ⚯ ", style=wx.ALIGN_CENTER)
|
|
|
|
|
group_label: wx.StaticText = wx.StaticText(self.pnl,
|
|
|
|
|
label=" ⚯ Groups ⚯ ",
|
|
|
|
|
style=wx.ALIGN_CENTER)
|
|
|
|
|
self.sizer.Add(group_label, 0, wx.EXPAND)
|
|
|
|
|
for group in groups:
|
|
|
|
|
inner_sizer: wx.BoxSizer = wx.BoxSizer(orient=wx.HORIZONTAL)
|
|
|
|
@ -104,17 +108,25 @@ class Hui(wx.Frame):
|
|
|
|
|
icon = self.m_on_icon
|
|
|
|
|
toggle_btn: wx.Button = wx.Button(self.pnl, label=icon)
|
|
|
|
|
inner_sizer.Add(toggle_btn, 1, wx.EXPAND)
|
|
|
|
|
self.Bind(wx.EVT_BUTTON,
|
|
|
|
|
lambda event, mgroupid=groupid: self.toggle_group(mgroupid), toggle_btn)
|
|
|
|
|
self.Bind(
|
|
|
|
|
wx.EVT_BUTTON,
|
|
|
|
|
lambda event, mgroupid=groupid: self.toggle_group(mgroupid),
|
|
|
|
|
toggle_btn)
|
|
|
|
|
label: str = "{}".format(str(group))
|
|
|
|
|
group_btn: wx.Button = wx.Button(self.pnl, label=label, style=wx.BU_LEFT)
|
|
|
|
|
group_btn: wx.Button = wx.Button(self.pnl,
|
|
|
|
|
label=label,
|
|
|
|
|
style=wx.BU_LEFT)
|
|
|
|
|
inner_sizer.Add(group_btn, 4, wx.EXPAND)
|
|
|
|
|
self.Bind(wx.EVT_BUTTON,
|
|
|
|
|
lambda event, mgroupid=groupid: self.goto_group(mgroupid), group_btn)
|
|
|
|
|
self.Bind(
|
|
|
|
|
wx.EVT_BUTTON,
|
|
|
|
|
lambda event, mgroupid=groupid: self.goto_group(mgroupid),
|
|
|
|
|
group_btn)
|
|
|
|
|
self.sizer.Add(inner_sizer, 0, wx.EXPAND)
|
|
|
|
|
if has_unattached:
|
|
|
|
|
unattached_label: wx.StaticText = wx.StaticText(self.pnl, label=" ⚬ Unattached lights ⚬ ",
|
|
|
|
|
style=wx.ALIGN_CENTER)
|
|
|
|
|
unattached_label: wx.StaticText = wx.StaticText(
|
|
|
|
|
self.pnl,
|
|
|
|
|
label=" ⚬ Unattached lights ⚬ ",
|
|
|
|
|
style=wx.ALIGN_CENTER)
|
|
|
|
|
self.sizer.Add(unattached_label, 0, wx.EXPAND)
|
|
|
|
|
for light in self.cur_bridge.unattached_lights:
|
|
|
|
|
inner_sizer = wx.BoxSizer(orient=wx.HORIZONTAL)
|
|
|
|
@ -127,21 +139,29 @@ class Hui(wx.Frame):
|
|
|
|
|
toggle_btn: wx.Button = wx.Button(self.pnl, label=icon)
|
|
|
|
|
inner_sizer.Add(toggle_btn, 1, wx.EXPAND)
|
|
|
|
|
self.Bind(wx.EVT_BUTTON,
|
|
|
|
|
lambda event, mlightid=lightid: self.toggle_light_and_goto_group(mlightid, lights),
|
|
|
|
|
lambda event, mlightid=lightid: self.
|
|
|
|
|
toggle_light_and_goto_group(mlightid, lights),
|
|
|
|
|
toggle_btn)
|
|
|
|
|
label: str = "{}".format(light)
|
|
|
|
|
light_btn: wx.Button = wx.Button(self.pnl, label=label, style=wx.BU_LEFT)
|
|
|
|
|
light_btn: wx.Button = wx.Button(self.pnl,
|
|
|
|
|
label=label,
|
|
|
|
|
style=wx.BU_LEFT)
|
|
|
|
|
inner_sizer.Add(light_btn, 4, wx.EXPAND)
|
|
|
|
|
self.Bind(wx.EVT_BUTTON,
|
|
|
|
|
lambda event, mlightid=lightid: self.add_single_light(mlightid, True), light_btn)
|
|
|
|
|
lambda event, mlightid=lightid: self.
|
|
|
|
|
add_single_light(mlightid, True),
|
|
|
|
|
light_btn)
|
|
|
|
|
self.sizer.Add(inner_sizer, 0, wx.EXPAND)
|
|
|
|
|
|
|
|
|
|
def add_manual_discovery_dialog(self) -> bool:
|
|
|
|
|
self.sizer.Clear(delete_windows=True)
|
|
|
|
|
found_any: bool = False
|
|
|
|
|
text_entry: wx.TextEntryDialog = wx.TextEntryDialog(self.pnl, "Manually enter IP address of bridge:",
|
|
|
|
|
caption="Auto discovery failure")
|
|
|
|
|
warn_label: wx.StaticText = wx.StaticText(self.pnl, label="Waiting for Button Press on Bridge")
|
|
|
|
|
text_entry: wx.TextEntryDialog = wx.TextEntryDialog(
|
|
|
|
|
self.pnl,
|
|
|
|
|
"Manually enter IP address of bridge:",
|
|
|
|
|
caption="Auto discovery failure")
|
|
|
|
|
warn_label: wx.StaticText = wx.StaticText(
|
|
|
|
|
self.pnl, label="Waiting for Button Press on Bridge")
|
|
|
|
|
if text_entry.ShowModal() == wx.ID_OK:
|
|
|
|
|
ipaddress: str = text_entry.GetValue()
|
|
|
|
|
if is_bridge(ipaddress):
|
|
|
|
@ -150,12 +170,14 @@ class Hui(wx.Frame):
|
|
|
|
|
user_or_error = HueUtils.connect(ipaddress)
|
|
|
|
|
while user_or_error.is_error():
|
|
|
|
|
user_or_error = HueUtils.connect(ipaddress)
|
|
|
|
|
self.m_tinge.append_bridge(HueBridge(ipaddress, user_or_error.get_user(), ipaddress))
|
|
|
|
|
self.m_tinge.append_bridge(
|
|
|
|
|
HueBridge(ipaddress, user_or_error.get_user(), ipaddress))
|
|
|
|
|
found_any = True
|
|
|
|
|
self.m_tinge.write_all_bridges_to_conf()
|
|
|
|
|
else:
|
|
|
|
|
label = "Supplied IP Address did not match a Bridge.",
|
|
|
|
|
failure_msg: wx.GenericMessageDialog = wx.GenericMessageDialog(self.pnl, label, caption="Try again!")
|
|
|
|
|
failure_msg: wx.GenericMessageDialog = wx.GenericMessageDialog(
|
|
|
|
|
self.pnl, label, caption="Try again!")
|
|
|
|
|
failure_msg.ShowModal()
|
|
|
|
|
return found_any
|
|
|
|
|
|
|
|
|
@ -170,7 +192,8 @@ class Hui(wx.Frame):
|
|
|
|
|
group_btn: wx.Button = wx.Button(self.pnl, label=str(self.cur_bridge))
|
|
|
|
|
self.sizer.Add(group_btn, 0, wx.EXPAND)
|
|
|
|
|
self.Bind(wx.EVT_BUTTON,
|
|
|
|
|
lambda event: self.add_groups(self.cur_bridge.get_groups()), group_btn)
|
|
|
|
|
lambda event: self.add_groups(self.cur_bridge.get_groups()),
|
|
|
|
|
group_btn)
|
|
|
|
|
for light in lights:
|
|
|
|
|
inner_sizer = wx.BoxSizer(orient=wx.HORIZONTAL)
|
|
|
|
|
lightid: int = light.get_id()
|
|
|
|
@ -182,13 +205,18 @@ class Hui(wx.Frame):
|
|
|
|
|
toggle_btn: wx.Button = wx.Button(self.pnl, label=icon)
|
|
|
|
|
inner_sizer.Add(toggle_btn, 1, wx.EXPAND)
|
|
|
|
|
self.Bind(wx.EVT_BUTTON,
|
|
|
|
|
lambda event, mlightid=lightid: self.toggle_light_and_goto_group(mlightid, lights),
|
|
|
|
|
lambda event, mlightid=lightid: self.
|
|
|
|
|
toggle_light_and_goto_group(mlightid, lights),
|
|
|
|
|
toggle_btn)
|
|
|
|
|
label: str = "{}".format(light)
|
|
|
|
|
light_btn: wx.Button = wx.Button(self.pnl, label=label, style=wx.BU_LEFT)
|
|
|
|
|
light_btn: wx.Button = wx.Button(self.pnl,
|
|
|
|
|
label=label,
|
|
|
|
|
style=wx.BU_LEFT)
|
|
|
|
|
inner_sizer.Add(light_btn, 4, wx.EXPAND)
|
|
|
|
|
self.Bind(wx.EVT_BUTTON,
|
|
|
|
|
lambda event, mlightid=lightid: self.add_single_light(mlightid), light_btn)
|
|
|
|
|
lambda event, mlightid=lightid: self.add_single_light(
|
|
|
|
|
mlightid),
|
|
|
|
|
light_btn)
|
|
|
|
|
self.sizer.Add(inner_sizer, 0, wx.EXPAND)
|
|
|
|
|
|
|
|
|
|
@redraw
|
|
|
|
@ -203,16 +231,20 @@ class Hui(wx.Frame):
|
|
|
|
|
self.SetTitle("Tinge - {}".format(light))
|
|
|
|
|
is_on: bool = light.is_on()
|
|
|
|
|
if unattached:
|
|
|
|
|
group_btn: wx.Button = wx.Button(self.pnl, label=str(self.cur_bridge))
|
|
|
|
|
group_btn: wx.Button = wx.Button(self.pnl,
|
|
|
|
|
label=str(self.cur_bridge))
|
|
|
|
|
self.sizer.Add(group_btn, 0, wx.EXPAND)
|
|
|
|
|
self.Bind(wx.EVT_BUTTON,
|
|
|
|
|
lambda event: self.add_groups(self.cur_bridge.get_groups()), group_btn)
|
|
|
|
|
self.Bind(
|
|
|
|
|
wx.EVT_BUTTON,
|
|
|
|
|
lambda event: self.add_groups(self.cur_bridge.get_groups()),
|
|
|
|
|
group_btn)
|
|
|
|
|
else:
|
|
|
|
|
group: HueGroup = self.cur_group
|
|
|
|
|
group_btn: wx.Button = wx.Button(self.pnl, label=str(group))
|
|
|
|
|
self.sizer.Add(group_btn, 0, wx.EXPAND)
|
|
|
|
|
self.Bind(wx.EVT_BUTTON,
|
|
|
|
|
lambda event: self.goto_group(self.cur_group.get_id()), group_btn)
|
|
|
|
|
lambda event: self.goto_group(self.cur_group.get_id()),
|
|
|
|
|
group_btn)
|
|
|
|
|
# Toggle
|
|
|
|
|
icon: str = self.m_off_icon
|
|
|
|
|
if is_on:
|
|
|
|
@ -222,54 +254,79 @@ class Hui(wx.Frame):
|
|
|
|
|
toggle_btn: wx.Button = wx.Button(self.pnl, label=icon)
|
|
|
|
|
self.sizer.Add(toggle_btn, 0, wx.EXPAND)
|
|
|
|
|
self.Bind(wx.EVT_BUTTON,
|
|
|
|
|
lambda event, mlightid=lightid: self.toggle_light_and_goto_light(mlightid),
|
|
|
|
|
lambda event, mlightid=lightid: self.
|
|
|
|
|
toggle_light_and_goto_light(mlightid),
|
|
|
|
|
toggle_btn)
|
|
|
|
|
|
|
|
|
|
# Slider for brightness
|
|
|
|
|
if is_on:
|
|
|
|
|
if light.can_set_brightness():
|
|
|
|
|
b_label: wx.StaticText = wx.StaticText(self.pnl, label="Brightness")
|
|
|
|
|
b_label: wx.StaticText = wx.StaticText(self.pnl,
|
|
|
|
|
label="Brightness")
|
|
|
|
|
self.sizer.Add(b_label, 0, wx.EXPAND)
|
|
|
|
|
b_slider: wx.Slider = wx.Slider(self.pnl, value=light.get_state().get_brightness(), minValue=1,
|
|
|
|
|
maxValue=254)
|
|
|
|
|
b_slider: wx.Slider = wx.Slider(
|
|
|
|
|
self.pnl,
|
|
|
|
|
value=light.get_state().get_brightness(),
|
|
|
|
|
minValue=1,
|
|
|
|
|
maxValue=254)
|
|
|
|
|
self.sizer.Add(b_slider, 0, wx.EXPAND)
|
|
|
|
|
self.Bind(wx.EVT_SCROLL,
|
|
|
|
|
lambda event: self.set_brightness(event, light.get_id()), b_slider)
|
|
|
|
|
self.Bind(
|
|
|
|
|
wx.EVT_SCROLL,
|
|
|
|
|
lambda event: self.set_brightness(event, light.get_id()),
|
|
|
|
|
b_slider)
|
|
|
|
|
# Slider for colortemp
|
|
|
|
|
if light.can_set_ct():
|
|
|
|
|
c_label: wx.StaticText = wx.StaticText(self.pnl, label="Color Temperature")
|
|
|
|
|
c_label: wx.StaticText = wx.StaticText(
|
|
|
|
|
self.pnl, label="Color Temperature")
|
|
|
|
|
self.sizer.Add(c_label, 0, wx.EXPAND)
|
|
|
|
|
c_slider: wx.Slider = wx.Slider(self.pnl, value=light.get_ct(), minValue=153, maxValue=500)
|
|
|
|
|
c_slider: wx.Slider = wx.Slider(self.pnl,
|
|
|
|
|
value=light.get_ct(),
|
|
|
|
|
minValue=153,
|
|
|
|
|
maxValue=500)
|
|
|
|
|
self.sizer.Add(c_slider, 0, wx.EXPAND)
|
|
|
|
|
self.Bind(wx.EVT_SCROLL,
|
|
|
|
|
lambda event: self.set_colortemp(event, light.get_id()), c_slider)
|
|
|
|
|
self.Bind(
|
|
|
|
|
wx.EVT_SCROLL,
|
|
|
|
|
lambda event: self.set_colortemp(event, light.get_id()),
|
|
|
|
|
c_slider)
|
|
|
|
|
|
|
|
|
|
# Slider for hue
|
|
|
|
|
if light.can_set_hue():
|
|
|
|
|
d_label: wx.StaticText = wx.StaticText(self.pnl, label="Hue")
|
|
|
|
|
self.sizer.Add(d_label, 0, wx.EXPAND)
|
|
|
|
|
d_slider: wx.Slider = wx.Slider(self.pnl, value=light.get_hue(), minValue=0, maxValue=65535)
|
|
|
|
|
d_slider: wx.Slider = wx.Slider(self.pnl,
|
|
|
|
|
value=light.get_hue(),
|
|
|
|
|
minValue=0,
|
|
|
|
|
maxValue=65535)
|
|
|
|
|
self.sizer.Add(d_slider, 0, wx.EXPAND)
|
|
|
|
|
self.Bind(wx.EVT_SCROLL,
|
|
|
|
|
lambda event: self.set_hue(event, light.get_id()), d_slider)
|
|
|
|
|
lambda event: self.set_hue(event, light.get_id()),
|
|
|
|
|
d_slider)
|
|
|
|
|
|
|
|
|
|
# Slider for saturation
|
|
|
|
|
if light.can_set_sat():
|
|
|
|
|
e_label: wx.StaticText = wx.StaticText(self.pnl, label="Saturation")
|
|
|
|
|
e_label: wx.StaticText = wx.StaticText(self.pnl,
|
|
|
|
|
label="Saturation")
|
|
|
|
|
self.sizer.Add(e_label, 0, wx.EXPAND)
|
|
|
|
|
e_slider: wx.Slider = wx.Slider(self.pnl, value=light.get_sat(), minValue=0, maxValue=254)
|
|
|
|
|
e_slider: wx.Slider = wx.Slider(self.pnl,
|
|
|
|
|
value=light.get_sat(),
|
|
|
|
|
minValue=0,
|
|
|
|
|
maxValue=254)
|
|
|
|
|
self.sizer.Add(e_slider, 0, wx.EXPAND)
|
|
|
|
|
self.Bind(wx.EVT_SCROLL,
|
|
|
|
|
lambda event: self.set_saturation(event, light.get_id()), e_slider)
|
|
|
|
|
self.Bind(
|
|
|
|
|
wx.EVT_SCROLL,
|
|
|
|
|
lambda event: self.set_saturation(event, light.get_id()),
|
|
|
|
|
e_slider)
|
|
|
|
|
rename_btn: wx.Button = wx.Button(self.pnl, label="Rename")
|
|
|
|
|
self.sizer.Add(rename_btn, 0, wx.EXPAND)
|
|
|
|
|
self.Bind(wx.EVT_BUTTON,
|
|
|
|
|
lambda event, mlightid=lightid: self.rename_light_and_goto_light(mlightid, unattached),
|
|
|
|
|
lambda event, mlightid=lightid: self.
|
|
|
|
|
rename_light_and_goto_light(mlightid, unattached),
|
|
|
|
|
rename_btn)
|
|
|
|
|
delete_btn: wx.Button = wx.Button(self.pnl, label="Delete")
|
|
|
|
|
self.sizer.Add(delete_btn, 0, wx.EXPAND)
|
|
|
|
|
self.Bind(wx.EVT_BUTTON,
|
|
|
|
|
lambda event, mlightid=lightid: self.delete_light_and_goto_group(mlightid),
|
|
|
|
|
lambda event, mlightid=lightid: self.
|
|
|
|
|
delete_light_and_goto_group(mlightid),
|
|
|
|
|
delete_btn)
|
|
|
|
|
|
|
|
|
|
def delete_light_and_goto_group(self, lightid):
|
|
|
|
@ -278,7 +335,8 @@ class Hui(wx.Frame):
|
|
|
|
|
Args:
|
|
|
|
|
lightid (int): The light id of the light to delete
|
|
|
|
|
"""
|
|
|
|
|
if self.get_ok_cancel_answer_from_modal("Are you sure you want to delete this light?"):
|
|
|
|
|
if self.get_ok_cancel_answer_from_modal(
|
|
|
|
|
"Are you sure you want to delete this light?"):
|
|
|
|
|
light: HueLight = self.cur_bridge.get_light_by_id(lightid)
|
|
|
|
|
light.delete()
|
|
|
|
|
self.cur_bridge.remove_light(light)
|
|
|
|
@ -299,7 +357,9 @@ class Hui(wx.Frame):
|
|
|
|
|
user_or_error = HueUtils.connect(bridge['ipaddress'])
|
|
|
|
|
while user_or_error.is_error():
|
|
|
|
|
user_or_error = HueUtils.connect(bridge['ipaddress'])
|
|
|
|
|
self.m_tinge.append_bridge(HueBridge(bridge['ipaddress'], user_or_error.get_user(), bridge['name']))
|
|
|
|
|
self.m_tinge.append_bridge(
|
|
|
|
|
HueBridge(bridge['ipaddress'], user_or_error.get_user(),
|
|
|
|
|
bridge['name']))
|
|
|
|
|
found_any = True
|
|
|
|
|
self.m_tinge.write_all_bridges_to_conf()
|
|
|
|
|
self.add_bridges()
|
|
|
|
@ -317,10 +377,16 @@ class Hui(wx.Frame):
|
|
|
|
|
Returns:
|
|
|
|
|
bool: The response from the user
|
|
|
|
|
"""
|
|
|
|
|
with wx.MessageDialog(self.pnl, message, style=wx.OK | wx.CANCEL | wx.CANCEL_DEFAULT) as dlg:
|
|
|
|
|
with wx.MessageDialog(self.pnl,
|
|
|
|
|
message,
|
|
|
|
|
style=wx.OK | wx.CANCEL
|
|
|
|
|
| wx.CANCEL_DEFAULT) as dlg:
|
|
|
|
|
return dlg.ShowModal() == wx.ID_OK
|
|
|
|
|
|
|
|
|
|
def get_text_answer_from_modal(self, message: str, cap: str, val: str = "") -> str:
|
|
|
|
|
def get_text_answer_from_modal(self,
|
|
|
|
|
message: str,
|
|
|
|
|
cap: str,
|
|
|
|
|
val: str = "") -> str:
|
|
|
|
|
"""Display a text entry and return the content
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
@ -331,7 +397,8 @@ class Hui(wx.Frame):
|
|
|
|
|
Returns:
|
|
|
|
|
str: The response from the user
|
|
|
|
|
"""
|
|
|
|
|
with wx.TextEntryDialog(self.pnl, message, caption=cap, value=val) as dlg:
|
|
|
|
|
with wx.TextEntryDialog(self.pnl, message, caption=cap,
|
|
|
|
|
value=val) as dlg:
|
|
|
|
|
dlg.ShowModal()
|
|
|
|
|
answer: str = dlg.GetValue()
|
|
|
|
|
return answer
|
|
|
|
@ -365,7 +432,8 @@ class Hui(wx.Frame):
|
|
|
|
|
Args:
|
|
|
|
|
lightid ([type]): The light id of the light to rename/display
|
|
|
|
|
"""
|
|
|
|
|
newname: str = self.get_text_answer_from_modal("Set new name", "New name:")
|
|
|
|
|
newname: str = self.get_text_answer_from_modal("Set new name",
|
|
|
|
|
"New name:")
|
|
|
|
|
if newname:
|
|
|
|
|
self.cur_bridge.get_light_by_id(lightid).rename(newname)
|
|
|
|
|
self.add_single_light(lightid, unattached)
|
|
|
|
@ -432,7 +500,8 @@ class Hui(wx.Frame):
|
|
|
|
|
self.cur_bridge.get_light_by_id(lightid).toggle()
|
|
|
|
|
self.add_single_light(lightid)
|
|
|
|
|
|
|
|
|
|
def toggle_light_and_goto_group(self, lightid: int, lights: list[HueLight]):
|
|
|
|
|
def toggle_light_and_goto_group(self, lightid: int,
|
|
|
|
|
lights: list[HueLight]):
|
|
|
|
|
"""Combo call back for toggle and goto group
|
|
|
|
|
|
|
|
|
|
Args:
|
|
|
|
|