From d956ba446eeea4bb71b76a6eb738d79d8ed2f563 Mon Sep 17 00:00:00 2001 From: Nikolay Rykunov Date: Mon, 9 Oct 2023 15:38:03 +0200 Subject: [PATCH] [compose] Introduce internal Compose Showcase action with basic some jewel components GitOrigin-RevId: 8bf7f8ba3279f360843c61b64c95626793798699 --- intellij.idea.community.main.iml | 1 + .../compose/intellij.platform.compose.iml | 1 + .../compose/resources/META-INF/compose.xml | 6 + .../compose/showcase/ComposeShowcase.kt | 142 ++++++++++++++++++ .../compose/showcase/ComposeShowcaseAction.kt | 40 +++++ .../src/META-INF/PlatformLangPlugin.xml | 4 + 6 files changed, 194 insertions(+) create mode 100644 platform/compose/resources/META-INF/compose.xml create mode 100644 platform/compose/src/com/intellij/compose/showcase/ComposeShowcase.kt create mode 100644 platform/compose/src/com/intellij/compose/showcase/ComposeShowcaseAction.kt diff --git a/intellij.idea.community.main.iml b/intellij.idea.community.main.iml index bf49575dd693..b41cebaadeab 100644 --- a/intellij.idea.community.main.iml +++ b/intellij.idea.community.main.iml @@ -208,5 +208,6 @@ + \ No newline at end of file diff --git a/platform/compose/intellij.platform.compose.iml b/platform/compose/intellij.platform.compose.iml index d3a59ed527aa..213a1831b023 100644 --- a/platform/compose/intellij.platform.compose.iml +++ b/platform/compose/intellij.platform.compose.iml @@ -26,6 +26,7 @@ + diff --git a/platform/compose/resources/META-INF/compose.xml b/platform/compose/resources/META-INF/compose.xml new file mode 100644 index 000000000000..cb345749197e --- /dev/null +++ b/platform/compose/resources/META-INF/compose.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/platform/compose/src/com/intellij/compose/showcase/ComposeShowcase.kt b/platform/compose/src/com/intellij/compose/showcase/ComposeShowcase.kt new file mode 100644 index 000000000000..426e8a1a5526 --- /dev/null +++ b/platform/compose/src/com/intellij/compose/showcase/ComposeShowcase.kt @@ -0,0 +1,142 @@ +// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.compose.showcase + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.* +import androidx.compose.ui.ExperimentalComposeUiApi +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import org.jetbrains.jewel.* + +@Composable +internal fun ComposeShowcase() { + Column( + verticalArrangement = Arrangement.spacedBy(15.dp), + modifier = Modifier.padding(10.dp) + ) { + CheckBox() + RadioButton() + Button() + Label() + Tabs() + LinkLabels() + TextField() + } +} + + +@OptIn(ExperimentalComposeUiApi::class) +@Composable +private fun CheckBox() { + var checkedState by remember { mutableStateOf(false) } + Row( + horizontalArrangement = Arrangement.spacedBy(5.dp) + ) { + Text("Checkbox:") + CheckboxRow( + "checkBox", + checkedState, + LocalResourceLoader.current, + onCheckedChange = { + checkedState = it + } + ) + } +} + +@OptIn(ExperimentalComposeUiApi::class) +@Composable +private fun RadioButton() { + var selectedRadioButton by remember { mutableStateOf(1) } + val resourceLoader = LocalResourceLoader.current + Row( + horizontalArrangement = Arrangement.spacedBy(5.dp) + ) { + Text("radioButton") + RadioButtonRow( + "Value 1", + selected = selectedRadioButton == 0, + resourceLoader, + onClick = { + selectedRadioButton = 0 + } + ) + RadioButtonRow( + "Value 2", + selected = selectedRadioButton == 1, + resourceLoader, + onClick = { + selectedRadioButton = 1 + } + ) + } +} + +@Composable +private fun Label() { + Row( + horizontalArrangement = Arrangement.spacedBy(5.dp) + ) { + Text("label:") + Text("Some label") + } +} + +@Composable +private fun Button() { + OutlinedButton(onClick = { + // no nothing + }) { + Text("button") + } +} + +@Composable +private fun Tabs() { + var selectedTabIndex by remember { mutableStateOf(0) } + val tabIds by remember { mutableStateOf((1..12).toList()) } + + val tabs by derivedStateOf { + tabIds.mapIndexed { index, id -> + TabData.Default( + selected = index == selectedTabIndex, + label = "Tab $id", + closable = false, + onClick = { selectedTabIndex = index }, + ) + } + } + + TabStrip(tabs) +} + +@OptIn(ExperimentalComposeUiApi::class) +@Composable +private fun LinkLabels() { + Row( + horizontalArrangement = Arrangement.spacedBy(5.dp) + ) { + val resourceLoader = LocalResourceLoader.current + + Text("Labels:") + Link("Link", resourceLoader, onClick = { + // do nothing + }) + } +} + +@Composable +private fun TextField() { + var textFieldState by remember { mutableStateOf("") } + Row( + horizontalArrangement = Arrangement.spacedBy(5.dp) + ) { + Text("Text field:") + TextField(textFieldState, onValueChange = { + textFieldState = it + }) + } +} \ No newline at end of file diff --git a/platform/compose/src/com/intellij/compose/showcase/ComposeShowcaseAction.kt b/platform/compose/src/com/intellij/compose/showcase/ComposeShowcaseAction.kt new file mode 100644 index 000000000000..1cb51cd7e21d --- /dev/null +++ b/platform/compose/src/com/intellij/compose/showcase/ComposeShowcaseAction.kt @@ -0,0 +1,40 @@ +// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.compose.showcase + +import com.intellij.compose.JBComposePanel +import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.project.DumbAwareAction +import com.intellij.openapi.project.Project +import com.intellij.openapi.ui.DialogWrapper +import com.intellij.openapi.util.NlsSafe +import com.intellij.ui.PaintingParent.Wrapper +import java.awt.Dimension +import javax.swing.JComponent + +private fun createComposeShowcaseComponent(): JComponent { + return JBComposePanel { + ComposeShowcase() + } +} + +private class ComposeShowcaseAction : DumbAwareAction() { + override fun actionPerformed(e: AnActionEvent) { + ComposeShowcaseDialog(e.project, e.presentation.text).show() + } +} + +private class ComposeShowcaseDialog(project: Project?, @NlsSafe dialogTitle: String) : + DialogWrapper(project, null, true, IdeModalityType.MODELESS, false) { + + init { + title = dialogTitle + init() + } + + override fun createCenterPanel(): JComponent { + return Wrapper(createComposeShowcaseComponent()).apply { + minimumSize = Dimension(200, 100) + preferredSize = Dimension(800, 600) + } + } +} diff --git a/platform/platform-resources/src/META-INF/PlatformLangPlugin.xml b/platform/platform-resources/src/META-INF/PlatformLangPlugin.xml index 6f452f537149..1a329fe94b84 100644 --- a/platform/platform-resources/src/META-INF/PlatformLangPlugin.xml +++ b/platform/platform-resources/src/META-INF/PlatformLangPlugin.xml @@ -145,6 +145,10 @@ + + + +