Only redraw status icons if necessary
This commit is contained in:
parent
430758ffb9
commit
0dbb119bc6
1 changed files with 40 additions and 16 deletions
|
@ -99,7 +99,7 @@ class StatusIcon():
|
|||
cr.fill()
|
||||
|
||||
class StatusIconBox(Gauge):
|
||||
__slots__ = 'x', 'y', 'width', 'height', 'icons', 'value',
|
||||
__slots__ = 'x', 'y', 'width', 'height', 'value', 'surface', 'icons', '_redraw'
|
||||
|
||||
__icons__ = (
|
||||
(VehicleStatus.BATTERY_FAULT, 'battery', '#f00', '#rect5, #rect6 {fill: %(s)s} #rect4, path {stroke: %(s)s}'),
|
||||
|
@ -133,6 +133,9 @@ class StatusIconBox(Gauge):
|
|||
self.width = width
|
||||
self.height = height
|
||||
self.value = VehicleStatus.OK.value
|
||||
self.surface = cairo.ImageSurface(cairo.FORMAT_ARGB32,int(width), int(height))
|
||||
self._redraw = False
|
||||
|
||||
self.icons: dict[int, StatusIcon] = dict()
|
||||
|
||||
for item in self.__icons__:
|
||||
|
@ -144,19 +147,19 @@ class StatusIconBox(Gauge):
|
|||
self.ICON_HEIGHT,
|
||||
color, style)
|
||||
|
||||
def reset(self):
|
||||
self.value = VehicleStatus.OK.value
|
||||
|
||||
def set_status(self, status: VehicleStatus):
|
||||
self.value |= status.value
|
||||
|
||||
def clear_status(self, status: VehicleStatus):
|
||||
self.value &= ~status.value
|
||||
def __del__(self):
|
||||
self.surface.finish()
|
||||
|
||||
def draw_bg(self, cr: cairo.Context):
|
||||
pass
|
||||
|
||||
def draw_fg(self, cr: cairo.Context):
|
||||
def _update_surface(self):
|
||||
cr = cairo.Context(self.surface)
|
||||
cr.set_source_rgba(0, 0, 0, 0)
|
||||
cr.set_operator(cairo.OPERATOR_SOURCE)
|
||||
cr.rectangle(0, 0, self.width, self.height)
|
||||
cr.fill()
|
||||
|
||||
x, y = 0, self.height - self.ICON_HEIGHT
|
||||
|
||||
for status_value in self.icons:
|
||||
|
@ -164,10 +167,31 @@ class StatusIconBox(Gauge):
|
|||
|
||||
if self.value & status_value:
|
||||
if icon is not None:
|
||||
icon.draw(cr, self.x + x, self.y + y)
|
||||
icon.draw(cr, x, y)
|
||||
|
||||
x += self.ICON_WIDTH
|
||||
|
||||
if x >= self.width:
|
||||
x = 0
|
||||
y -= self.ICON_HEIGHT
|
||||
|
||||
def draw_fg(self, cr: cairo.Context):
|
||||
if self._redraw:
|
||||
self._update_surface()
|
||||
self._redraw = False
|
||||
|
||||
cr.set_source_surface(self.surface, self.x, self.y)
|
||||
cr.rectangle(self.x, self.y, self.width, self.height)
|
||||
cr.fill()
|
||||
|
||||
def reset(self):
|
||||
self.value = VehicleStatus.OK.value
|
||||
self._redraw = True
|
||||
|
||||
def set_status(self, status: VehicleStatus):
|
||||
self.value |= status.value
|
||||
self._redraw = True
|
||||
|
||||
def clear_status(self, status: VehicleStatus):
|
||||
self.value &= ~status.value
|
||||
self._redraw = True
|
||||
|
|
Loading…
Add table
Reference in a new issue