Mercurial > dwindows
changeset 2668:917f2d1f9cae
Android: Implement dw_window_destroy() and try to add a back button to
secondary windows that will call windowDestroy() on them when pressed.
author | bsmith@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Sun, 17 Oct 2021 00:34:16 +0000 |
parents | 2ae70678c845 |
children | 2ad924c6493d |
files | android/DWindows.kt android/dw.cpp |
diffstat | 2 files changed, 78 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/android/DWindows.kt Fri Oct 15 23:22:23 2021 +0000 +++ b/android/DWindows.kt Sun Oct 17 00:34:16 2021 +0000 @@ -969,6 +969,17 @@ return false } + override fun onBackPressed() { + if(windowLayout != null) { + val adapter: DWTabViewPagerAdapter = windowLayout!!.adapter as DWTabViewPagerAdapter + val index = windowLayout!!.currentItem + + if (index > 0) { + windowDestroy(adapter.viewList[index]) + } + } + } + // These are the Android calls to actually create the UI... // forwarded from the C Dynamic Windows API @@ -1417,6 +1428,12 @@ if(windowDefault[index] != null) { windowDefault[index]?.requestFocus() } + // Add or remove a back button depending on the visible window + if(index > 0) { + this.actionBar?.setDisplayHomeAsUpEnabled(true) + } else { + this.actionBar?.setDisplayHomeAsUpEnabled(false) + } // Invalidate the menu, so it gets updated for the new window invalidateOptionsMenu() } @@ -1440,6 +1457,52 @@ } } + fun windowDestroy(window: View): Int { + var retval: Int = 1 // DW_ERROR_GENERAL + + if(windowLayout != null) { + waitOnUiThread { + val adapter: DWTabViewPagerAdapter = windowLayout!!.adapter as DWTabViewPagerAdapter + val index = adapter.viewList.indexOf(window) + + // We need to have at least 1 window... + // so only destroy secondary windows + if(index > 0) { + val newindex = index - 1 + val newwindow = adapter.viewList[newindex] + + // Make sure the previous window is visible... + // not sure if we should search the list for a visible + // window or force it visible. Forcing visible for now. + if(newwindow.visibility != View.VISIBLE) { + newwindow.visibility = View.VISIBLE + } + // Switch to the previous window + windowSwitchWindow(newindex) + + // Update our window list + adapter.viewList.removeAt(index) + windowTitles.removeAt(index) + windowMenuBars.removeAt(index) + windowStyles.removeAt(index) + windowDefault.removeAt(index) + + retval = 0 // DW_ERROR_NONE + } else { + // If we are removing an individual widget, + // find the parent layout and remove it. + if(window.parent is ViewGroup) { + val group = window.parent as ViewGroup + + group.removeView(window) + retval = 0 // DW_ERROR_NONE + } + } + } + } + return retval + } + fun clipboardGetText(): String { val cm: ClipboardManager = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager val clipdata = cm.primaryClip
--- a/android/dw.cpp Fri Oct 15 23:22:23 2021 +0000 +++ b/android/dw.cpp Sun Oct 17 00:34:16 2021 +0000 @@ -5501,7 +5501,21 @@ */ int API dw_window_destroy(HWND handle) { - return DW_ERROR_GENERAL; + JNIEnv *env; + int retval = DW_ERROR_GENERAL; + + if(handle && (env = (JNIEnv *)pthread_getspecific(_dw_env_key))) + { + // First get the class that contains the method you need to call + jclass clazz = _dw_find_class(env, DW_CLASS_NAME); + // Get the method that you want to call + jmethodID windowDestroy = env->GetMethodID(clazz, "windowDestroy", + "(Landroid/view/View;)I"); + // Call the method on the object + retval = env->CallIntMethod(_dw_obj, windowDestroy, handle); + _dw_jni_check_exception(env); + } + return retval; } /*