























@@ -90,6 +90,8 @@ fun V2ShellScreen(
9090) {
9191ClawDesignTheme {
9292var activeTab by rememberSaveable { mutableStateOf(V2Tab.Overview) }
93+var settingsRoute by rememberSaveable { mutableStateOf(V2SettingsRoute.Home) }
94+var returnToOverviewFromSettings by rememberSaveable { mutableStateOf(false) }
9395var commandOpen by rememberSaveable { mutableStateOf(false) }
9496val requestedHomeDestination by viewModel.requestedHomeDestination.collectAsState()
9597@@ -103,6 +105,10 @@ fun V2ShellScreen(
103105HomeDestination.Screen -> V2Tab.Chat
104106HomeDestination.Settings -> V2Tab.Settings
105107 }
108+if (destination == HomeDestination.Settings) {
109+ settingsRoute = V2SettingsRoute.Home
110+ returnToOverviewFromSettings = false
111+ }
106112 viewModel.clearRequestedHomeDestination()
107113 }
108114@@ -124,6 +130,11 @@ fun V2ShellScreen(
124130V2OverviewScreen(
125131 viewModel = viewModel,
126132 onSelectTab = { activeTab = it },
133+ onOpenSettingsRoute = {
134+ settingsRoute = it
135+ returnToOverviewFromSettings = true
136+ activeTab = V2Tab.Settings
137+ },
127138 onOpenCommand = { commandOpen = true },
128139 )
129140V2Tab.Chat ->
@@ -137,15 +148,35 @@ fun V2ShellScreen(
137148V2ProvidersModelsScreen(
138149 viewModel = viewModel,
139150 onBack = { activeTab = V2Tab.Overview },
140- onAddProvider = { activeTab = V2Tab.Settings },
151+ onAddProvider = {
152+ settingsRoute = V2SettingsRoute.Gateway
153+ returnToOverviewFromSettings = false
154+ activeTab = V2Tab.Settings
155+ },
141156 )
142157V2Tab.Sessions ->
143158V2SessionsScreen(
144159 viewModel = viewModel,
145160 onOpenCommand = { commandOpen = true },
146161 onOpenChat = { activeTab = V2Tab.Chat },
147162 )
148-V2Tab.Settings -> V2SettingsShellScreen(viewModel = viewModel, onOpenCommand = { commandOpen = true })
163+V2Tab.Settings ->
164+V2SettingsShellScreen(
165+ viewModel = viewModel,
166+ route = settingsRoute,
167+ onRouteChange = {
168+ settingsRoute = it
169+ returnToOverviewFromSettings = false
170+ },
171+ onRouteBack = {
172+ settingsRoute = V2SettingsRoute.Home
173+if (returnToOverviewFromSettings) {
174+ returnToOverviewFromSettings = false
175+ activeTab = V2Tab.Overview
176+ }
177+ },
178+ onOpenCommand = { commandOpen = true },
179+ )
149180 }
150181151182if (commandOpen) {
@@ -169,6 +200,8 @@ fun V2ShellScreen(
169200 commandOpen = false
170201 },
171202 onOpenSettings = {
203+ settingsRoute = V2SettingsRoute.Home
204+ returnToOverviewFromSettings = false
172205 activeTab = V2Tab.Settings
173206 commandOpen = false
174207 },
@@ -187,6 +220,7 @@ fun V2ShellScreen(
187220private fun V2OverviewScreen(
188221viewModel: MainViewModel,
189222onSelectTab: (V2Tab) -> Unit,
223+onOpenSettingsRoute: (V2SettingsRoute) -> Unit,
190224onOpenCommand: () -> Unit,
191225) {
192226val isConnected by viewModel.isConnected.collectAsState()
@@ -260,16 +294,17 @@ private fun V2OverviewScreen(
260294 icon = Icons.Outlined.Inventory2,
261295 tab = V2Tab.ProvidersModels,
262296 ),
263-V2ModuleRow("Channels", null, channelsSummaryText(channelsSummary), Icons.Default.Notifications, V2Tab.Settings),
264-V2ModuleRow("Agents", null, if (agents.isEmpty()) "Load" else "${agents.size} ready", Icons.Default.Person, V2Tab.Settings),
265-V2ModuleRow("Approvals", null, approvalsSummary(pendingToolCalls.size), Icons.Default.Lock, V2Tab.Settings),
266-V2ModuleRow("Cron Jobs", null, cronJobsSummary(cronStatus.jobs), Icons.Outlined.AccessTime, V2Tab.Settings),
267-V2ModuleRow("Skills", null, skillsSummaryText(skillsSummary.skills), Icons.Default.Settings, V2Tab.Settings),
268-V2ModuleRow("Nodes & Devices", null, nodesDevicesSummaryText(nodesDevicesSummary), Icons.Default.Cloud, V2Tab.Settings),
269-V2ModuleRow("Usage", null, usageSummaryText(usageSummary.providers.size), Icons.Default.Storage, V2Tab.Settings),
270-V2ModuleRow("Settings", null, null, Icons.Outlined.Settings, V2Tab.Settings),
297+V2ModuleRow("Channels", null, channelsSummaryText(channelsSummary), Icons.Default.Notifications, V2Tab.Settings, V2SettingsRoute.Channels),
298+V2ModuleRow("Agents", null, if (agents.isEmpty()) "Load" else "${agents.size} ready", Icons.Default.Person, V2Tab.Settings, V2SettingsRoute.Agents),
299+V2ModuleRow("Approvals", null, approvalsSummary(pendingToolCalls.size), Icons.Default.Lock, V2Tab.Settings, V2SettingsRoute.Approvals),
300+V2ModuleRow("Cron Jobs", null, cronJobsSummary(cronStatus.jobs), Icons.Outlined.AccessTime, V2Tab.Settings, V2SettingsRoute.CronJobs),
301+V2ModuleRow("Skills", null, skillsSummaryText(skillsSummary.skills), Icons.Default.Settings, V2Tab.Settings, V2SettingsRoute.Skills),
302+V2ModuleRow("Nodes & Devices", null, nodesDevicesSummaryText(nodesDevicesSummary), Icons.Default.Cloud, V2Tab.Settings, V2SettingsRoute.NodesDevices),
303+V2ModuleRow("Usage", null, usageSummaryText(usageSummary.providers.size), Icons.Default.Storage, V2Tab.Settings, V2SettingsRoute.Usage),
304+V2ModuleRow("Settings", null, null, Icons.Outlined.Settings, V2Tab.Settings, V2SettingsRoute.Home),
271305 ),
272306 onSelectTab = onSelectTab,
307+ onOpenSettingsRoute = onOpenSettingsRoute,
273308 )
274309 }
275310@@ -321,6 +356,7 @@ private data class V2ModuleRow(
321356val metadata: String?,
322357val icon: ImageVector,
323358val tab: V2Tab,
359+val settingsRoute: V2SettingsRoute? = null,
324360)
325361326362@Composable
@@ -380,11 +416,22 @@ private fun V2SectionLabel(
380416private fun V2ModuleList(
381417rows: List<V2ModuleRow>,
382418onSelectTab: (V2Tab) -> Unit,
419+onOpenSettingsRoute: (V2SettingsRoute) -> Unit,
383420) {
384421ClawPanel(contentPadding = PaddingValues(horizontal = 8.dp, vertical = 0.dp)) {
385422Column(verticalArrangement = Arrangement.spacedBy(0.dp)) {
386423 rows.forEachIndexed { index, row ->
387-V2ModuleListRow(row = row, onClick = { onSelectTab(row.tab) })
424+V2ModuleListRow(
425+ row = row,
426+ onClick = {
427+val route = row.settingsRoute
428+if (route == null) {
429+ onSelectTab(row.tab)
430+ } else {
431+ onOpenSettingsRoute(route)
432+ }
433+ },
434+ )
388435if (index != rows.lastIndex) {
389436HorizontalDivider(color = ClawTheme.colors.border, thickness = 1.dp)
390437 }
@@ -539,6 +586,9 @@ private fun V2VoiceShellScreen(viewModel: MainViewModel) {
539586@Composable
540587private fun V2SettingsShellScreen(
541588viewModel: MainViewModel,
589+route: V2SettingsRoute,
590+onRouteChange: (V2SettingsRoute) -> Unit,
591+onRouteBack: () -> Unit,
542592onOpenCommand: () -> Unit,
543593) {
544594val displayName by viewModel.displayName.collectAsState()
@@ -555,7 +605,6 @@ private fun V2SettingsShellScreen(
555605val nodesDevicesSummary by viewModel.nodesDevicesSummary.collectAsState()
556606val channelsSummary by viewModel.channelsSummary.collectAsState()
557607val dreamingSummary by viewModel.dreamingSummary.collectAsState()
558-var route by rememberSaveable { mutableStateOf(V2SettingsRoute.Home) }
559608560609LaunchedEffect(isConnected) {
561610if (isConnected) {
@@ -570,11 +619,11 @@ private fun V2SettingsShellScreen(
570619 }
571620572621BackHandler(enabled = route != V2SettingsRoute.Home) {
573-route = V2SettingsRoute.Home
622+onRouteBack()
574623 }
575624576625if (route != V2SettingsRoute.Home) {
577-V2SettingsDetailScreen(viewModel = viewModel, route = route, onBack = { route = V2SettingsRoute.Home })
626+V2SettingsDetailScreen(viewModel = viewModel, route = route, onBack = onRouteBack)
578627return
579628 }
580629@@ -617,7 +666,7 @@ private fun V2SettingsShellScreen(
617666V2SettingsRow("Health", "Diagnostics", Icons.Default.Settings, status = isConnected, route = V2SettingsRoute.Health),
618667V2SettingsRow("About", "Version and update", Icons.Default.Storage, route = V2SettingsRoute.About),
619668 ),
620- onOpen = { route = it },
669+ onOpen = onRouteChange,
621670 )
622671 }
623672此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。