[hidpi] Auto-scale cursors based on DPIs

This should work well on different DPI screens.

Still needs some testing on the various platforms.
This commit is contained in:
Alessandro Pasotti 2017-11-27 15:37:50 +01:00
parent 7ae8e16427
commit 346ab6099c
4 changed files with 22 additions and 17 deletions

View File

@ -27,25 +27,27 @@
guidetolerance="10" guidetolerance="10"
inkscape:pageopacity="0" inkscape:pageopacity="0"
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:window-width="1071" inkscape:window-width="2880"
inkscape:window-height="548" inkscape:window-height="1678"
id="namedview11" id="namedview11"
showgrid="false" showgrid="false"
inkscape:zoom="2.36" inkscape:zoom="2.36"
inkscape:cx="49.576271" inkscape:cx="49.152542"
inkscape:cy="50" inkscape:cy="83.898305"
inkscape:window-x="1188" inkscape:window-x="0"
inkscape:window-y="1073" inkscape:window-y="0"
inkscape:window-maximized="0" inkscape:window-maximized="1"
inkscape:current-layer="Layer_1" /><g inkscape:current-layer="Layer_1" /><g
id="g3"><g id="g3"
transform="matrix(1.1318275,0,0,1.1177011,-6.1676779,-5.6731926)"><g
id="g5"><path id="g5"><path
d="m91.645 8.355c-4.474-4.474-11.727-4.474-16.2 0l-13.5 13.501-3.727-3.727c-1.959-1.959-5.134-1.959-7.093 0s-1.959 5.134 0 7.093l3.727 3.727-41.51 41.508c-2.039 2.039-3.149 4.656-3.329 7.324-0.073 1.087-0.347 3.105-0.675 5.292-0.053 0.359-0.212 0.706-0.487 0.983l-3.105 3.106c-0.994 0.994-0.994 2.606 0 3.6l3.493 3.493c0.994 0.994 2.606 0.994 3.6 0l3.106-3.105c0.277-0.275 0.622-0.433 0.981-0.486 2.187-0.329 4.205-0.602 5.293-0.675 2.668-0.18 5.285-1.29 7.325-3.33l41.508-41.508 3.727 3.727c1.959 1.959 5.134 1.959 7.093 0s1.959-5.134 0-7.093l-12.365-12.366 9.697 7.577 12.44-12.441c4.475-4.473 4.474-11.726 0.001-16.2zm-26.594 34.394l-20.53 20.53c-0.994 0.994-2.606 0.994-3.6 0l-3.27-3.27c-0.994-0.993-2.605-0.993-3.599 0.001l-0.616 0.616-0.002-0.002-14.728 14.727c-0.337 0.337-0.819 0.401-1.076 0.143s-0.194-0.74 0.143-1.076l23.841-23.841 0.004 0.004 15.633-15.633c0.994-0.994 2.606-0.994 3.6 0l4.2 4.201c0.994 0.994 0.994 2.606 0 3.6z" d="m 91.645,8.355 c -4.474,-4.474 -11.727,-4.474 -16.2,0 l -13.5,13.501 -3.727,-3.727 c -1.959,-1.959 -5.134,-1.959 -7.093,0 -1.959,1.959 -1.959,5.134 0,7.093 l 3.727,3.727 -41.51,41.508 c -2.039,2.039 -3.149,4.656 -3.329,7.324 -0.073,1.087 -0.347,3.105 -0.675,5.292 -0.053,0.359 -0.212,0.706 -0.487,0.983 l -3.105,3.106 c -0.994,0.994 -0.994,2.606 0,3.6 l 3.493,3.493 c 0.994,0.994 2.606,0.994 3.6,0 l 3.106,-3.105 c 0.277,-0.275 0.622,-0.433 0.981,-0.486 2.187,-0.329 4.205,-0.602 5.293,-0.675 2.668,-0.18 5.285,-1.29 7.325,-3.33 l 41.508,-41.508 3.727,3.727 c 1.959,1.959 5.134,1.959 7.093,0 1.959,-1.959 1.959,-5.134 0,-7.093 l -12.365,-12.366 9.697,7.577 12.44,-12.441 c 4.475,-4.473 4.474,-11.726 10e-4,-16.2 z m -26.594,34.394 -20.53,20.53 c -0.994,0.994 -2.606,0.994 -3.6,0 l -3.27,-3.27 c -0.994,-0.993 -2.605,-0.993 -3.599,10e-4 l -0.616,0.616 -0.002,-0.002 -14.728,14.727 c -0.337,0.337 -0.819,0.401 -1.076,0.143 -0.257,-0.258 -0.194,-0.74 0.143,-1.076 l 23.841,-23.841 0.004,0.004 15.633,-15.633 c 0.994,-0.994 2.606,-0.994 3.6,0 l 4.2,4.201 c 0.994,0.994 0.994,2.606 0,3.6 z"
id="path7" /></g></g><metadata id="path7"
inkscape:connector-curvature="0" /></g></g><metadata
id="metadata9"><rdf:RDF><cc:Work><dc:format>image/svg+xml</dc:format><dc:type id="metadata9"><rdf:RDF><cc:Work><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><cc:license rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><cc:license
rdf:resource="http://creativecommons.org/licenses/publicdomain/" /><dc:publisher><cc:Agent rdf:resource="http://creativecommons.org/licenses/publicdomain/" /><dc:publisher><cc:Agent
rdf:about="http://openclipart.org/"><dc:title>Openclipart</dc:title></cc:Agent></dc:publisher><dc:title></dc:title></cc:Work><cc:License rdf:about="http://openclipart.org/"><dc:title>Openclipart</dc:title></cc:Agent></dc:publisher><dc:title /></cc:Work><cc:License
rdf:about="http://creativecommons.org/licenses/publicdomain/"><cc:permits rdf:about="http://creativecommons.org/licenses/publicdomain/"><cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" /><cc:permits rdf:resource="http://creativecommons.org/ns#Reproduction" /><cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" /><cc:permits rdf:resource="http://creativecommons.org/ns#Distribution" /><cc:permits

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -360,6 +360,8 @@ Returns the path to the default theme directory.
%Docstring %Docstring
Helper to get a theme cursor. It will fall back to the Helper to get a theme cursor. It will fall back to the
default theme if the active theme does not have the required icon. default theme if the active theme does not have the required icon.
Cursors are automatically scaled to look like a 16px cursor on 96dpi
screens.
:rtype: QCursor :rtype: QCursor
%End %End

