diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/login/ErrorScreen.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/login/ErrorScreen.kt index adf541b9120046b5674a6e68756611baab2b4c4d..09c36ab1112e9127cb73a963b2189b44d8f3d479 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/login/ErrorScreen.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/login/ErrorScreen.kt @@ -140,6 +140,6 @@ fun ErrorScreen( onClick = onShowAbout, modifier = Modifier.align(Alignment.BottomStart) ) { - Icon(Icons.Filled.Info, i18n("access.about_briar_desktop")) + Icon(Icons.Filled.Info, i18n("access.mode.about")) } } diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/login/StartupScreen.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/login/StartupScreen.kt index e03d14f2835de651b5392cd962f0a0248c59261f..089cf83049e8f646104ab75fc5d0c058b5ba6cc4 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/login/StartupScreen.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/login/StartupScreen.kt @@ -83,7 +83,7 @@ fun StartupScreenScaffold( onClick = onShowAbout, modifier = Modifier.align(Alignment.BottomStart) ) { - Icon(Icons.Filled.Info, i18n("access.about_briar_desktop")) + Icon(Icons.Filled.Info, i18n("access.mode.about")) } } diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/navigation/BriarSidebar.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/navigation/BriarSidebar.kt index fe080e6eade164bfb2f7089b6dd4e1b83a62c82d..418a6a339d411d4a2021247b757d0a59d25f2ec3 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/navigation/BriarSidebar.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/navigation/BriarSidebar.kt @@ -29,14 +29,6 @@ import androidx.compose.material.Icon import androidx.compose.material.IconButton import androidx.compose.material.MaterialTheme import androidx.compose.material.Surface -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ChromeReaderMode -import androidx.compose.material.icons.filled.Contacts -import androidx.compose.material.icons.filled.Forum -import androidx.compose.material.icons.filled.Group -import androidx.compose.material.icons.filled.Info -import androidx.compose.material.icons.filled.Settings -import androidx.compose.material.icons.filled.WifiTethering import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -56,17 +48,7 @@ fun BriarSidebar( account: LocalAuthor?, uiMode: UiMode, setUiMode: (UiMode) -> Unit, - showAbout: () -> Unit, ) { - val displayButton = @Composable { selectedMode: UiMode, mode: UiMode, icon: ImageVector -> - BriarSidebarButton( - selectedMode == mode, - { setUiMode(mode) }, - icon, - mode.toString() - ) - } - Surface(modifier = Modifier.width(SIDEBAR_WIDTH).fillMaxHeight(), color = MaterialTheme.colors.sidebarSurface) { Column(verticalArrangement = Arrangement.Top) { // profile button @@ -75,40 +57,59 @@ fun BriarSidebar( ) { account?.let { ProfileCircle(size = 45.dp, it.id.bytes) } } - val items = buildList { - add(Pair(UiMode.CONTACTS, Icons.Filled.Contacts)) + val modes = buildList { + add(UiMode.CONTACTS) val featureFlags = getDesktopFeatureFlags() - if (featureFlags.shouldEnablePrivateGroups()) add(Pair(UiMode.GROUPS, Icons.Filled.Group)) - if (featureFlags.shouldEnableForums()) add(Pair(UiMode.FORUMS, Icons.Filled.Forum)) - if (featureFlags.shouldEnableBlogs()) add(Pair(UiMode.BLOGS, Icons.Filled.ChromeReaderMode)) + if (featureFlags.shouldEnablePrivateGroups()) add(UiMode.GROUPS) + if (featureFlags.shouldEnableForums()) add(UiMode.FORUMS) + if (featureFlags.shouldEnableBlogs()) add(UiMode.BLOGS) } - for ((mode, icon) in items) { - displayButton(uiMode, mode, icon) + modes.forEach { mode -> + BriarSidebarButton( + currentMode = uiMode, + mode = mode, + setUiMode = setUiMode, + ) } } Column(verticalArrangement = Arrangement.Bottom) { - val items = buildList { + val modes = buildList { val featureFlags = getDesktopFeatureFlags() - if (featureFlags.shouldEnableTransportSettings()) add( - Pair(UiMode.TRANSPORTS, Icons.Filled.WifiTethering) - ) - add(Pair(UiMode.SETTINGS, Icons.Filled.Settings)) + if (featureFlags.shouldEnableTransportSettings()) add(UiMode.TRANSPORTS) + add(UiMode.SETTINGS) + add(UiMode.ABOUT) } - for ((mode, icon) in items) { - displayButton(uiMode, mode, icon) + modes.forEach { mode -> + BriarSidebarButton( + currentMode = uiMode, + mode = mode, + setUiMode = setUiMode, + ) } - BriarSidebarButton( - selected = false, - onClick = showAbout, - icon = Icons.Filled.Info, - contentDescription = i18n("access.about_briar_desktop") - ) } } } @Composable -fun BriarSidebarButton(selected: Boolean, onClick: () -> Unit, icon: ImageVector, contentDescription: String?) { +fun BriarSidebarButton( + mode: UiMode, + currentMode: UiMode, + setUiMode: (UiMode) -> Unit, +) = BriarSidebarButton( + currentMode == mode, + { setUiMode(mode) }, + mode.icon, + i18n(mode.contentDescriptionKey) +) + + +@Composable +fun BriarSidebarButton( + selected: Boolean, + onClick: () -> Unit, + icon: ImageVector, + contentDescription: String?, +) { val tint = if (selected) MaterialTheme.colors.primary else MaterialTheme.colors.onSurface IconButton( modifier = Modifier.padding(vertical = 4.dp, horizontal = 12.dp), diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/AboutDialog.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/AboutDialog.kt index 5899d87ba3aa427a1a87305c6608aeff4239f598..252d749cc0c83c2aa9e1dc75ada19289bfd2438b 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/AboutDialog.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/AboutDialog.kt @@ -45,6 +45,20 @@ fun main() = preview( fun AboutDialog( onClose: () -> Unit, ) { + BriarDialog(onClose = onClose) { + val box = this + Column( + modifier = Modifier.requiredSize( + box.maxWidth.times(0.8f), box.maxHeight.times(0.8f) + ).padding(16.dp) + ) { + AboutScreen() + } + } +} + +@Composable +fun AboutScreen() { // sizes of the two columns val colSizes = listOf(0.3f, 0.7f) @@ -52,7 +66,7 @@ fun AboutDialog( val buildTime = Instant.ofEpochMilli(BuildData.GIT_TIME).atZone(ZoneId.systemDefault()).toLocalDateTime() // rows displayed in table - val lines = buildList<Pair<String, String>> { + val lines = buildList { add(i18n("about.copyright") to "The Briar Project") // NON-NLS add(i18n("about.license") to "GNU Affero General Public License v3") // NON-NLS add(i18n("about.version") to BuildData.VERSION) @@ -66,63 +80,56 @@ fun AboutDialog( add(i18n("about.contact") to "desktop@briarproject.org") // NON-NLS } - BriarDialog(onClose = onClose) { - val box = this - Column( - modifier = Modifier.requiredSize( - box.maxWidth.times(0.8f), box.maxHeight.times(0.8f) - ).padding(16.dp) + Column { + Row( + modifier = Modifier.padding(bottom = 8.dp).fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Center ) { - Row( - modifier = Modifier.padding(bottom = 8.dp).fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.Center - ) { - BriarLogo(modifier = Modifier.height(48.dp)) - Text( - i18n("main.title"), - style = MaterialTheme.typography.h4, - modifier = Modifier.padding(start = 16.dp), - overflow = TextOverflow.Ellipsis, - maxLines = 1, - ) - } - val scrollState = rememberLazyListState() - Box { - LazyColumn(state = scrollState) { - item { - HorizontalDivider() - } - items(lines) { (key, value) -> - // this is required for Divider between Boxes to have appropriate size - Row(Modifier.fillMaxWidth().height(IntrinsicSize.Min)) { - Box(modifier = Modifier.weight(colSizes[0]).fillMaxHeight()) { + BriarLogo(modifier = Modifier.height(48.dp)) + Text( + i18n("main.title"), + style = MaterialTheme.typography.h4, + modifier = Modifier.padding(start = 16.dp), + overflow = TextOverflow.Ellipsis, + maxLines = 1, + ) + } + val scrollState = rememberLazyListState() + Box { + LazyColumn(state = scrollState) { + item { + HorizontalDivider() + } + items(lines) { (key, value) -> + // this is required for Divider between Boxes to have appropriate size + Row(Modifier.fillMaxWidth().height(IntrinsicSize.Min)) { + Box(modifier = Modifier.weight(colSizes[0]).fillMaxHeight()) { + Text( + text = key, + modifier = Modifier.padding(horizontal = 8.dp) + .padding(vertical = 8.dp).padding(end = 8.dp) + .align(Alignment.CenterStart) + ) + } + VerticalDivider() + Box(modifier = Modifier.weight(colSizes[1]).fillMaxHeight()) { + SelectionContainer { Text( - text = key, - modifier = Modifier.padding(horizontal = 8.dp) - .padding(vertical = 8.dp).padding(end = 8.dp) - .align(Alignment.CenterStart) + text = value, + modifier = Modifier.fillMaxWidth().padding(vertical = 8.dp) + .padding(start = 8.dp) ) } - VerticalDivider() - Box(modifier = Modifier.weight(colSizes[1]).fillMaxHeight()) { - SelectionContainer { - Text( - text = value, - modifier = Modifier.fillMaxWidth().padding(vertical = 8.dp) - .padding(start = 8.dp) - ) - } - } } - HorizontalDivider() } + HorizontalDivider() } - VerticalScrollbar( - adapter = rememberScrollbarAdapter(scrollState), - modifier = Modifier.align(Alignment.CenterEnd).fillMaxHeight() - ) } + VerticalScrollbar( + adapter = rememberScrollbarAdapter(scrollState), + modifier = Modifier.align(Alignment.CenterEnd).fillMaxHeight() + ) } } } diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/MainScreen.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/MainScreen.kt index 48581bd3217a070476f52c40e78ea669ffd9e7f6..196a5748a627f9d750ed039ce55584600afea298 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/MainScreen.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/MainScreen.kt @@ -42,13 +42,13 @@ fun MainScreen( viewModel.account.value, viewModel.uiMode.value, viewModel::setUiMode, - showAbout = onShowAbout, ) VerticalDivider() when (viewModel.uiMode.value) { UiMode.CONTACTS -> PrivateMessageScreen() UiMode.GROUPS -> PrivateGroupScreen() UiMode.SETTINGS -> SettingsScreen() + UiMode.ABOUT -> AboutScreen() else -> UiPlaceholder() } } diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/UiMode.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/UiMode.kt index 414966fb5347f4c1a2e83300f586fa244bb450f4..10a464edbea9cfb4230f02a92d64dd51079dc791 100644 --- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/UiMode.kt +++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/ui/UiMode.kt @@ -18,11 +18,22 @@ package org.briarproject.briar.desktop.ui -enum class UiMode { - CONTACTS, - GROUPS, - FORUMS, - BLOGS, - TRANSPORTS, - SETTINGS, +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ChromeReaderMode +import androidx.compose.material.icons.filled.Contacts +import androidx.compose.material.icons.filled.Forum +import androidx.compose.material.icons.filled.Group +import androidx.compose.material.icons.filled.Info +import androidx.compose.material.icons.filled.Settings +import androidx.compose.material.icons.filled.WifiTethering +import androidx.compose.ui.graphics.vector.ImageVector + +enum class UiMode(val icon: ImageVector, val contentDescriptionKey: String) { + CONTACTS(Icons.Filled.Contacts, "access.mode.contacts"), + GROUPS(Icons.Filled.Group, "access.mode.groups"), + FORUMS(Icons.Filled.Forum, "access.mode.forums"), + BLOGS(Icons.Filled.ChromeReaderMode, "access.mode.blogs"), + TRANSPORTS(Icons.Filled.WifiTethering, "access.mode.transports"), + SETTINGS(Icons.Filled.Settings, "access.mode.settings"), + ABOUT(Icons.Filled.Info, "access.mode.about"), } diff --git a/briar-desktop/src/main/resources/strings/BriarDesktop.properties b/briar-desktop/src/main/resources/strings/BriarDesktop.properties index f95ee998a6a978c1eed4c6eb8572f75db7707144..39f09d11b49366ab347af0b7b75be2dd31b32f38 100644 --- a/briar-desktop/src/main/resources/strings/BriarDesktop.properties +++ b/briar-desktop/src/main/resources/strings/BriarDesktop.properties @@ -14,7 +14,13 @@ access.message.send=Send message access.message.sent=Message sent access.logo=Briar logo access.swap=Icon showing errors between two contacts -access.about_briar_desktop=About Briar Desktop +access.mode.contacts=Contacts +access.mode.groups=Private Groups +access.mode.forums=Forums +access.mode.blogs=Blogs +access.mode.transports=Transport Settings +access.mode.settings=Settings +access.mode.about=About Briar Desktop access.password.show=Show password access.password.hide=Hide password access.settings.current_value=Current value