1+ package com.imsproject.watch.view
2+
3+ import androidx.compose.foundation.ScrollState
4+ import androidx.compose.foundation.background
5+ import androidx.compose.foundation.layout.Box
6+ import androidx.compose.foundation.layout.Column
7+ import androidx.compose.foundation.layout.Spacer
8+ import androidx.compose.foundation.layout.fillMaxHeight
9+ import androidx.compose.foundation.layout.fillMaxSize
10+ import androidx.compose.foundation.layout.fillMaxWidth
11+ import androidx.compose.foundation.layout.height
12+ import androidx.compose.foundation.layout.padding
13+ import androidx.compose.foundation.rememberScrollState
14+ import androidx.compose.foundation.text.BasicText
15+ import androidx.compose.foundation.verticalScroll
16+ import androidx.compose.runtime.Composable
17+ import androidx.compose.runtime.remember
18+ import androidx.compose.ui.Alignment
19+ import androidx.compose.ui.Modifier
20+ import androidx.compose.ui.draw.drawWithContent
21+ import androidx.compose.ui.geometry.CornerRadius
22+ import androidx.compose.ui.geometry.Offset
23+ import androidx.compose.ui.geometry.Size
24+ import androidx.compose.ui.graphics.Color
25+ import androidx.compose.ui.graphics.RectangleShape
26+ import androidx.compose.ui.unit.Dp
27+ import androidx.compose.ui.unit.dp
28+ import androidx.compose.ui.unit.sp
29+ import androidx.wear.compose.material.Button
30+ import androidx.wear.compose.material.MaterialTheme
31+ import com.imsproject.watch.COLUMN_PADDING
32+ import com.imsproject.watch.DARK_BACKGROUND_COLOR
33+ import com.imsproject.watch.LIGHT_BLUE_COLOR
34+ import com.imsproject.watch.SCREEN_HEIGHT
35+ import com.imsproject.watch.SCREEN_WIDTH
36+ import com.imsproject.watch.textStyle
37+
38+ @Composable
39+ fun ErrorScreen (error : String , onDismiss : () -> Unit ) {
40+ MaterialTheme {
41+ Box (
42+ modifier = Modifier
43+ .fillMaxSize()
44+ .background(DARK_BACKGROUND_COLOR ),
45+ contentAlignment = Alignment .Center
46+ ) {
47+ Column (
48+ modifier = Modifier
49+ .fillMaxSize(),
50+ horizontalAlignment = Alignment .CenterHorizontally ,
51+ ){
52+ Spacer (modifier = Modifier .height((SCREEN_HEIGHT * 0.025f ).dp))
53+ val red = remember { Color (0xFFF14141 ) }
54+ Box (
55+ modifier = Modifier
56+ .background(color = red)
57+ .fillMaxWidth()
58+ .fillMaxHeight(0.10f )
59+ ,
60+ contentAlignment = Alignment .Center ,
61+ ){
62+ BasicText (
63+ text = " ERROR" ,
64+ style = textStyle.copy(color = Color .Black ),
65+ )
66+ }
67+ Spacer (modifier = Modifier .height((SCREEN_HEIGHT * 0.02f ).dp))
68+ val scrollState = rememberScrollState()
69+ Column (
70+ modifier = Modifier
71+ .padding(start= COLUMN_PADDING ,end= COLUMN_PADDING )
72+ .fillMaxWidth()
73+ .fillMaxHeight(0.65f )
74+ .verticalColumnScrollbar(scrollState, endPadding = - SCREEN_WIDTH * 0.02f )
75+ .verticalScroll(scrollState),
76+ horizontalAlignment = Alignment .CenterHorizontally ,
77+ ) {
78+ BasicText (
79+ text = error,
80+ style = textStyle,
81+ modifier = Modifier
82+ .fillMaxWidth()
83+ .align(Alignment .CenterHorizontally )
84+ )
85+ }
86+ Spacer (modifier = Modifier .height((SCREEN_HEIGHT * 0.02f ).dp))
87+ Button (
88+ onClick = { onDismiss() },
89+ modifier = Modifier
90+ .fillMaxSize()
91+ ,
92+ shape = RectangleShape ,
93+ ) {
94+ BasicText (
95+ text = " Dismiss" ,
96+ style = textStyle.copy(color = Color .Black , letterSpacing = 1 .sp),
97+ )
98+ }
99+ }
100+ }
101+ }
102+ }
103+
104+ @Composable
105+ fun Modifier.verticalColumnScrollbar (
106+ scrollState : ScrollState ,
107+ width : Dp = 4.dp,
108+ showScrollBarTrack : Boolean = true,
109+ scrollBarTrackColor : Color = Color .Gray ,
110+ scrollBarColor : Color = LIGHT_BLUE_COLOR ,
111+ scrollBarCornerRadius : Float = 4f,
112+ endPadding : Float = 0f
113+ ): Modifier {
114+ return drawWithContent {
115+ // Draw the column's content
116+ drawContent()
117+ // Dimensions and calculations
118+ val viewportHeight = this .size.height
119+ val totalContentHeight = scrollState.maxValue.toFloat() + viewportHeight
120+ if (totalContentHeight <= viewportHeight) return @drawWithContent
121+ val scrollValue = scrollState.value.toFloat()
122+ // Compute scrollbar height and position
123+ val scrollBarHeight =
124+ (viewportHeight / totalContentHeight) * viewportHeight
125+ val scrollBarStartOffset =
126+ (scrollValue / totalContentHeight) * viewportHeight
127+ // Draw the track (optional)
128+ if (showScrollBarTrack) {
129+ drawRoundRect(
130+ cornerRadius = CornerRadius (scrollBarCornerRadius),
131+ color = scrollBarTrackColor,
132+ topLeft = Offset (this .size.width - endPadding, 0f ),
133+ size = Size (width.toPx(), viewportHeight),
134+ )
135+ }
136+ // Draw the scrollbar
137+ drawRoundRect(
138+ cornerRadius = CornerRadius (scrollBarCornerRadius),
139+ color = scrollBarColor,
140+ topLeft = Offset (this .size.width - endPadding, scrollBarStartOffset),
141+ size = Size (width.toPx(), scrollBarHeight)
142+ )
143+ }
144+ }
0 commit comments