7#include <QtGui/qwindow.h>
8#include <QtGui/qfontdatabase.h>
11#include <QtCore/private/qcore_mac_p.h>
12#include <QtGui/private/qfont_p.h>
13#include <QtGui/private/qfontengine_p.h>
19@implementation QIOSFontDialogController {
20 QIOSFontDialog *m_fontDialog;
23- (instancetype)initWithQIOSFontDialog:(QIOSFontDialog *)dialog
25 UIFontPickerViewControllerConfiguration *configuration = [[UIFontPickerViewControllerConfiguration alloc] init];
26 if (dialog->options()->testOption(QFontDialogOptions::MonospacedFonts)) {
27 UIFontDescriptorSymbolicTraits traits = {};
28 traits |= UIFontDescriptorTraitMonoSpace;
29 configuration.filteredTraits = traits;
31 configuration.includeFaces = YES;
32 if (self = [super initWithConfiguration:configuration]) {
33 m_fontDialog = dialog;
35 self.presentationController.delegate = self;
37 [configuration release];
41- (
void)setQFont:(
const QFont &)font
43 QFontInfo fontInfo(font);
44 auto family = fontInfo.family().toNSString();
45 auto size = fontInfo.pointSize();
47 NSDictionary *dictionary = @{
48 static_cast<NSString *>(UIFontDescriptorFamilyAttribute): family,
49 static_cast<NSString *>(UIFontDescriptorSizeAttribute): [NSNumber numberWithInt:size]
51 UIFontDescriptor *fd = [UIFontDescriptor fontDescriptorWithFontAttributes:dictionary];
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];
60 self.selectedFontDescriptor = fd;
65 UIFontDescriptor *font = self.selectedFontDescriptor;
69 NSDictionary *attributes = font.fontAttributes;
70 UIFontDescriptorSymbolicTraits traits = font.symbolicTraits;
73 int size = qRound(font.pointSize);
74 QString family = QString::fromNSString([attributes objectForKey:UIFontDescriptorFamilyAttribute]);
75 if (family.isEmpty()) {
79 UIFont *f = [UIFont fontWithDescriptor:font size:size];
80 family = QString::fromNSString(f.familyName);
84 if ((traits & (UIFontDescriptorTraitItalic | UIFontDescriptorTraitBold)) == (UIFontDescriptorTraitItalic | UIFontDescriptorTraitBold))
85 style =
"Bold Italic";
86 else if (traits & UIFontDescriptorTraitItalic)
88 else if (traits & UIFontDescriptorTraitBold)
91 newFont = QFontDatabase::font(family, style, size);
94 m_fontDialog->updateCurrentFont(newFont);
95 emit m_fontDialog->currentFontChanged(newFont);
100- (
void)fontPickerViewControllerDidPickFont:(UIFontPickerViewController *)viewController
103 emit m_fontDialog->accept();
106- (
void)fontPickerViewControllerDidCancel:(UIFontPickerViewController *)viewController
108 Q_UNUSED(viewController);
109 emit m_fontDialog->reject();
113- (
void)presentationControllerDidDismiss:(UIPresentationController *)presentationController
115 Q_UNUSED(presentationController);
116 emit m_fontDialog->reject();
121QIOSFontDialog::QIOSFontDialog()
122 : m_viewController(
nullptr)
126QIOSFontDialog::~QIOSFontDialog()
131void QIOSFontDialog::exec()
133 m_eventLoop.exec(QEventLoop::DialogExec);
136bool QIOSFontDialog::show(Qt::WindowFlags windowFlags, Qt::WindowModality windowModality, QWindow *parent)
138 Q_UNUSED(windowFlags);
139 Q_UNUSED(windowModality);
141 if (!m_viewController) {
142 m_viewController = [[QIOSFontDialogController alloc] initWithQIOSFontDialog:
this];
143 [m_viewController setQFont:m_currentFont];
146 if (windowModality == Qt::ApplicationModal || windowModality == Qt::WindowModal)
147 m_viewController.modalInPresentation = YES;
149 UIWindow *window = presentationWindow(parent);
154 if (window.rootViewController.presentedViewController)
157 [window.rootViewController presentViewController:m_viewController animated:YES completion:nil];
162void QIOSFontDialog::hide()
164 [m_viewController dismissViewControllerAnimated:YES completion:nil];
165 [m_viewController release];
166 m_viewController =
nullptr;
167 if (m_eventLoop.isRunning())
171void QIOSFontDialog::setCurrentFont(
const QFont &font)
173 if (m_currentFont == font)
176 m_currentFont = font;
177 if (m_viewController)
178 [m_viewController setQFont:font];
181QFont QIOSFontDialog::currentFont()
const
183 return m_currentFont;
186void QIOSFontDialog::updateCurrentFont(
const QFont &font)
188 m_currentFont = font;