konyaco / compose-fluent-ui Goto Github PK
View Code? Open in Web Editor NEWFluent Design UI library for Compose Multiplatform
License: Apache License 2.0
Fluent Design UI library for Compose Multiplatform
License: Apache License 2.0
The android target used a sample android icon. could you update the android target icon? @123Duo3
Action:
Provide an interface that collect hovered, pressed, disabled, default states.
fun interface VisualStateScheme<Scheme: Any> {
fun schemeFor(state: VisualState): Scheme
}
interface ValueVisualStateScheme<Scheme: Any>: VisualStateScheme<Scheme> {
val default: Scheme
val hovered: Scheme
val pressed: Scheme
val disabled: Scheme
override fun schemeFor(state: VisualState): Scheme = when(state) {
VisualState.Default -> default
VisualState.Hovered -> hovered
VisualState.Pressed -> pressed
VisualState.Disabled -> disabled
}
}
@Immutable
class SelectableVisualStateScheme<Scheme: Any>(
private val default: VisualStateScheme<Scheme>,
private val selected: VisualStateScheme<Scheme>,
private val selectedState: () -> Boolean = { false },
): VisualStateScheme<Scheme> {
override fun schemeFor(state: VisualState): Scheme {
return if (selectedState()) {
selected.schemeFor(state)
} else {
default.schemeFor(state)
}
}
}
sealed interface VisualState {
data object Default: VisualState
data object Hovered: VisualState
data object Pressed: VisualState
data object Disabled: VisualState
}
@Composable
fun <T: Any> VisualStateScheme<T>.collectCurrentScheme(interactionSource: InteractionSource, disabled: Boolean = false): T {
val isHovered by interactionSource.collectIsHoveredAsState()
val isPressed by interactionSource.collectIsPressedAsState()
return when {
disabled -> schemeFor(VisualState.Disabled)
isPressed -> schemeFor(VisualState.Pressed)
isHovered -> schemeFor(VisualState.Hovered)
else -> schemeFor(VisualState.Default)
}
}
@Immutable
data class ButtonColors(
override val default: ButtonColor,
override val hovered: ButtonColor,
override val pressed: ButtonColor,
override val disabled: ButtonColor
): ValueVisualStateScheme<ButtonColor>
@Immutable
data class ButtonColor(
val fillColor: Color,
val contentColor: Color,
val borderBrush: Brush
)
@Composable
private fun ButtonLayer(
shape: Shape,
buttonColors: VisualStateScheme<ButtonColor>,
interaction: MutableInteractionSource,
disabled: Boolean,
accentButton: Boolean,
displayBorder: Boolean,
modifier: Modifier = Modifier,
content: @Composable () -> Unit
) {
val buttonColor = buttonColors.collectCurrentScheme(interaction, disabled)
val fillColor by animateColorAsState(
buttonColor.fillColor,
animationSpec = tween(FluentDuration.QuickDuration, easing = FluentEasing.FastInvokeEasing)
)
val contentColor by animateColorAsState(
buttonColor.contentColor,
animationSpec = tween(FluentDuration.QuickDuration, easing = FluentEasing.FastInvokeEasing)
)
Layer(
modifier = modifier,
color = fillColor,
contentColor = contentColor,
outsideBorder = !accentButton,
shape = shape,
border = if (displayBorder) BorderStroke(buttonBorderStrokeWidth, buttonColor.borderBrush) else null,
content = content
)
}
@Composable
fun ToggleButton(
checked: Boolean,
onCheckedChanged: (Boolean) -> Unit,
modifier: Modifier = Modifier,
disabled: Boolean = false,
colors: VisualStateScheme<ButtonColor> = SelectableVisualStateScheme(
default = buttonColors(),
selected = accentButtonColors(),
selectedState = { checked }
),
interaction: MutableInteractionSource = remember { MutableInteractionSource() },
iconOnly: Boolean = false,
outsideBorder: Boolean = !checked,
content: @Composable RowScope.() -> Unit
) {
Button(
onClick = null,
modifier = modifier.selectable(
selected = checked,
interactionSource = interaction,
indication = null,
onClick = { onCheckedChanged(!checked) },
role = Role.Checkbox
),
iconOnly = iconOnly,
buttonColors = colors,
interaction = interaction,
disabled = disabled,
accentButton = !outsideBorder,
content = content
)
}
@Composable
fun Button(
onClick: () -> Unit,
modifier: Modifier = Modifier,
disabled: Boolean = false,
buttonColors: VisualStateScheme<ButtonColor> = buttonColors(),
interaction: MutableInteractionSource = remember { MutableInteractionSource() },
iconOnly: Boolean = false,
content: @Composable RowScope.() -> Unit
) {
Button(modifier, interaction, disabled, buttonColors, false, onClick, iconOnly, content)
}
In the latest version of skiko, AwtFontManager was be remove.
Because of that, it isnt possible to use fluent-ui now.
How to fix it? 😢
@Konyaco
On stable compose version 1.3.0, DropdownMenu throws this exception when the expanded parameter is set to true:
Exception in thread "AWT-EventQueue-0" java.lang.NoSuchMethodError: 'void androidx.compose.ui.window.DesktopPopup_desktopKt.Popup(androidx.compose.ui.window.PopupPositionProvider, kotlin.jvm.functions.Function0, kotlin.jvm.functions.Function1, kotlin.jvm.functions.Function1, boolean, kotlin.jvm.functions.Function2, androidx.compose.runtime.Composer, int, int)'
at com.konyaco.fluent.component.DropdownKt.DropdownMenu-IBZr-mw(Dropdown.kt:48)
at org.chsrobotics.dash.AppKt$App$1$1$1.invoke(App.kt:66)
at org.chsrobotics.dash.AppKt$App$1$1$1.invoke(App.kt:42)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)
at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)
at androidx.compose.runtime.RecomposeScopeImpl.compose(RecomposeScopeImpl.kt:145)
at androidx.compose.runtime.ComposerImpl.recomposeToGroupEnd(Composer.kt:2375)
at androidx.compose.runtime.ComposerImpl.skipCurrentGroup(Composer.kt:2643)
at androidx.compose.runtime.ComposerImpl$doCompose$2$5.invoke(Composer.kt:3260)
at androidx.compose.runtime.ComposerImpl$doCompose$2$5.invoke(Composer.kt:3238)
at androidx.compose.runtime.SnapshotStateKt__DerivedStateKt.observeDerivedStateRecalculations(DerivedState.kt:341)
at androidx.compose.runtime.SnapshotStateKt.observeDerivedStateRecalculations(Unknown Source)
at androidx.compose.runtime.ComposerImpl.doCompose(Composer.kt:3238)
at androidx.compose.runtime.ComposerImpl.recompose$runtime(Composer.kt:3203)
at androidx.compose.runtime.CompositionImpl.recompose(Composition.kt:771)
at androidx.compose.runtime.Recomposer.performRecompose(Recomposer.kt:1031)
at androidx.compose.runtime.Recomposer.access$performRecompose(Recomposer.kt:125)
at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:534)
at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$2.invoke(Recomposer.kt:503)
at androidx.compose.runtime.BroadcastFrameClock$FrameAwaiter.resume(BroadcastFrameClock.kt:42)
at androidx.compose.runtime.BroadcastFrameClock.sendFrame(BroadcastFrameClock.kt:71)
at androidx.compose.ui.ComposeScene.render(ComposeScene.skiko.kt:411)
at androidx.compose.ui.awt.ComposeLayer$1$onRender$1.invoke(ComposeLayer.desktop.kt:326)
at androidx.compose.ui.awt.ComposeLayer$1$onRender$1.invoke(ComposeLayer.desktop.kt:325)
at androidx.compose.ui.awt.ComposeLayer.catchExceptions(ComposeLayer.desktop.kt:109)
at androidx.compose.ui.awt.ComposeLayer.access$catchExceptions(ComposeLayer.desktop.kt:87)
at androidx.compose.ui.awt.ComposeLayer$1.onRender(ComposeLayer.desktop.kt:325)
at org.jetbrains.skiko.SkiaLayer.update$skiko(SkiaLayer.awt.kt:525)
at org.jetbrains.skiko.redrawer.AWTRedrawer.update(AWTRedrawer.kt:54)
at org.jetbrains.skiko.redrawer.MetalRedrawer$frameDispatcher$1.invokeSuspend(MetalRedrawer.kt:50)
at org.jetbrains.skiko.redrawer.MetalRedrawer$frameDispatcher$1.invoke(MetalRedrawer.kt)
at org.jetbrains.skiko.redrawer.MetalRedrawer$frameDispatcher$1.invoke(MetalRedrawer.kt)
at org.jetbrains.skiko.FrameDispatcher$job$1.invokeSuspend(FrameDispatcher.kt:33)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
at java.desktop/java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.desktop/java.awt.EventQueue$3.run(Unknown Source)
at java.desktop/java.awt.EventQueue$3.run(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Unknown Source)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.desktop/java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.run(Unknown Source)
Suppressed: kotlinx.coroutines.DiagnosticCoroutineContextException: [androidx.compose.ui.awt.ComposeLayer$coroutineExceptionHandler$1@5fda5de, androidx.compose.runtime.BroadcastFrameClock@2a719e18, StandaloneCoroutine{Cancelling}@2b3f49fa, FlushCoroutineDispatcher@516e60a]
See XAML Border API
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.