Poor scaling of GUI on high resolution displays
Ubuntu 14.04 (xfce), GIT commit: 0f5bd23
High resolution displays are becoming more common, but unfortunately, OS and Qt support for them is still erratic, and as a result, MuseScore often does not work as well as it could. More unfortunately, the specific problems are OS-specific.
On a Mac with retina display, apparently OS X handles a good amount of the scaling issues for you by defining most things to use "device independent" pixels that are fixed to 96 DPI (I think) - thus allowing applications to continue to specify sizes in absolute sizes and the OS scales it for you. In MuseScore, this works for everything except the palette labels and the "Concert Pitch" toolbar button. I'm not sure if we understand why. Text within QToolButtons is not scaled automatically, I guess?
For my system running Linux with xfce4, the situation is somewhat different. There is an OS option to scale text, but it pretty much only applies to text, so you end up with applications that have readable text but tiny buttons. So the best solution I know is to increase the system text size (which generally affects default the basic size of menus & dialogs in application) and then hope the application provides enough controls to scale other things.
Right now in MuseScore, here is what a current build looks like on my monitor when run with all default settings:
I can't say how that will look for you, but on my 13" monitor, the menus and palette labels are fine, but the toolbar icons, score, palette contents, and MuseScore Connect are tiny. The problem isn't that my monitor is small; it's that it is fairly high resolution (166 DPI rather than the more standard ~96 DPI).
MuseScore provides preferences to select toolbar icon size and default zoom level for the score window, which partially addresses the issue. But palettes and a few other elements are still tiny on high resolution displays because they are set in absolute point sizes. You can increase palette sizes manually, but that has to be done for each palette one at a time, and needs to be done separately for the magnification and for the cell size.
It seems the software world is only slowly catching up to the hardware world in support for high resolution displays. I have no doubt that at some point, OS and Qt support will be such that we won't need hacks but will instead be able to just do some simple initialization up front. Qt 5.4 provides some guidelines here:
However, I have my doubts about whether QT_DEVICE_PIXEL_RATIO will work for us (it's labeled experimental, we don't use the Fusion style, and it's not like this scaling works perfectly for MacOS / retina as it is). So I think we will need to take some initiative here.
Not having a Mac to test on, I will leave it to someone else to see about solving the text-within-QToolButton issue. Could be a matter of mutiplying the specified font size by QWIndow::devicePixelRatio(), which is 2 for Retina, 1 for everything else. And never having seen a Windows machine with a high resolution display I have no idea what issues we may or may not have,
For Linux - or at least Ubuntu with xfce - a straightforward solution is to implement a command line option to scale the display of elements that are specified in absolute values. I have implemented this and it works well for me. Whether it will work for some other system I cannot say. But here is how it looks on my system if I specify "-x 1.5":
To my eyes, on my high resolution 13" monitor, this looks like how I'd want it to look in comparison to how it looks on my other machines with larger but lower resolution displays.
The long term option recommended in the Qt 5.4 guidelines is to rewrite the portions of the code that use absolute sizes and instead choose values based on screen size. Really, though, that amounts to another way of looking at the same thing. And I might not *want* my icons and score as physically big on my (higher resolution) 13" as they are on my (lower resolution) 17" monitor - it would mean I can't fit a full page on screen. So even if we provide an automatic way of setting this default, I think I prefer to be able to set the scaling manually.