7#include <private/qquickitem_p.h>
9#include <QtCore/qmetaobject.h>
11#include <QtGui/qguiapplication.h>
13#include <QtQml/qqmlengine.h>
14#include <QtQml/qqmlcontext.h>
15#include <QtQml/qqmlcomponent.h>
20QScopedPointer<QQuickItem> QQuickFluentWinUI3FocusFrame::m_focusFrame;
22QQuickFluentWinUI3FocusFrame::QQuickFluentWinUI3FocusFrame()
24 connect(qGuiApp, &QGuiApplication::focusObjectChanged,
this, [
this](QObject *focusObject){
25 if (QQuickControl *control = qobject_cast<QQuickControl *>(focusObject);
26 control && (control->focusReason() == Qt::FocusReason::TabFocusReason
27 || control->focusReason() == Qt::FocusReason::BacktabFocusReason)) {
35QQuickItem *QQuickFluentWinUI3FocusFrame::createFocusFrame(QQmlContext *context)
37 QQmlComponent component(context->engine(),
"QtQuick.Controls.FluentWinUI3.impl",
"FocusFrame");
38 auto frame = qobject_cast<QQuickItem *>(component.create());
44void QQuickFluentWinUI3FocusFrame::moveToItem(QQuickControl *item)
47 const auto context = QQmlEngine::contextForObject(item);
51 if (!context || !context->engine())
53 m_focusFrame.reset(createFocusFrame(context));
55 qWarning() <<
"Failed to create FocusFrame";
58 QQuickItemPrivate::get(m_focusFrame.get())->setTransparentForPositioner(
true);
61 const auto target = getFocusTarget(item);
62 QMetaObject::invokeMethod(m_focusFrame.data(),
"moveToItem",
63 Q_ARG(QVariant, QVariant::fromValue(target)));
66QQuickControl *QQuickFluentWinUI3FocusFrame::getFocusTarget(QQuickControl *focusItem)
const
71 const auto parentItem = focusItem->parentItem();
77 const auto proxy = focusItem->property(
"__focusFrameControl").value<QQuickControl *>();
78 const auto control = proxy ? proxy : focusItem;
79 auto target = control->property(
"__focusFrameTarget").value<QQuickControl *>();
86#include "moc_qquickfluentwinui3focusframe_p.cpp"
Combined button and popup list for selecting options.