mirror of
https://github.com/InsanusMokrassar/KotlinPublicationScriptsBuilder.git
synced 2025-09-21 15:59:18 +00:00
total rework
This commit is contained in:
@@ -5,18 +5,26 @@ import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.setValue
|
||||
import dev.inmo.kmppscriptbuilder.core.models.Config
|
||||
import dev.inmo.kmppscriptbuilder.core.ui.utils.Drawer
|
||||
import dev.inmo.kmppscriptbuilder.core.ui.utils.DefaultDivider
|
||||
|
||||
expect object BuilderViewDrawer : Drawer<BuilderView>
|
||||
@Composable
|
||||
expect fun TopAppBar(
|
||||
config: Config,
|
||||
saveAvailable: Boolean,
|
||||
onSaveAvailable: (Boolean) -> Unit,
|
||||
onNewConfig: (Config) -> Unit
|
||||
)
|
||||
|
||||
class BuilderView : View() {
|
||||
internal val projectTypeView = ProjectTypeView()
|
||||
internal val mavenInfoView = MavenInfoView()
|
||||
internal val licensesView = LicensesView()
|
||||
internal val projectTypeView by mutableStateOf(ProjectTypeView())
|
||||
internal val mavenInfoView by mutableStateOf(MavenInfoView())
|
||||
internal val licensesView by mutableStateOf(LicensesView())
|
||||
|
||||
internal var saveAvailableState by mutableStateOf(false)
|
||||
var config: Config
|
||||
get() = Config(licensesView.licenses, mavenInfoView.mavenConfig, projectTypeView.projectType)
|
||||
get() {
|
||||
return Config(licensesView.licenses, mavenInfoView.mavenConfig, projectTypeView.projectType)
|
||||
}
|
||||
set(value) {
|
||||
licensesView.licenses = value.licenses
|
||||
mavenInfoView.mavenConfig = value.mavenConfig
|
||||
@@ -26,6 +34,20 @@ class BuilderView : View() {
|
||||
|
||||
@Composable
|
||||
override fun build() {
|
||||
with(BuilderViewDrawer) { draw() }
|
||||
TopAppBar(
|
||||
config,
|
||||
saveAvailableState,
|
||||
{
|
||||
saveAvailableState = it
|
||||
}
|
||||
) {
|
||||
config = it
|
||||
}
|
||||
|
||||
projectTypeView.build()
|
||||
DefaultDivider()
|
||||
licensesView.build()
|
||||
DefaultDivider()
|
||||
mavenInfoView.build()
|
||||
}
|
||||
}
|
||||
|
@@ -1,10 +1,12 @@
|
||||
package dev.inmo.kmppscriptbuilder.core.ui
|
||||
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateListOf
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.setValue
|
||||
import dev.inmo.kmppscriptbuilder.core.models.Developer
|
||||
import dev.inmo.kmppscriptbuilder.core.ui.utils.CommonTextField
|
||||
|
||||
class DeveloperState(
|
||||
id: String = "",
|
||||
@@ -21,11 +23,32 @@ class DeveloperState(
|
||||
private fun Developer.toDeveloperState() = DeveloperState(id, name, eMail)
|
||||
|
||||
class DevelopersView : ListView<DeveloperState>("Developers info") {
|
||||
var developers = mutableStateListOf<Developer>()
|
||||
var developers: List<Developer>
|
||||
get() = itemsList.map { it.toDeveloper() }
|
||||
set(value) {
|
||||
itemsList.apply {
|
||||
clear()
|
||||
addAll(value.map { it.toDeveloperState() })
|
||||
}
|
||||
}
|
||||
|
||||
override val addItemText: String = "Add developer"
|
||||
override val removeItemText: String = "Remove developer"
|
||||
|
||||
override fun createItem(): DeveloperState = DeveloperState()
|
||||
|
||||
@Composable
|
||||
override fun buildView(item: DeveloperState) {
|
||||
CommonTextField(
|
||||
item.id,
|
||||
"Developer username",
|
||||
) { item.id = it }
|
||||
CommonTextField(
|
||||
item.name,
|
||||
"Developer name",
|
||||
) { item.name = it }
|
||||
CommonTextField(
|
||||
item.eMail,
|
||||
"Developer E-Mail",
|
||||
) { item.eMail = it }
|
||||
}
|
||||
}
|
||||
|
@@ -1,12 +1,15 @@
|
||||
package dev.inmo.kmppscriptbuilder.core.ui
|
||||
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.derivedStateOf
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateListOf
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.setValue
|
||||
import dev.inmo.kmppscriptbuilder.core.models.License
|
||||
import dev.inmo.kmppscriptbuilder.core.models.getLicenses
|
||||
import dev.inmo.kmppscriptbuilder.core.ui.utils.CommonTextField
|
||||
import dev.inmo.kmppscriptbuilder.core.ui.utils.Drawer
|
||||
import io.ktor.client.HttpClient
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
@@ -38,8 +41,14 @@ class LicensesView: VerticalView("Licenses") {
|
||||
licensesListState.addAll(value.map { it.toLicenseState() })
|
||||
}
|
||||
internal val availableLicensesState = mutableStateListOf<License>()
|
||||
internal val licensesOffersToShow = mutableStateListOf<License>()
|
||||
internal var licenseSearchFilter by mutableStateOf("")
|
||||
internal val searchFieldFocused = mutableStateOf(false)
|
||||
internal val licensesOffersToShow = derivedStateOf {
|
||||
val query = licenseSearchFilter.lowercase()
|
||||
availableLicensesState.filter {
|
||||
it.title.lowercase().contains(query)
|
||||
}
|
||||
}
|
||||
|
||||
init {
|
||||
CoroutineScope(Dispatchers.Default).launch {
|
||||
@@ -50,6 +59,16 @@ class LicensesView: VerticalView("Licenses") {
|
||||
}
|
||||
|
||||
override val content: @Composable () -> Unit = {
|
||||
CommonTextField(
|
||||
licenseSearchFilter,
|
||||
"Search filter",
|
||||
onFocusChanged = {
|
||||
searchFieldFocused.value = it
|
||||
}
|
||||
) { filterText ->
|
||||
licenseSearchFilter = filterText
|
||||
}
|
||||
|
||||
with(LicensesDrawer) { draw() }
|
||||
}
|
||||
}
|
||||
|
@@ -18,7 +18,7 @@ abstract class ListView<T>(title: String) : VerticalView(title) {
|
||||
|
||||
protected val drawer = ListViewDrawer<T>()
|
||||
|
||||
override val content: () -> Unit = {
|
||||
override val content: @Composable () -> Unit = {
|
||||
with(drawer) {
|
||||
draw()
|
||||
}
|
||||
|
@@ -2,9 +2,17 @@ package dev.inmo.kmppscriptbuilder.core.ui
|
||||
|
||||
import androidx.compose.runtime.*
|
||||
import dev.inmo.kmppscriptbuilder.core.models.GpgSigning
|
||||
import dev.inmo.kmppscriptbuilder.core.models.MavenConfig
|
||||
import dev.inmo.kmppscriptbuilder.core.models.SonatypeRepository
|
||||
import dev.inmo.kmppscriptbuilder.core.models.defaultProjectDescription
|
||||
import dev.inmo.kmppscriptbuilder.core.models.defaultProjectName
|
||||
import dev.inmo.kmppscriptbuilder.core.ui.utils.ButtonsPanel
|
||||
import dev.inmo.kmppscriptbuilder.core.ui.utils.CommonTextField
|
||||
import dev.inmo.kmppscriptbuilder.core.ui.utils.Drawer
|
||||
import dev.inmo.kmppscriptbuilder.core.ui.utils.SwitchWithLabel
|
||||
|
||||
expect object MavenInfoDrawer : Drawer<MavenInfoView>
|
||||
expect class GpgSigningOptionDrawer : Drawer<GpgSigning>
|
||||
expect fun GpgSigningOptionDrawerWithView(view: MavenInfoView): GpgSigningOptionDrawer
|
||||
|
||||
class MavenInfoView : VerticalView("Project information") {
|
||||
internal var projectNameProperty by mutableStateOf("")
|
||||
@@ -43,10 +51,46 @@ class MavenInfoView : VerticalView("Project information") {
|
||||
publishToMavenCentralProperty = value.repositories.any { it == SonatypeRepository }
|
||||
developersView.developers = value.developers
|
||||
repositoriesView.repositories = value.repositories.filter { it != SonatypeRepository }
|
||||
// developersView.developers = value.developers
|
||||
}
|
||||
|
||||
private val gpgSigningDrawer = GpgSigningOptionDrawerWithView(this)
|
||||
|
||||
override val content: @Composable () -> Unit = {
|
||||
with (MavenInfoDrawer) { draw() }
|
||||
CommonTextField(
|
||||
projectNameProperty,
|
||||
"Public project name",
|
||||
) { projectNameProperty = it }
|
||||
CommonTextField(
|
||||
projectDescriptionProperty,
|
||||
"Public project description",
|
||||
) { projectDescriptionProperty = it }
|
||||
CommonTextField(
|
||||
projectUrlProperty,
|
||||
"Public project URL",
|
||||
) { projectUrlProperty = it }
|
||||
CommonTextField(
|
||||
projectVcsUrlProperty,
|
||||
"Public project VCS URL (with .git)",
|
||||
) { projectVcsUrlProperty = it }
|
||||
|
||||
ButtonsPanel(
|
||||
GpgSigning.Disabled,
|
||||
GpgSigning.Optional,
|
||||
GpgSigning.Enabled
|
||||
) {
|
||||
with(gpgSigningDrawer) {
|
||||
with (it) {
|
||||
draw()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SwitchWithLabel(
|
||||
"Include publication to MavenCentral",
|
||||
publishToMavenCentralProperty,
|
||||
placeSwitchAtTheStart = true
|
||||
) { publishToMavenCentralProperty = it }
|
||||
developersView.build()
|
||||
repositoriesView.build()
|
||||
}
|
||||
}
|
||||
|
@@ -4,16 +4,31 @@ import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.setValue
|
||||
import dev.inmo.kmppscriptbuilder.core.models.JSProjectType
|
||||
import dev.inmo.kmppscriptbuilder.core.models.JVMProjectType
|
||||
import dev.inmo.kmppscriptbuilder.core.models.MultiplatformProjectType
|
||||
import dev.inmo.kmppscriptbuilder.core.models.ProjectType
|
||||
import dev.inmo.kmppscriptbuilder.core.ui.utils.ButtonsPanel
|
||||
import dev.inmo.kmppscriptbuilder.core.ui.utils.Drawer
|
||||
|
||||
expect object ProjectTypeDrawer : Drawer<ProjectTypeView>
|
||||
expect class ProjectTypeDrawer : Drawer<ProjectType>
|
||||
expect fun ProjectTypeDrawerWithView(view: ProjectTypeView): ProjectTypeDrawer
|
||||
|
||||
class ProjectTypeView : VerticalView("Project type") {
|
||||
var projectType by mutableStateOf<ProjectType>(MultiplatformProjectType)
|
||||
private val typeDrawer = ProjectTypeDrawerWithView(this)
|
||||
|
||||
override val content: @Composable () -> Unit = {
|
||||
with(ProjectTypeDrawer) { draw() }
|
||||
ButtonsPanel(
|
||||
MultiplatformProjectType,
|
||||
JVMProjectType,
|
||||
JSProjectType
|
||||
) {
|
||||
with(typeDrawer) {
|
||||
with (it) {
|
||||
draw()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -2,9 +2,11 @@ package dev.inmo.kmppscriptbuilder.core.ui
|
||||
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateListOf
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.setValue
|
||||
import dev.inmo.kmppscriptbuilder.core.models.MavenPublishingRepository
|
||||
import dev.inmo.kmppscriptbuilder.core.ui.utils.CommonTextField
|
||||
import dev.inmo.kmppscriptbuilder.core.ui.utils.Drawer
|
||||
|
||||
class RepositoryState(
|
||||
@@ -19,8 +21,6 @@ class RepositoryState(
|
||||
|
||||
private fun MavenPublishingRepository.toRepositoryState() = RepositoryState(name, url)
|
||||
|
||||
expect object RepositoryStateDrawer : Drawer<RepositoryState>
|
||||
|
||||
class RepositoriesView : ListView<RepositoryState>("Repositories info") {
|
||||
var repositories: List<MavenPublishingRepository>
|
||||
get() = itemsList.map { it.toRepository() }
|
||||
@@ -38,7 +38,14 @@ class RepositoriesView : ListView<RepositoryState>("Repositories info") {
|
||||
|
||||
@Composable
|
||||
override fun buildView(item: RepositoryState) {
|
||||
with(RepositoryStateDrawer) { with(item) { draw() } }
|
||||
CommonTextField(
|
||||
item.name,
|
||||
"Repository name",
|
||||
) { item.name = it }
|
||||
CommonTextField(
|
||||
item.url,
|
||||
"Repository url",
|
||||
) { item.url = it }
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -2,7 +2,7 @@ package dev.inmo.kmppscriptbuilder.core.ui.utils
|
||||
|
||||
import androidx.compose.runtime.Composable
|
||||
|
||||
interface Drawer<T> {
|
||||
fun interface Drawer<T> {
|
||||
@Composable
|
||||
fun T.draw()
|
||||
}
|
||||
|
@@ -9,7 +9,12 @@ expect fun TitleText(text: String)
|
||||
expect fun CommonText(text: String, onClick: (() -> Unit)? = null)
|
||||
|
||||
@Composable
|
||||
expect fun CommonTextField(presetText: String, hint: String, onChange: (String) -> Unit)
|
||||
expect fun CommonTextField(
|
||||
presetText: String,
|
||||
hint: String,
|
||||
onFocusChanged: (Boolean) -> Unit = {},
|
||||
onChange: (String) -> Unit
|
||||
)
|
||||
|
||||
@Composable
|
||||
expect fun SwitchWithLabel(
|
||||
@@ -19,3 +24,18 @@ expect fun SwitchWithLabel(
|
||||
switchEnabled: Boolean = true,
|
||||
onCheckedChange: (Boolean) -> Unit
|
||||
)
|
||||
|
||||
@Composable
|
||||
expect fun <T> ButtonsPanel(
|
||||
data: Iterable<T>,
|
||||
itemDrawer: @Composable (T) -> Unit
|
||||
)
|
||||
|
||||
@Composable
|
||||
fun <T> ButtonsPanel(
|
||||
vararg data: T,
|
||||
itemDrawer: @Composable (T) -> Unit
|
||||
) = ButtonsPanel(data.toList(), itemDrawer)
|
||||
|
||||
@Composable
|
||||
expect fun DefaultDivider()
|
||||
|
@@ -5,16 +5,7 @@ import dev.inmo.micro_utils.common.MPPFile
|
||||
|
||||
internal const val appExtension = "kpsb"
|
||||
|
||||
private var lastFile: MPPFile? = null
|
||||
|
||||
fun loadConfigFile(file: MPPFile): Config {
|
||||
lastFile = file
|
||||
return serialFormat.decodeFromString(Config.serializer(), file.text())
|
||||
}
|
||||
|
||||
expect fun MPPFile.text(): String
|
||||
|
||||
expect fun loadConfig(): Config?
|
||||
expect fun openNewConfig(onParsed: (Config) -> Unit)
|
||||
|
||||
expect fun saveConfig(config: Config): Boolean
|
||||
|
||||
|
Reference in New Issue
Block a user