Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
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
7#include "qpagesetupdialog.h"
8
10
11#include <qpa/qplatformnativeinterface.h>
12#include <QtPrintSupport/qprintengine.h>
13
14#include <QtPrintSupport/private/qprintengine_mac_p.h>
15
16#include <QtCore/private/qcore_mac_p.h>
17
19
20@class QT_MANGLE_NAMESPACE(QCocoaPageLayoutDelegate);
21
23@end
24
26 NSPrintInfo *printInfo;
27}
28
29- (instancetype)initWithNSPrintInfo:(NSPrintInfo *)nsPrintInfo
30{
31 self = [super init];
32 if (self) {
33 printInfo = nsPrintInfo;
34 }
35 return self;
36
37}
38- (void)pageLayoutDidEnd:(NSPageLayout *)pageLayout
39 returnCode:(int)returnCode contextInfo:(void *)contextInfo
40{
41 Q_UNUSED(pageLayout);
42 QPageSetupDialog *dialog = static_cast<QPageSetupDialog *>(contextInfo);
43 QPrinter *printer = dialog->printer();
44
45 if (returnCode == NSModalResponseOK) {
46 PMPageFormat format = static_cast<PMPageFormat>([printInfo PMPageFormat]);
47 PMRect paperRect;
48 PMGetUnadjustedPaperRect(format, &paperRect);
49 PMOrientation orientation;
50 PMGetOrientation(format, &orientation);
51 QSizeF paperSize = QSizeF(paperRect.right - paperRect.left, paperRect.bottom - paperRect.top);
53 printer->printEngine()->setProperty(QPrintEngine::PPK_Orientation, orientation == kPMLandscape ? QPageLayout::Landscape : QPageLayout::Portrait);
54 }
55
56 dialog->done((returnCode == NSModalResponseOK) ? QDialog::Accepted : QDialog::Rejected);
57}
58@end
59
61
63{
64 Q_DECLARE_PUBLIC(QPageSetupDialog)
65
66public:
68 : QPageSetupDialogPrivate(printer), printInfo(0), pageLayout(0)
69 { }
70
73
74 void openCocoaPageLayout(Qt::WindowModality modality);
75 void closeCocoaPageLayout();
76
77 NSPrintInfo *printInfo;
78 NSPageLayout *pageLayout;
79};
80
82{
84
85 printInfo = static_cast<QMacPrintEngine *>(printer->printEngine())->printInfo();
86 [printInfo retain];
87
88 pageLayout = [NSPageLayout pageLayout];
89 // Keep a copy to this since we plan on using it for a bit.
90 [pageLayout retain];
91 QT_MANGLE_NAMESPACE(QCocoaPageLayoutDelegate) *delegate = [[QT_MANGLE_NAMESPACE(QCocoaPageLayoutDelegate) alloc] initWithNSPrintInfo:printInfo];
92
93 if (modality == Qt::ApplicationModal) {
94
95 // Make sure we don't interrupt the runModalWithPrintInfo call.
96 (void) QMetaObject::invokeMethod(qApp->platformNativeInterface(),
97 "clearCurrentThreadCocoaEventDispatcherInterruptFlag");
98
99 int rval = [pageLayout runModalWithPrintInfo:printInfo];
100 [delegate pageLayoutDidEnd:pageLayout returnCode:rval contextInfo:q];
101 } else {
102 Q_ASSERT(q->parentWidget());
103 QWindow *parentWindow = q->parentWidget()->windowHandle();
104 NSWindow *window = static_cast<NSWindow *>(qApp->platformNativeInterface()->nativeResourceForWindow("nswindow", parentWindow));
105 [pageLayout beginSheetWithPrintInfo:printInfo
106 modalForWindow:window
107 delegate:delegate
108 didEndSelector:@selector(pageLayoutDidEnd:returnCode:contextInfo:)
109 contextInfo:q];
110 }
111}
112
114{
115 [printInfo release];
116 printInfo = 0;
117 [pageLayout release];
118 pageLayout = 0;
119}
120
122 : QDialog(*(new QMacPageSetupDialogPrivate(printer)), parent)
123{
124 setWindowTitle(QCoreApplication::translate("QPrintPreviewDialog", "Page Setup"));
126}
127
134
135void QPageSetupDialog::setVisible(bool visible)
136{
137 Q_D(QPageSetupDialog);
138
139 if (d->printer->outputFormat() != QPrinter::NativeFormat)
140 return;
141
142 bool isCurrentlyVisible = (static_cast <QMacPageSetupDialogPrivate*>(d)->pageLayout != 0);
143 if (!visible == !isCurrentlyVisible)
144 return;
145
147
148 if (visible) {
150 if (modality == Qt::NonModal) {
151 // NSPrintPanels can only be modal, so we must pick a type
153 }
154 static_cast <QMacPageSetupDialogPrivate*>(d)->openCocoaPageLayout(modality);
155 return;
156 } else {
157 if (static_cast <QMacPageSetupDialogPrivate*>(d)->pageLayout) {
158 static_cast <QMacPageSetupDialogPrivate*>(d)->closeCocoaPageLayout();
159 return;
160 }
161 }
162}
163
165{
166 Q_D(QPageSetupDialog);
167
168 if (d->printer->outputFormat() != QPrinter::NativeFormat)
169 return Rejected;
170
172
174 static_cast <QMacPageSetupDialogPrivate*>(d)->openCocoaPageLayout(Qt::ApplicationModal);
175 static_cast <QMacPageSetupDialogPrivate*>(d)->closeCocoaPageLayout();
176
177 QDialog::setVisible(false);
178
179 return result();
180}
181
static QString translate(const char *context, const char *key, const char *disambiguation=nullptr, int n=-1)
\threadsafe
The QDialog class is the base class of dialog windows.
Definition qdialog.h:19
int result() const
In general returns the modal dialog's result code, Accepted or Rejected.
Definition qdialog.cpp:475
@ Accepted
Definition qdialog.h:30
@ Rejected
Definition qdialog.h:30
void setVisible(bool visible) override
\reimp
Definition qdialog.cpp:744
void done(int result) override
\reimp
QMacPageSetupDialogPrivate(QPrinter *printer)
void openCocoaPageLayout(Qt::WindowModality modality)
\inmodule QtGui
Definition qpagelayout.h:20
The QPageSetupDialog class provides a configuration dialog for the page-related options on a printer.
QPageSetupDialog(QPrinter *printer, QWidget *parent=nullptr)
Constructs a page setup dialog that configures printer with parent as the parent widget.
int exec() override
This virtual function is called to pop up the dialog.
virtual void setProperty(PrintEnginePropertyKey key, const QVariant &value)=0
Sets the print engine's property specified by key to the given value.
\reentrant
Definition qprinter.h:28
QPrintEngine * printEngine() const
@ NativeFormat
Definition qprinter.h:69
\inmodule QtCore
Definition qsize.h:208
The QWidget class is the base class of all user interface objects.
Definition qwidget.h:99
void setAttribute(Qt::WidgetAttribute, bool on=true)
Sets the attribute attribute on this widget if on is true; otherwise clears the attribute.
Qt::WindowModality windowModality
which windows are blocked by the modal widget
Definition qwidget.h:104
void setWindowTitle(const QString &)
Definition qwidget.cpp:6105
QWidget * parentWidget() const
Returns the parent of this widget, or \nullptr if it does not have any parent widget.
Definition qwidget.h:904
bool visible
whether the widget is visible
Definition qwidget.h:144
\inmodule QtGui
Definition qwindow.h:63
Combined button and popup list for selecting options.
@ WA_DontShowOnScreen
Definition qnamespace.h:383
WindowModality
@ NonModal
@ WindowModal
@ ApplicationModal
QString self
Definition language.cpp:58
#define qApp
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
GLint GLsizei GLsizei GLenum format
GLdouble GLdouble GLdouble GLdouble q
Definition qopenglext.h:259
NSPrintInfo * printInfo
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
#define QT_MANGLE_NAMESPACE(name)
#define Q_UNUSED(x)
QFileDialog dialog(this)
[1]
aWidget window() -> setWindowTitle("New Window Title")
[2]
static bool invokeMethod(QObject *obj, const char *member, Qt::ConnectionType, QGenericReturnArgument ret, QGenericArgument val0=QGenericArgument(nullptr), QGenericArgument val1=QGenericArgument(), QGenericArgument val2=QGenericArgument(), QGenericArgument val3=QGenericArgument(), QGenericArgument val4=QGenericArgument(), QGenericArgument val5=QGenericArgument(), QGenericArgument val6=QGenericArgument(), QGenericArgument val7=QGenericArgument(), QGenericArgument val8=QGenericArgument(), QGenericArgument val9=QGenericArgument())
\threadsafe This is an overloaded member function, provided for convenience. It differs from the abov...