total rework

This commit is contained in:
2022-11-16 00:56:24 +06:00
parent 53a76c7a73
commit 8430e68167
69 changed files with 904 additions and 1586 deletions

View File

@@ -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()
}
}

View File

@@ -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 }
}
}

View File

@@ -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() }
}
}

View File

@@ -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()
}

View File

@@ -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()
}
}

View File

@@ -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()
}
}
}
}
}

View File

@@ -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 }
}
}

View File

@@ -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()
}

View File

@@ -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()

View File

@@ -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