Add support for moving plan items.

This commit is contained in:
Matthew Stratford 2021-03-13 22:32:04 +00:00
parent 0c176bea03
commit 023200b94b
3 changed files with 35 additions and 4 deletions

View file

@ -28,6 +28,10 @@ class PlanItem:
def weight(self) -> int: def weight(self) -> int:
return self._weight return self._weight
@weight.setter
def weight(self, value: int):
self._weight = value
@property @property
def timeslotitemid(self) -> int: def timeslotitemid(self) -> int:
return self._timeslotitemid return self._timeslotitemid

View file

@ -232,6 +232,7 @@ class Player():
plan = self.api.get_showplan(message) plan = self.api.get_showplan(message)
self.clear_channel_plan() self.clear_channel_plan()
channel = self.state.state["channel"] channel = self.state.state["channel"]
self.logger.log.info(plan)
if len(plan) > channel: if len(plan) > channel:
for plan_item in plan[str(channel)]: for plan_item in plan[str(channel)]:
try: try:
@ -242,18 +243,37 @@ class Player():
return True return True
def add_to_plan(self, new_item: Dict[str, Any]) -> bool: def add_to_plan(self, new_item: Dict[str, Any]) -> bool:
self.state.update("show_plan", self.state.state["show_plan"] + [PlanItem(new_item)]) new_item_obj = PlanItem(new_item)
plan_copy: List[PlanItem] = copy.copy(self.state.state["show_plan"])
# Shift any plan items after the new position down one to make space.
for item in plan_copy:
if item.weight >= new_item_obj.weight:
item.weight += 1
plan_copy += [new_item_obj] # Add the new item.
def sort_weight(e: PlanItem):
return e.weight
plan_copy.sort(key=sort_weight) # Sort into weighted order.
self.state.update("show_plan", plan_copy)
return True return True
def remove_from_plan(self, weight: int) -> bool: def remove_from_plan(self, weight: int) -> bool:
plan_copy: List[PlanItem] = copy.copy(self.state.state["show_plan"]) plan_copy: List[PlanItem] = copy.copy(self.state.state["show_plan"])
found = False
for i in plan_copy: for i in plan_copy:
if i.weight == weight: if i.weight == weight:
plan_copy.remove(i) plan_copy.remove(i)
self.state.update("show_plan", plan_copy) found = True
return True elif i.weight > weight: # Shuffle up the weights of the items following the deleted one.
i.weight -= 1
if found:
self.state.update("show_plan", plan_copy)
return True
return False return False
def clear_channel_plan(self) -> bool: def clear_channel_plan(self) -> bool:

View file

@ -48,6 +48,13 @@ async def websocket_handler(websocket, path):
elif data["command"] == "REPEAT": elif data["command"] == "REPEAT":
channel_to_q[channel].put("REPEAT:" + str(data["mode"]).lower()) channel_to_q[channel].put("REPEAT:" + str(data["mode"]).lower())
elif data["command"] == "MOVE":
# Should we trust the client with the item info?
new_channel = int(data["new_channel"])
channel_to_q[channel].put("REMOVE:" + str(data["weight"]))
item = data["item"]
item["weight"] = int(data["new_weight"])
channel_to_q[new_channel].put("ADD:" + json.dumps(item))
elif data["command"] == "ADD": elif data["command"] == "ADD":
channel_to_q[channel].put("ADD:" + json.dumps(data["newItem"])) channel_to_q[channel].put("ADD:" + json.dumps(data["newItem"]))