changeset 2806:d7b6e19e44d2

Android: Add support for menu item handles in dw_window_set_style(). Also implement auto toggling of menu item checks. Only invalidate the menu after it is changed.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Wed, 20 Jul 2022 09:30:33 +0000
parents ebe139dc16dd
children 975df4680ff7
files android/DWindows.kt
diffstat 1 files changed, 54 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/android/DWindows.kt	Tue Jul 19 16:57:39 2022 +0000
+++ b/android/DWindows.kt	Wed Jul 20 09:30:33 2022 +0000
@@ -2050,6 +2050,11 @@
                         menuitem.menuitem!!.isChecked = menuitem.checked
                         menuitem.menuitem!!.isEnabled = menuitem.enabled
                         menuitem.menuitem!!.setOnMenuItemClickListener { item: MenuItem? ->
+                            // Toggle the check automatically
+                            if(menuitem.menuitem!!.isCheckable) {
+                                menuitem.menuitem!!.isChecked = !menuitem.menuitem!!.isChecked
+                                menuitem.checked = menuitem.menuitem!!.isChecked
+                            }
                             eventHandlerSimple(menuitem, DWEvent.CLICKED)
                             true
                         }
@@ -2773,6 +2778,7 @@
     {
         for(menuitem in menu.children) {
             if(menuitem.id == cid) {
+                var changed: Boolean = false
                 // Handle DW_MIS_ENABLED/DISABLED
                 if((state and (1 or (1 shl 1))) != 0) {
                     var enabled = false
@@ -2782,11 +2788,9 @@
                         enabled = true
                     }
                     menuitem.enabled = enabled
-                    if(menuitem.menuitem != null) {
-                        runOnUiThread {
-                            menuitem.menuitem!!.isEnabled = enabled
-                            invalidateOptionsMenu()
-                        }
+                    if (menuitem.menuitem != null && menuitem.menuitem!!.isEnabled != enabled) {
+                        menuitem.menuitem!!.isEnabled = enabled
+                        changed = true
                     }
                 }
 
@@ -2799,9 +2803,12 @@
                         checked = true
                     }
                     menuitem.checked = checked
-                    if(menuitem.menuitem != null) {
+                    if (menuitem.menuitem != null && menuitem.menuitem!!.isChecked != checked) {
+                        menuitem.menuitem!!.isChecked = checked
+                        changed = true
+                    }
+                    if(changed == true) {
                         runOnUiThread {
-                            menuitem.menuitem!!.isChecked = checked
                             invalidateOptionsMenu()
                         }
                     }
@@ -2891,6 +2898,46 @@
                         button.background = null
                     } // TODO: Handle turning border back on if possible
                 }
+            } else if(window is DWMenuItem) {
+                var menuitem = window as DWMenuItem
+                var changed: Boolean = false
+
+                // Handle DW_MIS_ENABLED/DISABLED
+                if((mask and (1 or (1 shl 1))) != 0) {
+                    var enabled = false
+
+                    // Handle DW_MIS_ENABLED = 1 or DW_MIS_DISABLED = 0
+                    if (((mask and 1) != 0 && (style and 1) != 0) ||
+                        ((mask and (1 shl 1) != 0 && (style and (1 shl 1) == 0)))) {
+                        enabled = true
+                    }
+                    menuitem.enabled = enabled
+                    if(menuitem.menuitem != null && menuitem.menuitem!!.isEnabled != enabled) {
+                        menuitem.menuitem!!.isEnabled = enabled
+                        changed = true
+                    }
+                }
+
+                // Handle DW_MIS_CHECKED/UNCHECKED
+                if((mask and ((1 shl 2) or (1 shl 3))) != 0) {
+                    var checked = false
+
+                    // Handle DW_MIS_CHECKED = 1 or DW_MIS_UNCHECKED = 0
+                    if (((mask and (1 shl 2)) != 0 && (style and (1 shl 2)) != 0) ||
+                        ((mask and (1 shl 3) != 0 && (style and (1 shl 3) == 0)))) {
+                        checked = true
+                    }
+                    menuitem.checked = checked
+                    if (menuitem.menuitem != null && menuitem.menuitem!!.isChecked != checked) {
+                        menuitem.menuitem!!.isChecked = checked
+                        changed = true
+                    }
+                }
+                if(changed == true) {
+                    runOnUiThread {
+                        invalidateOptionsMenu()
+                    }
+                }
             }
         }
     }