iOS: Add platform plugin option to debug window management

When the 'debugWindowManagement' option is enabled, e.g. by passing the
argument -platform ios:debugWindowManagement to the application, the
plugin will add a background color and outline to all QUIViews, as
well as draw a grid for the underlying QUIViewController. This makes
it easier to see where windows are placed when the window itself
doesn't draw anything, e.g. in unit tests.

Change-Id: If9a59822e0b320b154ad8e338f9fb5ec7cf191a2
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@theqtcompany.com>
bb10
Tor Arne Vestbø 2015-03-11 18:14:12 +01:00
parent 2094903a14
commit d3d258a1b2
4 changed files with 82 additions and 0 deletions

View File

@ -48,6 +48,7 @@ class QIOSServices;
class QIOSIntegration : public QPlatformNativeInterface, public QPlatformIntegration
{
Q_OBJECT
Q_PROPERTY(bool debugWindowManagement READ debugWindowManagement WRITE setDebugWindowManagement);
public:
QIOSIntegration();
@ -87,6 +88,9 @@ public:
void *nativeResourceForWindow(const QByteArray &resource, QWindow *window);
void setDebugWindowManagement(bool);
bool debugWindowManagement() const;
private:
QPlatformFontDatabase *m_fontDatabase;
QPlatformClipboard *m_clipboard;
@ -96,6 +100,8 @@ private:
QIOSServices *m_platformServices;
mutable QPlatformAccessibility *m_accessibility;
QIOSFileEngineFactory m_fileEngineFactory;
bool m_debugWindowManagement;
};
QT_END_NAMESPACE

View File

@ -67,6 +67,7 @@ QIOSIntegration::QIOSIntegration()
, m_inputContext(0)
, m_platformServices(new QIOSServices)
, m_accessibility(0)
, m_debugWindowManagement(false)
{
if (![UIApplication sharedApplication]) {
qFatal("Error: You are creating QApplication before calling UIApplicationMain.\n" \
@ -249,6 +250,16 @@ void *QIOSIntegration::nativeResourceForWindow(const QByteArray &resource, QWind
return 0;
}
void QIOSIntegration::setDebugWindowManagement(bool enabled)
{
m_debugWindowManagement = enabled;
}
bool QIOSIntegration::debugWindowManagement() const
{
return m_debugWindowManagement;
}
// ---------------------------------------------------------
#include "moc_qiosintegration.cpp"

View File

@ -41,6 +41,7 @@
#include <QtGui/private/qwindow_p.h>
#include "qiosintegration.h"
#include "qiosscreen.h"
#include "qiosglobal.h"
#include "qioswindow.h"
@ -64,6 +65,56 @@
@implementation QIOSDesktopManagerView
- (id)init
{
if (!(self = [super init]))
return nil;
QIOSIntegration *iosIntegration = QIOSIntegration::instance();
if (iosIntegration && iosIntegration->debugWindowManagement()) {
static UIImage *gridPattern = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
CGFloat dimension = 100.f;
UIGraphicsBeginImageContextWithOptions(CGSizeMake(dimension, dimension), YES, 0.0f);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(context, -0.5, -0.5);
#define gridColorWithBrightness(br) \
[UIColor colorWithHue:0.6 saturation:0.0 brightness:br alpha:1.0].CGColor
CGContextSetFillColorWithColor(context, gridColorWithBrightness(0.05));
CGContextFillRect(context, CGRectMake(0, 0, dimension, dimension));
CGFloat gridLines[][2] = { { 10, 0.1 }, { 20, 0.2 }, { 100, 0.3 } };
for (size_t l = 0; l < sizeof(gridLines) / sizeof(gridLines[0]); ++l) {
CGFloat step = gridLines[l][0];
for (int c = step; c <= dimension; c += step) {
CGContextMoveToPoint(context, c, 0);
CGContextAddLineToPoint(context, c, dimension);
CGContextMoveToPoint(context, 0, c);
CGContextAddLineToPoint(context, dimension, c);
}
CGFloat brightness = gridLines[l][1];
CGContextSetStrokeColorWithColor(context, gridColorWithBrightness(brightness));
CGContextStrokePath(context);
}
gridPattern = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[gridPattern retain];
});
self.backgroundColor = [UIColor colorWithPatternImage:gridPattern];
}
return self;
}
- (void)didAddSubview:(UIView *)subview
{
Q_UNUSED(subview);

View File

@ -73,6 +73,20 @@
self.hidden = YES;
self.multipleTouchEnabled = YES;
if (QIOSIntegration::instance()->debugWindowManagement()) {
static CGFloat hue = 0.0;
CGFloat lastHue = hue;
for (CGFloat diff = 0; diff < 0.1 || diff > 0.9; diff = fabsf(hue - lastHue))
hue = drand48();
#define colorWithBrightness(br) \
[UIColor colorWithHue:hue saturation:0.5 brightness:br alpha:1.0].CGColor
self.layer.backgroundColor = colorWithBrightness(0.5);
self.layer.borderColor = colorWithBrightness(1.0);
self.layer.borderWidth = 1.0;
}
}
return self;