Skip to content

Commit

Permalink
create canvas element architcture
Browse files Browse the repository at this point in the history
revert change by mistake

Fix build-bootstrap.xml

Simplify configuration of platform tests. No referencing of mps-generated is now allowed in tests.

rebuild: update build-bootstrap.xml
  • Loading branch information
Pechenka2005 committed May 10, 2024
1 parent ffb4d2e commit ab87773
Show file tree
Hide file tree
Showing 72 changed files with 2,507 additions and 405 deletions.
8 changes: 8 additions & 0 deletions .idea/compiler.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .idea/kotlinc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 1 addition & 10 deletions code/cat_visual/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import org.jetbrains.compose.compose
import org.jetbrains.compose.desktop.application.dsl.TargetFormat
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
kotlin
kotlin("jvm") version "1.8.0"
id("org.jetbrains.compose") version "1.3.1"
kotlin("plugin.serialization") version "1.8.0"
}
Expand Down Expand Up @@ -38,12 +37,4 @@ compose.desktop {
packageVersion = "1.0.0"
}
}
}
val compileKotlin: KotlinCompile by tasks
compileKotlin.kotlinOptions {
jvmTarget = "1.8"
}
val compileTestKotlin: KotlinCompile by tasks
compileTestKotlin.kotlinOptions {
jvmTarget = "1.8"
}
Binary file added code/cat_visual/gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
7 changes: 7 additions & 0 deletions code/cat_visual/gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
120 changes: 100 additions & 20 deletions code/cat_visual/src/main/kotlin/Main.kt
Original file line number Diff line number Diff line change
@@ -1,35 +1,40 @@
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.gestures.rememberTransformableState
import androidx.compose.foundation.gestures.transformable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material.Button
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Scaffold
import androidx.compose.runtime.Composable
import androidx.compose.material.Text
import androidx.compose.runtime.*
import androidx.compose.runtime.snapshots.SnapshotStateList
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Window
import androidx.compose.ui.window.application
import androidx.compose.ui.window.rememberWindowState
import canvas.items.CustomItem
import androidx.compose.ui.zIndex
import canvas.items.impl.CustomItem
import canvas.items.impl.LampItem
import canvas.items.impl.TextItem
import canvas.items.interfaces.CanvasItemInterface
import canvas.items.model.JsonCanvasModel
import canvas.items.model.toItem
import connection.*
import connection.field.BoolField
import connection.field.TYPE_ID
import example.COUNTER.CounterLampHMI
import example.WATER_TANK.System
import example.WATER_TANK.WaterTank
import serializer.PlainMapping
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import serializer.SerializationUtils
import serializer.getConf
import serializer.getMapping
import serializer.getPlainMapping
import java.io.BufferedReader
import java.io.File
import java.io.InputStreamReader
import java.net.DatagramPacket
import java.net.InetAddress
import java.net.ServerSocket

