Resolve navigation parent control in popup view before show

This commit is contained in:
Eism 2022-03-24 16:20:49 +02:00 committed by Elnur Ismailzada
parent e927d49d99
commit ec4ea46069
4 changed files with 61 additions and 29 deletions

View file

@ -47,7 +47,6 @@ PopupView {
x: (root.parent.width / 2) - (root.width / 2)
y: root.parent.height
property bool isDoActiveParentOnClose: true
property bool isCloseByEscape: true
property NavigationSection navigationSection: NavigationSection {
id: navSec
@ -75,9 +74,6 @@ PopupView {
onClosed: {
rootContainer.focus = false
if (root.isDoActiveParentOnClose && root.navigationParentControl) {
root.navigationParentControl.requestActive()
}
}
contentItem: FocusScope {

View file

@ -75,6 +75,8 @@ void DialogView::exec()
{
open();
m_loop.exec();
activateNavigationParentControl();
}
void DialogView::show()

View file

@ -174,22 +174,13 @@ void PopupView::open()
m_window->setResizable(m_resizable);
}
resolveNavigationParentControl();
QScreen* screen = resolveScreen();
m_window->show(screen, m_globalPos.toPoint(), m_openPolicy != OpenPolicy::NoActivateFocus);
m_globalPos = QPointF(); // invalidate
if (!m_navigationParentControl) {
ui::INavigationControl* ctrl = navigationController()->activeControl();
//! NOTE At the moment we have only qml navigation controls
QObject* qmlCtrl = dynamic_cast<QObject*>(ctrl);
setNavigationParentControl(qmlCtrl);
connect(qmlCtrl, &QObject::destroyed, this, [this]() {
setNavigationParentControl(nullptr);
});
}
qApp->installEventFilter(this);
emit isOpenedChanged();
@ -215,6 +206,8 @@ void PopupView::close()
qApp->removeEventFilter(this);
m_window->close();
activateNavigationParentControl();
}
void PopupView::toggleOpened()
@ -246,12 +239,17 @@ PopupView::ClosePolicy PopupView::closePolicy() const
return m_closePolicy;
}
QObject* PopupView::navigationParentControl() const
bool PopupView::isDoActiveParentOnClose() const
{
return m_isDoActiveParentOnClose;
}
mu::ui::INavigationControl* PopupView::navigationParentControl() const
{
return m_navigationParentControl;
}
void PopupView::setNavigationParentControl(QObject* navigationParentControl)
void PopupView::setNavigationParentControl(ui::INavigationControl* navigationParentControl)
{
if (m_navigationParentControl == navigationParentControl) {
return;
@ -528,6 +526,16 @@ void PopupView::setAnchorItem(QQuickItem* anchorItem)
emit anchorItemChanged(m_anchorItem);
}
void PopupView::setIsDoActiveParentOnClose(bool isDoActiveParentOnClose)
{
if (m_isDoActiveParentOnClose == isDoActiveParentOnClose) {
return;
}
m_isDoActiveParentOnClose = isDoActiveParentOnClose;
emit isDoActiveParentOnCloseChanged(m_isDoActiveParentOnClose);
}
QVariantMap PopupView::ret() const
{
return m_ret;
@ -712,6 +720,28 @@ QRectF PopupView::anchorGeometry() const
return geometry;
}
void PopupView::resolveNavigationParentControl()
{
ui::INavigationControl* ctrl = navigationController()->activeControl();
setNavigationParentControl(ctrl);
//! NOTE At the moment we have only qml navigation controls
QObject* qmlCtrl = dynamic_cast<QObject*>(ctrl);
if (qmlCtrl) {
connect(qmlCtrl, &QObject::destroyed, this, [this]() {
setNavigationParentControl(nullptr);
});
}
}
void PopupView::activateNavigationParentControl()
{
if (m_isDoActiveParentOnClose && m_navigationParentControl) {
m_navigationParentControl->requestActive();
}
}
int PopupView::contentWidth() const
{
return m_contentWidth;

View file

@ -65,14 +65,8 @@ class PopupView : public QObject, public QQmlParserStatus
Q_PROPERTY(OpenPolicy openPolicy READ openPolicy WRITE setOpenPolicy NOTIFY openPolicyChanged)
Q_PROPERTY(ClosePolicy closePolicy READ closePolicy WRITE setClosePolicy NOTIFY closePolicyChanged)
//! NOTE We use QObject (instead ui::NavigationControl) for avoid add UI module dependency at link time.
//! Itself not bad for uicomponents, but we have dependency uicomponents - instruments - libmscore - imports - tests
//! So, add ui dependency is bad and problems with compilation
Q_PROPERTY(QObject * navigationParentControl
READ navigationParentControl
WRITE setNavigationParentControl
NOTIFY navigationParentControlChanged
)
Q_PROPERTY(
bool isDoActiveParentOnClose READ isDoActiveParentOnClose WRITE setIsDoActiveParentOnClose NOTIFY isDoActiveParentOnCloseChanged)
//! NOTE Used for dialogs, but be here so that dialogs and just popups have one api
Q_PROPERTY(QString title READ title WRITE setTitle NOTIFY titleChanged)
@ -123,7 +117,9 @@ public:
OpenPolicy openPolicy() const;
ClosePolicy closePolicy() const;
QObject* navigationParentControl() const;
bool isDoActiveParentOnClose() const;
ui::INavigationControl* navigationParentControl() const;
bool isOpened() const;
@ -153,7 +149,7 @@ public slots:
void setLocalY(qreal y);
void setOpenPolicy(OpenPolicy openPolicy);
void setClosePolicy(ClosePolicy closePolicy);
void setNavigationParentControl(QObject* parentNavigationControl);
void setNavigationParentControl(ui::INavigationControl* parentNavigationControl);
void setObjectId(QString objectId);
void setTitle(QString title);
void setModal(bool modal);
@ -167,6 +163,8 @@ public slots:
void setShowArrow(bool showArrow);
void setAnchorItem(QQuickItem* anchorItem);
void setIsDoActiveParentOnClose(bool isDoActiveParentOnClose);
signals:
void parentItemChanged();
void contentItemChanged();
@ -175,7 +173,7 @@ signals:
void yChanged(qreal y);
void openPolicyChanged(OpenPolicy openPolicy);
void closePolicyChanged(ClosePolicy closePolicy);
void navigationParentControlChanged(QObject* navigationParentControl);
void navigationParentControlChanged(ui::INavigationControl* navigationParentControl);
void objectIdChanged(QString objectId);
void titleChanged(QString title);
void modalChanged(bool modal);
@ -197,6 +195,8 @@ signals:
void contentWidthChanged();
void contentHeightChanged();
void isDoActiveParentOnCloseChanged(bool isDoActiveParentOnClose);
private slots:
void onApplicationStateChanged(Qt::ApplicationState state);
@ -228,6 +228,9 @@ protected:
QRectF anchorGeometry() const;
void resolveNavigationParentControl();
void activateNavigationParentControl();
IPopupWindow* m_window = nullptr;
QQuickItem* m_contentItem = nullptr;
@ -240,7 +243,8 @@ protected:
QPointF m_globalPos;
OpenPolicy m_openPolicy = OpenPolicy::Default;
ClosePolicy m_closePolicy = ClosePolicy::CloseOnPressOutsideParent;
QObject* m_navigationParentControl = nullptr;
bool m_isDoActiveParentOnClose = true;
ui::INavigationControl* m_navigationParentControl = nullptr;
QString m_objectId;
QString m_title;
bool m_modal = true;