summaryrefslogtreecommitdiffstats
path: root/tests/manual/cocoa/qt_on_cocoa/main.mm
blob: bd54484409dc9c42ff9b27e23f97481bc39ac602 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0

#include "rasterwindow.h"

#include <QtGui>
#include <QtWidgets/QtWidgets>

#include <AppKit/AppKit.h>


@interface ContentView : NSView
@end

@implementation ContentView
- (void)drawRect:(NSRect)dirtyRect {
    [[NSColor whiteColor] setFill];
    NSRectFill(dirtyRect);
}

- (void)cursorUpdate:(NSEvent *)theEvent
{
    Q_UNUSED(theEvent);
    [[NSCursor pointingHandCursor] set];
}
@end

@interface AppDelegate : NSObject <NSApplicationDelegate>
@end

@implementation AppDelegate {
    QGuiApplication *m_app;
    QWindow *m_window;
}

- (instancetype)initWithArgc:(int)argc argv:(const char **)argv
{
    if ((self = [self init])) {
        m_app = new QGuiApplication(argc, const_cast<char **>(argv));
    }
    return self;
}

- (void)applicationWillFinishLaunching:(NSNotification *)notification
{
    Q_UNUSED(notification);

    // Create the NSWindow
    NSRect frame = NSMakeRect(500, 500, 500, 500);
    NSWindow *window  = [[NSWindow alloc] initWithContentRect:frame
                        styleMask:NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask
                        backing:NSBackingStoreBuffered
                        defer:NO];

    NSString *title = @"This the NSWindow window";
    [window setTitle:title];
    [window setBackgroundColor:[NSColor blueColor]];

    NSView *contentView = [[[ContentView alloc] initWithFrame:frame] autorelease];
    [contentView addTrackingArea:[[NSTrackingArea alloc] initWithRect:[contentView frame]
            options:NSTrackingActiveInActiveApp | NSTrackingInVisibleRect | NSTrackingCursorUpdate
            owner:contentView userInfo:nil]];

    // Create the QWindow, add its NSView to the content view
    m_window = new RasterWindow;
    m_window->setObjectName("RasterWindow");
    m_window->setCursor(Qt::CrossCursor);
    m_window->setGeometry(QRect(0, 0, 300, 300));

    QWindow *childWindow = new RasterWindow;
    childWindow->setObjectName("RasterWindowChild");
    childWindow->setParent(m_window);
    childWindow->setCursor(Qt::BusyCursor);
    childWindow->setGeometry(50, 50, 100, 100);

    NSTextField *textField = [[NSTextField alloc] initWithFrame:NSMakeRect(10, 10, 80, 25)];
    [reinterpret_cast<NSView *>(childWindow->winId()) addSubview:textField];

    [contentView addSubview:reinterpret_cast<NSView *>(m_window->winId())];

    window.contentView = contentView;

    // Show the NSWindow delayed, so that we can verify that Qt picks up the right
    // notifications to expose the window when it does become visible.
    dispatch_async(dispatch_get_main_queue(), ^{
        [window makeKeyAndOrderFront:NSApp];
    });
}

- (void)applicationWillTerminate:(NSNotification *)notification
{
    Q_UNUSED(notification);
    delete m_window;
    delete m_app;
}

@end

int main(int argc, const char *argv[])
{
    // Create NSApplicaiton with delgate
    NSApplication *app = [NSApplication sharedApplication];
    app.delegate = [[AppDelegate alloc] initWithArgc:argc argv:argv];
    return NSApplicationMain(argc, argv);
}