obscreen/src/model/entity/Variable.py

193 lines
5.5 KiB
Python

import json
import time
from typing import Optional, Union, Dict, List
from src.model.enum.VariableType import VariableType
from src.model.enum.VariableUnit import VariableUnit
from src.model.entity.Selectable import Selectable
from src.utils import str_to_enum
class Variable:
def __init__(self, name: str = '', section: str = '', description: str = '', type: Union[VariableType, str] = VariableType.STRING,
value: Union[int, bool, str] = '', editable: bool = True, id: Optional[str] = None,
plugin: Optional[str] = None, selectables: Optional[List[Selectable]] = None, unit: Optional[VariableUnit] = None,
refresh_player: bool = False):
self._id = id if id else None
self._name = name
self._section = section
self._type = str_to_enum(type, VariableType) if isinstance(type, str) else type
self._unit = str_to_enum(unit, VariableUnit) if isinstance(unit, str) else unit
self._description = description
self._value = value
self._editable = editable
self._plugin = plugin
self._refresh_player = refresh_player
self._selectables = selectables
@property
def id(self) -> Union[int, str]:
return self._id
@property
def selectables(self) -> List[Selectable]:
return self._selectables
@selectables.setter
def selectables(self, value: List[Selectable]):
self._selectables = value
def add_selectable(self, value: Selectable):
self._selectables.append(value)
@property
def name(self) -> str:
return self._name
@name.setter
def name(self, value: str):
self._name = value
@property
def section(self) -> str:
return self._section
@section.setter
def section(self, value: str):
self._section = value
@property
def type(self) -> VariableType:
return self._type
@type.setter
def type(self, value: VariableType):
self._type = value
@property
def unit(self) -> VariableUnit:
return self._unit
@unit.setter
def unit(self, value: VariableUnit):
self._unit = value
@property
def description(self) -> str:
return self._description
@description.setter
def description(self, value: str):
self._description = value
@property
def editable(self) -> bool:
return self._editable
@editable.setter
def editable(self, value: bool):
self._editable = value
@property
def refresh_player(self) -> bool:
return self._refresh_player
@refresh_player.setter
def refresh_player(self, value: bool):
self._refresh_player = value
@property
def value(self) -> Union[int, bool, str]:
return self._value
@value.setter
def value(self, value: Union[int, bool, str]):
self._value = value
@property
def plugin(self) -> Optional[str]:
return self._plugin
@plugin.setter
def plugin(self, value: Optional[str]):
self._plugin = value
def __str__(self) -> str:
return f"Variable(" \
f"id='{self.id}',\n" \
f"name='{self.name}',\n" \
f"section='{self.section}',\n" \
f"value='{self.value}',\n" \
f"type='{self.type}',\n" \
f"unit='{self.unit}',\n" \
f"description='{self.description}',\n" \
f"editable='{self.editable}',\n" \
f"refresh_player='{self.refresh_player}',\n" \
f"plugin='{self.plugin}',\n" \
f"selectables='{self.selectables}',\n" \
f")"
def to_json(self) -> str:
return json.dumps(self.to_dict())
def to_dict(self) -> dict:
return {
"id": self.id,
"name": self.name,
"section": self.section,
"value": self.value,
"type": self.type.value,
"unit": self.unit.value if self.unit else None,
"description": self.description,
"editable": self.editable,
"refresh_player": self.refresh_player,
"plugin": self.plugin,
"selectables": [selectable.to_dict() for selectable in self.selectables] if isinstance(self._selectables, list) else None
}
def as_bool(self) -> bool:
return bool(int(self._value))
def as_string(self) -> str:
return str(self._value)
def as_int(self) -> int:
return int(self._value)
def as_ctime(self) -> int:
return time.ctime(self._value)
def display(self) -> Union[int, bool, str]:
value = self.eval()
if self.type == VariableType.SELECT_SINGLE:
if isinstance(self._selectables, list):
for selectable in self.selectables:
if selectable.key == value:
value = str(selectable.label)
break
if self.unit == VariableUnit.BYTE:
value = "{} {}".format(
value / 1024 / 1024,
"MB"
)
elif self.unit == VariableUnit.SECOND:
value = "{}{}".format(value, "s")
return value
def eval(self) -> Union[int, bool, str]:
if self.type == VariableType.INT:
return self.as_int()
elif self.type == VariableType.BOOL:
return self.as_bool()
elif self.type == VariableType.TIMESTAMP:
return self.as_ctime()
return self.as_string()
def is_from_plugin(self) -> Optional[str]:
return self.plugin