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>
17#include <QtQuick/qquickitem.h>
19#include "items/qquickstyleitem.h"
23Q_LOGGING_CATEGORY(lcFocusFrame,
"qt.quick.controls.focusframe")
25QQuickFocusFrameDescription QQuickFocusFrameDescription::Invalid = {
nullptr, QQuickStyleMargins(), 0 };
30 connect(qGuiApp, &QGuiApplication::focusObjectChanged,
this, [
this](QObject *focusObject){
31 if (
auto item = qobject_cast<QQuickItem *>(focusObject))
41 const auto context = QQmlEngine::contextForObject(item);
45 if (!context || !context->engine())
47 m_focusFrame.reset(createFocusFrame(context));
49 qWarning() <<
"Failed to create FocusFrame";
52 QQuickItemPrivate::get(m_focusFrame.get())->setTransparentForPositioner(
true);
55 const QQuickFocusFrameDescription &config = getDescriptionForItem(item);
56 QMetaObject::invokeMethod(m_focusFrame.data(),
"moveToItem",
57 Q_ARG(QVariant, QVariant::fromValue(config.target)),
58 Q_ARG(QVariant, QVariant::fromValue(config.margins)),
59 Q_ARG(QVariant, QVariant::fromValue(config.radius)));
62QQuickFocusFrameDescription
QQuickFocusFrame::getDescriptionForItem(QQuickItem *focusItem)
const
65 return QQuickFocusFrameDescription::Invalid;
67 qCDebug(lcFocusFrame) <<
"new focusobject:" << focusItem;
68 const auto parentItem = focusItem->parentItem();
70 return QQuickFocusFrameDescription::Invalid;
74 const auto proxy = focusItem->property(
"__focusFrameControl").value<QQuickItem *>();
75 const auto control = proxy ? proxy : focusItem;
76 auto target = control->property(
"__focusFrameTarget").value<QQuickItem *>();
77 qCDebug(lcFocusFrame) <<
"target:" << target;
78 qCDebug(lcFocusFrame) <<
"control:" << control;
93 return QQuickFocusFrameDescription::Invalid;
99 const auto styleItemProperty = control->property(
"__focusFrameStyleItem");
100 auto item = styleItemProperty.value<QQuickItem *>();
102 const auto styleItemProperty = control->property(
"background");
103 item = styleItemProperty.value<QQuickItem *>();
105 qCDebug(lcFocusFrame) <<
"styleItem:" << item;
107 return QQuickFocusFrameDescription::Invalid;
113 const QVariant focusFrameRadiusVariant = item->property(
"__focusFrameRadius");
114 if (focusFrameRadiusVariant.isValid()) {
115 qCDebug(lcFocusFrame) <<
"'focusFrameRadius' property found, showing a default focus frame";
116 const QStyleOption opt;
117 const qreal radius = qMax(0.0, focusFrameRadiusVariant.toReal());
123 qCDebug(lcFocusFrame) <<
"custom delegates in use, skip showing focus frame";
124 return QQuickFocusFrameDescription::Invalid;
QQuickStyleMargins layoutMargins() const