View File

@ -487,10 +487,7 @@ QCursor QgsApplication::getThemeCursor( const Cursor &cursor )
if ( app && app->mCursorCache.contains( cursor ) ) if ( app && app->mCursorCache.contains( cursor ) )
return app->mCursorCache.value( cursor ); return app->mCursorCache.value( cursor );
// Cursor are supposed to be 32x32 as it seems to be the // All calculations are done on 32x32 icons
// most cross-platform size
// If we want to make this size user-configurable or make
// a better guess: we might use fontMetrics
// Defaults to center, individual cursors may override // Defaults to center, individual cursors may override
int activeX = 16; int activeX = 16;
int activeY = 16; int activeY = 16;
@ -520,7 +517,7 @@ QCursor QgsApplication::getThemeCursor( const Cursor &cursor )
break; break;
case Sampler: case Sampler:
activeX = 0; activeX = 0;
activeY = 0; activeY = 32;
name = QStringLiteral( "mSampler.svg" ); name = QStringLiteral( "mSampler.svg" );
break; break;
// No default // No default
@ -533,7 +530,9 @@ QCursor QgsApplication::getThemeCursor( const Cursor &cursor )
// Check if an icon exists for this cursor (the O.S. default cursor will be used if it does not) // Check if an icon exists for this cursor (the O.S. default cursor will be used if it does not)
if ( ! icon.isNull( ) ) if ( ! icon.isNull( ) )
{ {
_cursor = QCursor( icon.pixmap( 32, 32 ), activeX, activeY ); // Apply scaling
float scale( ( float ) app->fontMetrics().height() / 32 );
_cursor = QCursor( icon.pixmap( std::ceil( scale * 32 ), std::ceil( scale * 32 ) ), std::ceil( scale * activeX ), std::ceil( scale * activeY ) );
} }
if ( app ) if ( app )
app->mCursorCache.insert( cursor, _cursor ); app->mCursorCache.insert( cursor, _cursor );

View File

@ -329,6 +329,8 @@ class CORE_EXPORT QgsApplication : public QApplication
/** /**
* Helper to get a theme cursor. It will fall back to the * Helper to get a theme cursor. It will fall back to the
* default theme if the active theme does not have the required icon. * default theme if the active theme does not have the required icon.
* Cursors are automatically scaled to look like a 16px cursor on 96dpi
* screens.
*/ */
static QCursor getThemeCursor( const Cursor &cursor ); static QCursor getThemeCursor( const Cursor &cursor );