Base anchor contents labels based on dpi-aware font bounding rect
parent
3f7d9c5c15
commit
54d36f26f0
|
@ -18,6 +18,7 @@
|
||||||
Mouse interaction graphics
|
Mouse interaction graphics
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
import math
|
||||||
from typing import Optional, Tuple, Set, Dict
|
from typing import Optional, Tuple, Set, Dict
|
||||||
|
|
||||||
import inspect
|
import inspect
|
||||||
|
@ -113,10 +114,6 @@ class LineDot(pg.CurvePoint):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
# TODO: likely will need to tweak this based on dpi...
|
|
||||||
_y_margin = 5
|
|
||||||
|
|
||||||
|
|
||||||
# TODO: change this into our own ``Label``
|
# TODO: change this into our own ``Label``
|
||||||
class ContentsLabel(pg.LabelItem):
|
class ContentsLabel(pg.LabelItem):
|
||||||
"""Label anchored to a ``ViewBox`` typically for displaying
|
"""Label anchored to a ``ViewBox`` typically for displaying
|
||||||
|
@ -132,11 +129,11 @@ class ContentsLabel(pg.LabelItem):
|
||||||
|
|
||||||
# XXX: fyi naming here is confusing / opposite to coords
|
# XXX: fyi naming here is confusing / opposite to coords
|
||||||
_corner_margins = {
|
_corner_margins = {
|
||||||
('top', 'left'): (-4, -_y_margin),
|
('top', 'left'): (-2, lambda font_size: -font_size*0.25),
|
||||||
('top', 'right'): (4, -_y_margin),
|
('top', 'right'): (2, lambda font_size: -font_size*0.25),
|
||||||
|
|
||||||
('bottom', 'left'): (-4, lambda font_size: font_size + 2*_y_margin),
|
('bottom', 'left'): (-2, lambda font_size: font_size),
|
||||||
('bottom', 'right'): (4, lambda font_size: font_size + 2*_y_margin),
|
('bottom', 'right'): (2, lambda font_size: font_size),
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
|
@ -147,11 +144,21 @@ class ContentsLabel(pg.LabelItem):
|
||||||
font_size: Optional[int] = None,
|
font_size: Optional[int] = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
font_size = font_size or _font.font.pixelSize()
|
font_size = font_size or _font.font.pixelSize()
|
||||||
|
|
||||||
super().__init__(
|
super().__init__(
|
||||||
justify=justify_text,
|
justify=justify_text,
|
||||||
size=f'{str(font_size)}px'
|
size=f'{str(font_size)}px'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if _font._physical_dpi >= 97:
|
||||||
|
# ad-hoc scale it based on boundingRect
|
||||||
|
# TODO: need proper fix for this?
|
||||||
|
typical_br = _font._qfm.boundingRect('Qyp')
|
||||||
|
anchor_font_size = math.ceil(typical_br.height() * 1.25)
|
||||||
|
|
||||||
|
else:
|
||||||
|
anchor_font_size = font_size
|
||||||
|
|
||||||
# anchor to viewbox
|
# anchor to viewbox
|
||||||
self.setParentItem(chart._vb)
|
self.setParentItem(chart._vb)
|
||||||
chart.scene().addItem(self)
|
chart.scene().addItem(self)
|
||||||
|
@ -163,7 +170,9 @@ class ContentsLabel(pg.LabelItem):
|
||||||
|
|
||||||
ydim = margins[1]
|
ydim = margins[1]
|
||||||
if inspect.isfunction(margins[1]):
|
if inspect.isfunction(margins[1]):
|
||||||
margins = margins[0], ydim(font_size)
|
margins = margins[0], ydim(anchor_font_size)
|
||||||
|
|
||||||
|
print(f'margins: {margins}')
|
||||||
|
|
||||||
self.anchor(itemPos=index, parentPos=index, offset=margins)
|
self.anchor(itemPos=index, parentPos=index, offset=margins)
|
||||||
|
|
||||||
|
@ -385,13 +394,12 @@ class Cursor(pg.GraphicsObject):
|
||||||
|
|
||||||
if self._y_label_update:
|
if self._y_label_update:
|
||||||
self.graphics[self.active_plot]['yl'].update_label(
|
self.graphics[self.active_plot]['yl'].update_label(
|
||||||
abs_pos=plot.mapFromView(QPointF(ix, iy + line_offset)),
|
abs_pos=plot.mapFromView(QPointF(ix, iy)),
|
||||||
value=iy
|
value=iy
|
||||||
)
|
)
|
||||||
|
|
||||||
# only update horizontal xhair line if label is enabled
|
# only update horizontal xhair line if label is enabled
|
||||||
self.graphics[plot]['hl'].setY(iy + line_offset)
|
self.graphics[plot]['hl'].setY(iy)
|
||||||
|
|
||||||
|
|
||||||
# update all trackers
|
# update all trackers
|
||||||
for item in self._trackers:
|
for item in self._trackers:
|
||||||
|
|
Loading…
Reference in New Issue