pixel scaling algo moved from M3 to QskPlatform.h

This commit is contained in:
Uwe Rathmann 2023-03-05 11:52:42 +01:00
parent c8dc9db00a
commit 4f244c8f76
8 changed files with 88 additions and 93 deletions

View File

@ -20,7 +20,7 @@ namespace
inline QFont qskFont( qreal pointSize )
{
QFont font( "Roboto" );
font.setPointSizeF( pointSize / qskDpiScaled( 1.0 ) );
font.setPointSizeF( pointSize / qskDpToPixels( 1.0 ) );
return font;
}

View File

@ -59,61 +59,14 @@ static const int qskDuration = 150;
namespace
{
// see: https://en.wikipedia.org/wiki/Device-independent_pixel
inline qreal dpToPixels( long double value )
{
static qreal factor = -1.0;
if ( factor < 0.0 )
{
factor = 1.0;
if ( const auto screen = QGuiApplication::primaryScreen() )
{
const qreal pdpi = screen->physicalDotsPerInch();
qreal dpi;
// calculate buckets according to https://developer.android.com/training/multiscreen/screendensities
if( pdpi <= 140.0 )
{
dpi = 120.0; // ldpi
}
else if( pdpi <= 200.0 )
{
dpi = 160.0; // mdpi
}
else if( pdpi <= 280.0 )
{
dpi = 240.0; // hdpi
}
else if( pdpi <= 400.0 )
{
dpi = 320.0; // xhdpi
}
else if( pdpi <= 560.0 )
{
dpi = 480.0; // xxhdpi
}
else
{
dpi = 640.0; // xxxhdpi
}
factor = dpi / 160.0;
}
}
return value * factor;
}
inline double operator ""_dp( long double value )
{
return dpToPixels( value );
return qskDpToPixels( static_cast< qreal >( value ) );
}
inline double operator ""_dp( unsigned long long int value )
inline double operator ""_dp( unsigned long long value )
{
return dpToPixels( value );
return qskDpToPixels( value );
}
class Editor : private QskSkinHintTableEditor

View File

@ -52,6 +52,16 @@ static const int qskDuration = 200;
namespace
{
inline double operator ""_dp( long double value )
{
return qskDpToPixels( static_cast< qreal >( value ) );
}
inline double operator ""_dp( unsigned long long value )
{
return qskDpToPixels( value );
}
class ColorPalette
{
public:
@ -309,15 +319,15 @@ void Editor::setupCheckBox()
using A = QskAspect;
using Q = QskCheckBox;
const qreal size = qskDpiScaled( 26 );
const qreal size = 26_dp;
setSpacing( Q::Panel, qskDpiScaled( 5 ) );
setSpacing( Q::Panel, 5_dp );
setStrutSize( Q::Box, size, size );
setPadding( Q::Box, qskDpiScaled( 5 ) );
setBoxShape( Q::Box, qskDpiScaled( 3 ) );
setBoxBorderMetrics( Q::Box, qskDpiScaled( 1 ) );
setPadding( Q::Box, 5_dp );
setBoxShape( Q::Box, 3_dp );
setBoxBorderMetrics( Q::Box, 1_dp );
setBoxBorderColors( Q::Box, m_pal.darker125 );
setGradient( Q::Box, m_pal.lighter135 );
@ -362,8 +372,8 @@ void Editor::setupMenu()
setHint( Q::Overlay | A::Style, true );
setGradient( Q::Overlay, QColor( 220, 220, 220, 100 ) );
setBoxShape( Q::Panel, qskDpiScaled( 4 ) );
setBoxBorderMetrics( Q::Panel, qskDpiScaled( 1 ) );
setBoxShape( Q::Panel, 4_dp );
setBoxBorderMetrics( Q::Panel, 1_dp );
setBoxBorderColors( Q::Panel, m_pal.darker125 );
setGradient( Q::Panel, m_pal.lighter110 );
@ -371,7 +381,7 @@ void Editor::setupMenu()
const bool isCascading = qskMaybeDesktopPlatform();
setHint( Q::Panel | A::Style, isCascading );
setMetric( Q::Separator | A::Size, qskDpiScaled( 2 ) );
setMetric( Q::Separator | A::Size, 2_dp );
setSeparator( Q::Separator );
setPadding( Q::Segment, QskMargins( 2, 10, 2, 10 ) );
@ -520,7 +530,7 @@ void Editor::setupSegmentedBar()
setBoxBorderColors( Q::Panel, borderColors );
const QSize strutSize( qskDpiScaled( 100 ), qskDpiScaled( 50 ) );
const QSize strutSize( 100_dp, 50_dp );
setStrutSize( Q::Panel | A::Horizontal, strutSize );
setStrutSize( Q::Panel | A::Vertical, strutSize.transposed() );
@ -576,7 +586,7 @@ void Editor::setupPageIndicator()
{
using Q = QskPageIndicator;
const auto extent = qskDpiScaled( 8 );
const auto extent = 8_dp;
setStrutSize( Q::Bullet, extent, extent );
// circles, without border
@ -584,7 +594,7 @@ void Editor::setupPageIndicator()
setBoxBorderMetrics( Q::Bullet, 0 );
setGradient( Q::Bullet, m_pal.darker150 );
setMargin( Q::Bullet, qskDpiScaled( 1 ) );
setMargin( Q::Bullet, 1_dp );
setGradient( Q::Bullet | Q::Selected, m_pal.lighter150 );
setMargin( Q::Bullet | Q::Selected, 0 );
@ -601,7 +611,7 @@ void Editor::setupPushButton()
// Panel
setHint( Q::Panel | QskAspect::Direction, Qsk::TopToBottom );
setStrutSize( Q::Panel, qskDpiScaled( 75.0 ), qskDpiScaled( 23.0 ) );
setStrutSize( Q::Panel, 75_dp, 23_dp );
setMargin( Q::Panel, 0 );
setPadding( Q::Panel, 10 );
@ -641,18 +651,18 @@ void Editor::setupRadioBox()
{
using Q = QskRadioBox;
setSpacing( Q::Panel, qskDpiScaled( 10 ) );
setStrutSize( Q::Button, qskDpiScaled( 20 ), qskDpiScaled( 20 ) );
setSpacing( Q::Panel, 10_dp );
setStrutSize( Q::Button, 20_dp, 20_dp );
for ( auto subControl : { Q::Button, Q::Indicator, Q::Ripple } )
setBoxShape( subControl, 100, Qt::RelativeSize ); // circular
setBoxBorderMetrics( Q::Button, qskDpiScaled( 1 ) );
setBoxBorderMetrics( Q::Button, 1_dp );
setBoxBorderColors( Q::Button, m_pal.darker125 );
setBoxBorderColors( Q::Button | Q::Disabled, m_pal.theme );
setPadding( Q::Button, qskDpiScaled( 5 ) );
setPadding( Q::Button, 5_dp );
setColor( Q::Text, m_pal.themeForeground );
setColor( Q::Text | Q::Disabled, m_pal.darker200 );
@ -897,7 +907,7 @@ void Editor::setupInputPredictionBar()
setButton( Q::ButtonPanel, Flat );
setButton( Q::ButtonPanel | QskPushButton::Pressed, Sunken );
setStrutSize( Q::ButtonPanel, qskDpiScaled( 30.0 ), qskDpiScaled( 23.0 ) );
setStrutSize( Q::ButtonPanel, 30_dp, 23_dp );
setColor( Q::ButtonText, m_pal.themeForeground );
setColor( Q::ButtonText | QskPushButton::Disabled, m_pal.darker200 );
@ -944,7 +954,7 @@ void Editor::setupScrollView()
// scroll bars
for ( auto subControl : { Q::HorizontalScrollBar, Q::VerticalScrollBar } )
{
setMetric( subControl | A::Size, qskDpiScaled( 12 ) );
setMetric( subControl | A::Size, 12_dp );
setPadding( subControl, 0 );
setMargin( subControl, 0 );
}
@ -956,7 +966,7 @@ void Editor::setupScrollView()
setButton( subControl, Raised, bw );
const auto extent = qskDpiScaled( 40.0 );
const auto extent = 40_dp;
if ( subControl == Q::HorizontalScrollHandle )
{
@ -1092,7 +1102,7 @@ void Editor::setupSwitchButton()
using A = QskAspect;
using Q = QskSwitchButton;
const qreal radius = qskDpiScaled( 12 );
const qreal radius = 15_dp;
const qreal handleSize = 2 * ( radius - 2 );
setBoxShape( Q::Groove, 100, Qt::RelativeSize );

View File

@ -11,23 +11,6 @@ QSK_QT_PRIVATE_END
#include <qpa/qplatformintegration.h>
#include <qpa/qplatformscreen.h>
qreal qskDpiScaled( qreal value )
{
static qreal factor = 0.0;
if ( factor <= 0.0 )
{
if ( const auto screen = QGuiApplication::primaryScreen() )
factor = screen->logicalDotsPerInchX();
else
factor = 100.0;
factor /= 96.0;
}
return value * factor;
}
qreal qskGlobalScaleFactor()
{
// The value of QT_SCALE_FACTOR
@ -58,4 +41,35 @@ QRect qskPlatformScreenGeometry( const QScreen* screen )
return screen->handle()->geometry();
}
static inline qreal qskRoundedDpi( qreal dpi )
{
// see https://developer.android.com/training/multiscreen/screendensities
if( dpi <= 140.0 )
return 120.0; // ldpi
if( dpi <= 200.0 )
return 160.0; // mdpi
if( dpi <= 280.0 )
return 240.0; // hdpi
if( dpi <= 400.0 )
return 320.0; // xhdpi
if( dpi <= 560.0 )
return 480.0; // xxhdpi
return 640.0; // xxxhdpi
}
qreal qskDpToPixelsFactor()
{
if ( const auto screen = QGuiApplication::primaryScreen() )
{
// see: https://en.wikipedia.org/wiki/Device-independent_pixel
return qskRoundedDpi( screen->physicalDotsPerInch() ) / 160.0;
}
return 1.0;
}

View File

@ -12,11 +12,29 @@ class QScreen;
class QPlatformIntegration;
class QRect;
QSK_EXPORT qreal qskDpiScaled( qreal value );
QSK_EXPORT qreal qskGlobalScaleFactor();
QSK_EXPORT bool qskMaybeDesktopPlatform();
QSK_EXPORT const QPlatformIntegration* qskPlatformIntegration();
QSK_EXPORT QRect qskPlatformScreenGeometry( const QScreen* );
/*
One dp is a virtual pixel unit that's roughly equal to one pixel
on a medium-density screen ( 160 dpi ).
see: https://en.wikipedia.org/wiki/Device-independent_pixel
*/
QSK_EXPORT qreal qskDpToPixelsFactor();
inline qreal qskDpToPixels( qreal value )
{
static qreal factor = -1.0;
if ( factor < 0.0 )
factor = qskDpToPixelsFactor();
return value * factor;
}
#endif

View File

@ -251,7 +251,7 @@ void QskSkin::setupFonts( const QString& family, int weight, bool italic )
for ( int i = TinyFont; i <= HugeFont; i++ )
{
font.setPixelSize( qskDpiScaled( sizes[i - 1] ) );
font.setPixelSize( qskDpToPixels( sizes[i - 1] ) );
m_data->fonts[ i ] = font;
}

View File

@ -222,10 +222,10 @@ QSizeF QskSubWindow::layoutSizeHint(
{
// should be Minimum Width/Height from the skin hints
if ( hint.width() < 0.0 )
hint.setWidth( qskDpiScaled( 100 ) );
hint.setWidth( qskDpToPixels( 100 ) );
if ( hint.height() < 0.0 )
hint.setHeight( qskDpiScaled( 80 ) );
hint.setHeight( qskDpToPixels( 80 ) );
}
return hint;

View File

@ -26,7 +26,7 @@ static void qskUpdateEventFilter( QskSubWindowArea* area )
static Qt::Edges qskSelectedEdges( const QRectF& rect, const QPointF& pos )
{
const qreal tolerance = qskDpiScaled( 10.0 );
const qreal tolerance = qskDpToPixels( 10.0 );
Qt::Edges edges;
if ( pos.x() <= rect.left() + tolerance )