comparison android/DWindows.kt @ 2666:4f2d433747e2

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.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Wed, 13 Oct 2021 17:54:09 +0000
parents aca4b56f50dd
children 2ae70678c845
comparison
equal deleted inserted replaced
2665:aca4b56f50dd 2666:4f2d433747e2
451 class DWMenu { 451 class DWMenu {
452 var menu: Menu? = null 452 var menu: Menu? = null
453 var children = mutableListOf<DWMenuItem>() 453 var children = mutableListOf<DWMenuItem>()
454 var id: Int = 0 454 var id: Int = 0
455 455
456 fun createMenu(newmenu: Menu?) { 456 fun createMenu(newmenu: Menu?, recreate: Boolean) {
457 if(menu == null) { 457 var refresh = recreate
458 menu = newmenu 458
459 if(newmenu != null) {
460 if(newmenu != menu) {
461 menu = newmenu
462 refresh = true
463 }
459 } 464 }
460 if(menu != null) { 465 if(menu != null) {
461 var group = 0 466 var group = 0
467
468 if(refresh) {
469 menu!!.clear()
470 }
462 471
463 // Enable group dividers for separators 472 // Enable group dividers for separators
464 MenuCompat.setGroupDividerEnabled(menu, true) 473 MenuCompat.setGroupDividerEnabled(menu, true)
465 474
466 for (menuitem in children) { 475 for (menuitem in children) {
467 // Submenus on Android can't have submenus, so stop at depth 1 476 // Submenus on Android can't have submenus, so stop at depth 1
468 if (menuitem.submenu != null && menu !is SubMenu) { 477 if (menuitem.submenu != null && menu !is SubMenu) {
469 if(menuitem.submenuitem == null) { 478 if(menuitem.submenuitem == null || refresh) {
470 menuitem.submenuitem = menu?.addSubMenu(group, menuitem.id, 0, menuitem.title) 479 menuitem.submenuitem = menu?.addSubMenu(group, menuitem.id, 0, menuitem.title)
471 } 480 }
472 menuitem.submenu!!.createMenu(menuitem.submenuitem) 481 menuitem.submenu!!.createMenu(menuitem.submenuitem, refresh)
473 } else if(menuitem.submenu == null) { 482 } else if(menuitem.submenu == null) {
474 if(menuitem.title!!.isEmpty()) { 483 if(menuitem.title!!.isEmpty()) {
475 group += 1 484 group += 1
476 } else if(menuitem.menuitem == null) { 485 } else if(menuitem.menuitem == null || refresh) {
477 menuitem.menuitem = menu?.add(group, menuitem.id, 0, menuitem.title) 486 menuitem.menuitem = menu?.add(group, menuitem.id, 0, menuitem.title)
478 menuitem.menuitem!!.isCheckable = menuitem.check 487 menuitem.menuitem!!.isCheckable = menuitem.check
479 menuitem.menuitem!!.isChecked = menuitem.checked 488 menuitem.menuitem!!.isChecked = menuitem.checked
480 menuitem.menuitem!!.isEnabled = menuitem.enabled 489 menuitem.menuitem!!.isEnabled = menuitem.enabled
481 menuitem.menuitem!!.setOnMenuItemClickListener { item: MenuItem? -> 490 menuitem.menuitem!!.setOnMenuItemClickListener { item: MenuItem? ->
774 var notificationID: Int = 0 783 var notificationID: Int = 0
775 var darkMode: Int = -1 784 var darkMode: Int = -1
776 var lastClickView: View? = null 785 var lastClickView: View? = null
777 private var paint = Paint() 786 private var paint = Paint()
778 private var bgcolor: Int? = null 787 private var bgcolor: Int? = null
779 private var menuBar: DWMenu? = null
780 private var fileURI: Uri? = null 788 private var fileURI: Uri? = null
781 private var fileLock = ReentrantLock() 789 private var fileLock = ReentrantLock()
782 private var fileCond = threadLock.newCondition() 790 private var fileCond = threadLock.newCondition()
783 // Lists of data for our Windows 791 // Lists of data for our Windows
784 private var windowTitles = mutableListOf<String?>() 792 private var windowTitles = mutableListOf<String?>()
918 eventHandlerInt(window, DWEvent.CONFIGURE, width, height, 0, 0) 926 eventHandlerInt(window, DWEvent.CONFIGURE, width, height, 0, 0)
919 } 927 }
920 } 928 }
921 929
922 override fun onCreateOptionsMenu(menu: Menu?): Boolean { 930 override fun onCreateOptionsMenu(menu: Menu?): Boolean {
923 if(menuBar == null) { 931 if(windowLayout != null) {
924 menuBar = DWMenu() 932 val index = windowLayout!!.currentItem
925 menuBar!!.menu = menu 933
926 } 934 if (windowMenuBars.count() > 0) {
927 return super.onCreateOptionsMenu(menu) 935 var menuBar = windowMenuBars[index]
936
937 if(menuBar == null) {
938 menuBar = DWMenu()
939 windowMenuBars[index] = menuBar
940 }
941 menuBar!!.menu = menu
942 return super.onCreateOptionsMenu(menu)
943 }
944 }
945 return false
928 } 946 }
929 947
930 override fun onPrepareOptionsMenu(menu: Menu?): Boolean { 948 override fun onPrepareOptionsMenu(menu: Menu?): Boolean {
931 if(menuBar != null) { 949 if(windowLayout != null) {
932 menuBar!!.createMenu(menu) 950 val index = windowLayout!!.currentItem
933 } else { 951
934 menuBar = DWMenu() 952 if (windowMenuBars.count() > 0) {
935 menuBar!!.createMenu(menu) 953 var menuBar = windowMenuBars[index]
936 } 954
937 return super.onPrepareOptionsMenu(menu) 955 if(menuBar != null) {
956 menuBar!!.createMenu(menu, true)
957 } else {
958 menuBar = DWMenu()
959 menuBar!!.createMenu(menu, true)
960 windowMenuBars[index] = menuBar
961 }
962 return super.onPrepareOptionsMenu(menu)
963 }
964 }
965 return false
938 } 966 }
939 967
940 // These are the Android calls to actually create the UI... 968 // These are the Android calls to actually create the UI...
941 // forwarded from the C Dynamic Windows API 969 // forwarded from the C Dynamic Windows API
942 970
955 } 983 }
956 984
957 runOnUiThread { 985 runOnUiThread {
958 val popup = PopupMenu(this, anchor) 986 val popup = PopupMenu(this, anchor)
959 987
960 menu.createMenu(popup.menu) 988 menu.createMenu(popup.menu, false)
961 popup.show() 989 popup.show()
962 } 990 }
963 } 991 }
964 992
965 fun menuBarNew(location: View): DWMenu? 993 fun menuBarNew(location: View): DWMenu?
966 { 994 {
967 // TODO: Make sure location is this activity 995 var menuBar: DWMenu? = null
996
997 if(windowLayout != null) {
998 waitOnUiThread {
999 val adapter: DWTabViewPagerAdapter = windowLayout!!.adapter as DWTabViewPagerAdapter
1000 val index = adapter.viewList.indexOf(location)
1001
1002 if (index != -1) {
1003 menuBar = DWMenu()
1004 windowMenuBars[index] = menuBar
1005 }
1006 }
1007 }
968 return menuBar 1008 return menuBar
969 } 1009 }
970 1010
971 fun menuNew(cid: Int): DWMenu 1011 fun menuNew(cid: Int): DWMenu
972 { 1012 {
1366 if (index != -1) { 1406 if (index != -1) {
1367 defaultItem = windowDefault[index] 1407 defaultItem = windowDefault[index]
1368 if(state != 0) { 1408 if(state != 0) {
1369 windowLayout!!.setCurrentItem(index, true) 1409 windowLayout!!.setCurrentItem(index, true)
1370 } 1410 }
1411 invalidateOptionsMenu()
1371 } 1412 }
1372 if(state != 0 && defaultItem != null) { 1413 if(state != 0 && defaultItem != null) {
1373 defaultItem.requestFocus() 1414 defaultItem.requestFocus()
1374 } 1415 }
1375 } 1416 }