Attempt to calculate font size by DPI
parent
23672fc22b
commit
751cca35e1
|
@ -36,7 +36,7 @@ from ..data import (
|
||||||
maybe_open_shm_array,
|
maybe_open_shm_array,
|
||||||
)
|
)
|
||||||
from ..log import get_logger
|
from ..log import get_logger
|
||||||
from ._exec import run_qtractor
|
from ._exec import run_qtractor, current_screen
|
||||||
from ._interaction import ChartView
|
from ._interaction import ChartView
|
||||||
from .. import fsp
|
from .. import fsp
|
||||||
|
|
||||||
|
@ -233,7 +233,10 @@ class LinkedSplitCharts(QtGui.QWidget):
|
||||||
cpw = ChartPlotWidget(
|
cpw = ChartPlotWidget(
|
||||||
array=array,
|
array=array,
|
||||||
parent=self.splitter,
|
parent=self.splitter,
|
||||||
axisItems={'bottom': xaxis, 'right': PriceAxis()},
|
axisItems={
|
||||||
|
'bottom': xaxis,
|
||||||
|
'right': PriceAxis(linked_charts=self)
|
||||||
|
},
|
||||||
viewBox=cv,
|
viewBox=cv,
|
||||||
cursor=self._ch,
|
cursor=self._ch,
|
||||||
**cpw_kwargs,
|
**cpw_kwargs,
|
||||||
|
@ -688,6 +691,21 @@ async def _async_main(
|
||||||
"""
|
"""
|
||||||
chart_app = widgets['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
|
# historical data fetch
|
||||||
brokermod = brokers.get_brokermod(brokername)
|
brokermod = brokers.get_brokermod(brokername)
|
||||||
|
|
||||||
|
|
|
@ -16,12 +16,22 @@ from PyQt5.QtCore import (
|
||||||
pyqtRemoveInputHook, Qt, QCoreApplication
|
pyqtRemoveInputHook, Qt, QCoreApplication
|
||||||
)
|
)
|
||||||
import qdarkstyle
|
import qdarkstyle
|
||||||
|
|
||||||
import trio
|
import trio
|
||||||
import tractor
|
import tractor
|
||||||
from outcome import Error
|
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
|
# Proper high DPI scaling is available in Qt >= 5.6.0. This attibute
|
||||||
# must be set before creating the application
|
# must be set before creating the application
|
||||||
if hasattr(Qt, 'AA_EnableHighDpiScaling'):
|
if hasattr(Qt, 'AA_EnableHighDpiScaling'):
|
||||||
|
@ -62,6 +72,10 @@ def run_qtractor(
|
||||||
# currently seem tricky..
|
# currently seem tricky..
|
||||||
app.setQuitOnLastWindowClosed(False)
|
app.setQuitOnLastWindowClosed(False)
|
||||||
|
|
||||||
|
# set global app singleton
|
||||||
|
global _qt_app
|
||||||
|
_qt_app = app
|
||||||
|
|
||||||
# This code is from Nathaniel, and I quote:
|
# This code is from Nathaniel, and I quote:
|
||||||
# "This is substantially faster than using a signal... for some
|
# "This is substantially faster than using a signal... for some
|
||||||
# reason Qt signal dispatch is really slow (and relies on events
|
# reason Qt signal dispatch is really slow (and relies on events
|
||||||
|
@ -84,10 +98,13 @@ def run_qtractor(
|
||||||
app.postEvent(reenter, event)
|
app.postEvent(reenter, event)
|
||||||
|
|
||||||
def done_callback(outcome):
|
def done_callback(outcome):
|
||||||
|
|
||||||
print(f"Outcome: {outcome}")
|
print(f"Outcome: {outcome}")
|
||||||
|
|
||||||
if isinstance(outcome, Error):
|
if isinstance(outcome, Error):
|
||||||
exc = outcome.error
|
exc = outcome.error
|
||||||
traceback.print_exception(type(exc), exc, exc.__traceback__)
|
traceback.print_exception(type(exc), exc, exc.__traceback__)
|
||||||
|
|
||||||
app.quit()
|
app.quit()
|
||||||
|
|
||||||
# load dark theme
|
# load dark theme
|
||||||
|
@ -125,6 +142,12 @@ def run_qtractor(
|
||||||
|
|
||||||
window.main_widget = main_widget
|
window.main_widget = main_widget
|
||||||
window.setCentralWidget(instance)
|
window.setCentralWidget(instance)
|
||||||
|
|
||||||
|
# store global ref
|
||||||
|
# set global app singleton
|
||||||
|
global _qt_win
|
||||||
|
_qt_win = window
|
||||||
|
|
||||||
# actually render to screen
|
# actually render to screen
|
||||||
window.show()
|
window.show()
|
||||||
app.exec_()
|
app.exec_()
|
||||||
|
|
|
@ -5,19 +5,54 @@ import pyqtgraph as pg
|
||||||
from PyQt5 import QtGui
|
from PyQt5 import QtGui
|
||||||
from qdarkstyle.palette import DarkPalette
|
from qdarkstyle.palette import DarkPalette
|
||||||
|
|
||||||
|
from ..log import get_logger
|
||||||
|
|
||||||
|
log = get_logger(__name__)
|
||||||
|
|
||||||
# chart-wide font
|
# 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?
|
# 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
|
# _physical_font_height_in = 1/6 # inches
|
||||||
# on screen despite different displays?
|
_font._fm = QtGui.QFontMetrics(_font)
|
||||||
# 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
|
|
||||||
|
|
||||||
_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
|
# splitter widget config
|
||||||
_xaxis_at = 'bottom'
|
_xaxis_at = 'bottom'
|
||||||
|
|
Loading…
Reference in New Issue