Qt 6.x
The Qt SDK
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 "qiosfontdialog.h"
15#include "qiosintegration.h"
16
17@implementation QIOSFontDialogController {
18 QIOSFontDialog *m_fontDialog;
19}
20
21- (instancetype)initWithQIOSFontDialog:(QIOSFontDialog *)dialog
22{
23 UIFontPickerViewControllerConfiguration *configuration = [[UIFontPickerViewControllerConfiguration alloc] init];
25 UIFontDescriptorSymbolicTraits traits = {};
26 traits |= UIFontDescriptorTraitMonoSpace;
27 configuration.filteredTraits = traits;
28 }
29 configuration.includeFaces = YES;
30 if (self = [super initWithConfiguration:configuration]) {
31 m_fontDialog = dialog;
32 self.delegate = self;
33 self.presentationController.delegate = self;
34 }
35 [configuration release];
36 return self;
37}
38
39- (void)setQFont:(const QFont &)font
40{
41 QFontInfo fontInfo(font);
42 auto family = fontInfo.family().toNSString();
43 auto size = fontInfo.pointSize();
44
45 NSDictionary *dictionary = @{
46 static_cast<NSString *>(UIFontDescriptorFamilyAttribute): family,
47 static_cast<NSString *>(UIFontDescriptorSizeAttribute): [NSNumber numberWithInt:size]
48 };
49 UIFontDescriptor *fd = [UIFontDescriptor fontDescriptorWithFontAttributes:dictionary];
50
51 UIFontDescriptorSymbolicTraits traits = 0;
53 traits |= UIFontDescriptorTraitItalic;
54 if (font.weight() == QFont::Bold)
55 traits |= UIFontDescriptorTraitBold;
56 fd = [fd fontDescriptorWithSymbolicTraits:traits];
57
58 self.selectedFontDescriptor = fd;
59}
60
61- (void)updateQFont
62{
63 UIFontDescriptor *font = self.selectedFontDescriptor;
64 if (!font)
65 return;
66
67 NSDictionary *attributes = font.fontAttributes;
68 UIFontDescriptorSymbolicTraits traits = font.symbolicTraits;
69
70 QFont newFont;
72 QString family = QString::fromNSString([attributes objectForKey:UIFontDescriptorFamilyAttribute]);
73 if (family.isEmpty()) {
74 // If includeFaces is true, then the font descriptor won't
75 // have the UIFontDescriptorFamilyAttribute key set so we
76 // need to create a UIFont to get the font family
77 UIFont *f = [UIFont fontWithDescriptor:font size:size];
78 family = QString::fromNSString(f.familyName);
79 }
80
81 QString style;
82 if ((traits & (UIFontDescriptorTraitItalic | UIFontDescriptorTraitBold)) == (UIFontDescriptorTraitItalic | UIFontDescriptorTraitBold))
83 style = "Bold Italic";
84 else if (traits & UIFontDescriptorTraitItalic)
85 style = "Italic";
86 else if (traits & UIFontDescriptorTraitBold)
87 style = "Bold";
88
89 newFont = QFontDatabase::font(family, style, size);
90
91 if (m_fontDialog) {
92 m_fontDialog->updateCurrentFont(newFont);
93 emit m_fontDialog->currentFontChanged(newFont);
94 }
95}
96
97// ----------------------UIFontPickerViewControllerDelegate--------------------------
98- (void)fontPickerViewControllerDidPickFont:(UIFontPickerViewController *)viewController
99{
100 [self updateQFont];
101 emit m_fontDialog->accept();
102}
103
104- (void)fontPickerViewControllerDidCancel:(UIFontPickerViewController *)viewController
105{
106 Q_UNUSED(viewController);
107 emit m_fontDialog->reject();
108}
109
110// ----------------------UIAdaptivePresentationControllerDelegate--------------------------
111- (void)presentationControllerDidDismiss:(UIPresentationController *)presentationController
112{
113 Q_UNUSED(presentationController);
114 emit m_fontDialog->reject();
115}
116
117@end
118
120 : m_viewController(nullptr)
121{
122}
123
125{
126 hide();
127}
128
130{
131 m_eventLoop.exec(QEventLoop::DialogExec);
132}
133
134bool QIOSFontDialog::show(Qt::WindowFlags windowFlags, Qt::WindowModality windowModality, QWindow *parent)
135{
136 Q_UNUSED(windowFlags);
137 Q_UNUSED(windowModality);
138
139 if (!m_viewController) {
140 m_viewController = [[QIOSFontDialogController alloc] initWithQIOSFontDialog:this];
141 [m_viewController setQFont:m_currentFont];
142 }
143
144 if (windowModality == Qt::ApplicationModal || windowModality == Qt::WindowModal)
145 m_viewController.modalInPresentation = YES;
146
147 UIWindow *window = parent ? reinterpret_cast<UIView *>(parent->winId()).window
148 : qt_apple_sharedApplication().keyWindow;
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:14
\reentrant
Definition qfont.h:20
Weight weight() const
Returns the weight of the font, using the same scale as the \l{QFont::Weight} enumeration.
Definition qfont.cpp:1118
int pointSize() const
Returns the point size of the font.
Definition qfont.cpp:863
Style style() const
Returns the style of the font.
Definition qfont.cpp:1090
@ Bold
Definition qfont.h:67
@ StyleItalic
Definition qfont.h:75
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:311
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
Definition qstring.h:1083
\inmodule QtGui
Definition qwindow.h:63
WindowModality
@ WindowModal
@ ApplicationModal
QString self
Definition language.cpp:57
AppleApplication * qt_apple_sharedApplication()
Definition qcore_mac.mm:430
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:281
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]
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent