chore: move package
CI / android (push) Failing after 2m14s

This commit is contained in:
anran
2026-01-31 02:50:05 +08:00
parent 4e868d9f7f
commit e5a779e48a
49 changed files with 177 additions and 169 deletions
+2 -3
View File
@@ -1,4 +1,3 @@
import org.jetbrains.compose.desktop.application.dsl.TargetFormat
import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins { plugins {
@@ -66,11 +65,11 @@ kotlin {
} }
android { android {
namespace = "moe.uni.comfy_kmp" namespace = "moe.uni.comfyKmp"
compileSdk = libs.versions.android.compileSdk.get().toInt() compileSdk = libs.versions.android.compileSdk.get().toInt()
defaultConfig { defaultConfig {
applicationId = "moe.uni.comfy_kmp" applicationId = "moe.uni.comfyKmp"
minSdk = libs.versions.android.minSdk.get().toInt() minSdk = libs.versions.android.minSdk.get().toInt()
targetSdk = libs.versions.android.targetSdk.get().toInt() targetSdk = libs.versions.android.targetSdk.get().toInt()
versionCode = 1 versionCode = 1
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp package moe.uni.comfyKmp
import android.content.Context import android.content.Context
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp package moe.uni.comfyKmp
import android.content.Context import android.content.Context
import android.net.Uri import android.net.Uri
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp package moe.uni.comfyKmp
import android.os.Bundle import android.os.Bundle
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp package moe.uni.comfyKmp
import android.os.Build import android.os.Build
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp package moe.uni.comfyKmp
import android.app.Activity import android.app.Activity
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
@@ -1,10 +1,10 @@
package moe.uni.comfy_kmp.data package moe.uni.comfyKmp.data
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.BitmapFactory import android.graphics.BitmapFactory
import java.io.File import java.io.File
import kotlin.math.max import kotlin.math.max
import moe.uni.comfy_kmp.AndroidAppContext import moe.uni.comfyKmp.AndroidAppContext
actual fun saveCoverImage(bytes: ByteArray, filenameHint: String): String { actual fun saveCoverImage(bytes: ByteArray, filenameHint: String): String {
val safeName = filenameHint.replace(Regex("[^A-Za-z0-9._-]"), "_") val safeName = filenameHint.replace(Regex("[^A-Za-z0-9._-]"), "_")
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp.data package moe.uni.comfyKmp.data
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp.network package moe.uni.comfyKmp.network
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.engine.okhttp.OkHttp import io.ktor.client.engine.okhttp.OkHttp
@@ -1,3 +1,3 @@
<resources> <resources>
<string name="app_name">comfy_kmp</string> <string name="app_name">comfyKmp</string>
</resources> </resources>
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp package moe.uni.comfyKmp
import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
@@ -6,10 +6,10 @@ import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import cafe.adriel.voyager.navigator.Navigator import cafe.adriel.voyager.navigator.Navigator
import moe.uni.comfy_kmp.di.AppContainer import moe.uni.comfyKmp.di.AppContainer
import moe.uni.comfy_kmp.di.LocalAppContainer import moe.uni.comfyKmp.di.LocalAppContainer
import moe.uni.comfy_kmp.ui.screens.ServerScreen import moe.uni.comfyKmp.ui.screens.ServerScreen
import moe.uni.comfy_kmp.ui.theme.ComfyTheme import moe.uni.comfyKmp.ui.theme.ComfyTheme
@Composable @Composable
@Preview @Preview
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp package moe.uni.comfyKmp
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp package moe.uni.comfyKmp
class Greeting { class Greeting {
private val platform = getPlatform() private val platform = getPlatform()
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp package moe.uni.comfyKmp
interface Platform { interface Platform {
val name: String val name: String
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp package moe.uni.comfyKmp
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp.data package moe.uni.comfyKmp.data
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.JsonElement
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp.data package moe.uni.comfyKmp.data
import okio.FileSystem import okio.FileSystem
import okio.Path.Companion.toPath import okio.Path.Companion.toPath
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp.data package moe.uni.comfyKmp.data
import okio.FileSystem import okio.FileSystem
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp.data package moe.uni.comfyKmp.data
import kotlinx.serialization.json.JsonArray import kotlinx.serialization.json.JsonArray
import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.JsonElement
@@ -1,3 +1,3 @@
package moe.uni.comfy_kmp.data package moe.uni.comfyKmp.data
expect suspend fun saveImageToGallery(bytes: ByteArray, filenameHint: String): String expect suspend fun saveImageToGallery(bytes: ByteArray, filenameHint: String): String
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp.data package moe.uni.comfyKmp.data
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import kotlinx.serialization.json.JsonArray import kotlinx.serialization.json.JsonArray
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp.data package moe.uni.comfyKmp.data
import kotlinx.serialization.json.JsonArray import kotlinx.serialization.json.JsonArray
import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.JsonElement
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp.di package moe.uni.comfyKmp.di
import androidx.compose.runtime.compositionLocalOf import androidx.compose.runtime.compositionLocalOf
@@ -1,11 +1,11 @@
package moe.uni.comfy_kmp.di package moe.uni.comfyKmp.di
import moe.uni.comfy_kmp.network.ComfyApiClient import moe.uni.comfyKmp.network.ComfyApiClient
import moe.uni.comfy_kmp.network.ComfyWebSocketClient import moe.uni.comfyKmp.network.ComfyWebSocketClient
import moe.uni.comfy_kmp.network.createHttpClient import moe.uni.comfyKmp.network.createHttpClient
import moe.uni.comfy_kmp.storage.ServerRepository import moe.uni.comfyKmp.storage.ServerRepository
import moe.uni.comfy_kmp.storage.SettingsStorage import moe.uni.comfyKmp.storage.SettingsStorage
import moe.uni.comfy_kmp.storage.WorkflowRepository import moe.uni.comfyKmp.storage.WorkflowRepository
class AppContainer( class AppContainer(
private val storage: SettingsStorage = SettingsStorage() private val storage: SettingsStorage = SettingsStorage()
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp.network package moe.uni.comfyKmp.network
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.call.body import io.ktor.client.call.body
@@ -10,8 +10,8 @@ import io.ktor.http.ContentType
import io.ktor.http.contentType import io.ktor.http.contentType
import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonObject
import moe.uni.comfy_kmp.data.PromptRequest import moe.uni.comfyKmp.data.PromptRequest
import moe.uni.comfy_kmp.data.PromptResponse import moe.uni.comfyKmp.data.PromptResponse
class ComfyApiClient( class ComfyApiClient(
private val httpClient: HttpClient private val httpClient: HttpClient
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp.network package moe.uni.comfyKmp.network
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.plugins.websocket.webSocket import io.ktor.client.plugins.websocket.webSocket
@@ -25,8 +25,8 @@ import kotlinx.coroutines.launch
import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive import kotlinx.serialization.json.jsonPrimitive
import moe.uni.comfy_kmp.data.ComfyJson import moe.uni.comfyKmp.data.ComfyJson
import moe.uni.comfy_kmp.data.WsMessage import moe.uni.comfyKmp.data.WsMessage
import kotlin.math.min import kotlin.math.min
import kotlin.random.Random import kotlin.random.Random
@@ -1,11 +1,11 @@
package moe.uni.comfy_kmp.network package moe.uni.comfyKmp.network
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.HttpClientConfig import io.ktor.client.HttpClientConfig
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
import io.ktor.client.plugins.websocket.WebSockets import io.ktor.client.plugins.websocket.WebSockets
import io.ktor.serialization.kotlinx.json.json import io.ktor.serialization.kotlinx.json.json
import moe.uni.comfy_kmp.data.ComfyJson import moe.uni.comfyKmp.data.ComfyJson
internal fun HttpClientConfig<*>.installComfyPlugins() { internal fun HttpClientConfig<*>.installComfyPlugins() {
install(ContentNegotiation) { install(ContentNegotiation) {
@@ -1,7 +1,7 @@
package moe.uni.comfy_kmp.storage package moe.uni.comfyKmp.storage
import moe.uni.comfy_kmp.data.ServerConfig import moe.uni.comfyKmp.data.ServerConfig
import moe.uni.comfy_kmp.data.WorkflowEntity import moe.uni.comfyKmp.data.WorkflowEntity
import kotlin.random.Random import kotlin.random.Random
import kotlin.time.Clock import kotlin.time.Clock
@@ -1,13 +1,12 @@
package moe.uni.comfy_kmp.storage package moe.uni.comfyKmp.storage
import com.russhwolf.settings.Settings import com.russhwolf.settings.Settings
import moe.uni.comfy_kmp.data.ComfyJson import moe.uni.comfyKmp.data.ComfyJson
import moe.uni.comfy_kmp.data.ServerConfig import moe.uni.comfyKmp.data.ServerConfig
import moe.uni.comfy_kmp.data.WorkflowEntity import moe.uni.comfyKmp.data.WorkflowEntity
import moe.uni.comfy_kmp.data.saveCoverImage import moe.uni.comfyKmp.data.saveCoverImage
import kotlinx.serialization.builtins.ListSerializer import kotlinx.serialization.builtins.ListSerializer
import kotlinx.serialization.encodeToString import kotlinx.serialization.encodeToString
import kotlinx.serialization.decodeFromString
import okio.FileSystem import okio.FileSystem
import okio.Path.Companion.toPath import okio.Path.Companion.toPath
import kotlin.io.encoding.Base64 import kotlin.io.encoding.Base64
@@ -1,8 +1,6 @@
package moe.uni.comfy_kmp.ui.components package moe.uni.comfyKmp.ui.components
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
@@ -14,7 +12,6 @@ import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Button import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton import androidx.compose.material3.TextButton
@@ -25,8 +22,8 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties import androidx.compose.ui.window.DialogProperties
import moe.uni.comfy_kmp.ui.theme.ComfySpacing import moe.uni.comfyKmp.ui.theme.ComfySpacing
import moe.uni.comfy_kmp.ui.theme.comfyColors import moe.uni.comfyKmp.ui.theme.comfyColors
@Composable @Composable
fun ComfyDialog( fun ComfyDialog(
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp.ui.components package moe.uni.comfyKmp.ui.components
import androidx.compose.animation.animateColorAsState import androidx.compose.animation.animateColorAsState
import androidx.compose.animation.core.animateDpAsState import androidx.compose.animation.core.animateDpAsState
@@ -23,8 +23,8 @@ import androidx.compose.ui.draw.shadow
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import moe.uni.comfy_kmp.ui.theme.ComfySpacing import moe.uni.comfyKmp.ui.theme.ComfySpacing
import moe.uni.comfy_kmp.ui.theme.comfyColors import moe.uni.comfyKmp.ui.theme.comfyColors
@Composable @Composable
fun GlassCard( fun GlassCard(
@@ -1,17 +1,19 @@
package moe.uni.comfy_kmp.ui.components package moe.uni.comfyKmp.ui.components
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxWithConstraints
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.widthIn
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
@@ -33,8 +35,8 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import moe.uni.comfy_kmp.ui.theme.ComfySpacing import moe.uni.comfyKmp.ui.theme.ComfySpacing
import moe.uni.comfy_kmp.ui.theme.comfyColors import moe.uni.comfyKmp.ui.theme.comfyColors
data class GalleryImage( data class GalleryImage(
val filename: String, val filename: String,
@@ -49,18 +51,24 @@ fun ImageGallery(
onImageClick: ((Int) -> Unit)? = null, onImageClick: ((Int) -> Unit)? = null,
onSaveClick: ((Int) -> Unit)? = null onSaveClick: ((Int) -> Unit)? = null
) { ) {
Box(modifier = modifier.fillMaxSize()) { BoxWithConstraints(modifier = modifier.fillMaxSize()) {
val availableWidth = maxWidth
val availableHeight = maxHeight
if (images.isEmpty()) { if (images.isEmpty()) {
EmptyGalleryState(modifier = Modifier.align(Alignment.Center)) EmptyGalleryState(modifier = Modifier.align(Alignment.Center))
} else { } else {
LazyColumn( LazyColumn(
contentPadding = PaddingValues(ComfySpacing.lg), contentPadding = PaddingValues(ComfySpacing.lg),
verticalArrangement = Arrangement.spacedBy(ComfySpacing.md), verticalArrangement = Arrangement.spacedBy(ComfySpacing.md),
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier.fillMaxSize() modifier = Modifier.fillMaxSize()
) { ) {
itemsIndexed(images) { index, image -> itemsIndexed(images) { index, image ->
GalleryImageItem( GalleryImageItem(
image = image, image = image,
availableWidth = availableWidth,
availableHeight = availableHeight,
onClick = { onClick = {
onImageClick?.invoke(index) onImageClick?.invoke(index)
}, },
@@ -75,37 +83,57 @@ fun ImageGallery(
@Composable @Composable
private fun GalleryImageItem( private fun GalleryImageItem(
image: GalleryImage, image: GalleryImage,
availableWidth: androidx.compose.ui.unit.Dp,
availableHeight: androidx.compose.ui.unit.Dp,
onClick: () -> Unit, onClick: () -> Unit,
onSave: (() -> Unit)? onSave: (() -> Unit)?
) { ) {
val shape = RoundedCornerShape(12.dp) val shape = RoundedCornerShape(12.dp)
val aspectRatio = image.bitmap?.let { it.width.toFloat() / it.height.toFloat() } ?: 1f val bitmap = image.bitmap
// Calculate max dimensions (leave padding space)
val padding = ComfySpacing.lg * 2
val maxWidth = availableWidth - padding
val maxHeight = availableHeight - padding
// Calculate fitted size maintaining aspect ratio
val (fittedWidth, fittedHeight) = if (bitmap != null) {
val imageAspect = bitmap.width.toFloat() / bitmap.height.toFloat()
val containerAspect = maxWidth / maxHeight
if (imageAspect > containerAspect) {
// Image is wider - fit to width
maxWidth to (maxWidth / imageAspect)
} else {
// Image is taller - fit to height
(maxHeight * imageAspect) to maxHeight
}
} else {
maxWidth to (maxWidth * 0.75f) // Default 4:3 for placeholder
}
Column( Column(
modifier = Modifier.fillMaxWidth(), verticalArrangement = Arrangement.spacedBy(ComfySpacing.sm),
verticalArrangement = Arrangement.spacedBy(ComfySpacing.sm) horizontalAlignment = Alignment.CenterHorizontally
) { ) {
Box( Box(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .widthIn(max = fittedWidth)
.heightIn(max = fittedHeight)
.shadow(4.dp, shape) .shadow(4.dp, shape)
.clip(shape) .clip(shape)
.background(MaterialTheme.comfyColors.cardBackground) .background(MaterialTheme.comfyColors.cardBackground)
.clickable(onClick = onClick) .clickable(onClick = onClick)
) { ) {
when { when {
image.bitmap != null -> { bitmap != null -> {
Image( Image(
bitmap = image.bitmap, bitmap = bitmap,
contentDescription = image.filename, contentDescription = image.filename,
contentScale = ContentScale.FillWidth, contentScale = ContentScale.Fit,
modifier = Modifier modifier = Modifier
.fillMaxWidth() .widthIn(max = fittedWidth)
.then( .heightIn(max = fittedHeight)
if (aspectRatio.isFinite() && aspectRatio > 0f) {
Modifier.aspectRatio(aspectRatio)
} else Modifier
)
) )
// Filename badge at bottom // Filename badge at bottom
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp.ui.components package moe.uni.comfyKmp.ui.components
import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.animateColorAsState import androidx.compose.animation.animateColorAsState
@@ -14,19 +14,16 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Casino import androidx.compose.material.icons.filled.Casino
import androidx.compose.material.icons.filled.ExpandLess import androidx.compose.material.icons.filled.ExpandLess
import androidx.compose.material.icons.filled.ExpandMore import androidx.compose.material.icons.filled.ExpandMore
import androidx.compose.material.icons.filled.Refresh
import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ExposedDropdownMenuBox import androidx.compose.material3.ExposedDropdownMenuBox
@@ -57,9 +54,9 @@ import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.JsonPrimitive import kotlinx.serialization.json.JsonPrimitive
import kotlinx.serialization.json.contentOrNull import kotlinx.serialization.json.contentOrNull
import kotlinx.serialization.json.longOrNull import kotlinx.serialization.json.longOrNull
import moe.uni.comfy_kmp.data.NodeStatus import moe.uni.comfyKmp.data.NodeStatus
import moe.uni.comfy_kmp.ui.theme.ComfySpacing import moe.uni.comfyKmp.ui.theme.ComfySpacing
import moe.uni.comfy_kmp.ui.theme.comfyColors import moe.uni.comfyKmp.ui.theme.comfyColors
import kotlin.math.roundToInt import kotlin.math.roundToInt
@Composable @Composable
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp.ui.components package moe.uni.comfyKmp.ui.components
import androidx.compose.animation.AnimatedContent import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.animateColorAsState import androidx.compose.animation.animateColorAsState
@@ -21,7 +21,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.LinearProgressIndicator import androidx.compose.material3.LinearProgressIndicator
@@ -35,8 +34,8 @@ import androidx.compose.ui.draw.alpha
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.graphics.StrokeCap
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import moe.uni.comfy_kmp.ui.theme.ComfySpacing import moe.uni.comfyKmp.ui.theme.ComfySpacing
import moe.uni.comfy_kmp.ui.theme.comfyColors import moe.uni.comfyKmp.ui.theme.comfyColors
enum class ExecutionStatus { enum class ExecutionStatus {
IDLE, IDLE,
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp.ui.screens package moe.uni.comfyKmp.ui.screens
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.background import androidx.compose.foundation.background
@@ -24,7 +24,6 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.input.pointer.pointerInput
@@ -33,8 +32,8 @@ import androidx.compose.ui.unit.dp
import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.LocalNavigator
import cafe.adriel.voyager.navigator.currentOrThrow import cafe.adriel.voyager.navigator.currentOrThrow
import moe.uni.comfy_kmp.SystemBarsEffect import moe.uni.comfyKmp.SystemBarsEffect
import moe.uni.comfy_kmp.ui.theme.ComfySpacing import moe.uni.comfyKmp.ui.theme.ComfySpacing
import org.jetbrains.compose.resources.decodeToImageBitmap import org.jetbrains.compose.resources.decodeToImageBitmap
data class ImagePreviewScreen( data class ImagePreviewScreen(
@@ -1,6 +1,6 @@
@file:OptIn(ExperimentalMaterial3Api::class) @file:OptIn(ExperimentalMaterial3Api::class)
package moe.uni.comfy_kmp.ui.screens package moe.uni.comfyKmp.ui.screens
import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.core.tween import androidx.compose.animation.core.tween
@@ -30,7 +30,6 @@ import androidx.compose.material.icons.filled.Check
import androidx.compose.material.icons.filled.Delete import androidx.compose.material.icons.filled.Delete
import androidx.compose.material.icons.filled.Dns import androidx.compose.material.icons.filled.Dns
import androidx.compose.material.icons.filled.Edit import androidx.compose.material.icons.filled.Edit
import androidx.compose.material.icons.filled.RadioButtonChecked
import androidx.compose.material.icons.filled.RadioButtonUnchecked import androidx.compose.material.icons.filled.RadioButtonUnchecked
import androidx.compose.material3.Button import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ButtonDefaults
@@ -40,7 +39,6 @@ import androidx.compose.material3.ExtendedFloatingActionButton
import androidx.compose.material3.FilledTonalButton import androidx.compose.material3.FilledTonalButton
import androidx.compose.material3.FabPosition import androidx.compose.material3.FabPosition
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedButton import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.OutlinedTextField
@@ -65,13 +63,13 @@ import cafe.adriel.voyager.core.model.rememberScreenModel
import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.LocalNavigator
import cafe.adriel.voyager.navigator.currentOrThrow import cafe.adriel.voyager.navigator.currentOrThrow
import moe.uni.comfy_kmp.data.ServerConfig import moe.uni.comfyKmp.data.ServerConfig
import moe.uni.comfy_kmp.di.LocalAppContainer import moe.uni.comfyKmp.di.LocalAppContainer
import moe.uni.comfy_kmp.storage.generateId import moe.uni.comfyKmp.storage.generateId
import moe.uni.comfy_kmp.ui.components.ComfyDialog import moe.uni.comfyKmp.ui.components.ComfyDialog
import moe.uni.comfy_kmp.ui.components.GlassCard import moe.uni.comfyKmp.ui.components.GlassCard
import moe.uni.comfy_kmp.ui.theme.ComfySpacing import moe.uni.comfyKmp.ui.theme.ComfySpacing
import moe.uni.comfy_kmp.ui.theme.comfyColors import moe.uni.comfyKmp.ui.theme.comfyColors
class ServerScreen : Screen { class ServerScreen : Screen {
@Composable @Composable
@@ -223,7 +221,7 @@ class ServerScreen : Screen {
} }
private class ServerScreenModel( private class ServerScreenModel(
private val repository: moe.uni.comfy_kmp.storage.ServerRepository private val repository: moe.uni.comfyKmp.storage.ServerRepository
) : ScreenModel { ) : ScreenModel {
var servers by mutableStateOf(repository.getServers()) var servers by mutableStateOf(repository.getServers())
private set private set
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp.ui.screens package moe.uni.comfyKmp.ui.screens
import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.core.tween import androidx.compose.animation.core.tween
@@ -31,9 +31,7 @@ import androidx.compose.material.icons.automirrored.filled.Assignment
import androidx.compose.material.icons.filled.Delete import androidx.compose.material.icons.filled.Delete
import androidx.compose.material.icons.filled.FolderOpen import androidx.compose.material.icons.filled.FolderOpen
import androidx.compose.material.icons.filled.Image import androidx.compose.material.icons.filled.Image
import androidx.compose.material.icons.filled.PlayArrow
import androidx.compose.material3.Button import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.FilledTonalButton import androidx.compose.material3.FilledTonalButton
import androidx.compose.material3.FilledTonalIconButton import androidx.compose.material3.FilledTonalIconButton
@@ -45,7 +43,6 @@ import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
@@ -59,7 +56,6 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.shadow import androidx.compose.ui.draw.shadow
import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
@@ -68,15 +64,15 @@ import cafe.adriel.voyager.core.model.rememberScreenModel
import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.LocalNavigator
import cafe.adriel.voyager.navigator.currentOrThrow import cafe.adriel.voyager.navigator.currentOrThrow
import moe.uni.comfy_kmp.data.WorkflowEntity import moe.uni.comfyKmp.data.WorkflowEntity
import moe.uni.comfy_kmp.data.loadCoverImageBytes import moe.uni.comfyKmp.data.loadCoverImageBytes
import moe.uni.comfy_kmp.di.LocalAppContainer import moe.uni.comfyKmp.di.LocalAppContainer
import moe.uni.comfy_kmp.isFilePickerSupported import moe.uni.comfyKmp.isFilePickerSupported
import moe.uni.comfy_kmp.rememberFilePickerLauncher import moe.uni.comfyKmp.rememberFilePickerLauncher
import moe.uni.comfy_kmp.storage.generateId import moe.uni.comfyKmp.storage.generateId
import moe.uni.comfy_kmp.ui.components.ComfyDialog import moe.uni.comfyKmp.ui.components.ComfyDialog
import moe.uni.comfy_kmp.ui.theme.ComfySpacing import moe.uni.comfyKmp.ui.theme.ComfySpacing
import moe.uni.comfy_kmp.ui.theme.comfyColors import moe.uni.comfyKmp.ui.theme.comfyColors
import org.jetbrains.compose.resources.decodeToImageBitmap import org.jetbrains.compose.resources.decodeToImageBitmap
import kotlin.time.Clock import kotlin.time.Clock
@@ -199,7 +195,7 @@ data class WorkflowListScreen(val serverId: String) : Screen {
private class WorkflowListScreenModel( private class WorkflowListScreenModel(
private val serverId: String, private val serverId: String,
private val repository: moe.uni.comfy_kmp.storage.WorkflowRepository private val repository: moe.uni.comfyKmp.storage.WorkflowRepository
) : ScreenModel { ) : ScreenModel {
var workflows by mutableStateOf(repository.getWorkflows(serverId)) var workflows by mutableStateOf(repository.getWorkflows(serverId))
private set private set
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp.ui.screens package moe.uni.comfyKmp.ui.screens
import androidx.compose.animation.AnimatedContent import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeIn
@@ -68,36 +68,35 @@ import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.JsonPrimitive import kotlinx.serialization.json.JsonPrimitive
import kotlinx.serialization.json.contentOrNull import kotlinx.serialization.json.contentOrNull
import kotlinx.serialization.json.jsonArray
import kotlinx.serialization.json.jsonPrimitive import kotlinx.serialization.json.jsonPrimitive
import moe.uni.comfy_kmp.data.ComfyJson import moe.uni.comfyKmp.data.ComfyJson
import moe.uni.comfy_kmp.data.ImageRef import moe.uni.comfyKmp.data.ImageRef
import moe.uni.comfy_kmp.data.NodeExecutionState import moe.uni.comfyKmp.data.NodeExecutionState
import moe.uni.comfy_kmp.data.NodeStatus import moe.uni.comfyKmp.data.NodeStatus
import moe.uni.comfy_kmp.data.PromptRequest import moe.uni.comfyKmp.data.PromptRequest
import moe.uni.comfy_kmp.data.extractImagesFromHistory import moe.uni.comfyKmp.data.extractImagesFromHistory
import moe.uni.comfy_kmp.data.extractPromptObject import moe.uni.comfyKmp.data.extractPromptObject
import moe.uni.comfy_kmp.data.parsePromptNodes import moe.uni.comfyKmp.data.parsePromptNodes
import moe.uni.comfy_kmp.data.saveCoverImage import moe.uni.comfyKmp.data.saveCoverImage
import moe.uni.comfy_kmp.data.saveImageToGallery import moe.uni.comfyKmp.data.saveImageToGallery
import moe.uni.comfy_kmp.data.updateNodeInput import moe.uni.comfyKmp.data.updateNodeInput
import moe.uni.comfy_kmp.di.LocalAppContainer import moe.uni.comfyKmp.di.LocalAppContainer
import moe.uni.comfy_kmp.network.ComfyApiClient import moe.uni.comfyKmp.network.ComfyApiClient
import moe.uni.comfy_kmp.network.ComfyWebSocketClient import moe.uni.comfyKmp.network.ComfyWebSocketClient
import moe.uni.comfy_kmp.network.WsConnectionStatus import moe.uni.comfyKmp.network.WsConnectionStatus
import moe.uni.comfy_kmp.storage.ServerRepository import moe.uni.comfyKmp.storage.ServerRepository
import moe.uni.comfy_kmp.storage.WorkflowRepository import moe.uni.comfyKmp.storage.WorkflowRepository
import moe.uni.comfy_kmp.storage.generateId import moe.uni.comfyKmp.storage.generateId
import moe.uni.comfy_kmp.ui.components.EditableNodeType import moe.uni.comfyKmp.ui.components.EditableNodeType
import moe.uni.comfy_kmp.ui.components.EditableNodeCard import moe.uni.comfyKmp.ui.components.EditableNodeCard
import moe.uni.comfy_kmp.ui.components.ExecutionStatus import moe.uni.comfyKmp.ui.components.ExecutionStatus
import moe.uni.comfy_kmp.ui.components.ExecutionStatusBar import moe.uni.comfyKmp.ui.components.ExecutionStatusBar
import moe.uni.comfy_kmp.ui.components.GalleryImage import moe.uni.comfyKmp.ui.components.GalleryImage
import moe.uni.comfy_kmp.ui.components.ImageGallery import moe.uni.comfyKmp.ui.components.ImageGallery
import moe.uni.comfy_kmp.ui.components.detectNodeType import moe.uni.comfyKmp.ui.components.detectNodeType
import moe.uni.comfy_kmp.ui.components.getModelFolder import moe.uni.comfyKmp.ui.components.getModelFolder
import moe.uni.comfy_kmp.ui.theme.ComfySpacing import moe.uni.comfyKmp.ui.theme.ComfySpacing
import moe.uni.comfy_kmp.ui.theme.comfyColors import moe.uni.comfyKmp.ui.theme.comfyColors
import org.jetbrains.compose.resources.decodeToImageBitmap import org.jetbrains.compose.resources.decodeToImageBitmap
import kotlin.random.Random import kotlin.random.Random
import kotlin.time.Clock import kotlin.time.Clock
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp.ui.theme package moe.uni.comfyKmp.ui.theme
import androidx.compose.animation.core.CubicBezierEasing import androidx.compose.animation.core.CubicBezierEasing
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
@@ -11,10 +11,8 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.Immutable import androidx.compose.runtime.Immutable
import androidx.compose.runtime.staticCompositionLocalOf import androidx.compose.runtime.staticCompositionLocalOf
import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp package moe.uni.comfyKmp
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp package moe.uni.comfyKmp
import androidx.compose.ui.window.ComposeUIViewController import androidx.compose.ui.window.ComposeUIViewController
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp package moe.uni.comfyKmp
import platform.UIKit.UIDevice import platform.UIKit.UIDevice
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp package moe.uni.comfyKmp
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.DisposableEffect
@@ -1,6 +1,6 @@
@file:OptIn(kotlinx.cinterop.ExperimentalForeignApi::class) @file:OptIn(kotlinx.cinterop.ExperimentalForeignApi::class)
package moe.uni.comfy_kmp.data package moe.uni.comfyKmp.data
import kotlinx.cinterop.addressOf import kotlinx.cinterop.addressOf
import kotlinx.cinterop.convert import kotlinx.cinterop.convert
@@ -11,7 +11,6 @@ import platform.Foundation.NSCachesDirectory
import platform.Foundation.NSData import platform.Foundation.NSData
import platform.Foundation.NSFileManager import platform.Foundation.NSFileManager
import platform.Foundation.NSUserDomainMask import platform.Foundation.NSUserDomainMask
import platform.Foundation.URLByAppendingPathComponent
import platform.Foundation.dataWithBytes import platform.Foundation.dataWithBytes
import platform.UIKit.UIImage import platform.UIKit.UIImage
import platform.UIKit.UIImageJPEGRepresentation import platform.UIKit.UIImageJPEGRepresentation
@@ -1,6 +1,6 @@
@file:OptIn(kotlinx.cinterop.ExperimentalForeignApi::class) @file:OptIn(kotlinx.cinterop.ExperimentalForeignApi::class)
package moe.uni.comfy_kmp.data package moe.uni.comfyKmp.data
import kotlinx.cinterop.addressOf import kotlinx.cinterop.addressOf
import kotlinx.cinterop.usePinned import kotlinx.cinterop.usePinned
@@ -1,4 +1,4 @@
package moe.uni.comfy_kmp.network package moe.uni.comfyKmp.network
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.engine.darwin.Darwin import io.ktor.client.engine.darwin.Darwin
+2 -2
View File
@@ -1,7 +1,7 @@
TEAM_ID= TEAM_ID=
PRODUCT_NAME=comfy_kmp PRODUCT_NAME=comfyKmp
PRODUCT_BUNDLE_IDENTIFIER=moe.uni.comfy_kmp.comfy_kmp$(TEAM_ID) PRODUCT_BUNDLE_IDENTIFIER=moe.uni.comfyKmp.comfyKmp$(TEAM_ID)
CURRENT_PROJECT_VERSION=1 CURRENT_PROJECT_VERSION=1
MARKETING_VERSION=1.0 MARKETING_VERSION=1.0
+3 -3
View File
@@ -7,7 +7,7 @@
objects = { objects = {
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
338A2ACE269EA4A9809609C8 /* comfy_kmp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = comfy_kmp.app; sourceTree = BUILT_PRODUCTS_DIR; }; 338A2ACE269EA4A9809609C8 /* comfyKmp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = comfyKmp.app; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
@@ -59,7 +59,7 @@
657B04DAB4CB0FD124755A63 /* Products */ = { 657B04DAB4CB0FD124755A63 /* Products */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
338A2ACE269EA4A9809609C8 /* comfy_kmp.app */, 338A2ACE269EA4A9809609C8 /* comfyKmp.app */,
); );
name = Products; name = Products;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -87,7 +87,7 @@
packageProductDependencies = ( packageProductDependencies = (
); );
productName = iosApp; productName = iosApp;
productReference = 338A2ACE269EA4A9809609C8 /* comfy_kmp.app */; productReference = 338A2ACE269EA4A9809609C8 /* comfyKmp.app */;
productType = "com.apple.product-type.application"; productType = "com.apple.product-type.application";
}; };
/* End PBXNativeTarget section */ /* End PBXNativeTarget section */
+1 -1
View File
@@ -1,4 +1,4 @@
rootProject.name = "comfy_kmp" rootProject.name = "comfyKmp"
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS") enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
pluginManagement { pluginManagement {