Mercurial > dwindows
changeset 2544:dbfcc0e357d6
Android: Clean up the menus... add separator, remove tildes and implement callbacks.
author | bsmith@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Thu, 13 May 2021 20:46:07 +0000 |
parents | f9367eb9a6e7 |
children | f803f3b164cf |
files | android/DWindows.kt android/dw.cpp |
diffstat | 2 files changed, 50 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/android/DWindows.kt Thu May 13 19:54:15 2021 +0000 +++ b/android/DWindows.kt Thu May 13 20:46:07 2021 +0000 @@ -40,6 +40,7 @@ import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import androidx.core.content.res.ResourcesCompat +import androidx.core.view.MenuCompat import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 import com.google.android.material.tabs.TabLayout @@ -419,21 +420,34 @@ menu = newmenu } if(menu != null) { + var group: Int = 0 + + // 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) { - menuitem.submenuitem = menu?.addSubMenu(0, menuitem.id, 0, menuitem.title) + menuitem.submenuitem = menu?.addSubMenu(group, menuitem.id, 0, menuitem.title) } menuitem.submenu!!.createMenu(menuitem.submenuitem) } else if(menuitem.submenu == null) { - if(menuitem.menuitem == null) { - menuitem.menuitem = menu?.add(0, menuitem.id, 0, menuitem.title) + if(menuitem.title!!.isEmpty()) { + group += 1 + } else if(menuitem.menuitem == null) { + menuitem.menuitem = menu?.add(group, menuitem.id, 0, menuitem.title) + menuitem.menuitem!!.setOnMenuItemClickListener(MenuItem.OnMenuItemClickListener { item: MenuItem? -> + eventHandlerSimple(menuitem, 8) + true + }) } } } } } + + external fun eventHandlerSimple(item: DWMenuItem, message: Int) } class DWindows : AppCompatActivity() {
--- a/android/dw.cpp Thu May 13 19:54:15 2021 +0000 +++ b/android/dw.cpp Thu May 13 20:46:07 2021 +0000 @@ -492,6 +492,15 @@ return timerfunc((void *)data); } +/* A more simple method for quicker calls */ +JNIEXPORT void JNICALL +Java_org_dbsoft_dwindows_DWMenu_eventHandlerSimple(JNIEnv* env, jobject obj, jobject obj1, jint message) { + void *params[8] = { nullptr }; + + _dw_event_handler(obj1, params, message); +} + + /* This function adds a signal handler callback into the linked list. */ void _dw_new_signal(ULONG message, HWND window, int msgid, void *signalfunction, void *discfunc, void *data) @@ -3984,6 +3993,27 @@ { } +char _dw_removetilde(char *dest, const char *src) +{ + int z, cur=0; + char accel = '\0'; + + for(z=0;z<strlen(src);z++) + { + if(src[z] != '~') + { + dest[cur] = src[z]; + cur++; + } + else + { + accel = src[z+1]; + } + } + dest[cur] = 0; + return accel; +} + /* * Adds a menuitem or submenu to an existing menu. * Parameters: @@ -4003,8 +4033,10 @@ if((env = (JNIEnv *)pthread_getspecific(_dw_env_key))) { + char *newtitle = (char *)alloca(strlen(title)+1); + char accel = _dw_removetilde(newtitle, title); // Create a string - jstring jstr = env->NewStringUTF(title); + jstring jstr = env->NewStringUTF(newtitle); // 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