Skip to content

Commit 835802e

Browse files
Enable to remove tab from tabs page (#71)
* Add remove tab button * Remove clear tabs when goBack * Disable nav buttons * Goback on clear last item
1 parent 35bcc8a commit 835802e

File tree

2 files changed

+51
-71
lines changed

2 files changed

+51
-71
lines changed

app/src/main/java/com/paulcoding/hviewer/ui/page/AppEntry.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,6 @@ fun AppEntry(intent: Intent?, appViewModel: AppViewModel) {
251251
TabsPage(
252252
goBack = {
253253
navController.popBackStack()
254-
appViewModel.clearTabs()
255254
},
256255
navToCustomTag = { postItem, tag -> navToCustomTag(postItem, tag) },
257256
appViewModel = appViewModel,

app/src/main/java/com/paulcoding/hviewer/ui/page/tabs/TabsPage.kt

Lines changed: 51 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,9 @@ import androidx.compose.foundation.layout.fillMaxSize
77
import androidx.compose.foundation.layout.padding
88
import androidx.compose.foundation.layout.width
99
import androidx.compose.foundation.pager.HorizontalPager
10-
import androidx.compose.foundation.pager.PagerState
1110
import androidx.compose.foundation.pager.rememberPagerState
1211
import androidx.compose.material.icons.Icons
13-
import androidx.compose.material.icons.outlined.ChevronLeft
14-
import androidx.compose.material.icons.outlined.ChevronRight
12+
import androidx.compose.material.icons.outlined.Close
1513
import androidx.compose.material.icons.outlined.Info
1614
import androidx.compose.material3.Text
1715
import androidx.compose.runtime.Composable
@@ -28,7 +26,6 @@ import androidx.compose.ui.unit.dp
2826
import com.paulcoding.hviewer.model.PostItem
2927
import com.paulcoding.hviewer.model.Tag
3028
import com.paulcoding.hviewer.ui.LocalHostsMap
31-
import com.paulcoding.hviewer.ui.component.HEmpty
3229
import com.paulcoding.hviewer.ui.component.HFavoriteIcon
3330
import com.paulcoding.hviewer.ui.component.HIcon
3431
import com.paulcoding.hviewer.ui.page.AppViewModel
@@ -47,7 +44,7 @@ fun TabsPage(
4744
val tabs by appViewModel.tabs.collectAsState(initial = listOf())
4845
val reversedTabs by remember { derivedStateOf { tabs.reversed() } }
4946
val pagerState = rememberPagerState { reversedTabs.size }
50-
val currentPost by remember { derivedStateOf { reversedTabs[pagerState.currentPage] } }
47+
5148
val scope = rememberCoroutineScope()
5249
var infoSheetVisible by remember { mutableStateOf(false) }
5350

@@ -64,42 +61,45 @@ fun TabsPage(
6461
}
6562

6663
Box(modifier = Modifier.fillMaxSize()) {
67-
if (reversedTabs.isEmpty()) {
68-
HEmpty()
69-
} else {
70-
HorizontalPager(
71-
state = pagerState,
72-
modifier = Modifier.fillMaxSize(),
73-
beyondViewportPageCount = 2,
74-
key = { reversedTabs[it].url }
75-
) { pageIndex ->
76-
val tab = reversedTabs[pageIndex]
77-
val siteConfig = tab.getSiteConfig(hostsMap)
64+
HorizontalPager(
65+
state = pagerState,
66+
modifier = Modifier.fillMaxSize(),
67+
beyondViewportPageCount = 2,
68+
key = { reversedTabs[it].url }
69+
) { pageIndex ->
70+
val tab = reversedTabs[pageIndex]
71+
val siteConfig = tab.getSiteConfig(hostsMap)
7872

79-
if (siteConfig != null) {
80-
ImageList(
81-
tab,
82-
siteConfig = siteConfig,
83-
goBack = goBack,
84-
bottomRowActions = {
85-
BottomRowActions(
86-
tab,
87-
appViewModel,
88-
pageIndex,
89-
scope,
90-
pagerState,
91-
toggleBottomSheet = {
92-
infoSheetVisible = !infoSheetVisible
93-
})
94-
}
95-
)
96-
} else
97-
Text(
98-
"Site config not found for ${tab.url}",
99-
modifier = Modifier.padding(16.dp),
100-
color = Color.Red
101-
)
102-
}
73+
if (siteConfig != null) {
74+
ImageList(
75+
tab,
76+
siteConfig = siteConfig,
77+
goBack = goBack,
78+
bottomRowActions = {
79+
BottomRowActions(
80+
tab,
81+
appViewModel,
82+
pageIndex,
83+
scope,
84+
removeTab = {
85+
appViewModel.removeTab(tab)
86+
if (pagerState.pageCount == 1) {
87+
goBack()
88+
}
89+
},
90+
toggleBottomSheet = {
91+
infoSheetVisible = !infoSheetVisible
92+
})
93+
}
94+
)
95+
} else
96+
Text(
97+
"Site config not found for ${tab.url}",
98+
modifier = Modifier.padding(16.dp),
99+
color = Color.Red
100+
)
101+
}
102+
reversedTabs.getOrNull(pagerState.currentPage)?.let { currentPost ->
103103
InfoBottomSheet(
104104
visible = infoSheetVisible,
105105
postItem = currentPost,
@@ -119,41 +119,13 @@ fun TabsPage(
119119
internal fun BottomRowActions(
120120
postItem: PostItem,
121121
appViewModel: AppViewModel,
122-
pageIndex: Int,
122+
totalPage: Int,
123123
scope: CoroutineScope,
124-
pagerState: PagerState,
124+
removeTab: () -> Unit,
125125
toggleBottomSheet: () -> Unit,
126126
) {
127127
val favorite by appViewModel.postFavorite(postItem.url).collectAsState(false)
128128

129-
HIcon(
130-
Icons.Outlined.ChevronLeft,
131-
size = 32,
132-
rounded = true,
133-
enabled = pageIndex > 0
134-
) {
135-
scope.launch {
136-
pagerState.animateScrollToPage(
137-
pageIndex.dec()
138-
)
139-
}
140-
}
141-
Spacer(modifier = Modifier.width(16.dp))
142-
HIcon(
143-
Icons.Outlined.ChevronRight,
144-
size = 32,
145-
rounded = true,
146-
enabled = pageIndex < pagerState.pageCount - 1
147-
) {
148-
scope.launch {
149-
pagerState.animateScrollToPage(
150-
pageIndex.inc()
151-
)
152-
}
153-
}
154-
155-
Spacer(modifier = Modifier.width(16.dp))
156-
157129
HIcon(
158130
Icons.Outlined.Info,
159131
size = 32,
@@ -172,5 +144,14 @@ internal fun BottomRowActions(
172144
appViewModel.deleteFavorite(postItem)
173145
}
174146
}
147+
148+
Spacer(modifier = Modifier.width(16.dp))
149+
150+
HIcon(
151+
Icons.Outlined.Close,
152+
size = 32,
153+
rounded = true,
154+
onClick = removeTab
155+
)
175156
}
176157

0 commit comments

Comments
 (0)