@Composable
fun CanvasContext(listFigures: SnapshotStateList<CustomItem>) {
Expand Down Expand Up @@ -64,16 +69,91 @@ val client = buildMappingClient("src/main/kotlin/example/COUNTER/COUNTER.xml", "
//val client = buildMappingClient("src/main/kotlin/example/WATER_TANK/WATER_TANK.xml", "src/main/kotlin/example/WATER_TANK/WATER_TANK_CONF.xml", "")
//val client = buildMappingClient("src/main/kotlin/example/WATER_TANK/WATER_TANK.xml", "src/main/kotlin/example/WATER_TANK/COMMON_CONF.xml", "json")

@Composable
fun canvas(
itemList: List<CanvasItemInterface>,
deleteItem: (String) -> Unit,
) {
LazyColumn(
modifier = Modifier
.fillMaxHeight()
.fillMaxWidth()
.zIndex(0f),
) {
items(itemList.size) { index ->
itemList[index].getContent { deleteItem(it)}
}
}
}

@Composable
fun itemBar(
itemList: List<CanvasItemInterface>,
addNewItem: (CanvasItemInterface) -> Unit
) {
Column(
modifier = Modifier
.background(Color.LightGray)
.width(100.dp)
.fillMaxHeight()
.zIndex(-2f),
horizontalAlignment = Alignment.End,
) {
Button(
modifier = Modifier.align(alignment = Alignment.CenterHorizontally),
onClick = {
addNewItem(TextItem(content = "AddedText"))
}
) {
Text(text = "Add text")
}
Button(
modifier = Modifier.align(alignment = Alignment.CenterHorizontally),
onClick = {
addNewItem(LampItem(client = client))
}
) {
Text(text = "Add lamp")
}
Button(
modifier = Modifier.align(alignment = Alignment.CenterHorizontally),
onClick = {
val x = itemList.map {it.toModel()}
val json = Json.encodeToString(x)
SerializationUtils.saveSnapshot(json)
}
) {
Text(text = "save")
}
}
}

fun main() = application {
Window(
onCloseRequest = ::exitApplication,
title = "Canvas for CAT",
state = rememberWindowState(width = 600.dp, height = 600.dp)
) {
MaterialTheme {
CounterLampHMI(client, "1")
client.retrieveValues()
}
val listxxx = Json.decodeFromString<List<JsonCanvasModel>>(SerializationUtils.readSnapshot())
var itemList by remember { mutableStateOf(listxxx.map { it.toItem(client) }) }
MaterialTheme {
Row(
modifier = Modifier
.fillMaxWidth()
.fillMaxHeight(),
) {
// CounterLampHMI(client, "1")
itemBar(itemList) { item ->
itemList += listOf(item)
}
canvas(itemList) { idToDelete ->
itemList = itemList.filter { it.id.toString() != idToDelete }
val x = 1
println(itemList.map { it.id })
}
client.retrieveValues()
}

}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package canvas.exceptions

class UnknownTypeItemException(id: String, unresolvedType: String):
RuntimeException("Can't resolve type: $unresolvedType, for id: $id")
34 changes: 34 additions & 0 deletions code/cat_visual/src/main/kotlin/canvas/items/Draggable.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package canvas.items

import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.gestures.detectDragGestures
import androidx.compose.foundation.layout.offset
import androidx.compose.runtime.MutableState
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.pointer.changedToUp
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.dp

interface Draggable {
fun Modifier.makeDraggable(
density: Density,
x: MutableState<Float>,
y: MutableState<Float>,
): Modifier =
this.offset(
(x.value / density.density).dp,
(y.value / density.density).dp
).pointerInput(Unit) {
detectDragGestures { change, dragAmount ->
change.consume()
x.value += dragAmount.x
y.value += dragAmount.y
}

}.clickable {
this.background(Color.LightGray)
}
}
47 changes: 47 additions & 0 deletions code/cat_visual/src/main/kotlin/canvas/items/impl/AbstractItem.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package canvas.items.impl

import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import canvas.items.interfaces.CanvasItemInterface
import canvas.items.model.Input
import canvas.items.model.JsonCanvasModel
import canvas.items.model.Output
import connection.AbstractClient
import kotlinx.serialization.Serializable
import serializer.SerializationUtils
import java.util.UUID

open class AbstractItem(
override val id: UUID = UUID.randomUUID(),
override var x: Float,
override var y: Float,
override val inputs: List<Input> = listOf(),
override val outputs: List<Output> = listOf(),
protected open val modifier: Modifier = Modifier,
protected open val content: Any? = null,
protected open val client: AbstractClient? = null,
): CanvasItemInterface {

override val type: CanvasItemInterface.Type
get() = CanvasItemInterface.Type.UNKNOWN

override fun toModel(): JsonCanvasModel =
JsonCanvasModel(
id = id.toString(),
x = x,
y = y,
inputs = inputs,
outputs = outputs,
type = type.toString(),
content = content.toString(),
)

@Composable
override fun getContent(deleteCurrentItem: (String) -> Unit) {
Box(modifier = modifier
.wrapContentSize())
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package canvas.items
package canvas.items.impl

import androidx.compose.animation.animateContentSize
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.background
import androidx.compose.foundation.gestures.*
import androidx.compose.foundation.layout.*
Expand All @@ -11,18 +9,11 @@ import androidx.compose.material.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.input.pointer.PointerEventPass
import androidx.compose.ui.input.pointer.PointerEventType
import androidx.compose.ui.input.pointer.onPointerEvent
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.layout.onSizeChanged
import androidx.compose.ui.semantics.Role
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.dp

Expand Down
Loading

0 comments on commit ab87773

Please sign in to comment.