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
28 || control->focusReason() == Qt::FocusReason::OtherFocusReason)) {
36QQuickItem *QQuickFluentWinUI3FocusFrame::createFocusFrame(QQmlContext *context)
38 QQmlComponent component(context->engine(),
"QtQuick.Controls.FluentWinUI3.impl",
"FocusFrame");
39 auto frame = qobject_cast<QQuickItem *>(component.create());
45void QQuickFluentWinUI3FocusFrame::moveToItem(QQuickControl *item)
48 const auto context = QQmlEngine::contextForObject(item);
52 if (!context || !context->engine())
54 m_focusFrame.reset(createFocusFrame(context));
56 qWarning() <<
"Failed to create FocusFrame";
59 QQuickItemPrivate::get(m_focusFrame.get())->setTransparentForPositioner(
true);
62 const auto target = getFocusTarget(item);
63 QMetaObject::invokeMethod(m_focusFrame.data(),
"moveToItem",
64 Q_ARG(QVariant, QVariant::fromValue(target)));
67QQuickControl *QQuickFluentWinUI3FocusFrame::getFocusTarget(QQuickControl *focusItem)
const
72 const auto parentItem = focusItem->parentItem();
78 const auto proxy = focusItem->property(
"__focusFrameControl").value<QQuickControl *>();
79 const auto control = proxy ? proxy : focusItem;
80 auto target = control->property(
"__focusFrameTarget").value<QQuickControl *>();
87#include "moc_qquickfluentwinui3focusframe_p.cpp"