Mercurial > dwindows
comparison android/DWindows.kt @ 2614:dbcd9416e9c9
Android: Popup menus on Andoird use an anchor View not the touch location.
The parent parameter passed probably will not be the ideal anchor. The two
options are to hit test the touch event coordinates of the x/y parameters.
Or, the solution I did in this commit, saving the View of the last click
event and if it is valid, use that View as the anchor. This works well in
the test program but may need to revisit this later.
author | bsmith@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Fri, 23 Jul 2021 14:52:32 +0000 |
parents | 72f1141c07aa |
children | dcd71b04cc46 |
comparison
equal
deleted
inserted
replaced
2613:72f1141c07aa | 2614:dbcd9416e9c9 |
---|---|
741 var windowLayout: LinearLayout? = null | 741 var windowLayout: LinearLayout? = null |
742 var threadLock = ReentrantLock() | 742 var threadLock = ReentrantLock() |
743 var threadCond = threadLock.newCondition() | 743 var threadCond = threadLock.newCondition() |
744 var notificationID: Int = 0 | 744 var notificationID: Int = 0 |
745 var darkMode: Int = -1 | 745 var darkMode: Int = -1 |
746 var lastClickView: View? = null | |
746 private var paint = Paint() | 747 private var paint = Paint() |
747 private var bgcolor: Int = 0 | 748 private var bgcolor: Int = 0 |
748 private var menuBar: DWMenu? = null | 749 private var menuBar: DWMenu? = null |
749 private var defaultItem: View? = null | 750 private var defaultItem: View? = null |
750 private var fileURI: Uri? = null | 751 private var fileURI: Uri? = null |
836 return darkMode | 837 return darkMode |
837 } | 838 } |
838 | 839 |
839 fun menuPopup(menu: DWMenu, parent: View, x: Int, y: Int) | 840 fun menuPopup(menu: DWMenu, parent: View, x: Int, y: Int) |
840 { | 841 { |
842 var anchor: View? = parent | |
843 | |
844 // If lastClickView is valid, use that instead of parent | |
845 if(lastClickView != null) { | |
846 anchor = lastClickView | |
847 } | |
848 | |
841 runOnUiThread { | 849 runOnUiThread { |
842 val popup = PopupMenu(this, parent) | 850 val popup = PopupMenu(this, anchor) |
843 | 851 |
844 menu.createMenu(popup.menu) | 852 menu.createMenu(popup.menu) |
845 popup.show() | 853 popup.show() |
846 } | 854 } |
847 } | 855 } |
1415 button!!.tag = dataArrayMap | 1423 button!!.tag = dataArrayMap |
1416 button!!.isAllCaps = false | 1424 button!!.isAllCaps = false |
1417 button!!.text = text | 1425 button!!.text = text |
1418 button!!.id = cid | 1426 button!!.id = cid |
1419 button!!.setOnClickListener { | 1427 button!!.setOnClickListener { |
1428 lastClickView = button!! | |
1420 eventHandlerSimple(button!!, 8) | 1429 eventHandlerSimple(button!!, 8) |
1421 } | 1430 } |
1422 } | 1431 } |
1423 return button | 1432 return button |
1424 } | 1433 } |
1431 | 1440 |
1432 button!!.tag = dataArrayMap | 1441 button!!.tag = dataArrayMap |
1433 button!!.id = resid | 1442 button!!.id = resid |
1434 button!!.setImageResource(resid) | 1443 button!!.setImageResource(resid) |
1435 button!!.setOnClickListener { | 1444 button!!.setOnClickListener { |
1445 lastClickView = button!! | |
1436 eventHandlerSimple(button!!, 8) | 1446 eventHandlerSimple(button!!, 8) |
1437 } | 1447 } |
1438 } | 1448 } |
1439 return button | 1449 return button |
1440 } | 1450 } |
1447 val exts = arrayOf("", ".png", ".webp", ".jpg", ".jpeg", ".gif") | 1457 val exts = arrayOf("", ".png", ".webp", ".jpg", ".jpeg", ".gif") |
1448 | 1458 |
1449 button!!.tag = dataArrayMap | 1459 button!!.tag = dataArrayMap |
1450 button!!.id = cid | 1460 button!!.id = cid |
1451 button!!.setOnClickListener { | 1461 button!!.setOnClickListener { |
1462 lastClickView = button!! | |
1452 eventHandlerSimple(button!!, 8) | 1463 eventHandlerSimple(button!!, 8) |
1453 } | 1464 } |
1454 | 1465 |
1455 for (ext in exts) { | 1466 for (ext in exts) { |
1456 // Try to load the image, and protect against exceptions | 1467 // Try to load the image, and protect against exceptions |
1477 val b = BitmapFactory.decodeByteArray(data,0, length) | 1488 val b = BitmapFactory.decodeByteArray(data,0, length) |
1478 | 1489 |
1479 button!!.tag = dataArrayMap | 1490 button!!.tag = dataArrayMap |
1480 button!!.id = cid | 1491 button!!.id = cid |
1481 button!!.setOnClickListener { | 1492 button!!.setOnClickListener { |
1493 lastClickView = button!! | |
1482 eventHandlerSimple(button!!, 8) | 1494 eventHandlerSimple(button!!, 8) |
1483 } | 1495 } |
1484 button!!.setImageBitmap(b) | 1496 button!!.setImageBitmap(b) |
1485 } | 1497 } |
1486 return button | 1498 return button |
1519 | 1531 |
1520 radiobutton!!.tag = dataArrayMap | 1532 radiobutton!!.tag = dataArrayMap |
1521 radiobutton!!.id = cid | 1533 radiobutton!!.id = cid |
1522 radiobutton!!.text = text | 1534 radiobutton!!.text = text |
1523 radiobutton!!.setOnClickListener { | 1535 radiobutton!!.setOnClickListener { |
1536 lastClickView = radiobutton!! | |
1524 eventHandlerSimple(radiobutton!!, 8) | 1537 eventHandlerSimple(radiobutton!!, 8) |
1525 } | 1538 } |
1526 } | 1539 } |
1527 return radiobutton | 1540 return radiobutton |
1528 } | 1541 } |
1536 checkbox = CheckBox(this) | 1549 checkbox = CheckBox(this) |
1537 checkbox!!.tag = dataArrayMap | 1550 checkbox!!.tag = dataArrayMap |
1538 checkbox!!.id = cid | 1551 checkbox!!.id = cid |
1539 checkbox!!.text = text | 1552 checkbox!!.text = text |
1540 checkbox!!.setOnClickListener { | 1553 checkbox!!.setOnClickListener { |
1554 lastClickView = checkbox!! | |
1541 eventHandlerSimple(checkbox!!, 8) | 1555 eventHandlerSimple(checkbox!!, 8) |
1542 } | 1556 } |
1543 } | 1557 } |
1544 return checkbox | 1558 return checkbox |
1545 } | 1559 } |
2151 val data = adapter.model.getRowData(position) | 2165 val data = adapter.model.getRowData(position) |
2152 val now = System.currentTimeMillis() | 2166 val now = System.currentTimeMillis() |
2153 | 2167 |
2154 view.isSelected = !view.isSelected | 2168 view.isSelected = !view.isSelected |
2155 adapter.selectedItem = position | 2169 adapter.selectedItem = position |
2170 lastClickView = cont!! | |
2156 // If we are single select or we got a double tap... | 2171 // If we are single select or we got a double tap... |
2157 // Generate an ENTER event | 2172 // Generate an ENTER event |
2158 if(cont!!.choiceMode != ListView.CHOICE_MODE_MULTIPLE || | 2173 if(cont!!.choiceMode != ListView.CHOICE_MODE_MULTIPLE || |
2159 (position == adapter.lastClickRow && | 2174 (position == adapter.lastClickRow && |
2160 (now - adapter.lastClick) < ViewConfiguration.getDoubleTapTimeout())) { | 2175 (now - adapter.lastClick) < ViewConfiguration.getDoubleTapTimeout())) { |
2169 cont!!.setOnContextClickListener { | 2184 cont!!.setOnContextClickListener { |
2170 if(adapter.selectedItem > -1 && adapter.selectedItem < adapter.model.numberOfRows()) { | 2185 if(adapter.selectedItem > -1 && adapter.selectedItem < adapter.model.numberOfRows()) { |
2171 val title = adapter.model.getRowTitle(adapter.selectedItem) | 2186 val title = adapter.model.getRowTitle(adapter.selectedItem) |
2172 val data = adapter.model.getRowData(adapter.selectedItem) | 2187 val data = adapter.model.getRowData(adapter.selectedItem) |
2173 | 2188 |
2189 lastClickView = cont!! | |
2174 eventHandlerContainer(cont!!, 10, title, 0, 0, data) | 2190 eventHandlerContainer(cont!!, 10, title, 0, 0, data) |
2175 } | 2191 } |
2176 true | 2192 true |
2177 } | 2193 } |
2178 cont!!.setOnItemLongClickListener { parent, view, position, id -> | 2194 cont!!.setOnItemLongClickListener { parent, view, position, id -> |
2179 val title = adapter.model.getRowTitle(position) | 2195 val title = adapter.model.getRowTitle(position) |
2180 val data = adapter.model.getRowData(position) | 2196 val data = adapter.model.getRowData(position) |
2181 | 2197 |
2198 lastClickView = cont!! | |
2182 eventHandlerContainer(cont!!, 10, title, 0, 0, data) | 2199 eventHandlerContainer(cont!!, 10, title, 0, 0, data) |
2183 true | 2200 true |
2184 } | 2201 } |
2185 } | 2202 } |
2186 return cont | 2203 return cont |
2900 // onLongClickListener below, just save the location | 2917 // onLongClickListener below, just save the location |
2901 } | 2918 } |
2902 MotionEvent.ACTION_UP -> { | 2919 MotionEvent.ACTION_UP -> { |
2903 render!!.evx = event.x | 2920 render!!.evx = event.x |
2904 render!!.evy = event.y | 2921 render!!.evy = event.y |
2922 lastClickView = render!! | |
2905 eventHandlerInt(render!!, 4, event.x.toInt(), event.y.toInt(), render!!.button, 0) | 2923 eventHandlerInt(render!!, 4, event.x.toInt(), event.y.toInt(), render!!.button, 0) |
2906 } | 2924 } |
2907 MotionEvent.ACTION_MOVE -> { | 2925 MotionEvent.ACTION_MOVE -> { |
2908 render!!.evx = event.x | 2926 render!!.evx = event.x |
2909 render!!.evy = event.y | 2927 render!!.evy = event.y |
2928 lastClickView = render!! | |
2910 eventHandlerInt(render!!, 5, event.x.toInt(), event.y.toInt(), 1, 0) | 2929 eventHandlerInt(render!!, 5, event.x.toInt(), event.y.toInt(), 1, 0) |
2911 } | 2930 } |
2912 } | 2931 } |
2913 return false | 2932 return false |
2914 } | 2933 } |
2915 }) | 2934 }) |
2916 render!!.setOnLongClickListener{ | 2935 render!!.setOnLongClickListener{ |
2917 // Long click functions as button 2 | 2936 // Long click functions as button 2 |
2918 render!!.button = 2 | 2937 render!!.button = 2 |
2938 lastClickView = render!! | |
2919 eventHandlerInt(render!!, 3, render!!.evx.toInt(), render!!.evy.toInt(), 2, 0) | 2939 eventHandlerInt(render!!, 3, render!!.evx.toInt(), render!!.evy.toInt(), 2, 0) |
2920 true | 2940 true |
2921 } | 2941 } |
2922 render!!.setOnClickListener{ | 2942 render!!.setOnClickListener{ |
2923 // Normal click functions as button 1 | 2943 // Normal click functions as button 1 |
2924 render!!.button = 1 | 2944 render!!.button = 1 |
2945 lastClickView = render!! | |
2925 eventHandlerInt(render!!, 3, render!!.evx.toInt(), render!!.evy.toInt(), 1, 0) | 2946 eventHandlerInt(render!!, 3, render!!.evx.toInt(), render!!.evy.toInt(), 1, 0) |
2926 } | 2947 } |
2927 render!!.setOnKeyListener(View.OnKeyListener { v, keyCode, event -> | 2948 render!!.setOnKeyListener(View.OnKeyListener { v, keyCode, event -> |
2928 if (event.action == KeyEvent.ACTION_DOWN) { | 2949 if (event.action == KeyEvent.ACTION_DOWN) { |
2929 eventHandlerKey(render!!, 2, keyCode, event.unicodeChar, event.modifiers, event.characters) | 2950 eventHandlerKey(render!!, 2, keyCode, event.unicodeChar, event.modifiers, event.characters) |