Attempt to calculate font size by DPI
parent
23672fc22b
commit
751cca35e1
|
@ -36,7 +36,7 @@ from ..data import (
|
|||
maybe_open_shm_array,
|
||||
)
|
||||
from ..log import get_logger
|
||||
from ._exec import run_qtractor
|
||||
from ._exec import run_qtractor, current_screen
|
||||
from ._interaction import ChartView
|
||||
from .. import fsp
|
||||
|
||||
|
@ -233,7 +233,10 @@ class LinkedSplitCharts(QtGui.QWidget):
|
|||
cpw = ChartPlotWidget(
|
||||
array=array,
|
||||
parent=self.splitter,
|
||||
axisItems={'bottom': xaxis, 'right': PriceAxis()},
|
||||
axisItems={
|
||||
'bottom': xaxis,
|
||||
'right': PriceAxis(linked_charts=self)
|
||||
},
|
||||
viewBox=cv,
|
||||
cursor=self._ch,
|
||||
**cpw_kwargs,
|
||||
|
@ -688,6 +691,21 @@ async def _async_main(
|
|||
"""
|
||||
chart_app = widgets['main']
|
||||
|
||||
screen = current_screen()
|
||||
|
||||
from ._style import configure_font_to_dpi
|
||||
print(
|
||||
f'screen: {screen.name()} {screen.size()}')
|
||||
|
||||
configure_font_to_dpi(screen)
|
||||
|
||||
# from ._exec import get_screen
|
||||
# screen = get_screen(chart_app.geometry().bottomRight())
|
||||
|
||||
# XXX: bug zone if you try to ctl-c after this we get hangs again?
|
||||
# wtf...
|
||||
# await tractor.breakpoint()
|
||||
|
||||
# historical data fetch
|
||||
brokermod = brokers.get_brokermod(brokername)
|
||||
|
||||
|
|
|
@ -16,12 +16,22 @@ from PyQt5.QtCore import (
|
|||
pyqtRemoveInputHook, Qt, QCoreApplication
|
||||
)
|
||||
import qdarkstyle
|
||||
|
||||
import trio
|
||||
import tractor
|
||||
from outcome import Error
|
||||
|
||||
|
||||
# singleton app per actor
|
||||
_qt_app: QtGui.QApplication = None
|
||||
_qt_win: QtGui.QMainWindow = None
|
||||
|
||||
|
||||
def current_screen() -> QtGui.QScreen:
|
||||
|
||||
global _qt_win, _qt_app
|
||||
return _qt_app.screenAt(_qt_win.centralWidget().geometry().center())
|
||||
|
||||
|
||||
# Proper high DPI scaling is available in Qt >= 5.6.0. This attibute
|
||||
# must be set before creating the application
|
||||
if hasattr(Qt, 'AA_EnableHighDpiScaling'):
|
||||
|
@ -62,6 +72,10 @@ def run_qtractor(
|
|||
# currently seem tricky..
|
||||
app.setQuitOnLastWindowClosed(False)
|
||||
|
||||
# set global app singleton
|
||||
global _qt_app
|
||||
_qt_app = app
|
||||
|
||||
# This code is from Nathaniel, and I quote:
|
||||
# "This is substantially faster than using a signal... for some
|
||||
# reason Qt signal dispatch is really slow (and relies on events
|
||||
|
@ -84,10 +98,13 @@ def run_qtractor(
|
|||
app.postEvent(reenter, event)
|
||||
|
||||
def done_callback(outcome):
|
||||
|
||||
print(f"Outcome: {outcome}")
|
||||
|
||||
if isinstance(outcome, Error):
|
||||
exc = outcome.error
|
||||
traceback.print_exception(type(exc), exc, exc.__traceback__)
|
||||
|
||||
app.quit()
|
||||
|
||||
# load dark theme
|
||||
|
@ -125,6 +142,12 @@ def run_qtractor(
|
|||
|
||||
window.main_widget = main_widget
|
||||
window.setCentralWidget(instance)
|
||||
|
||||
# store global ref
|
||||
# set global app singleton
|
||||
global _qt_win
|
||||
_qt_win = window
|
||||
|
||||
# actually render to screen
|
||||
window.show()
|
||||
app.exec_()
|
||||
|
|
|
@ -5,19 +5,54 @@ import pyqtgraph as pg
|
|||
from PyQt5 import QtGui
|
||||
from qdarkstyle.palette import DarkPalette
|
||||
|
||||
from ..log import get_logger
|
||||
|
||||
log = get_logger(__name__)
|
||||
|
||||
# chart-wide font
|
||||
_font = QtGui.QFont("Hack")
|
||||
# font size 6px / 53 dpi (3x scaled down on 4k hidpi)
|
||||
_font_inches_we_like = 6 / 53
|
||||
|
||||
# use pixel size to be cross-resolution compatible?
|
||||
_font.setPixelSize(6)
|
||||
_font = QtGui.QFont("Hack")
|
||||
_font.setPixelSize(6) # default
|
||||
|
||||
# TODO: use QScreen to determine the same physical font size
|
||||
# on screen despite different displays?
|
||||
# PyQt docs: https://doc.qt.io/qtforpython/PySide2/QtGui/QScreen.html
|
||||
# - supposedly it's ``from QtGui import QScreen``
|
||||
# Qt forums: https://forum.qt.io/topic/43625/point-sizes-are-they-reliable/4
|
||||
# _physical_font_height_in = 1/6 # inches
|
||||
_font._fm = QtGui.QFontMetrics(_font)
|
||||
|
||||
_i3_rgba = QtGui.QColor.fromRgbF(*[0.14]*3 + [1])
|
||||
# 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
|
||||
|
||||
|
||||
def configure_font_to_dpi(screen: QtGui.QScreen):
|
||||
"""Set an appropriately sized font size depending on the screen DPI.
|
||||
|
||||
If we end up needing to generalize this more here are some resources:
|
||||
|
||||
- https://stackoverflow.com/questions/42141354/convert-pixel-size-to-point-size-for-fonts-on-multiple-platforms
|
||||
- https://stackoverflow.com/questions/25761556/qt5-font-rendering-different-on-various-platforms/25929628#25929628
|
||||
- https://doc.qt.io/qt-5/highdpi.html
|
||||
- https://stackoverflow.com/questions/20464814/changing-dpi-scaling-size-of-display-make-qt-applications-font-size-get-rendere
|
||||
- https://stackoverflow.com/a/20465247
|
||||
- https://doc.qt.io/archives/qt-4.8/qfontmetrics.html#width
|
||||
- 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
|
||||
- https://forum.qt.io/topic/43625/point-sizes-are-they-reliable/4
|
||||
|
||||
Also, see the script in ``snippets/qt_screen_info.py``.
|
||||
|
||||
"""
|
||||
dpi = screen.physicalDotsPerInch()
|
||||
font_size = round(_font_inches_we_like * dpi)
|
||||
log.info(
|
||||
f"\nscreen:{screen.name()} with DPI: {dpi}"
|
||||
f"\nbest font size is {font_size}\n"
|
||||
)
|
||||
global _font
|
||||
_font.setPixelSize(font_size)
|
||||
return _font
|
||||
|
||||
|
||||
# _i3_rgba = QtGui.QColor.fromRgbF(*[0.14]*3 + [1])
|
||||
|
||||
# splitter widget config
|
||||
_xaxis_at = 'bottom'
|
||||
|
|
Loading…
Reference in New Issue