comparison android/DWindows.kt @ 2720:9ce1649b0fbd

Android: Fix vertical sliders/scrollbars by creating a DWSlider class to encapsulate the SeekBar... then override the measurements and adjust the width. The width on the SeekBar needs to be set to the height after rotation... Since that is not the actually correct width, we need to wrap it in a frame.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Thu, 09 Dec 2021 01:57:52 +0000
parents 6754e8f70142
children cacde852e2db
comparison
equal deleted inserted replaced
2719:6754e8f70142 2720:9ce1649b0fbd
63 import android.content.Intent 63 import android.content.Intent
64 import android.util.* 64 import android.util.*
65 import android.util.Base64 65 import android.util.Base64
66 import kotlin.math.* 66 import kotlin.math.*
67 import android.content.ContentUris 67 import android.content.ContentUris
68 68 import androidx.appcompat.widget.AppCompatSeekBar
69
70 69
71 70
72 // Color Wheel section 71 // Color Wheel section
73 private val HUE_COLORS = intArrayOf( 72 private val HUE_COLORS = intArrayOf(
74 Color.RED, 73 Color.RED,
941 } 940 }
942 941
943 external fun eventHandlerHTMLChanged(obj1: View, message: Int, URI: String, status: Int) 942 external fun eventHandlerHTMLChanged(obj1: View, message: Int, URI: String, status: Int)
944 } 943 }
945 944
945 class DWSlider
946 @JvmOverloads constructor(context: Context): FrameLayout(context) {
947 val slider: SeekBar = SeekBar(context)
948
949 init {
950 slider.layoutParams = LayoutParams(LayoutParams.MATCH_PARENT,
951 LayoutParams.WRAP_CONTENT, Gravity.CENTER)
952 addView(slider)
953 }
954
955 @Synchronized
956 override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
957 if(slider.rotation == 90F || slider.rotation == 270F) {
958 val layoutHeight = MeasureSpec.getSize(heightMeasureSpec)
959 // set slider width to layout heigth
960 slider.layoutParams.width = layoutHeight
961 }
962 super.onMeasure(widthMeasureSpec, heightMeasureSpec)
963 if(slider.rotation == 90F || slider.rotation == 270F) {
964 // update layout width to the rotated height of the slider
965 // otherwise the layout remains quadratic
966 setMeasuredDimension(slider.measuredHeight, measuredHeight)
967 }
968 }
969 }
970
946 class DWSpinButton(context: Context) : AppCompatEditText(context), OnTouchListener { 971 class DWSpinButton(context: Context) : AppCompatEditText(context), OnTouchListener {
947 var value: Long = 0 972 var value: Long = 0
948 var minimum: Long = 0 973 var minimum: Long = 0
949 var maximum: Long = 65535 974 var maximum: Long = 65535
950 975
3550 constraintSet.applyTo(splitbar) 3575 constraintSet.applyTo(splitbar)
3551 } 3576 }
3552 } 3577 }
3553 } 3578 }
3554 3579
3555 fun scrollBarNew(vertical: Int, cid: Int): SeekBar? 3580 fun scrollBarNew(vertical: Int, cid: Int): DWSlider?
3556 { 3581 {
3557 var slider: SeekBar? = null 3582 var scrollbar: DWSlider? = null
3558 3583
3559 waitOnUiThread { 3584 waitOnUiThread {
3560 val dataArrayMap = SimpleArrayMap<String, Long>() 3585 val dataArrayMap = SimpleArrayMap<String, Long>()
3561 3586
3562 slider = SeekBar(this) 3587 scrollbar = DWSlider(this)
3588 scrollbar!!.tag = dataArrayMap
3589 scrollbar!!.id = cid
3590 scrollbar!!.slider.max = 1
3591 scrollbar!!.slider.progressTintList = null
3592 scrollbar!!.slider.progressBackgroundTintList = null
3593 if (vertical != 0) {
3594 scrollbar!!.slider.rotation = 90F
3595 }
3596 scrollbar!!.slider.setOnSeekBarChangeListener(object : OnSeekBarChangeListener {
3597 override fun onStopTrackingTouch(seekBar: SeekBar) {
3598 }
3599
3600 override fun onStartTrackingTouch(seekBar: SeekBar) {
3601 }
3602
3603 override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
3604 eventHandlerInt(scrollbar as View, DWEvent.VALUE_CHANGED, scrollbar!!.slider.progress, 0, 0, 0)
3605 }
3606 })
3607 }
3608 return scrollbar
3609 }
3610
3611 fun sliderNew(vertical: Int, increments: Int, cid: Int): DWSlider?
3612 {
3613 var slider: DWSlider? = null
3614
3615 waitOnUiThread {
3616 val dataArrayMap = SimpleArrayMap<String, Long>()
3617
3618 slider = DWSlider(this)
3563 slider!!.tag = dataArrayMap 3619 slider!!.tag = dataArrayMap
3564 slider!!.id = cid 3620 slider!!.id = cid
3565 slider!!.max = 1 3621 slider!!.slider.max = increments
3566 slider!!.progressTintList = null
3567 slider!!.progressBackgroundTintList = null
3568 if (vertical != 0) { 3622 if (vertical != 0) {
3569 slider!!.rotation = 90F 3623 slider!!.slider.rotation = 90F
3570 } 3624 }
3571 slider!!.setOnSeekBarChangeListener(object : OnSeekBarChangeListener { 3625 slider!!.slider.setOnSeekBarChangeListener(object : OnSeekBarChangeListener {
3572 override fun onStopTrackingTouch(seekBar: SeekBar) { 3626 override fun onStopTrackingTouch(seekBar: SeekBar) {
3573 } 3627 }
3574 3628
3575 override fun onStartTrackingTouch(seekBar: SeekBar) { 3629 override fun onStartTrackingTouch(seekBar: SeekBar) {
3576 } 3630 }
3577 3631
3578 override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { 3632 override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
3579 eventHandlerInt(slider as View, DWEvent.VALUE_CHANGED, slider!!.progress, 0, 0, 0) 3633 eventHandlerInt(slider as View, DWEvent.VALUE_CHANGED, slider!!.slider.progress, 0, 0, 0)
3580 }
3581 })
3582 }
3583 return slider
3584 }
3585
3586 fun sliderNew(vertical: Int, increments: Int, cid: Int): SeekBar?
3587 {
3588 var slider: SeekBar? = null
3589
3590 waitOnUiThread {
3591 val dataArrayMap = SimpleArrayMap<String, Long>()
3592
3593 slider = SeekBar(this)
3594 slider!!.tag = dataArrayMap
3595 slider!!.id = cid
3596 slider!!.max = increments
3597 if (vertical != 0) {
3598 slider!!.rotation = 90F
3599 }
3600 slider!!.setOnSeekBarChangeListener(object : OnSeekBarChangeListener {
3601 override fun onStopTrackingTouch(seekBar: SeekBar) {
3602 }
3603
3604 override fun onStartTrackingTouch(seekBar: SeekBar) {
3605 }
3606
3607 override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
3608 eventHandlerInt(slider as View, DWEvent.VALUE_CHANGED, slider!!.progress, 0, 0, 0)
3609 } 3634 }
3610 }) 3635 })
3611 } 3636 }
3612 return slider 3637 return slider
3613 } 3638 }
3625 percent!!.max = 100 3650 percent!!.max = 100
3626 } 3651 }
3627 return percent 3652 return percent
3628 } 3653 }
3629 3654
3630 fun percentGetPos(percent: ProgressBar): Int 3655 fun percentGetPos(percent: View): Int
3631 { 3656 {
3632 var retval = 0 3657 var retval = 0
3633 3658
3634 waitOnUiThread { 3659 waitOnUiThread {
3635 retval = percent.progress 3660 var progress: ProgressBar
3661
3662 if(percent is ProgressBar) {
3663 progress = percent as ProgressBar
3664 } else {
3665 val slider = percent as DWSlider
3666 progress = slider.slider
3667 }
3668 retval = progress.progress
3636 } 3669 }
3637 return retval 3670 return retval
3638 } 3671 }
3639 3672
3640 fun percentSetPos(percent: ProgressBar, position: Int) 3673 fun percentSetPos(percent: View, position: Int)
3641 { 3674 {
3642 waitOnUiThread { 3675 waitOnUiThread {
3643 percent.progress = position 3676 var progress: ProgressBar
3644 } 3677
3645 } 3678 if(percent is ProgressBar) {
3646 3679 progress = percent as ProgressBar
3647 fun percentSetRange(percent: ProgressBar, range: Int) 3680 } else {
3648 { 3681 val slider = percent as DWSlider
3649 waitOnUiThread { 3682 progress = slider.slider
3650 percent.max = range 3683 }
3684 progress.progress = position
3685 }
3686 }
3687
3688 fun percentSetRange(percent: View, range: Int)
3689 {
3690 waitOnUiThread {
3691 var progress: ProgressBar
3692
3693 if(percent is ProgressBar) {
3694 progress = percent as ProgressBar
3695 } else {
3696 val slider = percent as DWSlider
3697 progress = slider.slider
3698 }
3699 progress.max = range
3651 } 3700 }
3652 } 3701 }
3653 3702
3654 fun htmlNew(cid: Int): WebView? 3703 fun htmlNew(cid: Int): WebView?
3655 { 3704 {