6#include <qpa/qplatformtheme.h>
21QIOSMenu *QIOSMenu::m_currentMenu =
nullptr;
34- (instancetype)initWithVisibleMenuItems:(
const QIOSMenuItemList &)visibleMenuItems
36 if (self = [super
init]) {
37 [
self setVisibleMenuItems:visibleMenuItems];
38 [[NSNotificationCenter defaultCenter]
40 selector:@selector(menuClosed)
41 name:UIMenuControllerDidHideMenuNotification object:nil];
49 [[NSNotificationCenter defaultCenter]
51 name:UIMenuControllerDidHideMenuNotification object:nil];
57 m_visibleMenuItems = visibleMenuItems;
58 NSMutableArray<UIMenuItem *> *menuItemArray = [NSMutableArray<UIMenuItem *> arrayWithCapacity:m_visibleMenuItems.size()];
64 for (
int i = 0;
i < m_visibleMenuItems.count(); ++
i) {
66 SEL sel = NSSelectorFromString([NSString stringWithFormat:
@"%@%i:",
kSelectorPrefix,
i]);
67 [menuItemArray addObject:[[[UIMenuItem alloc] initWithTitle:item->m_text.toNSString() action:sel] autorelease]];
69 [UIMenuController sharedMenuController].menuItems = menuItemArray;
70 if ([UIMenuController sharedMenuController].menuVisible)
71 [[UIMenuController sharedMenuController] setMenuVisible:YES animated:NO];
79- (
id)targetForAction:(SEL)action withSender:(
id)sender
82 BOOL containsPrefix = ([NSStringFromSelector(action) rangeOfString:kSelectorPrefix].location != NSNotFound);
83 return containsPrefix ? self : 0;
86- (NSMethodSignature *)methodSignatureForSelector:(SEL)
selector
91 return [
super methodSignatureForSelector:@selector(methodSignatureForSelector:)];
94- (
void)forwardInvocation:(NSInvocation *)invocation
98 NSString *
selector = NSStringFromSelector(invocation.selector);
100 NSInteger selectedIndex = [[selector substringWithRange:range] integerValue];
108@interface QUIPickerView : UIPickerView <UIPickerViewDelegate, UIPickerViewDataSource>
110@property(retain) UIToolbar *toolbar;
123 [
self setVisibleMenuItems:visibleMenuItems selectItem:selectItem];
125 self.autoresizingMask = UIViewAutoresizingFlexibleWidth;
126 self.toolbar = [[[UIToolbar alloc] init] autorelease];
127 self.toolbar.frame.
size = [
self.toolbar sizeThatFits:self.bounds.size];
128 self.toolbar.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
130 UIBarButtonItem *spaceButton = [[[UIBarButtonItem alloc]
131 initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
132 target:self action:@selector(closeMenu)] autorelease];
133 UIBarButtonItem *cancelButton = [[[UIBarButtonItem alloc]
134 initWithBarButtonSystemItem:UIBarButtonSystemItemCancel
135 target:self action:@selector(cancelMenu)] autorelease];
136 UIBarButtonItem *doneButton = [[[UIBarButtonItem alloc]
137 initWithBarButtonSystemItem:UIBarButtonSystemItemDone
138 target:self action:@selector(closeMenu)] autorelease];
139 [
self.toolbar setItems:@[cancelButton, spaceButton, doneButton]];
141 [
self setDelegate:self];
142 [
self setDataSource:self];
143 [
self selectRow:m_selectedRow inComponent:0 animated:false];
144 [
self listenForKeyboardWillHideNotification:YES];
152 m_visibleMenuItems = visibleMenuItems;
156 [
self reloadAllComponents];
159- (
void)listenForKeyboardWillHideNotification:(BOOL)listen
162 [[NSNotificationCenter defaultCenter]
164 selector:@selector(cancelMenu)
165 name:@"UIKeyboardWillHideNotification" object:nil];
167 [[NSNotificationCenter defaultCenter]
169 name:@"UIKeyboardWillHideNotification" object:nil];
175 [
self listenForKeyboardWillHideNotification:NO];
180- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(
NSInteger)row forComponent:(
NSInteger)component
184 return m_visibleMenuItems.at(
row)->m_text.toNSString();
187- (
NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
193- (
NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(
NSInteger)component
197 return m_visibleMenuItems.length();
209 if (!m_visibleMenuItems.isEmpty())
260#ifndef QT_NO_SHORTCUT
278 , m_menuType(DefaultMenu)
279 , m_effectiveMenuType(DefaultMenu)
282 , m_menuController(0)
300 if (m_currentMenu ==
this)
307 if (m_currentMenu ==
this)
313 if (m_currentMenu !=
this)
316 switch (m_effectiveMenuType) {
318 [
m_menuController setVisibleMenuItems:filterFirstResponderActions(visibleMenuItems())];
321 [
m_pickerView setVisibleMenuItems:visibleMenuItems() selectItem:m_targetItem];
352 menu->setMenuType(m_effectiveMenuType);
353 menu->showPopup(m_parentWindow, m_targetRect, 0);
359 if (m_currentMenu ==
this || !parentWindow)
364 m_parentWindow =
const_cast<QWindow *
>(parentWindow);
365 m_targetRect = targetRect;
368 if (!m_parentWindow->isActive())
369 m_parentWindow->requestActivate();
371 if (m_currentMenu && m_currentMenu !=
this)
374 m_currentMenu =
this;
375 m_effectiveMenuType = m_menuType;
378 switch (m_effectiveMenuType) {
380 toggleShowUsingUIMenuController(
true);
383 toggleShowUsingUIPickerView(
true);
392 if (m_currentMenu !=
this)
399 switch (m_effectiveMenuType) {
401 toggleShowUsingUIMenuController(
false);
404 toggleShowUsingUIPickerView(
false);
408 m_currentMenu =
nullptr;
412void QIOSMenu::toggleShowUsingUIMenuController(
bool show)
416 m_menuController = [[
QUIMenuController alloc] initWithVisibleMenuItems:filterFirstResponderActions(visibleMenuItems())];
423 [[UIMenuController sharedMenuController] setMenuVisible:NO animated:YES];
424 [m_menuController release];
425 m_menuController =
nullptr;
429void QIOSMenu::toggleShowUsingUIPickerView(
bool show)
431 static QObject *focusObjectWithPickerView =
nullptr;
435 m_pickerView = [[
QUIPickerView alloc] initWithVisibleMenuItems:visibleMenuItems() selectItem:m_targetItem];
437 Q_ASSERT(!focusObjectWithPickerView);
438 focusObjectWithPickerView =
qApp->focusWindow()->focusObject();
442 Q_ASSERT(focusObjectWithPickerView);
444 focusObjectWithPickerView =
nullptr;
447 [m_pickerView listenForKeyboardWillHideNotification:NO];
448 [m_pickerView release];
449 m_pickerView =
nullptr;
461 obj->event(queryEvent);
481 std::copy_if(m_menuItems.
begin(), m_menuItems.
end(), std::back_inserter(visibleMenuItems),
482 [](
QIOSMenuItem *
item) { return item->m_enabled && item->m_visible && !item->m_separator; });
483 return visibleMenuItems;
494 UIResponder *responder = [UIResponder currentFirstResponder];
496 for (
int i = 0;
i < menuItems.
count(); ++
i) {
498#ifndef QT_NO_SHORTCUT
513 filteredMenuItems.
append(menuItem);
515 return filteredMenuItems;
518void QIOSMenu::repositionMenu()
520 switch (m_effectiveMenuType) {
522 UIView *
view =
reinterpret_cast<UIView *
>(m_parentWindow->winId());
523 [[UIMenuController sharedMenuController] setTargetRect:m_targetRect.toCGRect() inView:view];
524 [[UIMenuController sharedMenuController] setMenuVisible:YES animated:YES];
533 if (position < 0 || position >= m_menuItems.
size())
540 for (
int i = 0;
i < m_menuItems.
size(); ++
i) {
void focusObjectChanged(QObject *focusObject)
This signal is emitted when final receiver of events tied to focus is changed.
The QKeySequence class encapsulates a key sequence as used by shortcuts.
qsizetype size() const noexcept
iterator insert(qsizetype i, parameter_type t)
bool removeOne(const AT &t)
const_reference at(qsizetype i) const noexcept
qsizetype count() const noexcept
void reserve(qsizetype size)
void append(parameter_type t)
iterator insert(const Key &key, const T &value)
void installEventFilter(QObject *filterObj)
Installs an event filter filterObj on this object.
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
virtual bool eventFilter(QObject *watched, QEvent *event)
Filters events if this object has been installed as an event filter for the watched object.
void removeEventFilter(QObject *obj)
Removes an event filter object obj from this object.
\inmodule QtCore\reentrant
\macro QT_RESTRICTED_CAST_FROM_ASCII
qsizetype size() const
Returns the number of characters in this string.
QMap< QString, QVariant > toMap() const
Returns the variant as a QVariantMap if the variant has type() \l QMetaType::QVariantMap.
static auto fromValue(T &&value) noexcept(std::is_nothrow_copy_constructible_v< T > &&Private::CanUseInternalSpace< T >) -> std::enable_if_t< std::conjunction_v< std::is_copy_constructible< T >, std::is_destructible< T > >, QVariant >
static jboolean cut(JNIEnv *, jobject)
static jboolean copy(JNIEnv *, jobject)
static jboolean paste(JNIEnv *, jobject)
static jboolean selectAll(JNIEnv *, jobject)
AudioChannelLayoutTag tag
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
static bool isSeparator(char c)
const char kImePlatformDataInputView[]
const char kImePlatformDataInputAccessoryView[]
const char kImePlatformDataHideShortcutsBar[]
GLenum GLenum GLsizei const GLuint GLboolean enabled
GLenum GLenum GLsizei void * row
static qreal component(const QPointF &point, unsigned int i)
static qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)
static QT_BEGIN_NAMESPACE void init(QTextBoundaryFinder::BoundaryType type, QStringView str, QCharAttributes *attributes)
QFileSelector selector
[1]
myObject disconnect()
[26]
qsizetype indexOf(const AT &t, qsizetype from=0) const noexcept