# HG changeset patch # User bsmith@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1634147649 0 # Node ID 4f2d433747e230109a3cd0d36e1e4b5431fbfd00 # Parent aca4b56f50dd82f035ec5247ce547a5712bdd48e Android: Rewrite the menubar code for multi-window support. This provides the necessary framework to switch out the menu in the action bar based on which window is currently visible in the View Pager. diff -r aca4b56f50dd -r 4f2d433747e2 android/DWindows.kt --- a/android/DWindows.kt Tue Oct 12 23:04:13 2021 +0000 +++ b/android/DWindows.kt Wed Oct 13 17:54:09 2021 +0000 @@ -453,27 +453,36 @@ var children = mutableListOf() var id: Int = 0 - fun createMenu(newmenu: Menu?) { - if(menu == null) { - menu = newmenu + fun createMenu(newmenu: Menu?, recreate: Boolean) { + var refresh = recreate + + if(newmenu != null) { + if(newmenu != menu) { + menu = newmenu + refresh = true + } } if(menu != null) { var group = 0 + if(refresh) { + menu!!.clear() + } + // Enable group dividers for separators MenuCompat.setGroupDividerEnabled(menu, true) for (menuitem in children) { // Submenus on Android can't have submenus, so stop at depth 1 if (menuitem.submenu != null && menu !is SubMenu) { - if(menuitem.submenuitem == null) { + if(menuitem.submenuitem == null || refresh) { menuitem.submenuitem = menu?.addSubMenu(group, menuitem.id, 0, menuitem.title) } - menuitem.submenu!!.createMenu(menuitem.submenuitem) + menuitem.submenu!!.createMenu(menuitem.submenuitem, refresh) } else if(menuitem.submenu == null) { if(menuitem.title!!.isEmpty()) { group += 1 - } else if(menuitem.menuitem == null) { + } else if(menuitem.menuitem == null || refresh) { menuitem.menuitem = menu?.add(group, menuitem.id, 0, menuitem.title) menuitem.menuitem!!.isCheckable = menuitem.check menuitem.menuitem!!.isChecked = menuitem.checked @@ -776,7 +785,6 @@ var lastClickView: View? = null private var paint = Paint() private var bgcolor: Int? = null - private var menuBar: DWMenu? = null private var fileURI: Uri? = null private var fileLock = ReentrantLock() private var fileCond = threadLock.newCondition() @@ -920,21 +928,41 @@ } override fun onCreateOptionsMenu(menu: Menu?): Boolean { - if(menuBar == null) { - menuBar = DWMenu() - menuBar!!.menu = menu + if(windowLayout != null) { + val index = windowLayout!!.currentItem + + if (windowMenuBars.count() > 0) { + var menuBar = windowMenuBars[index] + + if(menuBar == null) { + menuBar = DWMenu() + windowMenuBars[index] = menuBar + } + menuBar!!.menu = menu + return super.onCreateOptionsMenu(menu) + } } - return super.onCreateOptionsMenu(menu) + return false } override fun onPrepareOptionsMenu(menu: Menu?): Boolean { - if(menuBar != null) { - menuBar!!.createMenu(menu) - } else { - menuBar = DWMenu() - menuBar!!.createMenu(menu) + if(windowLayout != null) { + val index = windowLayout!!.currentItem + + if (windowMenuBars.count() > 0) { + var menuBar = windowMenuBars[index] + + if(menuBar != null) { + menuBar!!.createMenu(menu, true) + } else { + menuBar = DWMenu() + menuBar!!.createMenu(menu, true) + windowMenuBars[index] = menuBar + } + return super.onPrepareOptionsMenu(menu) + } } - return super.onPrepareOptionsMenu(menu) + return false } // These are the Android calls to actually create the UI... @@ -957,14 +985,26 @@ runOnUiThread { val popup = PopupMenu(this, anchor) - menu.createMenu(popup.menu) + menu.createMenu(popup.menu, false) popup.show() } } fun menuBarNew(location: View): DWMenu? { - // TODO: Make sure location is this activity + var menuBar: DWMenu? = null + + if(windowLayout != null) { + waitOnUiThread { + val adapter: DWTabViewPagerAdapter = windowLayout!!.adapter as DWTabViewPagerAdapter + val index = adapter.viewList.indexOf(location) + + if (index != -1) { + menuBar = DWMenu() + windowMenuBars[index] = menuBar + } + } + } return menuBar } @@ -1368,6 +1408,7 @@ if(state != 0) { windowLayout!!.setCurrentItem(index, true) } + invalidateOptionsMenu() } if(state != 0 && defaultItem != null) { defaultItem.requestFocus()