Implement proper text gauge alignment
This commit is contained in:
parent
1eb4724040
commit
61498c91a6
2 changed files with 66 additions and 68 deletions
|
@ -3,8 +3,9 @@ import cairo
|
|||
|
||||
from typing import Iterable, List
|
||||
|
||||
from hexagram.box import Align
|
||||
from hexagram.pattern import HexagonPattern
|
||||
from hexagram.gauge import Gauge
|
||||
from hexagram.gauge import Gauge, TextGauge
|
||||
from hexagram.dial import Dial
|
||||
from hexagram.speedo import Speedo
|
||||
from hexagram.tacho import Tacho
|
||||
|
@ -78,77 +79,29 @@ class ShiftIndicator(Gauge):
|
|||
for l in range(0, len(self.LIGHT_LEVELS)):
|
||||
self.draw_level(cr, level, l >= level)
|
||||
|
||||
class Odometer(Gauge):
|
||||
__slots__ = 'x', 'y',
|
||||
class Odometer(TextGauge):
|
||||
def __init__(self, x: float, y: float, align: Align):
|
||||
super().__init__(x, y, 0, 999999999, align)
|
||||
|
||||
def __init__(self, x: float, y: float):
|
||||
super().__init__(0, 999999999)
|
||||
def format_text(self):
|
||||
return "%d mi" % self.value
|
||||
|
||||
self.x = x
|
||||
self.y = y
|
||||
class AmbientTemp(TextGauge):
|
||||
def __init__(self, x: float, y: float, align: Align):
|
||||
super().__init__(x, y, -100, 100, align)
|
||||
|
||||
def draw_bg(self, cr: cairo.Context):
|
||||
pass
|
||||
def format_text(self):
|
||||
return "%.1f°C" % self.value
|
||||
|
||||
def draw_fg(self, cr: cairo.Context):
|
||||
cr.set_source_rgb(1, 1, 1)
|
||||
cr.select_font_face("Muli",
|
||||
cairo.FontSlant.NORMAL,
|
||||
cairo.FontWeight.BOLD)
|
||||
class Clock(TextGauge):
|
||||
def __init__(self, x: float, y: float, align: Align):
|
||||
super().__init__(x, y, 0, 9999, align)
|
||||
|
||||
cr.set_font_size(24)
|
||||
|
||||
cr.move_to(self.x, self.y)
|
||||
cr.show_text("%d mi" % self.value)
|
||||
|
||||
class AmbientTemp(Gauge):
|
||||
__slots__ = 'x', 'y',
|
||||
|
||||
def __init__(self, x: float, y: float):
|
||||
super().__init__(-100, 100)
|
||||
|
||||
self.x = x
|
||||
self.y = y
|
||||
|
||||
def draw_bg(self, cr: cairo.Context):
|
||||
pass
|
||||
|
||||
def draw_fg(self, cr: cairo.Context):
|
||||
cr.set_source_rgb(1, 1, 1)
|
||||
cr.select_font_face("Muli",
|
||||
cairo.FontSlant.NORMAL,
|
||||
cairo.FontWeight.BOLD)
|
||||
|
||||
cr.set_font_size(24)
|
||||
|
||||
cr.move_to(self.x, self.y)
|
||||
cr.show_text("%.1f°C" % self.value)
|
||||
|
||||
class Clock(Gauge):
|
||||
__slots__ = 'x', 'y',
|
||||
|
||||
def __init__(self, x: float, y: float):
|
||||
super().__init__(0, 9999)
|
||||
|
||||
self.x = x
|
||||
self.y = y
|
||||
|
||||
def draw_bg(self, cr: cairo.Context):
|
||||
pass
|
||||
|
||||
def draw_fg(self, cr: cairo.Context):
|
||||
cr.set_source_rgb(1, 1, 1)
|
||||
cr.select_font_face("Muli",
|
||||
cairo.FontSlant.NORMAL,
|
||||
cairo.FontWeight.BOLD)
|
||||
|
||||
cr.set_font_size(24)
|
||||
|
||||
cr.move_to(self.x, self.y)
|
||||
cr.show_text("%d:%02d" % (
|
||||
def format_text(self):
|
||||
return "%d:%02d" % (
|
||||
(self.value - (self.value % 60)) / 60,
|
||||
self.value % 60
|
||||
))
|
||||
)
|
||||
|
||||
class Cluster():
|
||||
__slots__ = 'gauges', 'speedo', 'fuel', 'tacho', 'thermo', 'odo', \
|
||||
|
@ -181,9 +134,9 @@ class Cluster():
|
|||
self.HEIGHT / 2,
|
||||
self.HEIGHT / 2)
|
||||
|
||||
self.odo = Odometer(0.8 * self.HEIGHT, self.HEIGHT - 16)
|
||||
self.ambient = AmbientTemp(self.WIDTH - self.HEIGHT, self.HEIGHT - 16)
|
||||
self.clock = Clock(self.WIDTH / 2 - 32, self.HEIGHT - 16)
|
||||
self.odo = Odometer(0.8 * self.HEIGHT, self.HEIGHT - 16, Align.LEFT)
|
||||
self.clock = Clock(self.WIDTH / 2, self.HEIGHT - 16, Align.MIDDLE)
|
||||
self.ambient = AmbientTemp(self.WIDTH - 0.8 * self.HEIGHT, self.HEIGHT - 16, Align.RIGHT)
|
||||
|
||||
self.gauges.append(self.speedo)
|
||||
self.gauges.append(self.fuel)
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
import cairo
|
||||
|
||||
from hexagram.box import Align
|
||||
|
||||
class Gauge():
|
||||
__slots__ = 'min_value', 'max_value', 'value',
|
||||
|
||||
|
@ -17,3 +19,46 @@ class Gauge():
|
|||
def draw_fg(self, cr: cairo.Context):
|
||||
raise NotImplementedError
|
||||
|
||||
class TextGauge(Gauge):
|
||||
__slots__ = 'x', 'y', 'align',
|
||||
|
||||
FONT_FACE = "Muli"
|
||||
FONT_SLANT = cairo.FontSlant.NORMAL
|
||||
FONT_WEIGHT = cairo.FontWeight.BOLD
|
||||
FONT_SIZE = 24
|
||||
|
||||
def __init__(self, x: float, y: float, min_value: float, max_value: float, align: Align=Align.LEFT):
|
||||
super().__init__(min_value, max_value)
|
||||
|
||||
self.x = x
|
||||
self.y = y
|
||||
self.align = align
|
||||
|
||||
def format_text(self) -> str:
|
||||
raise NotImplementedError
|
||||
|
||||
def draw_bg(self, cr: cairo.Context):
|
||||
pass
|
||||
|
||||
def draw_fg(self, cr: cairo.Context):
|
||||
cr.set_source_rgb(1, 1, 1)
|
||||
|
||||
cr.select_font_face(self.FONT_FACE,
|
||||
self.FONT_SLANT,
|
||||
self.FONT_WEIGHT)
|
||||
|
||||
text = self.format_text()
|
||||
|
||||
cr.set_font_size(self.FONT_SIZE)
|
||||
|
||||
extents = cr.text_extents(text)
|
||||
width = extents[2] - extents[0]
|
||||
|
||||
if self.align is Align.LEFT:
|
||||
cr.move_to(self.x, self.y)
|
||||
elif self.align is Align.MIDDLE:
|
||||
cr.move_to(self.x - width / 2, self.y)
|
||||
elif self.align is Align.RIGHT:
|
||||
cr.move_to(self.x - width, self.y)
|
||||
|
||||
cr.show_text(text)
|
||||
|
|
Loading…
Add table
Reference in a new issue