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