diff --git a/examples/automotive/main.cpp b/examples/automotive/main.cpp index ed93e224..d4fd90f2 100644 --- a/examples/automotive/main.cpp +++ b/examples/automotive/main.cpp @@ -7,7 +7,6 @@ #include "SkinFactory.h" #include -#include #include #include @@ -33,7 +32,6 @@ int main( int argc, char** argv ) */ qskSetup->setItemUpdateFlag( QskQuickItem::PreferRasterForTextures, true ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts ); MainWindow window; diff --git a/examples/boxes/main.cpp b/examples/boxes/main.cpp index bfe8678d..95261fc2 100644 --- a/examples/boxes/main.cpp +++ b/examples/boxes/main.cpp @@ -5,7 +5,6 @@ #include "Box.h" -#include #include #include @@ -555,7 +554,6 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::Quit | SkinnyShortcut::DebugShortcuts ); auto* tabView = new TabView(); diff --git a/examples/buttons/main.cpp b/examples/buttons/main.cpp index 26ee773f..373e695d 100644 --- a/examples/buttons/main.cpp +++ b/examples/buttons/main.cpp @@ -3,7 +3,6 @@ * This file may be used under the terms of the 3-clause BSD License *****************************************************************************/ -#include #include #include @@ -24,7 +23,6 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts ); QQmlApplicationEngine engine( QUrl( "qrc:/qml/buttons.qml" ) ); diff --git a/examples/colorswitch/main.cpp b/examples/colorswitch/main.cpp index 59a1361a..00d69450 100644 --- a/examples/colorswitch/main.cpp +++ b/examples/colorswitch/main.cpp @@ -5,7 +5,6 @@ #include "Theme.h" -#include #include #include @@ -28,7 +27,6 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::Quit | SkinnyShortcut::ChangeFonts | SkinnyShortcut::DebugShortcuts ); diff --git a/examples/gallery/button/ButtonPage.cpp b/examples/gallery/button/ButtonPage.cpp index 267a0899..9a347c37 100644 --- a/examples/gallery/button/ButtonPage.cpp +++ b/examples/gallery/button/ButtonPage.cpp @@ -6,11 +6,9 @@ #include "ButtonPage.h" #include -#include -#include +#include #include - -#include +#include namespace { @@ -18,10 +16,11 @@ namespace { public: ButtonBox( QQuickItem* parent = nullptr ) - : QskLinearBox( Qt::Horizontal, parent ) + : QskLinearBox( Qt::Horizontal, 4, parent ) { - setDefaultAlignment( Qt::AlignHCenter | Qt::AlignTop ); - setMargins( 30 ); + setSpacing( 20 ); + setExtraSpacingAt( Qt::BottomEdge ); + setDefaultAlignment( Qt::AlignCenter ); populate(); } @@ -29,20 +28,53 @@ namespace private: void populate() { - (void) new QskSwitchButton( Qt::Vertical, this ); - (void) new QskSwitchButton( Qt::Horizontal, this ); + const char* texts[] = { "Press Me", "Check Me" }; + const char* graphics[] = { "diamond/khaki", "ellipse/sandybrown" }; - auto button3 = new QskSwitchButton( Qt::Vertical, this ); - button3->setInverted( true ); + for ( int i = 0; i < 6; i++ ) + { + const int index = i % 2; - auto button4 = new QskSwitchButton( Qt::Horizontal, this ); - button4->setInverted( true ); + auto button = new QskPushButton( this ); + button->setCheckable( index != 0 ); + //button->setSizePolicy( QskSizePolicy::Fixed, QskSizePolicy::Fixed ); + + if ( i > 1 ) + { + auto src = QStringLiteral( "image://shapes/" ) + graphics[ index ]; + button->setGraphicSource( src ); + } + + if ( i < 2 || i > 3 ) + { + button->setText( texts[ index ] ); + } + } + } + }; + + class SwitchButtonBox : public QskLinearBox + { + public: + SwitchButtonBox( QQuickItem* parent = nullptr ) + : QskLinearBox( Qt::Horizontal, parent ) + { + setSpacing( 20 ); + setExtraSpacingAt( Qt::LeftEdge | Qt::RightEdge | Qt::BottomEdge ); + + for ( auto orientation : { Qt::Vertical, Qt::Horizontal } ) + { + (void) new QskSwitchButton( orientation, this ); + + auto button = new QskSwitchButton( orientation, this ); + button->setInverted( true ); + } } }; } ButtonPage::ButtonPage( QQuickItem* parent ) - : Page( Qt::Horizontal, parent ) + : Page( Qt::Vertical, parent ) { setSpacing( 40 ); populate(); @@ -50,23 +82,7 @@ ButtonPage::ButtonPage( QQuickItem* parent ) void ButtonPage::populate() { - auto hbox1 = new QskLinearBox(); - hbox1->setSizePolicy( Qt::Vertical, QskSizePolicy::Fixed ); - hbox1->setExtraSpacingAt( Qt::LeftEdge ); - - auto label = new QskTextLabel( "Disable the switches:", hbox1 ); - label->setSizePolicy( QskSizePolicy::Fixed, QskSizePolicy::Fixed ); - - auto button0 = new QskSwitchButton( hbox1 ); - - auto hbox2 = new ButtonBox(); - - auto vbox = new QskLinearBox( Qt::Vertical, this ); - vbox->addItem( hbox1 ); - vbox->addItem( new QskSeparator() ); - vbox->addItem( hbox2 ); - vbox->setExtraSpacingAt( Qt::BottomEdge ); - - QObject::connect( button0, &QskSwitchButton::checkedChanged, - hbox2, &QskQuickItem::setDisabled ); + new ButtonBox( this ); + new QskSeparator( Qt::Horizontal, this ); + new SwitchButtonBox( this ); } diff --git a/examples/gallery/label/LabelPage.cpp b/examples/gallery/label/LabelPage.cpp index 8e4a2813..7b945ce8 100644 --- a/examples/gallery/label/LabelPage.cpp +++ b/examples/gallery/label/LabelPage.cpp @@ -8,29 +8,51 @@ #include #include #include +#include namespace { + class TextLabel : public QskTextLabel + { + public: + TextLabel( int role, QQuickItem* parent = nullptr ) + : QskTextLabel( parent ) + { + setText( textFromRole( role ) ); + setFontRole( role ); + + setSizePolicy( Qt::Horizontal, QskSizePolicy::Ignored ); + } + + private: + QString textFromRole( int role ) const + { + static QMetaEnum metaEnum; + + if ( !metaEnum.isValid() ) + { + const auto& mo = QskSkin::staticMetaObject; + metaEnum = mo.enumerator( mo.indexOfEnumerator( "SkinFontRole" ) ); + } + + QString s( metaEnum.valueToKey( role ) ); + s.remove( QStringLiteral( "Font" ) ); + + return s; + } + }; + class TextBox : public QskLinearBox { public: TextBox( QQuickItem* parent = nullptr ) - : QskLinearBox( Qt::Vertical, 3, parent ) + : QskLinearBox( Qt::Horizontal, 3, parent ) { setMargins( 10 ); - //setDefaultAlignment( Qt::AlignTop ); - setExtraSpacingAt( Qt::BottomEdge ); + setDefaultAlignment( Qt::AlignCenter ); - const QStringList texts = - { "Default", "Tiny", "Small", "Medium", "Large", "Huge" }; - - for ( int i = 0; i < texts.size(); i++ ) - { - auto label = new QskTextLabel( texts[ i ] + " Font", this ); - - //label->setPanel( true ); - label->setFontRole( i ); - } + for ( int i = 0; i <= QskSkin::HugeFont; i++ ) + ( void ) new TextLabel( i, this ); } }; diff --git a/examples/gallery/main.cpp b/examples/gallery/main.cpp index 869f06ac..7123fe62 100644 --- a/examples/gallery/main.cpp +++ b/examples/gallery/main.cpp @@ -8,13 +8,16 @@ #include "slider/SliderPage.h" #include "button/ButtonPage.h" -#include #include #include +#include #include #include #include +#include +#include +#include #include #include @@ -31,6 +34,76 @@ namespace setTabPosition( Qsk::Left ); setAutoFitTabs( true ); } + + void setTabsEnabled( bool on ) + { + for ( int i = 0; i < count(); i++ ) + itemAt( i )->setEnabled( on ); + } + }; + + /* + Once QskApplicationView and friends are implemented we can replace + Header/ApplicationWindow with it. TODO ... + */ + class Header : public QskLinearBox + { + Q_OBJECT + + public: + Header( QQuickItem* parent = nullptr ) + : QskLinearBox( Qt::Horizontal, parent ) + { + initSizePolicy( QskSizePolicy::Ignored, QskSizePolicy::Fixed ); + + setMargins( 10 ); + setBackgroundColor( Qt::lightGray ); + + { + auto button = new QskPushButton( "Skin", this ); +#if 1 + button->setFlat( true ); // until we have the section bit in QskAspect +#endif + + // transition leads to errors, when changing the tab before being completed. TODO ... + connect( button, &QskSwitchButton::clicked, + [] { Skinny::changeSkin( 500 ); } ); + } + + addStretch( 10 ); + + { + new QskTextLabel( "Enabled", this ); + + auto button = new QskSwitchButton( this ); + button->setChecked( true ); + + connect( button, &QskSwitchButton::toggled, + this, &Header::enabledToggled ); + } + } + + Q_SIGNALS: + void enabledToggled( bool ); + }; + + class ApplicationView : public QskLinearBox + { + public: + ApplicationView( QQuickItem* parent = nullptr ) + : QskLinearBox( Qt::Vertical, parent ) + { + auto header = new Header( this ); + + auto tabView = new TabView( this ); + tabView->addTab( "Labels", new LabelPage() ); + tabView->addTab( "Buttons", new ButtonPage() ); + tabView->addTab( "Sliders", new SliderPage() ); + tabView->addTab( "Progress\nBars", new ProgressBarPage() ); + + connect( header, &Header::enabledToggled, + tabView, &TabView::setTabsEnabled ); + } }; } @@ -44,21 +117,15 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts ); - auto tabView = new TabView(); - - tabView->addTab( "Labels", new LabelPage() ); - tabView->addTab( "Sliders", new SliderPage() ); - tabView->addTab( "Progress\nBars", new ProgressBarPage() ); - tabView->addTab( "Buttons", new ButtonPage() ); + auto mainView = new ApplicationView(); QSize size( 800, 600 ); - size = size.expandedTo( tabView->sizeHint().toSize() ); + size = size.expandedTo( mainView->sizeHint().toSize() ); QskWindow window; - window.addItem( tabView ); + window.addItem( mainView ); window.addItem( new QskFocusIndicator() ); window.resize( size ); @@ -66,3 +133,5 @@ int main( int argc, char* argv[] ) return app.exec(); } + +#include "main.moc" diff --git a/examples/iotdashboard/main.cpp b/examples/iotdashboard/main.cpp index 80be72ba..a1457e0d 100644 --- a/examples/iotdashboard/main.cpp +++ b/examples/iotdashboard/main.cpp @@ -7,7 +7,6 @@ #include "GraphicProvider.h" #include "Skin.h" -#include #include #include @@ -61,8 +60,6 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); - Qsk::addGraphicProvider( QString(), new GraphicProvider() ); // disable default skins diff --git a/examples/layouts/main.cpp b/examples/layouts/main.cpp index f6d59be6..6c829fd5 100644 --- a/examples/layouts/main.cpp +++ b/examples/layouts/main.cpp @@ -10,7 +10,6 @@ #include "StackLayoutPage.h" #include "TestRectangle.h" -#include #include #include @@ -31,7 +30,6 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts ); auto tabView = new QskTabView(); diff --git a/examples/listbox/main.cpp b/examples/listbox/main.cpp index 487796aa..2c1e2099 100644 --- a/examples/listbox/main.cpp +++ b/examples/listbox/main.cpp @@ -3,7 +3,6 @@ * This file may be used under the terms of the 3-clause BSD License *****************************************************************************/ -#include #include #include @@ -65,7 +64,6 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts ); QskWindow window; diff --git a/examples/messagebox/main.cpp b/examples/messagebox/main.cpp index f5702319..f1b96068 100644 --- a/examples/messagebox/main.cpp +++ b/examples/messagebox/main.cpp @@ -3,7 +3,6 @@ * This file may be used under the terms of the 3-clause BSD License *****************************************************************************/ -#include #include #include @@ -126,7 +125,6 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts ); qskDialog->setPolicy( QskDialog::EmbeddedBox ); diff --git a/examples/messageboxQml/main.cpp b/examples/messageboxQml/main.cpp index 58d084a6..3e7a0694 100644 --- a/examples/messageboxQml/main.cpp +++ b/examples/messageboxQml/main.cpp @@ -3,7 +3,6 @@ * This file may be used under the terms of the 3-clause BSD License *****************************************************************************/ -#include #include #include @@ -22,7 +21,6 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts ); QQmlApplicationEngine engine( QUrl( "qrc:/qml/messagebox.qml" ) ); diff --git a/examples/mycontrols/main.cpp b/examples/mycontrols/main.cpp index 996bcd02..7102c1a7 100644 --- a/examples/mycontrols/main.cpp +++ b/examples/mycontrols/main.cpp @@ -6,7 +6,6 @@ #include "MySkin.h" #include "MyToggleButton.h" -#include #include #include @@ -136,7 +135,6 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::DebugBackground | SkinnyShortcut::DebugStatistics | SkinnyShortcut::Quit ); diff --git a/examples/qvgviewer/main.cpp b/examples/qvgviewer/main.cpp index c6a53784..31d62caa 100644 --- a/examples/qvgviewer/main.cpp +++ b/examples/qvgviewer/main.cpp @@ -5,7 +5,6 @@ #include "MainWindow.h" -#include #include #ifdef CONTEXT_MENU @@ -29,7 +28,6 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts ); QskFocusIndicator* focusIndicator = new QskFocusIndicator(); diff --git a/examples/tabview/main.cpp b/examples/tabview/main.cpp index 7afab28f..5fbd43dc 100644 --- a/examples/tabview/main.cpp +++ b/examples/tabview/main.cpp @@ -3,7 +3,6 @@ * This file may be used under the terms of the 3-clause BSD License *****************************************************************************/ -#include #include #include @@ -90,7 +89,6 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts ); auto tabView = new TabView(); diff --git a/playground/anchors/main.cpp b/playground/anchors/main.cpp index 7f758ec6..a75c279d 100644 --- a/playground/anchors/main.cpp +++ b/playground/anchors/main.cpp @@ -5,7 +5,6 @@ #include "AnchorBox.h" -#include #include #include @@ -153,7 +152,6 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::Quit | SkinnyShortcut::DebugShortcuts ); auto box = new MyBox(); diff --git a/playground/dialogbuttons/main.cpp b/playground/dialogbuttons/main.cpp index 7393099d..b55461f9 100644 --- a/playground/dialogbuttons/main.cpp +++ b/playground/dialogbuttons/main.cpp @@ -5,7 +5,6 @@ #include "Window.h" -#include #include #include @@ -21,7 +20,6 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts ); Window window( Qt::Horizontal ); diff --git a/playground/grids/main.cpp b/playground/grids/main.cpp index 40dd8a8a..ea81b96a 100644 --- a/playground/grids/main.cpp +++ b/playground/grids/main.cpp @@ -5,8 +5,6 @@ #include "TestBox.h" -#include - #include #include @@ -389,15 +387,6 @@ int main( int argc, char** argv ) { QApplication app( argc, argv ); -#if 1 - /* - we don't need the fonts, but by calling something from - the support library initializations regarding the skins - are loaded. TODO ... - */ - SkinnyFont::init( &app ); -#endif - int testcase = 0; if ( argc == 2 ) testcase = atoi( argv[1] ); diff --git a/playground/images/images.qml b/playground/images/images.qml index 1ee7fb4f..b5132ff5 100644 --- a/playground/images/images.qml +++ b/playground/images/images.qml @@ -17,7 +17,8 @@ Qsk.Window orientation: Qt.Horizontal dimension: 3 - margins: 10 + //margins: 10 // only possible with Qt <= 6.1 + margins { left: 10; top: 10; right: 10; bottom: 10 } spacing: 10 Repeater diff --git a/playground/inputpanel/main.cpp b/playground/inputpanel/main.cpp index d26e3361..af6994cd 100644 --- a/playground/inputpanel/main.cpp +++ b/playground/inputpanel/main.cpp @@ -3,7 +3,6 @@ * This file may be used under the terms of the 3-clause BSD License *****************************************************************************/ -#include #include #include @@ -285,7 +284,6 @@ int main( int argc, char* argv[] ) QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::AllShortcuts ); #if 1 diff --git a/playground/webview/main.cpp b/playground/webview/main.cpp index 0a6de6ec..454e3639 100644 --- a/playground/webview/main.cpp +++ b/playground/webview/main.cpp @@ -3,7 +3,6 @@ * This file may be used under the terms of the 3-clause BSD License *****************************************************************************/ -#include #include #include @@ -43,7 +42,6 @@ int main( int argc, char* argv[] ) QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QGuiApplication app( argc, argv ); - SkinnyFont::init( &app ); SkinnyShortcut::enable( SkinnyShortcut::Quit | SkinnyShortcut::DebugShortcuts ); QskWindow window; diff --git a/skins/squiek/QskSquiekSkin.cpp b/skins/squiek/QskSquiekSkin.cpp index 55ce1c0c..da74a7d3 100644 --- a/skins/squiek/QskSquiekSkin.cpp +++ b/skins/squiek/QskSquiekSkin.cpp @@ -879,7 +879,7 @@ void Editor::setupSwitchButton() using A = QskAspect; using Q = QskSwitchButton; - const qreal radius = qskDpiScaled( 18 ); + const qreal radius = qskDpiScaled( 12 ); const qreal handleSize = 2 * ( radius - 2 ); setBoxShape( Q::Groove, 100, Qt::RelativeSize ); diff --git a/src/common/QskAspect.cpp b/src/common/QskAspect.cpp index a45febbb..6162df0e 100644 --- a/src/common/QskAspect.cpp +++ b/src/common/QskAspect.cpp @@ -144,7 +144,7 @@ QVector< QskAspect::Subcontrol > QskAspect::subControls( const QMetaObject* meta static QByteArray qskEnumString( const char* name, int value ) { - const QMetaObject& mo = QskAspect::staticMetaObject; + const auto& mo = QskAspect::staticMetaObject; const QMetaEnum metaEnum = mo.enumerator( mo.indexOfEnumerator( name ) ); const char* key = metaEnum.valueToKey( value ); diff --git a/src/controls/QskSkin.cpp b/src/controls/QskSkin.cpp index 85215d98..e438816c 100644 --- a/src/controls/QskSkin.cpp +++ b/src/controls/QskSkin.cpp @@ -12,6 +12,7 @@ #include "QskGraphicProviderMap.h" #include "QskSkinHintTable.h" #include "QskStandardSymbol.h" +#include "QskPlatform.h" #include "QskMargins.h" @@ -216,13 +217,14 @@ void QskSkin::declareSkinlet( const QMetaObject* metaObject, void QskSkin::setupFonts( const QString& family, int weight, bool italic ) { + const int sizes[] = { 10, 15, 20, 32, 66 }; + static_assert( sizeof( sizes ) / sizeof( sizes[ 0 ] ) == HugeFont ); + QFont font( family, -1, weight, italic ); - const uint base = TinyFont; for ( int i = TinyFont; i <= HugeFont; i++ ) { - // TODO: make the scaling components configurable - font.setPixelSize( int( std::pow( uint( i ) - base + 2, 2.5 ) ) ); + font.setPixelSize( qskDpiScaled( sizes[i-1] ) ); m_data->fonts[ i ] = font; } diff --git a/support/SkinnyFont.cpp b/support/SkinnyFont.cpp deleted file mode 100644 index 7278c388..00000000 --- a/support/SkinnyFont.cpp +++ /dev/null @@ -1,43 +0,0 @@ -/****************************************************************************** - * QSkinny - Copyright (C) 2016 Uwe Rathmann - * This file may be used under the terms of the 3-clause BSD License - *****************************************************************************/ - -#include "SkinnyFont.h" - -#include -#include -#include -#include - -#define STRINGIFY(x) #x -#define STRING(x) STRINGIFY(x) - -void SkinnyFont::init( QGuiApplication* ) -{ -#ifdef FONTCONFIG_FILE - const char env[] = "FONTCONFIG_FILE"; - if ( !qEnvironmentVariableIsSet( env ) ) - qputenv( env, STRING( FONTCONFIG_FILE ) ); -#endif - - QElapsedTimer timer; - timer.start(); - - QFontDatabase(); - - const auto elapsed = timer.elapsed(); - - if ( elapsed > 20 ) - { - qWarning() << "Loading fonts needed" << elapsed << "ms" - << "- usually because of creating a font cache."; - } - - /* - The default initialization in QskSkin sets up its font table - with using the application font for the default font role. - */ - QGuiApplication::setFont( QFont( "DejaVuSans", 12 ) ); -} - diff --git a/support/SkinnyGlobal.h b/support/SkinnyGlobal.h index 4f5a9a17..9c350ab8 100644 --- a/support/SkinnyGlobal.h +++ b/support/SkinnyGlobal.h @@ -3,23 +3,20 @@ * This file may be used under the terms of the 3-clause BSD License *****************************************************************************/ -#ifndef SKINNY_GLOBAL_H -#define SKINNY_GLOBAL_H +#pragma once #include #ifdef QSK_DLL -#if defined( SKINNY_MAKEDLL ) // create a DLL library -#define SKINNY_EXPORT Q_DECL_EXPORT -#else // use a DLL library -#define SKINNY_EXPORT Q_DECL_IMPORT -#endif + #if defined( SKINNY_MAKEDLL ) // create a DLL library + #define SKINNY_EXPORT Q_DECL_EXPORT + #else // use a DLL library + #define SKINNY_EXPORT Q_DECL_IMPORT + #endif #endif // QSK_DLL #ifndef SKINNY_EXPORT -#define SKINNY_EXPORT -#endif - + #define SKINNY_EXPORT #endif diff --git a/support/SkinnyNamespace.cpp b/support/SkinnyNamespace.cpp new file mode 100644 index 00000000..baf2d6a6 --- /dev/null +++ b/support/SkinnyNamespace.cpp @@ -0,0 +1,140 @@ +/****************************************************************************** + * QSkinny - Copyright (C) 2016 Uwe Rathmann + * This file may be used under the terms of the 3-clause BSD License + *****************************************************************************/ + +#include "SkinnyNamespace.h" + +#include +#include +#include +#include +#include + +#include +#include + +#define STRINGIFY(x) #x +#define STRING(x) STRINGIFY(x) + +#if defined( ENSURE_SKINS ) + + #include + #include + + static void initSkins() + { + if ( qskSkinManager->skinNames().isEmpty() ) + { + /* + To avoid having problems with not finding the skin plugins + we manually add them here. + */ + + qskSkinManager->registerFactory( "SquiekFactory", new QskSquiekSkinFactory() ); + qskSkinManager->registerFactory( "MaterialFactory", new QskMaterialSkinFactory() ); + + qWarning() << "Couldn't find skin plugins, adding some manually."; + } + } + + Q_COREAPP_STARTUP_FUNCTION( initSkins ) + +#endif + +#define ENSURE_FONTS + +#if defined( ENSURE_FONTS ) + + #include + #include + + static void initFonts() + { + #ifdef FONTCONFIG_FILE + const char env[] = "FONTCONFIG_FILE"; + if ( !qEnvironmentVariableIsSet( env ) ) + qputenv( env, STRING( FONTCONFIG_FILE ) ); + #endif + + QElapsedTimer timer; + timer.start(); + + QFontDatabase(); + + const auto elapsed = timer.elapsed(); + + if ( elapsed > 20 ) + { + qWarning() << "Loading fonts needed" << elapsed << "ms" + << "- usually because of creating a font cache."; + } + + /* + The default initialization in QskSkin sets up its font table + with using the application font for the default font role. + */ + QGuiApplication::setFont( QFont( "DejaVuSans", 12 ) ); + } +#endif + +Q_COREAPP_STARTUP_FUNCTION( initFonts ) + +void Skinny::changeSkin( QskAnimationHint hint ) +{ + const auto names = qskSkinManager->skinNames(); + if ( names.size() <= 1 ) + return; + + int index = names.indexOf( qskSetup->skinName() ); + index = ( index + 1 ) % names.size(); + + auto oldSkin = qskSetup->skin(); + if ( oldSkin->parent() == qskSetup ) + oldSkin->setParent( nullptr ); // otherwise setSkin deletes it + + if ( auto newSkin = qskSetup->setSkin( names[ index ] ) ) + { + QskSkinTransition transition; + + //transition.setMask( QskAspect::Color ); // Metrics are flickering -> TODO + transition.setSourceSkin( oldSkin ); + transition.setTargetSkin( newSkin ); + transition.setAnimation( hint ); + + transition.process(); + + if ( oldSkin->parent() == nullptr ) + delete oldSkin; + } +} + +void Skinny::changeFonts( int increment ) +{ + auto skin = qskSetup->skin(); + + const auto fonts = skin->fonts(); + + for ( auto it = fonts.begin(); it != fonts.end(); ++it ) + { + auto role = it->first; + auto font = it->second; + + if ( font.pixelSize() > 0 ) + { + const auto newSize = font.pixelSize() + increment; + if ( newSize > 0 ) + font.setPixelSize( newSize ); + } + else + { + const auto newSize = font.pointSizeF() + increment; + if ( newSize > 0 ) + font.setPointSizeF( font.pointSizeF() + increment ); + } + + skin->setFont( role, font ); + } + + Q_EMIT qskSetup->skinChanged( skin ); +} diff --git a/support/SkinnyFont.h b/support/SkinnyNamespace.h similarity index 63% rename from support/SkinnyFont.h rename to support/SkinnyNamespace.h index db2675a9..072e60b2 100644 --- a/support/SkinnyFont.h +++ b/support/SkinnyNamespace.h @@ -3,16 +3,13 @@ * This file may be used under the terms of the 3-clause BSD License *****************************************************************************/ -#ifndef SKINNY_FONT_H_ -#define SKINNY_FONT_H_ +#pragma once #include "SkinnyGlobal.h" +#include -class QGuiApplication; - -namespace SkinnyFont +namespace Skinny { - SKINNY_EXPORT void init( QGuiApplication* ); + SKINNY_EXPORT void changeSkin( QskAnimationHint hint = 500 ); + SKINNY_EXPORT void changeFonts( int increment ); } - -#endif diff --git a/support/SkinnyShapeFactory.h b/support/SkinnyShapeFactory.h index 3cbb591d..42794218 100644 --- a/support/SkinnyShapeFactory.h +++ b/support/SkinnyShapeFactory.h @@ -3,8 +3,7 @@ * This file may be used under the terms of the 3-clause BSD License *****************************************************************************/ -#ifndef SKINNY_SHAPE_FACTORY_H_ -#define SKINNY_SHAPE_FACTORY_H_ +#pragma once #include "SkinnyGlobal.h" #include @@ -32,5 +31,3 @@ namespace SkinnyShapeFactory SKINNY_EXPORT QPainterPath shapePath( Shape, const QSizeF& ); } - -#endif diff --git a/support/SkinnyShapeProvider.h b/support/SkinnyShapeProvider.h index 3b5f7962..fb0a8155 100644 --- a/support/SkinnyShapeProvider.h +++ b/support/SkinnyShapeProvider.h @@ -3,8 +3,7 @@ * This file may be used under the terms of the 3-clause BSD License *****************************************************************************/ -#ifndef SKINNY_SHAPE_PROVIDER_H -#define SKINNY_SHAPE_PROVIDER_H +#pragma once #include "SkinnyGlobal.h" #include @@ -15,5 +14,3 @@ class SKINNY_EXPORT SkinnyShapeProvider : public QskGraphicProvider const QskGraphic* loadGraphic( const QString& id ) const override final; }; -#endif - diff --git a/support/SkinnyShortcut.cpp b/support/SkinnyShortcut.cpp index 582827fb..6226f559 100644 --- a/support/SkinnyShortcut.cpp +++ b/support/SkinnyShortcut.cpp @@ -1,15 +1,11 @@ #include "SkinnyShortcut.h" +#include "SkinnyNamespace.h" #include #include -#include #include -#include -#include #include #include -#include -#include #include #include @@ -17,7 +13,6 @@ #include #include -#include #include SkinnyShortcut::SkinnyShortcut( QObject* parent ): @@ -34,17 +29,17 @@ void SkinnyShortcut::enable( Types types ) if ( types & RotateSkin ) { QskShortcutMap::addShortcut( QKeySequence( Qt::CTRL | Qt::Key_S ), - false, &s_shortcut, &SkinnyShortcut::rotateSkin ); + false, &s_shortcut, [] { Skinny::changeSkin(); } ); cout << "CTRL-S to change the skin." << endl; } if ( types & ChangeFonts ) { QskShortcutMap::addShortcut( QKeySequence( Qt::CTRL | Qt::Key_F ), - false, &s_shortcut, [] { s_shortcut.changeFonts( +1 ); } ); + false, &s_shortcut, [] { Skinny::changeFonts( +1 ); } ); QskShortcutMap::addShortcut( QKeySequence( Qt::CTRL | Qt::Key_G ), - false, &s_shortcut, [] { s_shortcut.changeFonts( -1 ); } ); + false, &s_shortcut, [] { Skinny::changeFonts( -1 ); } ); cout << "CTRL-F to increase the font size." << endl; cout << "CTRL-G to decrease the font size." << endl; @@ -75,35 +70,6 @@ void SkinnyShortcut::enable( Types types ) } } -void SkinnyShortcut::rotateSkin() -{ - const auto names = qskSkinManager->skinNames(); - if ( names.size() <= 1 ) - return; - - int index = names.indexOf( qskSetup->skinName() ); - index = ( index + 1 ) % names.size(); - - auto oldSkin = qskSetup->skin(); - if ( oldSkin->parent() == qskSetup ) - oldSkin->setParent( nullptr ); // otherwise setSkin deletes it - - if ( auto newSkin = qskSetup->setSkin( names[ index ] ) ) - { - QskSkinTransition transition; - - //transition.setMask( QskAspect::Color ); // Metrics are flickering -> TODO - transition.setSourceSkin( oldSkin ); - transition.setTargetSkin( newSkin ); - transition.setAnimation( 500 ); - - transition.process(); - - if ( oldSkin->parent() == nullptr ) - delete oldSkin; - } -} - void SkinnyShortcut::showBackground() { #if 0 @@ -149,36 +115,6 @@ void SkinnyShortcut::showBackground() } } -void SkinnyShortcut::changeFonts( int increment ) -{ - auto skin = qskSetup->skin(); - - const auto fonts = skin->fonts(); - - for ( auto it = fonts.begin(); it != fonts.end(); ++it ) - { - auto role = it->first; - auto font = it->second; - - if ( font.pixelSize() > 0 ) - { - const auto newSize = font.pixelSize() + increment; - if ( newSize > 0 ) - font.setPixelSize( newSize ); - } - else - { - const auto newSize = font.pointSizeF() + increment; - if ( newSize > 0 ) - font.setPointSizeF( font.pointSizeF() + increment ); - } - - skin->setFont( role, font ); - } - - Q_EMIT qskSetup->skinChanged( skin ); -} - static inline void countNodes( const QSGNode* node, int& counter ) { if ( node ) diff --git a/support/SkinnyShortcut.h b/support/SkinnyShortcut.h index 52222f18..8f63781f 100644 --- a/support/SkinnyShortcut.h +++ b/support/SkinnyShortcut.h @@ -3,8 +3,7 @@ * This file may be used under the terms of the 3-clause BSD License *****************************************************************************/ -#ifndef SKINNY_SHORTCUT_H_ -#define SKINNY_SHORTCUT_H_ +#pragma once #include "SkinnyGlobal.h" #include @@ -34,12 +33,8 @@ class SKINNY_EXPORT SkinnyShortcut : public QObject private: SkinnyShortcut( QObject* parent = nullptr ); - void rotateSkin(); - void changeFonts( int increment ); void showBackground(); void debugStatistics(); }; Q_DECLARE_OPERATORS_FOR_FLAGS( SkinnyShortcut::Types ) - -#endif diff --git a/support/support.pro b/support/support.pro index 699b1f2b..b02cb0d9 100644 --- a/support/support.pro +++ b/support/support.pro @@ -12,13 +12,13 @@ contains(QSK_CONFIG, QskDll): DEFINES += SKINNY_MAKEDLL HEADERS += \ SkinnyGlobal.h \ - SkinnyFont.h \ + SkinnyNamespace.h \ SkinnyShapeFactory.h \ SkinnyShapeProvider.h \ SkinnyShortcut.h SOURCES += \ - SkinnyFont.cpp \ + SkinnyNamespace.cpp \ SkinnyPlugin.cpp \ SkinnyShapeFactory.cpp \ SkinnyShapeProvider.cpp \