Skip to content

Commit

Permalink
Some more declarative schemas and documents display (#7)
Browse files Browse the repository at this point in the history
  • Loading branch information
eskatos authored May 22, 2024
2 parents 98af65b + 0e73f3d commit df28b16
Show file tree
Hide file tree
Showing 19 changed files with 157 additions and 80 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import org.gradle.client.build.model.ResolvedDomPrerequisites;
import org.gradle.declarative.dsl.schema.AnalysisSchema;
import org.gradle.declarative.dsl.tooling.models.DeclarativeSchemaModel;
import org.gradle.internal.Pair;
import org.gradle.tooling.BuildAction;
import org.gradle.tooling.BuildController;
import org.gradle.tooling.model.gradle.GradleBuild;
Expand All @@ -16,36 +17,39 @@ public class GetResolvedDomAction implements BuildAction<ResolvedDomPrerequisite
@Override
public ResolvedDomPrerequisites execute(BuildController controller) {
AnalysisSchema projectSchema = getProjectSchema(controller);
List<File> declarativeBuildFiles = getDeclarativeBuildFiles(controller);
return new ResolvedDomPrerequisitesImpl(projectSchema, declarativeBuildFiles);
Pair<File, List<File>> buildFiles = getDeclarativeBuildFiles(controller);
return new ResolvedDomPrerequisitesImpl(projectSchema, buildFiles.getLeft(), buildFiles.getRight());
}

private static AnalysisSchema getProjectSchema(BuildController controller) {
DeclarativeSchemaModel declarativeSchemaModel = controller.getModel(DeclarativeSchemaModel.class);
return declarativeSchemaModel.getProjectSchema();
}

private static List<File> getDeclarativeBuildFiles(BuildController controller) {
private static Pair<File, List<File>> getDeclarativeBuildFiles(BuildController controller) {
GradleBuild gradleBuild = controller.getModel(GradleBuild.class);
File rootProjectDirectory = gradleBuild.getRootProject().getProjectDirectory();
List<File> declarativeBuildFiles = gradleBuild
.getProjects()
.getAll()
.stream()
.map(p -> new File(p.getProjectDirectory(), "build.gradle.dcl"))
.filter(File::exists).collect(Collectors.toList());
if (declarativeBuildFiles.isEmpty()) {
throw new RuntimeException("Declarative project file not found");
throw new RuntimeException("No declarative project file found");
}
return declarativeBuildFiles;
return Pair.of(rootProjectDirectory, declarativeBuildFiles);
}

private static final class ResolvedDomPrerequisitesImpl implements ResolvedDomPrerequisites {

private final AnalysisSchema analysisSchema;
private final File rootDir;
private final List<File> declarativeBuildFiles;

public ResolvedDomPrerequisitesImpl(AnalysisSchema analysisSchema, List<File> declarativeBuildFiles) {
public ResolvedDomPrerequisitesImpl(AnalysisSchema analysisSchema, File rootDir, List<File> declarativeBuildFiles) {
this.analysisSchema = analysisSchema;
this.rootDir = rootDir;
this.declarativeBuildFiles = declarativeBuildFiles;
}

Expand All @@ -54,6 +58,10 @@ public AnalysisSchema getAnalysisSchema() {
return analysisSchema;
}

@Override
public File getRootDir() {
return rootDir;
}

@Override
public List<File> getDeclarativeBuildFiles() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,7 @@ public interface ResolvedDomPrerequisites extends Serializable {

AnalysisSchema getAnalysisSchema();

File getRootDir();

List<File> getDeclarativeBuildFiles();
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ import org.gradle.client.core.gradle.GradleConnectionParameters
import org.gradle.client.core.gradle.GradleDistribution
import org.gradle.client.ui.AppDispatchers
import java.io.File
import java.lang.Exception

sealed interface BuildModel {
data object Loading : BuildModel
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,9 @@ fun BuildContent(component: BuildComponent) {
onBackClick = { component.onCloseClicked() },
title = {
when (val current = model) {
BuildModel.Loading -> Text("Build")
is BuildModel.Failed -> Text("Failed")
is BuildModel.Loaded -> Text(current.build.rootDir.name)
BuildModel.Loading -> TitleMedium("Build")
is BuildModel.Failed -> TitleMedium("Failed")
is BuildModel.Loaded -> TitleMedium(current.build.rootDir.name)
}
}
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,14 @@ import com.arkivanov.decompose.extensions.compose.subscribeAsState
import kotlinx.coroutines.launch
import org.gradle.client.core.Constants.APPLICATION_DISPLAY_NAME
import org.gradle.client.core.database.Build
import org.gradle.client.ui.composables.DirChooserDialog
import org.gradle.client.ui.composables.Loading
import org.gradle.client.ui.composables.PlainTextTooltip
import org.gradle.client.ui.composables.TopBar
import org.gradle.client.ui.composables.*
import org.gradle.client.ui.theme.plusPaneSpacing

@Composable
fun BuildListContent(component: BuildListComponent) {
val snackbarState = remember { SnackbarHostState() }
Scaffold(
topBar = { TopBar(title = { Text(APPLICATION_DISPLAY_NAME) }) },
topBar = { TopBar(title = { TitleMedium(APPLICATION_DISPLAY_NAME) }) },
floatingActionButton = { AddBuildButton(component, snackbarState) },
snackbarHost = { SnackbarHost(snackbarState) },
) { scaffoldPadding ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Text
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import org.gradle.client.ui.theme.spacing

@Composable
fun Loading() {
Box(
modifier = Modifier.fillMaxSize().padding(top = 32.dp),
modifier = Modifier.fillMaxSize().padding(top = MaterialTheme.spacing.level6),
contentAlignment = Alignment.Center
) {
Column {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,15 @@ fun TitleSmall(text: String, modifier: Modifier = Modifier) {
)
}

@Composable
fun BodyMedium(text: String, modifier: Modifier = Modifier) {
Text(
modifier = modifier,
text = text,
style = MaterialTheme.typography.bodyMedium,
)
}

@Composable
fun LabelSmall(text: String, modifier: Modifier = Modifier) {
Text(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import org.gradle.client.core.gradle.GradleConnectionParameters
import org.gradle.client.core.gradle.GradleDistribution
import org.gradle.client.ui.AppDispatchers
import org.gradle.client.ui.connected.actions.*
import org.gradle.tooling.BuildAction
import org.gradle.tooling.GradleConnector
import org.gradle.tooling.ProjectConnection
import org.gradle.tooling.events.OperationType
Expand Down Expand Up @@ -59,8 +58,8 @@ class ConnectedComponent(
GetBuildEnvironment(),
GetGradleBuild(),
GetGradleProject(),
GetProjectSchema(),
GetResolvedDom()
GetDeclarativeSchema(),
GetDeclarativeDocuments()
)

private val scope = coroutineScope(appDispatchers.main + SupervisorJob())
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,22 @@
package org.gradle.client.ui.connected

import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.selection.selectable
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.PlayCircle
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import com.arkivanov.decompose.extensions.compose.subscribeAsState
import org.gradle.client.ui.composables.FailureContent
import org.gradle.client.ui.composables.Loading
import org.gradle.client.ui.composables.TitleMedium
import org.gradle.client.ui.composables.TopBar
import org.gradle.client.ui.theme.plusPaneSpacing
import org.gradle.client.ui.theme.spacing
import java.io.File

@Composable
fun ConnectedContent(component: ConnectedComponent) {
Expand All @@ -23,11 +26,11 @@ fun ConnectedContent(component: ConnectedComponent) {
TopBar(
onBackClick = { component.onCloseClicked() },
title = {
val rootDir = component.parameters.rootDir
val rootDir = File(component.parameters.rootDir)
when (model) {
ConnectionModel.Connecting -> Text("Connecting to $rootDir")
is ConnectionModel.ConnectionFailure -> Text("Connection to $rootDir failed")
is ConnectionModel.Connected -> Text("Connected to $rootDir")
ConnectionModel.Connecting -> TitleMedium("Connecting to ${rootDir.name}")
is ConnectionModel.ConnectionFailure -> TitleMedium("Connection to ${rootDir.name} failed")
is ConnectionModel.Connected -> TitleMedium("Connected to ${rootDir.name}")
}
}
)
Expand Down Expand Up @@ -61,14 +64,17 @@ private fun ConnectedMainContent(component: ConnectedComponent, model: Connectio
left = {
// Actions
component.modelActions.forEach { action ->
ListItem(
modifier = Modifier.selectable(
Row(
modifier = Modifier.fillMaxWidth().selectable(
selected = false,
onClick = { component.getModel(action) }
),
leadingContent = { Icon(Icons.Default.PlayCircle, action.displayName) },
headlineContent = { Text(action.displayName, style = MaterialTheme.typography.titleSmall) },
)
).padding(MaterialTheme.spacing.level1),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(MaterialTheme.spacing.level1)
) {
Icon(Icons.Default.PlayCircle, action.displayName)
Text(action.displayName, style = MaterialTheme.typography.bodyMedium)
}
}
},
right = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import org.gradle.client.ui.theme.spacing

private const val DEFAULT_LEFT_WEIGHT = 0.2f
private const val DEFAULT_RIGHT_WEIGHT = 0.8f
private const val DEFAULT_LEFT_WEIGHT = 0.15f
private const val DEFAULT_RIGHT_WEIGHT = 0.85f

@Composable
@Suppress("LongParameterList")
Expand All @@ -25,19 +25,21 @@ fun TwoPanes(
) {
Row(modifier) {
Column(
modifier = Modifier.padding(end = MaterialTheme.spacing.level2)
modifier = Modifier
.padding(end = MaterialTheme.spacing.level2)
.weight(leftWeight)
.run { if (verticallyScrollable) verticalScroll(rememberScrollState()) else this }
.run { if (horizontallyScrollable) horizontalScroll(rememberScrollState()) else this },
verticalArrangement = Arrangement.spacedBy(MaterialTheme.spacing.level2),
verticalArrangement = Arrangement.spacedBy(MaterialTheme.spacing.level1),
) {
left()
}
Column(
modifier = Modifier.weight(rightWeight)
modifier = Modifier
.weight(rightWeight)
.run { if (verticallyScrollable) verticalScroll(rememberScrollState()) else this }
.run { if (horizontallyScrollable) horizontalScroll(rememberScrollState()) else this },
verticalArrangement = Arrangement.spacedBy(MaterialTheme.spacing.level2),
verticalArrangement = Arrangement.spacedBy(MaterialTheme.spacing.level1),
) {
right()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ fun AnalysisSchema.softwareTypeNamed(name: String): SchemaMemberFunction =
val SchemaMemberFunction.softwareTypeSemantics: FunctionSemantics.AccessAndConfigure
get() = semantics as FunctionSemantics.AccessAndConfigure

fun AnalysisSchema.configuredTypeOf(semantics: FunctionSemantics.AccessAndConfigure): DataClass =
fun AnalysisSchema.configuredTypeOf(semantics: FunctionSemantics.ConfigureSemantics): DataClass =
dataClassFor(semantics.configuredType as DataTypeRef.Name)

val DataProperty.typeName: String
Expand Down Expand Up @@ -54,3 +54,9 @@ val List<SchemaMemberFunction>.accessAndConfigure: List<SchemaMemberFunction>

val SchemaMemberFunction.accessAndConfigureSemantics: FunctionSemantics.AccessAndConfigure
get() = semantics as FunctionSemantics.AccessAndConfigure

val List<SchemaMemberFunction>.addAndConfigure: List<SchemaMemberFunction>
get() = filter { it.semantics is FunctionSemantics.AddAndConfigure }

val SchemaMemberFunction.addAndConfigureSemantics: FunctionSemantics.AddAndConfigure
get() = semantics as FunctionSemantics.AddAndConfigure
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ class GetBuildEnvironment : GetModelAction<BuildEnvironment> {

override val modelType = BuildEnvironment::class

override val displayName: String
get() = "Build Environment"

@Composable
override fun ColumnScope.ModelContent(model: BuildEnvironment) {
Text(
Expand Down
Loading

0 comments on commit df28b16

Please sign in to comment.