Resolve navigation parent control in popup view before show
This commit is contained in:
parent
e927d49d99
commit
ec4ea46069
4 changed files with 61 additions and 29 deletions
|
@ -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 {
|
||||
|
|
|
@ -75,6 +75,8 @@ void DialogView::exec()
|
|||
{
|
||||
open();
|
||||
m_loop.exec();
|
||||
|
||||
activateNavigationParentControl();
|
||||
}
|
||||
|
||||
void DialogView::show()
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue