diff --git a/.gitignore b/.gitignore index 06e8847b4d..c2b13ed18a 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,9 @@ .mtj.tmp/ # Package Files # +*.jar +!gradle-wrapper.jar + *.war *.nar *.ear @@ -22,4 +25,4 @@ hs_err_pid* templates/multiplatform-template/.idea/** -templates/desktop-template/.idea/** \ No newline at end of file +templates/desktop-template/.idea/** diff --git a/ci/compose-uber-jar/README.md b/ci/compose-uber-jar/README.md index 9887446763..c64ade309d 100644 --- a/ci/compose-uber-jar/README.md +++ b/ci/compose-uber-jar/README.md @@ -22,5 +22,5 @@ The jar will be available at `build/libs/compose-full.jar` ``` export COMPOSE_REPO_USERNAME= export COMPOSE_REPO_KEY= -./gradlew publishToSpace +./gradlew publishToComposeRepo ``` \ No newline at end of file diff --git a/ci/compose-uber-jar/build.gradle.kts b/ci/compose-uber-jar/build.gradle.kts index 5855958d95..9ef3e45b60 100644 --- a/ci/compose-uber-jar/build.gradle.kts +++ b/ci/compose-uber-jar/build.gradle.kts @@ -33,8 +33,8 @@ val shadowJar = tasks.named("shadowJar", ShadowJar::class) { archiveFileName.set("compose-full.jar") } -tasks.register("publishToSpace") { - dependsOn(tasks.named("publishAllPublicationsToSpaceRepository")) +tasks.register("publishToComposeRepo") { + dependsOn(tasks.named("publishAllPublicationsToComposeRepoRepository")) } publishing { @@ -48,7 +48,7 @@ publishing { } repositories { maven(properties.composeRepoUrl) { - name = "Space" + name = "ComposeRepo" authentication { credentials { username = properties.composeRepoUserName @@ -66,7 +66,8 @@ class ComposeUberJarProperties { val composeVersionFile: String? get() = typedProperty(COMPOSE_VERSION_FILE_PROPERTY) - val composeRepoUrl: String = "https://packages.jetbrains.team/maven/p/ui/dev" + val composeRepoUrl: String + get() = System.getenv("COMPOSE_REPO_URL") ?: "https://maven.pkg.jetbrains.space/public/p/compose/dev" val composeRepoUserName: String? get() = System.getenv("COMPOSE_REPO_USERNAME") diff --git a/ci/compose-uber-jar/gradle.properties b/ci/compose-uber-jar/gradle.properties index 858a00b746..1d98137c0d 100644 --- a/ci/compose-uber-jar/gradle.properties +++ b/ci/compose-uber-jar/gradle.properties @@ -1,2 +1,2 @@ -compose.version=0.1.0-build49 +compose.version=0.1.0-build63 kotlin.code.style=official \ No newline at end of file diff --git a/ci/compose-uber-jar/gradle/wrapper/gradle-wrapper.jar b/ci/compose-uber-jar/gradle/wrapper/gradle-wrapper.jar index f3d88b1c2f..62d4c05355 100644 Binary files a/ci/compose-uber-jar/gradle/wrapper/gradle-wrapper.jar and b/ci/compose-uber-jar/gradle/wrapper/gradle-wrapper.jar differ diff --git a/ci/compose-uber-jar/settings.gradle b/ci/compose-uber-jar/settings.gradle index 7b0dc31dfc..bcd394b2a7 100644 --- a/ci/compose-uber-jar/settings.gradle +++ b/ci/compose-uber-jar/settings.gradle @@ -1,2 +1,2 @@ -rootProject.name = 'untitled23' +rootProject.name = 'compose-uber-jar' diff --git a/examples/imageviewer/common/src/androidMain/kotlin/example/imageviewer/model/ContentState.kt b/examples/imageviewer/common/src/androidMain/kotlin/example/imageviewer/model/ContentState.kt index 493683dfa3..0f2203a788 100755 --- a/examples/imageviewer/common/src/androidMain/kotlin/example/imageviewer/model/ContentState.kt +++ b/examples/imageviewer/common/src/androidMain/kotlin/example/imageviewer/model/ContentState.kt @@ -159,7 +159,7 @@ object ContentState { } // application content initialization - fun initData() { + private fun initData() { if (isAppUIReady.value) return diff --git a/examples/imageviewer/common/src/androidMain/kotlin/example/imageviewer/view/ActualAndroid.kt b/examples/imageviewer/common/src/androidMain/kotlin/example/imageviewer/view/AndroidHover.kt similarity index 76% rename from examples/imageviewer/common/src/androidMain/kotlin/example/imageviewer/view/ActualAndroid.kt rename to examples/imageviewer/common/src/androidMain/kotlin/example/imageviewer/view/AndroidHover.kt index 802cef2ab9..1a5d3c9173 100644 --- a/examples/imageviewer/common/src/androidMain/kotlin/example/imageviewer/view/ActualAndroid.kt +++ b/examples/imageviewer/common/src/androidMain/kotlin/example/imageviewer/view/AndroidHover.kt @@ -3,7 +3,7 @@ package example.imageviewer.view import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset -actual fun Modifier.maybePointerMoveFilter( +actual fun Modifier.hover( onEnter: () -> Boolean, onExit: () -> Boolean, onMove: (Offset) -> Boolean diff --git a/examples/imageviewer/common/src/commonMain/kotlin/example/imageviewer/style/Palette.kt b/examples/imageviewer/common/src/commonMain/kotlin/example/imageviewer/style/Palette.kt index 3b5ed68876..47eba56e7c 100755 --- a/examples/imageviewer/common/src/commonMain/kotlin/example/imageviewer/style/Palette.kt +++ b/examples/imageviewer/common/src/commonMain/kotlin/example/imageviewer/style/Palette.kt @@ -21,7 +21,11 @@ val DarkGreen = Color(16, 139, 102) val Gray = Color.DarkGray val LightGray = Color(100, 100, 100) val DarkGray = Color(32, 32, 32) +val PreviewImageAreaHoverColor = Color(45, 45, 45) val ToastBackground = Color(23, 23, 23) -val MiniatureColor = Color(50,50,50) +val MiniatureColor = Color(50, 50, 50) +val MiniatureHoverColor = Color(60, 60, 60) val Foreground = Color(210, 210, 210) +val TranslucentBlack = Color(0, 0, 0, 60) +val TranslucentWhite = Color(255, 255, 255, 20) val Transparent = Color.Transparent \ No newline at end of file diff --git a/examples/imageviewer/common/src/commonMain/kotlin/example/imageviewer/view/PointerMoveFilter.kt b/examples/imageviewer/common/src/commonMain/kotlin/example/imageviewer/view/PointerMoveFilter.kt index 1b7cd86faf..7eb8ec6adc 100644 --- a/examples/imageviewer/common/src/commonMain/kotlin/example/imageviewer/view/PointerMoveFilter.kt +++ b/examples/imageviewer/common/src/commonMain/kotlin/example/imageviewer/view/PointerMoveFilter.kt @@ -3,7 +3,7 @@ package example.imageviewer.view import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset -expect fun Modifier.maybePointerMoveFilter( +expect fun Modifier.hover( onEnter: () -> Boolean = { true }, onExit: () -> Boolean = { true }, onMove: (Offset) -> Boolean = { true } diff --git a/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/model/ContentState.kt b/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/model/ContentState.kt index a0fa47f812..029ff6c8d7 100755 --- a/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/model/ContentState.kt +++ b/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/model/ContentState.kt @@ -32,9 +32,24 @@ import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateOf -class ContentState( - private val repository: ImageRepository -) { +object ContentState { + + private lateinit var repository: ImageRepository + private lateinit var uriRepository: String + + fun applyContent(uriRepository: String): ContentState { + if (this::uriRepository.isInitialized && this.uriRepository == uriRepository) { + return this + } + this.uriRepository = uriRepository + repository = ImageRepository(uriRepository) + isAppUIReady.value = false + + initData() + + return this + } + private val executor: ExecutorService by lazy { Executors.newFixedThreadPool(2) } private val isAppUIReady = mutableStateOf(false) @@ -124,7 +139,7 @@ class ContentState( } // application content initialization - fun initData() { + private fun initData() { if (isAppUIReady.value) return diff --git a/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/AppUI.kt b/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/AppUI.kt index ea627fbef5..2178396725 100755 --- a/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/AppUI.kt +++ b/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/AppUI.kt @@ -32,8 +32,6 @@ private val state: MutableState = mutableStateOf(false) @Composable fun BuildAppUI(content: ContentState) { - content.initData() - Surface( modifier = Modifier.fillMaxSize(), color = Gray diff --git a/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/FullImageScreen.kt b/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/FullImageScreen.kt index c3d6adddbb..e86b280f3d 100755 --- a/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/FullImageScreen.kt +++ b/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/FullImageScreen.kt @@ -19,6 +19,7 @@ import java.awt.image.BufferedImage import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.ScrollableRow import androidx.compose.foundation.Image @@ -41,6 +42,8 @@ import androidx.compose.foundation.layout.preferredHeight import androidx.compose.foundation.layout.preferredSize import androidx.compose.foundation.layout.padding import androidx.compose.material.Surface +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.ui.unit.dp import example.imageviewer.core.FilterType import example.imageviewer.model.AppState @@ -51,6 +54,8 @@ import example.imageviewer.style.DarkGreen import example.imageviewer.style.Foreground import example.imageviewer.style.MiniatureColor import example.imageviewer.style.Transparent +import example.imageviewer.style.TranslucentBlack +import example.imageviewer.style.TranslucentWhite import example.imageviewer.style.icBack import example.imageviewer.style.icFilterGrayscaleOn import example.imageviewer.style.icFilterGrayscaleOff @@ -106,8 +111,11 @@ fun setToolBar( text: String, content: ContentState ) { - - Surface(color = MiniatureColor, modifier = Modifier.preferredHeight(44.dp)) { + val backButtonHover = remember { mutableStateOf(false) } + Surface( + color = MiniatureColor, + modifier = Modifier.preferredHeight(44.dp) + ) { Row(modifier = Modifier.padding(end = 30.dp)) { Surface( color = Transparent, @@ -115,6 +123,16 @@ fun setToolBar( shape = CircleShape ) { Clickable( + modifier = Modifier.hover( + onEnter = { + backButtonHover.value = true + false + }, + onExit = { + backButtonHover.value = false + false + }) + .background(color = if (backButtonHover.value) TranslucentBlack else Transparent), onClick = { if (content.isContentReady()) { content.restoreMainImage() @@ -160,11 +178,22 @@ fun FilterButton( type: FilterType, modifier: Modifier = Modifier.preferredSize(38.dp) ) { + val filterButtonHover = remember { mutableStateOf(false) } Surface( color = Transparent, shape = CircleShape ) { Clickable( + modifier = Modifier.hover( + onEnter = { + filterButtonHover.value = true + false + }, + onExit = { + filterButtonHover.value = false + false + }) + .background(color = if (filterButtonHover.value) TranslucentBlack else Transparent), onClick = { content.toggleFilter(type)} ) { Image( diff --git a/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/MainScreen.kt b/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/MainScreen.kt index 834977b900..4e0c342378 100755 --- a/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/MainScreen.kt +++ b/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/MainScreen.kt @@ -15,7 +15,12 @@ */ package example.imageviewer.view -import androidx.compose.foundation.* +import androidx.compose.foundation.clickable +import androidx.compose.foundation.background +import androidx.compose.foundation.Box +import androidx.compose.foundation.Text +import androidx.compose.foundation.Image +import androidx.compose.foundation.ScrollableColumn import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.graphics.RectangleShape @@ -53,6 +58,10 @@ import example.imageviewer.style.DarkGray import example.imageviewer.style.DarkGreen import example.imageviewer.style.Foreground import example.imageviewer.style.Transparent +import example.imageviewer.style.TranslucentBlack +import example.imageviewer.style.TranslucentWhite +import example.imageviewer.style.PreviewImageAreaHoverColor +import example.imageviewer.style.MiniatureHoverColor import example.imageviewer.style.MiniatureColor import example.imageviewer.style.LightGray import example.imageviewer.style.icRefresh @@ -112,7 +121,7 @@ fun setTopContent(content: ContentState) { @Composable fun setTitleBar(text: String, content: ContentState) { - + val refreshButtonHover = remember { mutableStateOf(false) } TopAppBar( backgroundColor = DarkGreen, title = { @@ -128,6 +137,16 @@ fun setTitleBar(text: String, content: ContentState) { shape = CircleShape ) { Clickable( + modifier = Modifier.hover( + onEnter = { + refreshButtonHover.value = true + false + }, + onExit = { + refreshButtonHover.value = false + false + }) + .background(color = if (refreshButtonHover.value) TranslucentBlack else Transparent), onClick = { if (content.isContentReady()) content.refresh() @@ -144,12 +163,23 @@ fun setTitleBar(text: String, content: ContentState) { @Composable fun setPreviewImageUI(content: ContentState) { - - Clickable(onClick = { - AppState.screenState(ScreenType.FullscreenImage) + val previewImageHover = remember { mutableStateOf(false) } + Clickable( + modifier = Modifier.hover( + onEnter = { + previewImageHover.value = true + false + }, + onExit = { + previewImageHover.value = false + false + }) + .background(color = if (previewImageHover.value) PreviewImageAreaHoverColor else DarkGray), + onClick = { + AppState.screenState(ScreenType.FullscreenImage) }) { Card( - backgroundColor = DarkGray, + backgroundColor = Transparent, modifier = Modifier.preferredHeight(250.dp), shape = RectangleShape, elevation = 1.dp @@ -173,29 +203,28 @@ fun setMiniatureUI( picture: Picture, content: ContentState ) { - val active = remember { mutableStateOf(false) } + val cardHover = remember { mutableStateOf(false) } + val infoButtonHover = remember { mutableStateOf(false) } Card( - backgroundColor = MiniatureColor, + backgroundColor = if (cardHover.value) MiniatureHoverColor else MiniatureColor, modifier = Modifier.padding(start = 10.dp, end = 10.dp).preferredHeight(70.dp) .fillMaxWidth() + .hover(onEnter = { + cardHover.value = true + false + }, + onExit = { + cardHover.value = false + false + }) .clickable { content.setMainImage(picture) }, shape = RectangleShape, - elevation = 2.dp + elevation = 20.dp ) { - Row(modifier = Modifier - .padding(end = 30.dp) - .maybePointerMoveFilter(onEnter = { - active.value = true - false - }, - onExit = { - active.value = false - false - } - ) - .background(color = if (active.value) Color.LightGray else Color.Black)) { + Row(modifier = Modifier.padding(end = 30.dp) + ) { Clickable( onClick = { content.fullscreen(picture) @@ -213,18 +242,27 @@ fun setMiniatureUI( } Text( text = picture.name, - color = if (active.value) Color.Red else Foreground, + color = Foreground, modifier = Modifier .weight(1f) .align(Alignment.CenterVertically) .padding(start = 16.dp), - fontSize = TextUnit.Sp(if (active.value) 40 else 16), style = MaterialTheme.typography.body1 ) Clickable( modifier = Modifier.preferredHeight(70.dp) - .preferredWidth(30.dp), + .preferredWidth(30.dp) + .hover( + onEnter = { + infoButtonHover.value = true + false + }, + onExit = { + infoButtonHover.value = false + false + }) + .background(color = if (infoButtonHover.value) TranslucentWhite else Transparent), onClick = { showPopUpMessage( "${ResString.picture} " + diff --git a/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/ActualDesktop.kt b/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/MouseHover.kt similarity index 82% rename from examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/ActualDesktop.kt rename to examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/MouseHover.kt index b0879399aa..a0d2318c72 100644 --- a/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/ActualDesktop.kt +++ b/examples/imageviewer/common/src/desktopMain/kotlin/example/imageviewer/view/MouseHover.kt @@ -4,7 +4,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset import androidx.compose.ui.input.pointer.pointerMoveFilter -actual fun Modifier.maybePointerMoveFilter( +actual fun Modifier.hover( onEnter: () -> Boolean, onExit: () -> Boolean, onMove: (Offset) -> Boolean diff --git a/examples/imageviewer/desktop/src/main/kotlin/imageviewer/Main.kt b/examples/imageviewer/desktop/src/main/kotlin/imageviewer/Main.kt index 4346705448..fd5c29f596 100755 --- a/examples/imageviewer/desktop/src/main/kotlin/imageviewer/Main.kt +++ b/examples/imageviewer/desktop/src/main/kotlin/imageviewer/Main.kt @@ -23,8 +23,8 @@ import example.imageviewer.model.ImageRepository fun main() { - val content = ContentState( - ImageRepository("https://spvessel.com/iv/images/fetching.list") + val content = ContentState.applyContent( + "https://spvessel.com/iv/images/fetching.list" ) AppWindow("ImageViewer", getPreferredWindowSize(800, 1000)).show {