Skip to content

Commit 2f62bc1

Browse files
committed
fix id ordering and activating spout sprites
1 parent ff1b858 commit 2f62bc1

File tree

6 files changed

+159
-67
lines changed

6 files changed

+159
-67
lines changed

src/desktopMain/kotlin/ScanPresets.kt

Lines changed: 46 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,17 @@ suspend fun scanMilkdrop() {
3333
)
3434
}
3535
val subCategories = categoryFolder.listFiles().orEmpty().filter { it.isDirectory }
36+
// .also {
37+
// logger.debug { "pre-sort: ${it.map { it.name }}" }
38+
// }
39+
.sortFileNames()
40+
// .also {
41+
// logger.debug { "post-sort: ${it.map { it.name }}" }
42+
// }
3643

3744
val subCategoryEntries = subCategories.flatMapIndexed() { index, subCategoryFolder ->
38-
val subCategoryFiles = subCategoryFolder.listFiles().orEmpty().filter { it.isFile }.filter { it.extension == "milk" }
45+
val subCategoryFiles =
46+
subCategoryFolder.listFiles().orEmpty().filter { it.isFile }.filter { it.extension == "milk" }
3947
if (subCategoryFiles.isNotEmpty()) {
4048
if (index == 0) {
4149
if (categoryPresets.isNotEmpty()) {
@@ -69,33 +77,11 @@ suspend fun scanMilkdrop() {
6977
}.associateBy { it.name }
7078

7179

72-
val imgPresets = spritesFolder.listFiles().orEmpty().filter { it.isDirectory }.sortFileNames().flatMap { categoryFolder ->
73-
val categoryFiles = categoryFolder.listFiles().orEmpty().filter { it.isFile }.filter { it.extension == "png" || it.extension == "jpg" }.sortFileNames()
74-
val categoryPresets = categoryFiles.filterNotNull().map { file ->
75-
val name = file.name
76-
val path = file.toRelativeString(presetsFolder)
77-
78-
PresetLocation.Img(
79-
name = name,
80-
id = id++,
81-
path = path,
82-
category = categoryFolder.name,
83-
)
84-
}
85-
val subCategories = categoryFolder.listFiles().orEmpty().filter { it.isDirectory }.sortFileNames()
86-
87-
val subCategoryEntries = subCategories.flatMapIndexed() { index, subCategoryFolder ->
88-
val subCategoryFiles = subCategoryFolder.listFiles().orEmpty().filter { it.extension == "png" || it.extension == "jpg" }.sortFileNames()
89-
if (subCategoryFiles.isNotEmpty()) {
90-
if (index == 0) {
91-
if (categoryPresets.isNotEmpty()) {
92-
id++
93-
}
94-
} else {
95-
id++
96-
}
97-
}
98-
subCategoryFiles.filterNotNull().map { file ->
80+
val imgPresets =
81+
spritesFolder.listFiles().orEmpty().filter { it.isDirectory }.sortFileNames().flatMap { categoryFolder ->
82+
val categoryFiles = categoryFolder.listFiles().orEmpty().filter { it.isFile }
83+
.filter { it.extension == "png" || it.extension == "jpg" }.sortFileNames()
84+
val categoryPresets = categoryFiles.filterNotNull().map { file ->
9985
val name = file.name
10086
val path = file.toRelativeString(presetsFolder)
10187

@@ -104,13 +90,39 @@ suspend fun scanMilkdrop() {
10490
id = id++,
10591
path = path,
10692
category = categoryFolder.name,
107-
subCategory = subCategoryFolder.name,
10893
)
10994
}
110-
}
95+
val subCategories = categoryFolder.listFiles().orEmpty().filter { it.isDirectory }.sortFileNames()
96+
97+
val subCategoryEntries = subCategories.flatMapIndexed() { index, subCategoryFolder ->
98+
val subCategoryFiles =
99+
subCategoryFolder.listFiles().orEmpty().filter { it.extension == "png" || it.extension == "jpg" }
100+
.sortFileNames()
101+
if (subCategoryFiles.isNotEmpty()) {
102+
if (index == 0) {
103+
if (categoryPresets.isNotEmpty()) {
104+
id++
105+
}
106+
} else {
107+
id++
108+
}
109+
}
110+
subCategoryFiles.filterNotNull().map { file ->
111+
val name = file.name
112+
val path = file.toRelativeString(presetsFolder)
113+
114+
PresetLocation.Img(
115+
name = name,
116+
id = id++,
117+
path = path,
118+
category = categoryFolder.name,
119+
subCategory = subCategoryFolder.name,
120+
)
121+
}
122+
}
111123

112-
categoryPresets + subCategoryEntries
113-
}.associateBy { it.name }
124+
categoryPresets + subCategoryEntries
125+
}.associateBy { it.name }
114126

115127
nestdropCategoryTagsSet.value = categoryTagsSet
116128

@@ -120,7 +132,7 @@ suspend fun scanMilkdrop() {
120132
flowScope.launch {
121133
measureTimedValue {
122134
imgPresets.values.map { sprite ->
123-
async (Dispatchers.IO) {
135+
async(Dispatchers.IO) {
124136
sprite.image
125137
// .also { img ->
126138
// logger.info { "loaded ${sprite.name} ${img.width}x${img.height}" }
@@ -136,5 +148,5 @@ suspend fun scanMilkdrop() {
136148
private val logger = KotlinLogging.logger {}
137149

138150
private fun List<File>.sortFileNames() = sortedBy { file ->
139-
file.nameWithoutExtension.lowercase().replace("_", "|")
151+
file.nameWithoutExtension.lowercase().replace("_", "|")+"_"
140152
}

src/desktopMain/kotlin/nestdrop/NestdropSpriteQueue.kt

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,17 @@ import kotlinx.coroutines.flow.onEach
1212

1313
sealed interface PresetIdState {
1414
val queue: Queue? get() = null
15+
// val index: Int? get() = null
1516
val index: Int? get() = null
1617
data class Data(
18+
// override val index: Int,
1719
override val index: Int,
1820
override val queue: Queue,
1921
val force: Boolean = false,
2022
// val hardCut: Boolean = false,
21-
) : PresetIdState
23+
) : PresetIdState {
24+
val id get() = queue.presets.getOrNull(index)?.id
25+
}
2226

2327
data object Unset : PresetIdState
2428
}
@@ -40,11 +44,16 @@ class NestdropSpriteQueue(
4044
channel.send(state)
4145
}
4246

43-
private suspend fun presetId(queue: Queue, index: Int, overlay: Boolean = false) {
44-
logger.debug { "presetId $index on ${queue.name} (\"/PresetID/${queue.name}/$index\")" }
47+
private suspend fun presetId(queue: Queue, id: Int?, overlay: Boolean = false) {
48+
if(id == null) {
49+
logger.warn { "failed to find sprite id" }
50+
return
51+
}
52+
logger.debug { "setting presetId $id on ${queue.name} (\"/PresetID/${queue.name}/$id\")" }
4553
nestdropSendChannel.send(
4654
OSCMessage(
47-
"/PresetID/${queue.name}/$index",
55+
"/PresetID/${queue.name}/$id",
56+
// "/PresetID/$id",
4857
listOf(
4958
if (overlay) 0 else 1
5059
)
@@ -68,9 +77,10 @@ class NestdropSpriteQueue(
6877
is PresetIdState.Data -> {
6978
if (previous.queue.type == QueueType.Sprite) {
7079
// to unset: send last index again
80+
logger.debug { "unsetting previous sprite" }
7181
presetId(
7282
queue = previous.queue,
73-
index = previous.index,
83+
id = previous.id,
7484
overlay = false
7585
)
7686
} else {
@@ -89,25 +99,29 @@ class NestdropSpriteQueue(
8999

90100
is PresetIdState.Data -> {
91101
if (current.force) {
102+
logger.debug { "force setting sprite" }
92103
presetId(
93-
current.queue,
94-
(current.index + 1) % current.queue.presets.size,
104+
queue = current.queue,
105+
id = current.id,
106+
// current.queue.presets.first { it.id != current.id }.id,
107+
// (current.index + 1) % current.queue.presets.size,
95108
overlay = false
96109
)
97110
delay(25)
98111
presetId(current.queue, current.index, overlay = false)
99112
} else {
100113

101114
val presetName = current.queue.presets.getOrNull(current.index)
102-
val previousIndex = previous?.index
103-
val previousPresetName = previousIndex?.let {
115+
val previousId = previous?.index
116+
val previousPresetName = previousId?.let {
104117
previous?.queue?.presets?.getOrNull(it)
105118
}
106-
if (current.index == previousIndex) {
119+
if (current.index == previousId) {
107120
logger.info { "ND: received same preset id again, resetting ${current.queue.name} to $presetName" }
108121
presetId(
109-
current.queue,
110-
current.index + 1 % current.queue.presets.size,
122+
queue = current.queue,
123+
id = current.id,
124+
// current.queue.presets.first { it.id != current.id }.id,
111125
overlay = false
112126
)
113127
// presetId(current.queue, current.index)

src/desktopMain/kotlin/nestdrop/deck/Deck.kt

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -450,13 +450,14 @@ class Deck(
450450
val presetId: String = "",
451451
// val id: Int = -1,
452452
val name: String = "unset",
453-
val modeInt: Int = 0,
453+
val active: Int = 0,
454454
val mode: ImgMode = ImgMode.Overlay,
455455
val fx: Int = 0,
456456
val mystery: Int = 0,
457457
val enabled: Boolean = false,
458458
val isImg: Boolean = false,
459459
) {
460+
val isActive = active == 1
460461
val isSpout = !isImg
461462
val id: Int = presetId.substringAfter("/PresetID/").toIntOrNull() ?: -1
462463
val key = SpriteKey(id, name, mode, fx, mystery)
@@ -489,21 +490,13 @@ class Deck(
489490
val args = message.arguments
490491
return try {
491492
// TODO: report this random extra parameter
492-
val modeIntOffset = if(args[2] is Int) 1 else 0
493-
val mode = if(args[2] is Int) {
494-
when(args[2] as Int) {
495-
0 -> ImgMode.Overlay
496-
1 -> ImgMode.Nested
497-
else -> error("")
498-
}
499-
} else {
500-
ImgMode.valueOf(args[2+modeIntOffset] as String)
501-
}
493+
val hasActiveParam = args[2] is Int
494+
val modeIntOffset = if(hasActiveParam) 1 else 0
502495
SpriteData(
503496
presetId = args[0] as String,
504497
name = args[1] as String,
505-
modeInt = mode.code,
506-
mode = mode,
498+
active = 1,
499+
mode = ImgMode.valueOf(args[2+modeIntOffset] as String),
507500
fx = args[3+modeIntOffset] as Int,
508501
mystery = args[4+modeIntOffset] as Int,
509502
enabled = (args[5+modeIntOffset] as Int) == 1,
@@ -918,7 +911,11 @@ class Deck(
918911
logger.info { "$deckName spout change: $index in ${queue?.name}" }
919912
nestdropSpout.send(
920913
when {
921-
queue != null && index != -1 -> PresetIdState.Data(index, queue, true)
914+
queue != null && index != -1 -> PresetIdState.Data(
915+
index = index,
916+
queue = queue,
917+
force = true,
918+
)
922919
else -> PresetIdState.Unset
923920
}
924921
)

src/desktopMain/kotlin/nestdrop/loadQueues.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package nestdrop
22

3+
import androidx.compose.ui.unit.lerp
34
import io.github.oshai.kotlinlogging.KotlinLogging
45
import kotlinx.coroutines.delay
56
import nestdrop.deck.Deck
@@ -33,11 +34,12 @@ suspend fun parseNestdropXml(
3334
// .lines().drop(1).joinToString("/n")
3435
)
3536
} catch (e: nl.adaptivity.xmlutil.XmlException) {
36-
logger.warn(e) { "failed to parse XML" }
37-
delay(100)
3837
if (retries < 5) {
38+
logger.warn { "failed to parse XML: ${e.message}" }
39+
delay(100)
3940
return parseNestdropXml(retries + 1)
4041
} else {
42+
logger.error(e) { "failed to parse XML" }
4143
throw e
4244
}
4345
}

src/desktopMain/kotlin/ui/App.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,12 @@ package ui
33
import androidx.compose.desktop.ui.tooling.preview.Preview
44
import androidx.compose.foundation.background
55
import androidx.compose.foundation.layout.Arrangement
6-
import androidx.compose.foundation.layout.Box
76
import androidx.compose.foundation.layout.Column
87
import androidx.compose.foundation.layout.ColumnScope
98
import androidx.compose.foundation.layout.PaddingValues
109
import androidx.compose.foundation.layout.Row
1110
import androidx.compose.foundation.layout.Spacer
1211
import androidx.compose.foundation.layout.defaultMinSize
13-
import androidx.compose.foundation.layout.fillMaxHeight
14-
import androidx.compose.foundation.layout.fillMaxSize
1512
import androidx.compose.foundation.layout.fillMaxWidth
1613
import androidx.compose.foundation.layout.height
1714
import androidx.compose.foundation.layout.padding
@@ -35,8 +32,6 @@ import androidx.compose.runtime.remember
3532
import androidx.compose.runtime.setValue
3633
import androidx.compose.ui.Alignment
3734
import androidx.compose.ui.Modifier
38-
import androidx.compose.ui.draw.scale
39-
import androidx.compose.ui.graphics.Color
4035
import androidx.compose.ui.unit.dp
4136
import androidx.compose.ui.unit.times
4237
import configFolder
@@ -48,6 +43,7 @@ import nestdrop.deck.Deck
4843
import ui.screens.PlaytlistSelectorScreen
4944
import ui.screens.autoChangeScreen
5045
import ui.screens.beatProgressScreen
46+
import ui.screens.debugPlaylistsScreen
5147
import ui.screens.debugScreen
5248
import ui.screens.deckSettingsScreen
5349
import ui.screens.editSearchesScreen
@@ -243,6 +239,7 @@ enum class Tabs(
243239
Tagging("Tags"),
244240
Searches("Playlist\nEditor"),
245241
NestdropControls("Nestdrop\nSettings"),
242+
DebugPlaylists("DebugPlaylists"),
246243
Debug("Debug"),
247244
;
248245
}
@@ -361,6 +358,10 @@ fun ColumnScope.tabScreen(
361358
}
362359
}
363360

361+
Tabs.DebugPlaylists -> {
362+
debugPlaylistsScreen()
363+
}
364+
364365
Tabs.Debug -> {
365366
debugScreen()
366367
}

0 commit comments

Comments
 (0)