Downscale fonts on scaled-down hidpi displays

status_bar
Tyler Goodlet 2021-06-04 11:29:12 -04:00
parent 193f4f945c
commit 62c456f8eb
1 changed files with 30 additions and 11 deletions

View File

@ -29,13 +29,15 @@ from ._exec import current_screen
log = get_logger(__name__)
_magic_inches = 0.0666 * (1 + 6/16)
# chart-wide fonts specified in inches
_font_sizes: Dict[str, Dict[str, float]] = {
'hi': {
# 'default': 0.0616,
'default': 0.0616 * 2,
'default': _magic_inches,
# 'small': 0.055,
'small': 6/66 * (1 + 6/16),
'small': 0.9 * _magic_inches,
},
'lo': {
'default': 6.5 / 64,
@ -45,6 +47,7 @@ _font_sizes: Dict[str, Dict[str, float]] = {
class DpiAwareFont:
def __init__(
self,
# TODO: move to config
@ -54,10 +57,10 @@ class DpiAwareFont:
) -> None:
self.name = name
self._qfont = QtGui.QFont(name)
# self._iwl = size_in_inches or _default_font_inches_we_like
self._font_size: str = font_size
self._qfm = QtGui.QFontMetrics(self._qfont)
self._physical_dpi = None
self._font_inches: float = None
self._screen = None
def _set_qfont_px_size(self, px_size: int) -> None:
@ -97,22 +100,30 @@ class DpiAwareFont:
# take the max since scaling can make things ugly in some cases
pdpi = screen.physicalDotsPerInch()
ldpi = screen.logicalDotsPerInch()
dpi = min(pdpi, ldpi)
mx_dpi = max(pdpi, ldpi)
scale = round(ldpi/pdpi)
# for low dpi scale everything down
if dpi <= 97:
if mx_dpi <= 97: # for low dpi use larger font sizes
inches = _font_sizes['lo'][self._font_size]
else:
else: # hidpi use smaller font sizes
inches = _font_sizes['hi'][self._font_size]
font_size = math.floor(inches * dpi)
# dpi is likely somewhat scaled down so use slightly larger font size
if scale > 1 and self._font_size:
# TODO: this denominator should probably be determined from
# relative aspect rations or something?
inches *= scale / 2.5
self._font_inches = inches
font_size = math.floor(inches * mx_dpi)
log.info(
f"\nscreen:{screen.name()} with pDPI: {pdpi}, lDPI: {ldpi}"
f"\nbest font size is {font_size} for min dpi {dpi}\n"
f"\nOur best guess font size is {font_size}\n"
)
# apply the size
self._set_qfont_px_size(font_size)
self._physical_dpi = dpi
def boundingRect(self, value: str) -> QtCore.QRectF:
@ -132,6 +143,14 @@ class DpiAwareFont:
# use inches size to be cross-resolution compatible?
_font = DpiAwareFont()
_font_small = DpiAwareFont(font_size='small')
def _config_fonts_to_screen() -> None:
global _font, _font_small
_font.configure_to_dpi()
_font_small.configure_to_dpi()
# TODO: re-compute font size when main widget switches screens?
# https://forum.qt.io/topic/54136/how-do-i-get-the-qscreen-my-widget-is-on-qapplication-desktop-screen-returns-a-qwidget-and-qobject_cast-qscreen-returns-null/3