@@ -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
-1
@@ -1,4 +1,4 @@
|
|||||||
package moe.uni.comfy_kmp
|
package moe.uni.comfyKmp
|
||||||
|
|
||||||
import android.content.Context
|
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.content.Context
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
+1
-1
@@ -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
-1
@@ -1,4 +1,4 @@
|
|||||||
package moe.uni.comfy_kmp
|
package moe.uni.comfyKmp
|
||||||
|
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
|
|
||||||
+1
-1
@@ -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
|
||||||
+2
-2
@@ -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
-1
@@ -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
-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.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>
|
||||||
+5
-5
@@ -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
-1
@@ -1,4 +1,4 @@
|
|||||||
package moe.uni.comfy_kmp
|
package moe.uni.comfyKmp
|
||||||
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
|
||||||
+1
-1
@@ -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
-1
@@ -1,4 +1,4 @@
|
|||||||
package moe.uni.comfy_kmp
|
package moe.uni.comfyKmp
|
||||||
|
|
||||||
interface Platform {
|
interface Platform {
|
||||||
val name: String
|
val name: String
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
package moe.uni.comfy_kmp
|
package moe.uni.comfyKmp
|
||||||
|
|
||||||
import androidx.compose.runtime.Composable
|
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.Json
|
||||||
import kotlinx.serialization.json.JsonElement
|
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.FileSystem
|
||||||
import okio.Path.Companion.toPath
|
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
|
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.JsonArray
|
||||||
import kotlinx.serialization.json.JsonElement
|
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
|
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.Serializable
|
||||||
import kotlinx.serialization.json.JsonArray
|
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.JsonArray
|
||||||
import kotlinx.serialization.json.JsonElement
|
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
|
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.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()
|
||||||
+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.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
|
||||||
+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.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
|
||||||
|
|
||||||
+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.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) {
|
||||||
+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.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
|
||||||
|
|
||||||
+5
-6
@@ -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
|
||||||
+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.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(
|
||||||
+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.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(
|
||||||
+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.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
|
||||||
+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.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
|
||||||
+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.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,
|
||||||
+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.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(
|
||||||
+9
-11
@@ -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
|
||||||
+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.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
|
||||||
+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.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
-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.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
-1
@@ -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
-1
@@ -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
-1
@@ -1,4 +1,4 @@
|
|||||||
package moe.uni.comfy_kmp
|
package moe.uni.comfyKmp
|
||||||
|
|
||||||
import platform.UIKit.UIDevice
|
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.Composable
|
||||||
import androidx.compose.runtime.DisposableEffect
|
import androidx.compose.runtime.DisposableEffect
|
||||||
+1
-2
@@ -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
-1
@@ -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
-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.HttpClient
|
||||||
import io.ktor.client.engine.darwin.Darwin
|
import io.ktor.client.engine.darwin.Darwin
|
||||||
@@ -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
|
||||||
@@ -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
@@ -1,4 +1,4 @@
|
|||||||
rootProject.name = "comfy_kmp"
|
rootProject.name = "comfyKmp"
|
||||||
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
|
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
|
||||||
|
|
||||||
pluginManagement {
|
pluginManagement {
|
||||||
|
|||||||
Reference in New Issue
Block a user