diff options
7 files changed, 104 insertions, 2 deletions
diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java index 9507d7eb3b..cddb06eff1 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java @@ -1102,4 +1102,33 @@ public class QtActivityDelegate m_layout.removeView(view); } } + + public void bringChildToFront(int id) + { + View view = m_surfaces.get(id); + if (view != null) { + final int index = m_layout.getChildCount() - m_nativeViews.size() - 1; + m_layout.moveChild(view, index < 0 ? 0 : index); + return; + } + + view = m_nativeViews.get(id); + if (view != null) + m_layout.moveChild(view, -1); + } + + public void bringChildToBack(int id) + { + View view = m_surfaces.get(id); + if (view != null) { + m_layout.moveChild(view, 0); + return; + } + + view = m_nativeViews.get(id); + if (view != null) { + final int index = m_layout.getChildCount() - m_nativeViews.size(); + m_layout.moveChild(view, index); + } + } } diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java b/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java index 058b10750f..4033866e6c 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtLayout.java @@ -205,8 +205,17 @@ public class QtLayout extends ViewGroup } } - public void bringChildFront(int child) + public void moveChild(View view, int index) { - bringChildToFront(getChildAt(child)); + if (view == null) + return; + + if (indexOfChild(view) == -1) + return; + + detachViewFromParent(view); + requestLayout(); + invalidate(); + attachViewToParent(view, index, view.getLayoutParams()); } } diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java index 8b0febe641..aba4cfa502 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java @@ -537,6 +537,26 @@ public class QtNative }); } + private static void bringChildToFront(final int id) + { + runAction(new Runnable() { + @Override + public void run() { + m_activityDelegate.bringChildToFront(id); + } + }); + } + + private static void bringChildToBack(final int id) + { + runAction(new Runnable() { + @Override + public void run() { + m_activityDelegate.bringChildToBack(id); + } + }); + } + private static void destroySurface(final int id) { runAction(new Runnable() { diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp index e068a43241..11f0bc5ffe 100644 --- a/src/plugins/platforms/android/androidjnimain.cpp +++ b/src/plugins/platforms/android/androidjnimain.cpp @@ -401,6 +401,28 @@ namespace QtAndroid surfaceId); } + void bringChildToFront(int surfaceId) + { + if (surfaceId == -1) + return; + + QJNIObjectPrivate::callStaticMethod<void>(m_applicationClass, + "bringChildToFront", + "(I)V", + surfaceId); + } + + void bringChildToBack(int surfaceId) + { + if (surfaceId == -1) + return; + + QJNIObjectPrivate::callStaticMethod<void>(m_applicationClass, + "bringChildToBack", + "(I)V", + surfaceId); + } + bool blockEventLoopsWhenSuspended() { static bool block = qgetenv("QT_BLOCK_EVENT_LOOPS_WHEN_SUSPENDED").toInt(); diff --git a/src/plugins/platforms/android/androidjnimain.h b/src/plugins/platforms/android/androidjnimain.h index 7f762c8108..01330ce283 100644 --- a/src/plugins/platforms/android/androidjnimain.h +++ b/src/plugins/platforms/android/androidjnimain.h @@ -64,6 +64,8 @@ namespace QtAndroid int insertNativeView(jobject view, const QRect &geometry); void setSurfaceGeometry(int surfaceId, const QRect &geometry); void destroySurface(int surfaceId); + void bringChildToFront(int surfaceId); + void bringChildToBack(int surfaceId); QWindow *topLevelWindowAt(const QPoint &globalPos); int desktopWidthPixels(); diff --git a/src/plugins/platforms/android/qandroidplatformforeignwindow.cpp b/src/plugins/platforms/android/qandroidplatformforeignwindow.cpp index af409d13a0..31c3614284 100644 --- a/src/plugins/platforms/android/qandroidplatformforeignwindow.cpp +++ b/src/plugins/platforms/android/qandroidplatformforeignwindow.cpp @@ -53,6 +53,24 @@ QAndroidPlatformForeignWindow::~QAndroidPlatformForeignWindow() QtAndroid::destroySurface(m_surfaceId); } +void QAndroidPlatformForeignWindow::lower() +{ + if (m_surfaceId == -1) + return; + + QAndroidPlatformWindow::lower(); + QtAndroid::bringChildToBack(m_surfaceId); +} + +void QAndroidPlatformForeignWindow::raise() +{ + if (m_surfaceId == -1) + return; + + QAndroidPlatformWindow::raise(); + QtAndroid::bringChildToFront(m_surfaceId); +} + void QAndroidPlatformForeignWindow::setGeometry(const QRect &rect) { QWindow *parent = window()->parent(); diff --git a/src/plugins/platforms/android/qandroidplatformforeignwindow.h b/src/plugins/platforms/android/qandroidplatformforeignwindow.h index 974ffbc376..df11c78b7c 100644 --- a/src/plugins/platforms/android/qandroidplatformforeignwindow.h +++ b/src/plugins/platforms/android/qandroidplatformforeignwindow.h @@ -45,6 +45,8 @@ class QAndroidPlatformForeignWindow : public QAndroidPlatformWindow public: explicit QAndroidPlatformForeignWindow(QWindow *window); ~QAndroidPlatformForeignWindow(); + void lower() Q_DECL_OVERRIDE; + void raise() Q_DECL_OVERRIDE; void setGeometry(const QRect &rect) Q_DECL_OVERRIDE; void setVisible(bool visible) Q_DECL_OVERRIDE; void applicationStateChanged(Qt::ApplicationState state) Q_DECL_OVERRIDE; |