Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qpagesetupdialog_mac.mm
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4
5#include <AppKit/AppKit.h>
6
8
10
11#include <qpa/qplatformnativeinterface.h>
12#include <qpa/qplatformwindow_p.h>
13#include <QtPrintSupport/qprintengine.h>
14
15#include <QtPrintSupport/private/qprintengine_mac_p.h>
16
17#include <QtCore/private/qcore_mac_p.h>
18
19QT_USE_NAMESPACE
20
21@class QT_MANGLE_NAMESPACE(QCocoaPageLayoutDelegate);
22
23@interface QT_MANGLE_NAMESPACE(QCocoaPageLayoutDelegate) : NSObject
24@end
25
26@implementation QT_MANGLE_NAMESPACE(QCocoaPageLayoutDelegate) {
27 NSPrintInfo *printInfo;
28}
29
30- (instancetype)initWithNSPrintInfo:(NSPrintInfo *)nsPrintInfo
31{
32 self = [super init];
33 if (self) {
34 printInfo = nsPrintInfo;
35 }
36 return self;
37
38}
39- (void)pageLayoutDidEnd:(NSPageLayout *)pageLayout
40 returnCode:(int)returnCode contextInfo:(void *)contextInfo
41{
42 Q_UNUSED(pageLayout);
43 QPageSetupDialog *dialog = static_cast<QPageSetupDialog *>(contextInfo);
44 QPrinter *printer = dialog->printer();
45
46 if (returnCode == NSModalResponseOK) {
47 PMPageFormat format = static_cast<PMPageFormat>([printInfo PMPageFormat]);
48 PMRect paperRect;
49 PMGetUnadjustedPaperRect(format, &paperRect);
50 PMOrientation orientation;
51 PMGetOrientation(format, &orientation);
52 QSizeF paperSize = QSizeF(paperRect.right - paperRect.left, paperRect.bottom - paperRect.top);
53 printer->printEngine()->setProperty(QPrintEngine::PPK_CustomPaperSize, paperSize);
54 printer->printEngine()->setProperty(QPrintEngine::PPK_Orientation, orientation == kPMLandscape ? QPageLayout::Landscape : QPageLayout::Portrait);
55 }
56
57 dialog->done((returnCode == NSModalResponseOK) ? QDialog::Accepted : QDialog::Rejected);
58}
59@end
60
61QT_BEGIN_NAMESPACE
62
63class QMacPageSetupDialogPrivate : public QPageSetupDialogPrivate
64{
65 Q_DECLARE_PUBLIC(QPageSetupDialog)
66
67public:
68 QMacPageSetupDialogPrivate(QPrinter *printer)
69 : QPageSetupDialogPrivate(printer), printInfo(0), pageLayout(0)
70 { }
71
72 ~QMacPageSetupDialogPrivate() {
73 }
74
75 void openCocoaPageLayout(Qt::WindowModality modality);
76 void closeCocoaPageLayout();
77
78 NSPrintInfo *printInfo;
79 NSPageLayout *pageLayout;
80};
81
82void QMacPageSetupDialogPrivate::openCocoaPageLayout(Qt::WindowModality modality)
83{
84 Q_Q(QPageSetupDialog);
85
86 printInfo = static_cast<QMacPrintEngine *>(printer->printEngine())->printInfo();
87 [printInfo retain];
88
89 pageLayout = [NSPageLayout pageLayout];
90 // Keep a copy to this since we plan on using it for a bit.
91 [pageLayout retain];
92 QT_MANGLE_NAMESPACE(QCocoaPageLayoutDelegate) *delegate = [[QT_MANGLE_NAMESPACE(QCocoaPageLayoutDelegate) alloc] initWithNSPrintInfo:printInfo];
93
94 if (modality == Qt::ApplicationModal) {
95
96 // Make sure we don't interrupt the runModalWithPrintInfo call.
97 (void) QMetaObject::invokeMethod(qApp->platformNativeInterface(),
98 "clearCurrentThreadCocoaEventDispatcherInterruptFlag");
99
100 int rval = [pageLayout runModalWithPrintInfo:printInfo];
101 [delegate pageLayoutDidEnd:pageLayout returnCode:rval contextInfo:q];
102 } else {
103 Q_ASSERT(q->parentWidget());
104 QWindow *parentWindow = q->parentWidget()->windowHandle();
105 auto *cocoaWindow = parentWindow->nativeInterface<QNativeInterface::Private::QCocoaWindow>();
106 NSWindow *window = cocoaWindow ? cocoaWindow->view().window : nil;
107 [pageLayout beginSheetWithPrintInfo:printInfo
108 modalForWindow:window
109 delegate:delegate
110 didEndSelector:@selector(pageLayoutDidEnd:returnCode:contextInfo:)
111 contextInfo:q];
112 }
113}
114
115void QMacPageSetupDialogPrivate::closeCocoaPageLayout()
116{
117 [printInfo release];
118 printInfo = 0;
119 [pageLayout release];
120 pageLayout = 0;
121}
122
123QPageSetupDialog::QPageSetupDialog(QPrinter *printer, QWidget *parent)
124 : QDialog(*(new QMacPageSetupDialogPrivate(printer)), parent)
125{
126 setWindowTitle(QCoreApplication::translate("QPrintPreviewDialog", "Page Setup"));
127 setAttribute(Qt::WA_DontShowOnScreen);
128}
129
130QPageSetupDialog::QPageSetupDialog(QWidget *parent)
131 : QDialog(*(new QMacPageSetupDialogPrivate(0)), parent)
132{
133 setWindowTitle(QCoreApplication::translate("QPrintPreviewDialog", "Page Setup"));
134 setAttribute(Qt::WA_DontShowOnScreen);
135}
136
137void QPageSetupDialog::setVisible(bool visible)
138{
139 Q_D(QPageSetupDialog);
140
141 if (d->printer->outputFormat() != QPrinter::NativeFormat)
142 return;
143
144 bool isCurrentlyVisible = (static_cast <QMacPageSetupDialogPrivate*>(d)->pageLayout != 0);
145 if (!visible == !isCurrentlyVisible)
146 return;
147
148 QDialog::setVisible(visible);
149
150 if (visible) {
151 Qt::WindowModality modality = windowModality();
152 if (modality == Qt::NonModal) {
153 // NSPrintPanels can only be modal, so we must pick a type
154 modality = parentWidget() ? Qt::WindowModal : Qt::ApplicationModal;
155 }
156 static_cast <QMacPageSetupDialogPrivate*>(d)->openCocoaPageLayout(modality);
157 return;
158 } else {
159 if (static_cast <QMacPageSetupDialogPrivate*>(d)->pageLayout) {
160 static_cast <QMacPageSetupDialogPrivate*>(d)->closeCocoaPageLayout();
161 return;
162 }
163 }
164}
165
166int QPageSetupDialog::exec()
167{
168 Q_D(QPageSetupDialog);
169
170 if (d->printer->outputFormat() != QPrinter::NativeFormat)
171 return Rejected;
172
173 QDialog::setVisible(true);
174
175 QMacAutoReleasePool pool;
176 static_cast <QMacPageSetupDialogPrivate*>(d)->openCocoaPageLayout(Qt::ApplicationModal);
177 static_cast <QMacPageSetupDialogPrivate*>(d)->closeCocoaPageLayout();
178
179 QDialog::setVisible(false);
180
181 return result();
182}
183
184QT_END_NAMESPACE