qskinny/support/SkinnyShortcut.cpp

259 lines
6.4 KiB
C++
Raw Normal View History

2017-07-21 18:21:34 +02:00
#include "SkinnyShortcut.h"
#include <QskShortcutMap.h>
2017-07-21 18:21:34 +02:00
#include <QskSetup.h>
#include <QskSkinManager.h>
2017-07-21 18:21:34 +02:00
#include <QskWindow.h>
#include <QskAspect.h>
#include <QskSkin.h>
#include <QskControl.h>
2018-05-01 12:41:20 +02:00
#include <QskQuick.h>
2017-07-21 18:21:34 +02:00
#include <QskSkinTransition.h>
#include <QQuickItem>
#include <QKeySequence>
#include <QGuiApplication>
#include <QSGNode>
#include <QDebug>
#include <unordered_map>
#include <iostream>
2017-07-21 18:21:34 +02:00
SkinnyShortcut::SkinnyShortcut( QObject* parent ):
QObject( parent )
{
}
void SkinnyShortcut::enable( Types types )
{
using namespace std;
2017-07-21 18:21:34 +02:00
static SkinnyShortcut s_shortcut;
2017-07-21 18:21:34 +02:00
if ( types & RotateSkin )
{
2020-10-23 12:45:46 +02:00
QskShortcutMap::addShortcut( QKeySequence( Qt::CTRL | Qt::Key_S ),
false, &s_shortcut, &SkinnyShortcut::rotateSkin );
cout << "CTRL-S to change the skin." << endl;
2017-07-21 18:21:34 +02:00
}
if ( types & ChangeFonts )
{
2020-10-23 12:45:46 +02:00
QskShortcutMap::addShortcut( QKeySequence( Qt::CTRL | Qt::Key_F ),
false, &s_shortcut, [] { s_shortcut.changeFonts( +1 ); } );
2020-10-23 12:45:46 +02:00
QskShortcutMap::addShortcut( QKeySequence( Qt::CTRL | Qt::Key_G ),
false, &s_shortcut, [] { s_shortcut.changeFonts( -1 ); } );
cout << "CTRL-F to increase the font size." << endl;
cout << "CTRL-G to decrease the font size." << endl;
}
2017-07-21 18:21:34 +02:00
if ( types & DebugBackground )
{
2020-10-23 12:45:46 +02:00
QskShortcutMap::addShortcut( QKeySequence( Qt::CTRL | Qt::Key_B ),
false, &s_shortcut, &SkinnyShortcut::showBackground );
cout << "CTRL-B to enable visual debugging modes." << endl;
2017-07-21 18:21:34 +02:00
}
if ( types & DebugStatistics )
{
2020-10-23 12:45:46 +02:00
QskShortcutMap::addShortcut( QKeySequence( Qt::CTRL | Qt::Key_K ),
false, &s_shortcut, &SkinnyShortcut::debugStatistics );
cout << "CTRL-K to dump statistics about the items/nodes being currently used." << endl;
}
if ( types & Quit )
{
// QKeySequence::Quit crashes the application
// when not being implemented by the platform !!
2020-10-23 12:45:46 +02:00
QskShortcutMap::addShortcut( QKeySequence( Qt::CTRL | Qt::Key_Q ),
false, QGuiApplication::instance(), &QGuiApplication::quit );
cout << "CTRL-Q to terminate the application." << endl;
2017-07-21 18:21:34 +02:00
}
}
void SkinnyShortcut::rotateSkin()
{
const QStringList names = qskSkinManager->skinNames();
2017-07-21 18:21:34 +02:00
if ( names.size() <= 1 )
return;
int index = names.indexOf( qskSetup->skinName() );
index = ( index + 1 ) % names.size();
QskSkin* oldSkin = qskSetup->skin();
if ( oldSkin->parent() == qskSetup )
oldSkin->setParent( nullptr ); // otherwise setSkin deletes it
QskSkin* newSkin = qskSetup->setSkin( names[ index ] );
QskSkinTransition transition;
2017-07-21 18:21:34 +02:00
//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
const QVector< QByteArray > sgDebugModes =
{ "clip", "overdraw", "changes", "batches" };
#else
const QVector< QByteArray > sgDebugModes = { "overdraw" };
#endif
static int id = 0;
id = ( id + 1 ) % ( sgDebugModes.count() + 2 );
bool forceBackground = false;
QByteArray scengraphDebugMode;
if ( id == 0 )
{
// nothing
}
else if ( id == 1 )
{
forceBackground = true;
}
else
{
scengraphDebugMode = sgDebugModes[ id - 2 ];
}
qskSetup->setControlFlag( QskSetup::DebugForceBackground, forceBackground );
2017-10-30 12:06:19 +01:00
const auto windows = QGuiApplication::topLevelWindows();
for ( auto window : windows )
2017-07-21 18:21:34 +02:00
{
if ( QskWindow* w = qobject_cast< QskWindow* >( window ) )
{
if ( w->customRenderMode() != scengraphDebugMode )
{
w->setCustomRenderMode( scengraphDebugMode );
w->update();
}
}
}
}
void SkinnyShortcut::changeFonts( int increment )
{
auto skin = qskSetup->skin();
2019-01-07 09:13:53 +01:00
2018-01-06 17:57:33 +01:00
const auto fonts = skin->fonts();
for ( auto it = fonts.begin(); it != fonts.end(); ++it )
{
2018-01-06 17:57:33 +01:00
auto role = it->first;
auto font = it->second;
if ( font.pixelSize() > 0 )
{
2018-01-05 09:37:17 +01:00
const auto newSize = font.pixelSize() + increment;
if ( newSize > 0 )
font.setPixelSize( newSize );
}
else
{
2018-01-06 17:57:33 +01:00
const auto newSize = font.pointSizeF() + increment;
2018-01-05 09:37:17 +01:00
if ( newSize > 0 )
2018-01-06 17:57:33 +01:00
font.setPointSizeF( font.pointSizeF() + increment );
}
skin->setFont( role, font );
}
2018-08-03 11:11:42 +02:00
Q_EMIT qskSetup->skinChanged( skin );
}
2017-07-21 18:21:34 +02:00
static inline void countNodes( const QSGNode* node, int& counter )
{
if ( node )
{
counter++;
for ( auto child = node->firstChild();
child != nullptr; child = child->nextSibling() )
{
countNodes( child, counter );
}
}
}
static void countNodes( const QQuickItem* item, int& counter )
{
const auto itemNode = qskItemNode( item );
2017-07-21 18:21:34 +02:00
if ( itemNode )
{
auto node = qskPaintNode( item );
2017-07-21 18:21:34 +02:00
if ( node )
{
countNodes( node, counter );
while ( node != itemNode )
{
counter++;
node = node->parent();
}
}
else
{
counter++;
// clipNode/opacityNode ???
}
}
}
static void countItems( const QQuickItem* item, int counter[4] )
{
if ( item )
{
counter[0]++;
int nodeCounter = 0;
countNodes( item, nodeCounter );
counter[2] += nodeCounter;
if ( item->isVisible() )
{
counter[1]++;
counter[3] += nodeCounter;
}
2017-10-30 12:06:19 +01:00
const auto children = item->childItems();
for ( const auto* child : children )
2017-07-21 18:21:34 +02:00
countItems( child, counter );
}
}
void SkinnyShortcut::debugStatistics()
{
2017-10-30 12:06:19 +01:00
const auto windows = QGuiApplication::topLevelWindows();
for ( auto window : windows )
2017-07-21 18:21:34 +02:00
{
const auto w = qobject_cast< const QQuickWindow* >( window );
if ( w == nullptr )
continue;
int counter[4] = {};
countItems( w->contentItem(), counter );
2017-07-26 13:21:10 +02:00
qDebug() << w << "\n\titems:" << counter[0] << "visible" << counter[1]
<< "\n\tnodes:" << counter[2] << "visible" << counter[3];
2017-07-21 18:21:34 +02:00
}
}
#include "moc_SkinnyShortcut.cpp"