diff options
Diffstat (limited to 'src/plugins/platforms/ios/qioscolordialog.mm')
-rw-r--r-- | src/plugins/platforms/ios/qioscolordialog.mm | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/src/plugins/platforms/ios/qioscolordialog.mm b/src/plugins/platforms/ios/qioscolordialog.mm new file mode 100644 index 0000000000..6651b1791d --- /dev/null +++ b/src/plugins/platforms/ios/qioscolordialog.mm @@ -0,0 +1,159 @@ +// Copyright (C) 2022 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#import <UIKit/UIKit.h> + +#include <QtGui/qwindow.h> +#include <QDebug> + +#include <QtCore/private/qcore_mac_p.h> + +#include "qiosglobal.h" +#include "qioscolordialog.h" +#include "qiosintegration.h" + +@interface QIOSColorDialogController : UIColorPickerViewController <UIColorPickerViewControllerDelegate, + UIAdaptivePresentationControllerDelegate> +@end + +@implementation QIOSColorDialogController { + QIOSColorDialog *m_colorDialog; +} + +- (instancetype)initWithQIOSColorDialog:(QIOSColorDialog *)dialog +{ + if (self = [super init]) { + m_colorDialog = dialog; + self.delegate = self; + self.presentationController.delegate = self; + self.supportsAlpha = dialog->options()->testOption(QColorDialogOptions::ShowAlphaChannel); + } + return self; +} + +- (void)setQColor:(const QColor &)qColor +{ + UIColor *uiColor; + const QColor::Spec spec = qColor.spec(); + if (spec == QColor::Hsv) { + uiColor = [UIColor colorWithHue:qColor.hsvHueF() + saturation:qColor.hsvSaturationF() + brightness:qColor.valueF() + alpha:qColor.alphaF()]; + } else { + uiColor = [UIColor colorWithRed:qColor.redF() + green:qColor.greenF() + blue:qColor.blueF() + alpha:qColor.alphaF()]; + } + self.selectedColor = uiColor; +} + +- (void)updateQColor +{ + UIColor *color = self.selectedColor; + CGFloat red = 0, green = 0, blue = 0, alpha = 0; + + QColor newColor; + if ([color getRed:&red green:&green blue:&blue alpha:&alpha]) + newColor.setRgbF(red, green, blue, alpha); + else + qWarning() << "Incompatible color space"; + + + if (m_colorDialog) { + m_colorDialog->updateColor(newColor); + emit m_colorDialog->currentColorChanged(newColor); + } +} + +// ----------------------UIColorPickerViewControllerDelegate-------------------------- +- (void)colorPickerViewControllerDidSelectColor:(UIColorPickerViewController *)viewController +{ + Q_UNUSED(viewController); + [self updateQColor]; +} + +- (void)colorPickerViewControllerDidFinish:(UIColorPickerViewController *)viewController +{ + Q_UNUSED(viewController); + [self updateQColor]; + emit m_colorDialog->accept(); +} + +// ----------------------UIAdaptivePresentationControllerDelegate-------------------------- +- (void)presentationControllerDidDismiss:(UIPresentationController *)presentationController +{ + Q_UNUSED(presentationController); + emit m_colorDialog->reject(); +} + +@end + +QIOSColorDialog::QIOSColorDialog() + : m_viewController(nullptr) +{ +} + +QIOSColorDialog::~QIOSColorDialog() +{ + hide(); +} + +void QIOSColorDialog::exec() +{ + m_eventLoop.exec(QEventLoop::DialogExec); +} + +bool QIOSColorDialog::show(Qt::WindowFlags windowFlags, Qt::WindowModality windowModality, QWindow *parent) +{ + Q_UNUSED(windowFlags); + + if (!m_viewController) { + m_viewController = [[QIOSColorDialogController alloc] initWithQIOSColorDialog:this]; + if (m_currentColor.isValid()) + [m_viewController setQColor:m_currentColor]; + } + + if (windowModality == Qt::ApplicationModal || windowModality == Qt::WindowModal) + m_viewController.modalInPresentation = YES; + + UIWindow *window = presentationWindow(parent); + if (!window) + return false; + + // We can't present from view controller if already presenting + if (window.rootViewController.presentedViewController) + return false; + + [window.rootViewController presentViewController:m_viewController animated:YES completion:nil]; + + return true; +} + +void QIOSColorDialog::hide() +{ + [m_viewController dismissViewControllerAnimated:YES completion:nil]; + [m_viewController release]; + m_viewController = nullptr; + m_eventLoop.exit(); +} + +void QIOSColorDialog::setCurrentColor(const QColor &color) +{ + updateColor(color); + if (m_viewController) + [m_viewController setQColor:color]; +} + +QColor QIOSColorDialog::currentColor() const +{ + return m_currentColor; +} + +void QIOSColorDialog::updateColor(const QColor &color) +{ + m_currentColor = color; +} + + |