7#include <private/qquickitem_p.h>
8#include <private/qquickstyleitem_p.h>
10#include <QtQml/qqmlcomponent.h>
11#include <QtQml/qqmlcontext.h>
12#include <QtQml/qqmlengine.h>
14#include <QtQuick/qquickitem.h>
16#include <QtGui/qguiapplication.h>
18#include <QtCore/qmetaobject.h>
23Q_LOGGING_CATEGORY(lcFocusFrame,
"qt.quick.controls.focusframe")
25QQuickFocusFrameDescription QQuickFocusFrameDescription::Invalid = {
nullptr, QQuickStyleMargins(), 0 };
26QScopedPointer<QQuickItem> QQuickFocusFrame::m_focusFrame;
28QQuickFocusFrame::QQuickFocusFrame()
30 connect(qGuiApp, &QGuiApplication::focusObjectChanged,
this, [
this](QObject *focusObject){
31 if (
auto item = qobject_cast<QQuickItem *>(focusObject))
38void QQuickFocusFrame::moveToItem(QQuickItem *item)
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;
108 if (QQuickStyleItem *styleItem = qobject_cast<QQuickStyleItem *>(item))
109 return { target, QQuickStyleMargins(styleItem->layoutMargins()), styleItem->focusFrameRadius() };
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());
118 return { target, QQuickStyleMargins(), radius };
123 qCDebug(lcFocusFrame) <<
"custom delegates in use, skip showing focus frame";
124 return QQuickFocusFrameDescription::Invalid;
Combined button and popup list for selecting options.