Skip to content

Commit

Permalink
feat: linked the bridges algorithm to the button
Browse files Browse the repository at this point in the history
  • Loading branch information
Demon32123 committed Sep 24, 2024
1 parent ffd989b commit f0a4cff
Show file tree
Hide file tree
Showing 5 changed files with 71 additions and 23 deletions.
53 changes: 39 additions & 14 deletions src/main/kotlin/view/MainView.kt
Original file line number Diff line number Diff line change
@@ -1,26 +1,28 @@
package view

import Config
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.*
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import view.canvas.CanvasView
import viewModel.MainViewModel
import viewModel.MenuViewModel

val HEADER_HEIGHT = Config.headerHeight
val MENU_WIDTH = Config.menuWidth

@Composable
fun DisplayAlgorithmMenu(name: String) {
fun DisplayAlgorithmMenu(name: String, viewModel: MenuViewModel, onClick: () -> Unit = {}) {

val imageResources = listOf(
"FindBridge.svg",
Expand Down Expand Up @@ -52,34 +54,49 @@ fun DisplayAlgorithmMenu(name: String) {
ImageButton(
imageResourceId = image,
onClick = {
}
if(image == "FindBridge.svg"){
onClick()
}
}, viewModel
)
}
}
}
}

@OptIn(ExperimentalFoundationApi::class)
@Composable
fun ImageButton(imageResourceId: String, onClick: () -> Unit) {
fun ImageButton(imageResourceId: String, onClick: () -> Unit, viewModel: MenuViewModel) {
Box(
modifier = Modifier
.size(440.dp, 60.dp)
.padding(1.dp)
.clickable { onClick() }
.background(Color(0x00))
) {
Image(
painter = painterResource(imageResourceId),
contentDescription = "Button Image",
modifier = Modifier.size(445.dp, 59.dp),
contentScale = ContentScale.Crop
)
if (imageResourceId == "FindBridge.svg") {
Image(
painter = painterResource(imageResourceId),
contentDescription = "Button Image",
modifier = Modifier.glowRec(viewModel.isFinded).size(445.dp, 59.dp).onClick(onClick = onClick),
contentScale = ContentScale.Crop
)
}
else {
Image(
painter = painterResource(imageResourceId),
contentDescription = "Button Image",
modifier = Modifier.alpha(0.2f).size(445.dp, 59.dp).onClick(onClick = onClick),
contentScale = ContentScale.Crop
)
}
}
}

@Composable
fun MainView(mainViewModel: MainViewModel) {

var isBridgeFinded by mainViewModel.menuViewModel::isFinded

Row(Modifier.offset(0f.dp, Config.headerHeight.dp)) {
MenuView(mainViewModel.menuViewModel)

Expand All @@ -90,8 +107,16 @@ fun MainView(mainViewModel: MainViewModel) {
}

if (mainViewModel.menuViewModel.isAlgorithmMenuOpen) {
DisplayAlgorithmMenu("DownMenuAlgorithm.svg")
DisplayAlgorithmMenu("DownMenuAlgorithm.svg",
mainViewModel.menuViewModel
){ isBridgeFinded = !isBridgeFinded }
}

SettingsView(mainViewModel.settingsViewModel)
}

fun Modifier.glowRec(flag: Boolean): Modifier {
if (!flag) return Modifier

return Modifier.border(1f.dp, color = Color(0xFFFF00FF), shape = RectangleShape)
}
10 changes: 5 additions & 5 deletions src/main/kotlin/view/MenuView.kt
Original file line number Diff line number Diff line change
Expand Up @@ -96,19 +96,19 @@ fun MenuView(
horizontalAlignment = Alignment.CenterHorizontally,
) {
Spacer(Modifier.height(25f.dp))
MenuIcon("Nodes.svg", "AddNode.svg", Modifier.glow(isNodeCreating)) { isNodeCreating = !isNodeCreating }
MenuIcon("Nodes.svg", "AddNode.svg", Modifier.glowCircle(isNodeCreating)) { isNodeCreating = !isNodeCreating }
MenuIcon("Ribs.svg", "AddEdge.svg", modifier = Modifier.alpha(0.2f))
MenuIcon("Clustering.svg", "ClusterD.svg", Modifier.glow(isClustering)) { isClustering = !isClustering }
MenuIcon("PageRank.svg", "AnalysisGraph.svg", Modifier.glow(viewModel.isRanked)) { isRanked = !isRanked }
MenuIcon("Clustering.svg", "ClusterD.svg", Modifier.glowCircle(isClustering)) { isClustering = !isClustering }
MenuIcon("PageRank.svg", "AnalysisGraph.svg", Modifier.glowCircle(viewModel.isRanked)) { isRanked = !isRanked }
MenuIcon(
"Algorithm.svg",
"Algorithms....svg",
Modifier.glow(viewModel.isAlgorithmMenuOpen)
Modifier.glowCircle(viewModel.isAlgorithmMenuOpen)
) { isAlgorithmMenuOpen = !isAlgorithmMenuOpen }
}
}

fun Modifier.glow(flag: Boolean): Modifier {
fun Modifier.glowCircle(flag: Boolean): Modifier {
if (!flag) return Modifier

return Modifier.border(4f.dp, color = Color(0xFFFF00FF), shape = CircleShape)
Expand Down
3 changes: 2 additions & 1 deletion src/main/kotlin/viewModel/MenuViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,6 @@ class MenuViewModel(
var isNodeCreating by canvasViewModel::isNodeCreatingMode
var isClustering by canvasViewModel::isClustering
var isRanked by canvasViewModel::isRanked
var isFinded by canvasViewModel::isFinded
var isAlgorithmMenuOpen by mutableStateOf(false)
}
}
3 changes: 2 additions & 1 deletion src/main/kotlin/viewModel/canvas/CanvasViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ class CanvasViewModel(

var isClustering by graphViewModel::clustering
var isRanked by graphViewModel::ranked
var isFinded by graphViewModel::bridgeFinded

var isNodeCreatingMode by mutableStateOf(false)
var zoom by mutableStateOf(1f)
Expand Down Expand Up @@ -114,7 +115,7 @@ class CanvasViewModel(
/*
* Change edges' color
* */
fun changeEdgesColor(edges: List<Pair<Edge, Color>>) {
fun changeEdgesColor(edges: MutableList<Pair<Edge, Color>>) {
graphViewModel.changeEdgesColor(edges)
}

Expand Down
25 changes: 23 additions & 2 deletions src/main/kotlin/viewModel/graph/UndirectedViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import model.algorithm.Clustering
import model.algorithm.FindBridges
import model.algorithm.PageRank
import model.graph.Edge
import model.graph.UndirectedGraph
Expand All @@ -17,15 +18,18 @@ class UndirectedViewModel(
private val graph: UndirectedGraph,
val showVerticesLabels: Boolean,
var groups: HashMap<Vertex, Int> = hashMapOf(),
var ranks: List<Pair<Vertex, Double>> = listOf()
var ranks: List<Pair<Vertex, Double>> = listOf(),
var bridges: List<Edge> = listOf()
) {
private val _vertices = hashMapOf<Vertex, VertexViewModel>()
private val _adjacencyList = hashMapOf<VertexViewModel, ArrayList<EdgeViewModel>>()
private val groupColors = hashMapOf<Int, Color>(0 to Color.Black)
private val BridgesWthColor = mutableListOf<Pair<Edge, Color>>()

private val _color = mutableStateOf(Color.Black)
private val _clustering = mutableStateOf(false)
private val _ranked = mutableStateOf(false)
private val _bridgeFinded = mutableStateOf(false)

private var size by mutableStateOf(10f)

Expand All @@ -48,8 +52,25 @@ class UndirectedViewModel(
set(value) {
_ranked.value = value
ranks = PageRank(graph).computePageRank(3)
println("хуй")
updateSizes()
}

var bridgeFinded
get() = _bridgeFinded.value
set(value) {
_bridgeFinded.value = value
bridges = FindBridges(graph).findBridges()
bridges.forEach {
BridgesWthColor.add(it to Color.Red)
}
if (bridgeFinded) {
changeEdgesColor(BridgesWthColor)
}
else{
resetEdgesColorToDefault()
}
}

private fun getColor(group: Int): Color {
if (clustering) {
Expand Down Expand Up @@ -120,7 +141,7 @@ class UndirectedViewModel(
/*
* Change edges' color
* */
fun changeEdgesColor(edges: List<Pair<Edge, Color>>) {
fun changeEdgesColor(edges: MutableList<Pair<Edge, Color>>) {
edges.forEach { p ->
val edge = p.first
val color = p.second
Expand Down

0 comments on commit f0a4cff

Please sign in to comment.