Skip to content

Commit 6645516

Browse files
Adding link icon and topbar for editor (#565)
* Adding link icon and topbar for editor * Leading icon * Update DocumentLinkDrawer.kt * Update DocumentLinkDrawer.kt
1 parent 9d668f6 commit 6645516

File tree

15 files changed

+94
-24
lines changed

15 files changed

+94
-24
lines changed

application/composeApp/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,8 +176,8 @@ android {
176176
applicationId = "io.writeopia"
177177
minSdk = libs.versions.minSdk.get().toInt()
178178
targetSdk = libs.versions.targetSdk.get().toInt()
179-
versionCode = 51
180-
versionName = "0.38.0"
179+
versionCode = 54
180+
versionName = "0.41.0"
181181

182182
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
183183
}

application/core/navigation/src/commonMain/kotlin/io/writeopia/navigation/notes/NoteNavigation.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package io.writeopia.navigation.notes
33
import androidx.navigation.NavController
44
import io.writeopia.common.utils.Destinations
55
import io.writeopia.common.utils.NotesNavigation
6+
import io.writeopia.common.utils.encoding.encodeForNavigation
67
import io.writeopia.notemenu.data.usecase.NotesNavigationUseCase
78
import io.writeopia.notemenu.navigation.NAVIGATION_PATH
89
import io.writeopia.notemenu.navigation.NAVIGATION_TYPE
@@ -18,15 +19,15 @@ fun NavController.navigateToNoteDesktop(id: String, title: String) {
1819
val noteId = this.currentBackStackEntry?.savedStateHandle?.get<String?>("noteId")
1920

2021
if (noteId != id) {
21-
navigate("${Destinations.EDITOR.id}/$id/$title")
22+
navigate("${Destinations.EDITOR.id}/$id/${title.encodeForNavigation()}")
2223
}
2324
}
2425

2526
fun NavController.navigateToNoteMobile(id: String, title: String) {
2627
val noteId = this.currentBackStackEntry?.savedStateHandle?.get<String?>("noteId")
2728

2829
if (noteId != id) {
29-
navigate("${Destinations.EDITOR.id}/$id/$title")
30+
navigate("${Destinations.EDITOR.id}/$id/${title.encodeForNavigation()}")
3031
}
3132
}
3233

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package io.writeopia.common.utils.encoding
2+
3+
fun String.encodeForNavigation(): String =
4+
this.replace("%", "%25") // Must be first!
5+
.replace("/", "%2F")
6+
.replace("?", "%3F")
7+
.replace("#", "%23")
8+
.replace("&", "%26")
9+
.replace(" ", "%20")
10+
11+
fun String.decodeFromNavigation(): String =
12+
this.replace("%20", " ")
13+
.replace("%26", "&")
14+
.replace("%23", "#")
15+
.replace("%3F", "?")
16+
.replace("%2F", "/")
17+
.replace("%25", "%")

application/features/editor/src/androidMain/kotlin/io/writeopia/editor/features/editor/ui/screen/NoteEditorScreen.android.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ private fun TopBar(
220220
val isEditable by editableState.collectAsState()
221221

222222
TopAppBar(
223-
modifier = modifier.height(44.dp),
223+
modifier = modifier.height(110.dp),
224224
title = {
225225
Row(
226226
modifier = Modifier.fillMaxHeight(),

application/features/editor/src/commonMain/kotlin/io/writeopia/editor/features/editor/ui/TextEditor.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import androidx.compose.runtime.remember
1313
import androidx.compose.ui.Modifier
1414
import androidx.compose.ui.text.font.FontFamily
1515
import androidx.compose.ui.unit.dp
16+
import io.writeopia.common.utils.icons.WrIcons
1617
import io.writeopia.editor.configuration.ui.DrawConfigFactory
1718
import io.writeopia.editor.features.editor.viewmodel.NoteEditorViewModel
1819
import io.writeopia.model.Font
@@ -79,6 +80,7 @@ internal fun TextEditor(
7980
generateSection = noteEditorViewModel::aiSection,
8081
receiveExternalFile = noteEditorViewModel::receiveExternalFile,
8182
onDocumentLinkClick = onDocumentLinkClick,
83+
linkLeadingIcon = WrIcons.pageStyle,
8284
equationToImageUrl = "https://latex.codecogs.com/png.latex?\\Large&space;x="
8385
),
8486
storyState = storyState,

application/features/editor/src/commonMain/kotlin/io/writeopia/editor/features/editor/ui/desktop/edit/menu/SideEditorOptions.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ import androidx.compose.ui.window.Popup
5353
import androidx.compose.ui.window.PopupProperties
5454
import io.writeopia.common.utils.collections.inBatches
5555
import io.writeopia.common.utils.colors.highlightColors
56+
import io.writeopia.common.utils.configuration.LocalPlatform
5657
import io.writeopia.common.utils.file.fileChooserLoad
5758
import io.writeopia.common.utils.file.fileChooserSave
5859
import io.writeopia.common.utils.icons.WrIcons
@@ -744,6 +745,9 @@ internal fun FontOptions(
744745
) {
745746
val selected by selectedState.collectAsState()
746747

748+
val currentPlatform = LocalPlatform.current
749+
val buttonPadding = if (currentPlatform.isMobile()) 8.dp else 4.dp
750+
747751
mapOf(
748752
Font.SYSTEM.label to FontFamily.Default,
749753
Font.SERIF.label to FontFamily.Serif,
@@ -768,7 +772,7 @@ internal fun FontOptions(
768772
.clickable {
769773
changeFontFamily(Font.fromLabel(name))
770774
}
771-
.padding(4.dp),
775+
.padding(buttonPadding),
772776
color = MaterialTheme.colorScheme.onBackground,
773777
style = buttonsTextStyle()
774778
)

application/features/editor/src/commonMain/kotlin/io/writeopia/editor/navigation/EditorNavigation.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import androidx.navigation.NavType
1515
import androidx.navigation.compose.composable
1616
import androidx.navigation.navArgument
1717
import io.writeopia.common.utils.Destinations
18+
import io.writeopia.common.utils.encoding.decodeFromNavigation
1819
import io.writeopia.editor.di.TextEditorInjector
1920
import io.writeopia.editor.features.editor.copy.CopyManager
2021
import io.writeopia.editor.features.editor.ui.screen.TextEditorScreen
@@ -48,6 +49,7 @@ fun NavGraphBuilder.editorNavigation(
4849
) { backStackEntry ->
4950
val noteId = backStackEntry.savedStateHandle.get<String?>("noteId")
5051
val noteTitle = backStackEntry.savedStateHandle.get<String?>("noteTitle")
52+
?.decodeFromNavigation()
5153
val parentFolderId = backStackEntry.savedStateHandle.get<String?>("parentFolderId")
5254

5355
if (noteId != null && noteTitle != null) {

writeopia_ui/src/androidMain/kotlin/io/writeopia/ui/drawer/factory/DefaultDrawersAndroid.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import androidx.compose.material3.MaterialTheme
99
import androidx.compose.runtime.Composable
1010
import androidx.compose.ui.Modifier
1111
import androidx.compose.ui.draw.clip
12+
import androidx.compose.ui.graphics.vector.ImageVector
1213
import androidx.compose.ui.text.font.FontFamily
1314
import androidx.compose.ui.text.input.TextFieldValue
1415
import androidx.compose.ui.unit.dp
@@ -35,6 +36,7 @@ object DefaultDrawersAndroid : DrawersFactory {
3536
generateSection: (Int) -> Unit,
3637
receiveExternalFile: (List<ExternalFile>, Int) -> Unit,
3738
onDocumentLinkClick: (String) -> Unit,
39+
linkLeadingIcon: ImageVector?,
3840
equationToImageUrl: String?
3941
): Map<Int, StoryStepDrawer> {
4042
val commonDrawers = CommonDrawers.create(
@@ -78,6 +80,7 @@ object DefaultDrawersAndroid : DrawersFactory {
7880
)
7981
}
8082
},
83+
linkLeadingIcon = linkLeadingIcon,
8184
onDocumentLinkClick = onDocumentLinkClick,
8285
)
8386

writeopia_ui/src/commonMain/kotlin/io/writeopia/ui/drawer/content/DocumentLinkDrawer.kt

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,22 @@ import androidx.compose.foundation.hoverable
66
import androidx.compose.foundation.interaction.MutableInteractionSource
77
import androidx.compose.foundation.interaction.collectIsHoveredAsState
88
import androidx.compose.foundation.layout.PaddingValues
9+
import androidx.compose.foundation.layout.Row
10+
import androidx.compose.foundation.layout.Spacer
911
import androidx.compose.foundation.layout.fillMaxWidth
1012
import androidx.compose.foundation.layout.padding
13+
import androidx.compose.foundation.layout.size
14+
import androidx.compose.foundation.layout.width
15+
import androidx.compose.material3.Icon
1116
import androidx.compose.material3.MaterialTheme
1217
import androidx.compose.material3.Text
1318
import androidx.compose.runtime.Composable
1419
import androidx.compose.runtime.LaunchedEffect
1520
import androidx.compose.runtime.getValue
1621
import androidx.compose.runtime.remember
22+
import androidx.compose.ui.Alignment
1723
import androidx.compose.ui.Modifier
24+
import androidx.compose.ui.graphics.vector.ImageVector
1825
import androidx.compose.ui.input.pointer.PointerIcon
1926
import androidx.compose.ui.input.pointer.pointerHoverIcon
2027
import androidx.compose.ui.text.TextStyle
@@ -53,6 +60,7 @@ class DocumentLinkDrawer(
5360
private val enabled: Boolean,
5461
private val paddingValues: PaddingValues = PaddingValues(0.dp),
5562
private val receiveExternalFile: (List<ExternalFile>, Int) -> Unit,
63+
private val leadingIcon: ImageVector? = null,
5664
private val onClick: (String) -> Unit
5765
) : StoryStepDrawer {
5866

@@ -122,23 +130,41 @@ class DocumentLinkDrawer(
122130
onSelected(!drawInfo.selectMode, drawInfo.position)
123131
}
124132
) {
125-
Text(
126-
modifier = Modifier.padding(
127-
horizontal = config.iaAnswerHorizontalPadding.dp,
128-
vertical = config.iaAnswerHorizontalPadding.dp
129-
).clickable {
130-
step.documentLink?.id?.let(onClick)
131-
}.pointerHoverIcon(PointerIcon.Hand),
132-
text = step.documentLink?.title ?: "New Document",
133-
style = TextStyle(
134-
color = MaterialTheme.colorScheme.onBackground,
135-
fontSize = 16.sp,
136-
textDecoration = TextDecoration.Underline
133+
Row(
134+
modifier = Modifier
135+
.clickable {
136+
step.documentLink?.id?.let(onClick)
137+
}.pointerHoverIcon(PointerIcon.Hand)
138+
.padding(
139+
horizontal = config.linkHorizontalPadding.dp,
140+
vertical = config.linkVerticalPadding.dp
141+
),
142+
verticalAlignment = Alignment.CenterVertically
143+
) {
144+
leadingIcon?.let { icon ->
145+
Icon(
146+
modifier = Modifier.size(20.dp),
147+
imageVector = icon,
148+
contentDescription = "Document Link",
149+
tint = MaterialTheme.colorScheme.onBackground
150+
)
151+
152+
Spacer(modifier = Modifier.width(6.dp))
153+
}
154+
155+
Text(
156+
modifier = Modifier,
157+
text = step.documentLink?.title ?: "New Document",
158+
style = TextStyle(
159+
color = MaterialTheme.colorScheme.onBackground,
160+
fontSize = 16.sp,
161+
textDecoration = TextDecoration.Underline
137162
// fontFamily = fontFamily
138-
),
139-
)
163+
),
164+
)
140165

141-
endContent?.invoke(step, drawInfo, isHovered)
166+
endContent?.invoke(step, drawInfo, isHovered)
167+
}
142168
}
143169
}
144170
}

writeopia_ui/src/commonMain/kotlin/io/writeopia/ui/drawer/factory/CommonDrawers.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import androidx.compose.runtime.Composable
1010
import androidx.compose.ui.Modifier
1111
import androidx.compose.ui.draw.clip
1212
import androidx.compose.ui.graphics.Color
13+
import androidx.compose.ui.graphics.vector.ImageVector
1314
import androidx.compose.ui.input.key.KeyEvent
1415
import androidx.compose.ui.text.TextStyle
1516
import androidx.compose.ui.text.font.FontFamily
@@ -65,6 +66,7 @@ object CommonDrawers {
6566
receiveExternalFile: (List<ExternalFile>, Int) -> Unit = { _, _ -> },
6667
headerEndContent: @Composable ((StoryStep, DrawInfo, Boolean) -> Unit)? = null,
6768
onDocumentLinkClick: (String) -> Unit,
69+
linkLeadingIcon: ImageVector? = null,
6870
equationToImageUrl: String? = null,
6971
textToolbox: @Composable (Boolean) -> Unit = {}
7072
): Map<Int, StoryStepDrawer> {
@@ -180,6 +182,7 @@ object CommonDrawers {
180182
onDragStart = manager::onDragStart,
181183
onDragStop = manager::onDragStop,
182184
moveRequest = manager::moveRequest,
185+
leadingIcon = linkLeadingIcon,
183186
onClick = onDocumentLinkClick
184187
)
185188

@@ -321,8 +324,8 @@ private fun RowScope.messageDrawer(
321324
eventListener: (KeyEvent, TextFieldValue, StoryStep, Int, EmptyErase, Int, EndOfText) -> Boolean,
322325
onSelectionLister: (Int) -> Unit,
323326
textToolbox: @Composable (Boolean) -> Unit
324-
): TextDrawer {
325-
return TextDrawer(
327+
): TextDrawer =
328+
TextDrawer(
326329
modifier = modifier.weight(1F),
327330
onKeyEvent = eventListener,
328331
onTextEdit = manager::handleTextInput,
@@ -339,4 +342,3 @@ private fun RowScope.messageDrawer(
339342
aiExplanation = aiExplanation,
340343
textToolbox = textToolbox
341344
)
342-
}

0 commit comments

Comments
 (0)