Mercurial > dwindows
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 } |