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
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// Qt-Security score:significant reason:default
4
5#import <UIKit/UIKit.h>
6
7#include <QtGui/qwindow.h>
8#include <QtGui/qfontdatabase.h>
9#include <QDebug>
10
11#include <QtCore/private/qcore_mac_p.h>
12#include <QtGui/private/qfont_p.h>
13#include <QtGui/private/qfontengine_p.h>
14
15#include "qiosglobal.h"
16#include "qiosfontdialog.h"
18
19@implementation QIOSFontDialogController {
20 QIOSFontDialog *m_fontDialog;
21}
22
23- (instancetype)initWithQIOSFontDialog:(QIOSFontDialog *)dialog
24{
25 UIFontPickerViewControllerConfiguration *configuration = [[UIFontPickerViewControllerConfiguration alloc] init];
26 if (dialog->options()->testOption(QFontDialogOptions::MonospacedFonts)) {
27 UIFontDescriptorSymbolicTraits traits = {};
28 traits |= UIFontDescriptorTraitMonoSpace;
29 configuration.filteredTraits = traits;
30 }
31 configuration.includeFaces = YES;
32 if (self = [super initWithConfiguration:configuration]) {
33 m_fontDialog = dialog;
34 self.delegate = self;
35 self.presentationController.delegate = self;
36 }
37 [configuration release];
38 return self;
39}
40
41- (void)setQFont:(const QFont &)font
42{
43 QFontInfo fontInfo(font);
44 auto family = fontInfo.family().toNSString();
45 auto size = fontInfo.pointSize();
46
47 NSDictionary *dictionary = @{
48 static_cast<NSString *>(UIFontDescriptorFamilyAttribute): family,
49 static_cast<NSString *>(UIFontDescriptorSizeAttribute): [NSNumber numberWithInt:size]
50 };
51 UIFontDescriptor *fd = [UIFontDescriptor fontDescriptorWithFontAttributes:dictionary];
52
53 UIFontDescriptorSymbolicTraits traits = 0;
54 if (font.style() == QFont::StyleItalic)
55 traits |= UIFontDescriptorTraitItalic;
56 if (font.weight() == QFont::Bold)
57 traits |= UIFontDescriptorTraitBold;
58 fd = [fd fontDescriptorWithSymbolicTraits:traits];
59
60 self.selectedFontDescriptor = fd;
61}
62
63- (void)updateQFont
64{
65 UIFontDescriptor *font = self.selectedFontDescriptor;
66 if (!font)
67 return;
68
69 NSDictionary *attributes = font.fontAttributes;
70 UIFontDescriptorSymbolicTraits traits = font.symbolicTraits;
71
72 QFont newFont;
73 int size = qRound(font.pointSize);
74 QString family = QString::fromNSString([attributes objectForKey:UIFontDescriptorFamilyAttribute]);
75 if (family.isEmpty()) {
76 // If includeFaces is true, then the font descriptor won't
77 // have the UIFontDescriptorFamilyAttribute key set so we
78 // need to create a UIFont to get the font family
79 UIFont *f = [UIFont fontWithDescriptor:font size:size];
80 family = QString::fromNSString(f.familyName);
81 }
82
83 QString style;
84 if ((traits & (UIFontDescriptorTraitItalic | UIFontDescriptorTraitBold)) == (UIFontDescriptorTraitItalic | UIFontDescriptorTraitBold))
85 style = "Bold Italic";
86 else if (traits & UIFontDescriptorTraitItalic)
87 style = "Italic";
88 else if (traits & UIFontDescriptorTraitBold)
89 style = "Bold";
90
91 newFont = QFontDatabase::font(family, style, size);
92
93 if (m_fontDialog) {
94 m_fontDialog->updateCurrentFont(newFont);
95 emit m_fontDialog->currentFontChanged(newFont);
96 }
97}
98
99// ----------------------UIFontPickerViewControllerDelegate--------------------------
100- (void)fontPickerViewControllerDidPickFont:(UIFontPickerViewController *)viewController
101{
102 [self updateQFont];
103 emit m_fontDialog->accept();
104}
105
106- (void)fontPickerViewControllerDidCancel:(UIFontPickerViewController *)viewController
107{
108 Q_UNUSED(viewController);
109 emit m_fontDialog->reject();
110}
111
112// ----------------------UIAdaptivePresentationControllerDelegate--------------------------
113- (void)presentationControllerDidDismiss:(UIPresentationController *)presentationController
114{
115 Q_UNUSED(presentationController);
116 emit m_fontDialog->reject();
117}
118
119@end
120
121QIOSFontDialog::QIOSFontDialog()
122 : m_viewController(nullptr)
123{
124}
125
126QIOSFontDialog::~QIOSFontDialog()
127{
128 hide();
129}
130
131void QIOSFontDialog::exec()
132{
133 m_eventLoop.exec(QEventLoop::DialogExec);
134}
135
136bool QIOSFontDialog::show(Qt::WindowFlags windowFlags, Qt::WindowModality windowModality, QWindow *parent)
137{
138 Q_UNUSED(windowFlags);
139 Q_UNUSED(windowModality);
140
141 if (!m_viewController) {
142 m_viewController = [[QIOSFontDialogController alloc] initWithQIOSFontDialog:this];
143 [m_viewController setQFont:m_currentFont];
144 }
145
146 if (windowModality == Qt::ApplicationModal || windowModality == Qt::WindowModal)
147 m_viewController.modalInPresentation = YES;
148
149 UIWindow *window = presentationWindow(parent);
150 if (!window)
151 return false;
152
153 // We can't present from view controller if already presenting
154 if (window.rootViewController.presentedViewController)
155 return false;
156
157 [window.rootViewController presentViewController:m_viewController animated:YES completion:nil];
158
159 return true;
160}
161
162void QIOSFontDialog::hide()
163{
164 [m_viewController dismissViewControllerAnimated:YES completion:nil];
165 [m_viewController release];
166 m_viewController = nullptr;
167 if (m_eventLoop.isRunning())
168 m_eventLoop.exit();
169}
170
171void QIOSFontDialog::setCurrentFont(const QFont &font)
172{
173 if (m_currentFont == font)
174 return;
175
176 m_currentFont = font;
177 if (m_viewController)
178 [m_viewController setQFont:font];
179}
180
181QFont QIOSFontDialog::currentFont() const
182{
183 return m_currentFont;
184}
185
186void QIOSFontDialog::updateCurrentFont(const QFont &font)
187{
188 m_currentFont = font;
189}