aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/moe/nea/firmament/gui/config/AllConfigsGui.kt
blob: 75554c00787e1b676cf65906bcf9481826bba7d6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/*
 * SPDX-FileCopyrightText: 2023 Linnea Gräf <nea@nea.moe>
 *
 * SPDX-License-Identifier: GPL-3.0-or-later
 */

package moe.nea.firmament.gui.config

import io.github.cottonmc.cotton.gui.client.BackgroundPainter
import io.github.cottonmc.cotton.gui.client.CottonClientScreen
import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription
import io.github.cottonmc.cotton.gui.widget.WBox
import io.github.cottonmc.cotton.gui.widget.WButton
import io.github.cottonmc.cotton.gui.widget.WLabel
import io.github.cottonmc.cotton.gui.widget.WScrollPanel
import io.github.cottonmc.cotton.gui.widget.data.Axis
import io.github.cottonmc.cotton.gui.widget.data.Insets
import moe.nea.firmament.features.FeatureManager
import moe.nea.firmament.gui.WFixedPanel
import moe.nea.firmament.gui.WSplitPanel
import moe.nea.firmament.repo.RepoManager
import moe.nea.firmament.util.MC
import moe.nea.firmament.util.ScreenUtil.setScreenLater
import net.minecraft.client.gui.screen.Screen
import net.minecraft.text.Text
import kotlin.streams.asSequence

object AllConfigsGui {

    val allConfigs
        get() = listOf(
            RepoManager.Config
        ) + FeatureManager.allFeatures.mapNotNull { it.config }

    fun makeScreen(parent: Screen? = null): CottonClientScreen {
        val lwgd = LightweightGuiDescription()
        var screen: CottonClientScreen? = null
        val configs = allConfigs
        val box = WBox(Axis.VERTICAL)
        configs.forEach { config ->
            val panel = WSplitPanel(
                WLabel(Text.translatable("firmament.config.${config.name}")),
                WButton(Text.translatable("firmanent.config.edit")).also {
                    it.setOnClick {
                        config.showConfigEditor(screen)
                    }
                    it.setSize(40, 18)
                }
            )
            panel.insets = Insets.ROOT_PANEL
            panel.backgroundPainter = BackgroundPainter.VANILLA
            box.add((panel))
        }
        box.streamChildren().asSequence()
            .forEach { it.setSize(380, 0) }
        lwgd.setRootPanel(WBox(
            Axis.VERTICAL
        ).also {
            it.insets = Insets.ROOT_PANEL
            box.layout()
            it.add(WFixedPanel((WScrollPanel((box)).also {
                it.setSize(400, 300)
            })))
            it.setSize(400, 300)
        })

        screen = object : CottonClientScreen(lwgd) {
            override fun close() {
                MC.screen = parent
            }
        }
        return screen
    }

    fun showAllGuis() {
        setScreenLater(makeScreen())
    }
}