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
qiosfontdialog.mm
Go to the documentation of this file.
1// Copyright (C) 2022 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#import <UIKit/UIKit.h>
5
6#include <QtGui/qwindow.h>
7#include <QtGui/qfontdatabase.h>
8#include <QDebug>
9
10#include <QtCore/private/qcore_mac_p.h>
11#include <QtGui/private/qfont_p.h>
12#include <QtGui/private/qfontengine_p.h>
13
14#include "qiosglobal.h"
15#include "qiosfontdialog.h"
16#include "qiosintegration.h"
17
18@implementation QIOSFontDialogController {
19 QIOSFontDialog *m_fontDialog;
20}
21
22- (instancetype)initWithQIOSFontDialog:(QIOSFontDialog *)dialog
23{
24 UIFontPickerViewControllerConfiguration *configuration = [[UIFontPickerViewControllerConfiguration alloc] init];
26 UIFontDescriptorSymbolicTraits traits = {};
27 traits |= UIFontDescriptorTraitMonoSpace;
28 configuration.filteredTraits = traits;
29 }
30 configuration.includeFaces = YES;
31 if (self = [super initWithConfiguration:configuration]) {
32 m_fontDialog = dialog;
33 self.delegate = self;
34 self.presentationController.delegate = self;
35 }
36 [configuration release];
37 return self;
38}
39
40- (void)setQFont:(const QFont &)font
41{
42 QFontInfo fontInfo(font);
43 auto family = fontInfo.family().toNSString();
44 auto size = fontInfo.pointSize();
45
46 NSDictionary *dictionary = @{
47 static_cast<NSString *>(UIFontDescriptorFamilyAttribute): family,
48 static_cast<NSString *>(UIFontDescriptorSizeAttribute): [NSNumber numberWithInt:size]
49 };
50 UIFontDescriptor *fd = [UIFontDescriptor fontDescriptorWithFontAttributes:dictionary];
51
52 UIFontDescriptorSymbolicTraits traits = 0;
54 traits |= UIFontDescriptorTraitItalic;
55 if (font.weight() == QFont::Bold)
56 traits |= UIFontDescriptorTraitBold;
57 fd = [fd fontDescriptorWithSymbolicTraits:traits];
58
59 self.selectedFontDescriptor = fd;
60}
61
62- (void)updateQFont
63{
64 UIFontDescriptor *font = self.selectedFontDescriptor;
65 if (!font)
66 return;
67
68 NSDictionary *attributes = font.fontAttributes;
69 UIFontDescriptorSymbolicTraits traits = font.symbolicTraits;
70
71 QFont newFont;
73 QString family = QString::fromNSString([attributes objectForKey:UIFontDescriptorFamilyAttribute]);
74 if (family.isEmpty()) {
75 // If includeFaces is true, then the font descriptor won't
76 // have the UIFontDescriptorFamilyAttribute key set so we
77 // need to create a UIFont to get the font family
78 UIFont *f = [UIFont fontWithDescriptor:font size:size];
79 family = QString::fromNSString(f.familyName);
80 }
81
82 QString style;
83 if ((traits & (UIFontDescriptorTraitItalic | UIFontDescriptorTraitBold)) == (UIFontDescriptorTraitItalic | UIFontDescriptorTraitBold))
84 style = "Bold Italic";
85 else if (traits & UIFontDescriptorTraitItalic)
86 style = "Italic";
87 else if (traits & UIFontDescriptorTraitBold)
88 style = "Bold";
89
90 newFont = QFontDatabase::font(family, style, size);
91
92 if (m_fontDialog) {
93 m_fontDialog->updateCurrentFont(newFont);
94 emit m_fontDialog->currentFontChanged(newFont);
95 }
96}
97
98// ----------------------UIFontPickerViewControllerDelegate--------------------------
99- (void)fontPickerViewControllerDidPickFont:(UIFontPickerViewController *)viewController
100{
101 [self updateQFont];
102 emit m_fontDialog->accept();
103}
104
105- (void)fontPickerViewControllerDidCancel:(UIFontPickerViewController *)viewController
106{
107 Q_UNUSED(viewController);
108 emit m_fontDialog->reject();
109}
110
111// ----------------------UIAdaptivePresentationControllerDelegate--------------------------
112- (void)presentationControllerDidDismiss:(UIPresentationController *)presentationController
113{
114 Q_UNUSED(presentationController);
115 emit m_fontDialog->reject();
116}
117
118@end
119
121 : m_viewController(nullptr)
122{
123}
124
129
131{
132 m_eventLoop.exec(QEventLoop::DialogExec);
133}
134
135bool QIOSFontDialog::show(Qt::WindowFlags windowFlags, Qt::WindowModality windowModality, QWindow *parent)
136{
137 Q_UNUSED(windowFlags);
138 Q_UNUSED(windowModality);
139
140 if (!m_viewController) {
141 m_viewController = [[QIOSFontDialogController alloc] initWithQIOSFontDialog:this];
142 [m_viewController setQFont:m_currentFont];
143 }
144
145 if (windowModality == Qt::ApplicationModal || windowModality == Qt::WindowModal)
146 m_viewController.modalInPresentation = YES;
147
148 UIWindow *window = presentationWindow(parent);
149 if (!window)
150 return false;
151
152 // We can't present from view controller if already presenting
153 if (window.rootViewController.presentedViewController)
154 return false;
155
156 [window.rootViewController presentViewController:m_viewController animated:YES completion:nil];
157
158 return true;
159}
160
162{
163 [m_viewController dismissViewControllerAnimated:YES completion:nil];
164 [m_viewController release];
165 m_viewController = nullptr;
166 if (m_eventLoop.isRunning())
167 m_eventLoop.exit();
168}
169
171{
172 if (m_currentFont == font)
173 return;
174
175 m_currentFont = font;
176 if (m_viewController)
177 [m_viewController setQFont:font];
178}
179
181{
182 return m_currentFont;
183}
184
186{
187 m_currentFont = font;
188}
189
190
int exec(ProcessEventsFlags flags=AllEvents)
Enters the main event loop and waits until exit() is called.
void exit(int returnCode=0)
Tells the event loop to exit with a return code.
bool isRunning() const
Returns true if the event loop is running; otherwise returns false.
Options options
The various options that affect the look and feel of the dialog.
Definition qfiledialog.h:34
static QFont font(const QString &family, const QString &style, int pointSize)
Returns a QFont object that has family family, style style and point size pointSize.
\reentrant
Definition qfontinfo.h:16
\reentrant
Definition qfont.h:22
Weight weight() const
Returns the weight of the font, using the same scale as the \l{QFont::Weight} enumeration.
Definition qfont.cpp:1133
int pointSize() const
Returns the point size of the font.
Definition qfont.cpp:884
Style style() const
Returns the style of the font.
Definition qfont.cpp:1105
@ Bold
Definition qfont.h:70
@ StyleItalic
Definition qfont.h:78
bool show(Qt::WindowFlags windowFlags, Qt::WindowModality windowModality, QWindow *parent) override
void updateCurrentFont(const QFont &)
void hide() override
void setCurrentFont(const QFont &) override
QFont currentFont() const override
void exec() override
QObject * parent() const
Returns a pointer to the parent object.
Definition qobject.h:346
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
bool isEmpty() const noexcept
Returns true if the string has no characters; otherwise returns false.
Definition qstring.h:192
\inmodule QtGui
Definition qwindow.h:63
WindowModality
@ WindowModal
@ ApplicationModal
QString self
Definition language.cpp:58
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
int qRound(qfloat16 d) noexcept
Definition qfloat16.h:327
UIWindow * presentationWindow(QWindow *)
Definition qiosglobal.mm:96
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLfloat GLfloat f
GLuint64 GLenum GLint fd
#define emit
#define Q_UNUSED(x)
QFuture< QSet< QString > > dictionary
QObject::connect nullptr
QFileDialog dialog(this)
[1]
aWidget window() -> setWindowTitle("New Window Title")
[2]