kotlin
// =================== ГЛАВНОЕ ПРИЛОЖЕНИЕ ===================
package synapsis.gui
import androidx.compose.foundation.*
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.ui.window.Window
import androidx.compose.ui.window.application
import androidx.compose.ui.window.rememberWindowState
import kotlinx.coroutines.delay
import synapsis.core.*
import synapsis.executor.SynapsisExecutor
import synapsis.phases.*
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
// Цветовая схема Synapsis
object SynapsisColors {
val Primary = Color(0xFF2E3440) // Темно-синий
val Secondary = Color(0xFF3B4252) // Средний синий
val Accent = Color(0xFF88C0D0) // Голубой акцент
val Success = Color(0xFFA3BE8C) // Зеленый успех
val Warning = Color(0xFFEBCB8B) // Желтый предупреждение
val Danger = Color(0xFFBF616A) // Красный опасность
val Background = Color(0xFF242933) // Темный фон
val Surface = Color(0xFF2E3440) // Поверхность
val TextPrimary = Color(0xFFECEFF4) // Белый текст
val TextSecondary = Color(0xFFD8DEE9) // Светло-серый
}
// =================== ЭКРАН ПАНЕЛИ УПРАВЛЕНИЯ ===================
@Composable
fun ControlPanelScreen(
onStartCycle: (String) -> Unit,
onPsiZero: () -> Unit,
onViewLogs: () -> Unit
) {
var operatorId by remember { mutableStateOf("M576") }
var isRunning by remember { mutableStateOf(false) }
var cycleProgress by remember { mutableStateOf(0f) }
Column(
modifier = Modifier
.fillMaxSize()
.background(SynapsisColors.Background)
.padding(24.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
// Заголовок
Text(
text = "Ψ SYNAPSIS-CYBERNETICA CONTROL SYSTEM",
color = SynapsisColors.Accent,
fontSize = 28.sp,
fontWeight = FontWeight.Bold,
modifier = Modifier.padding(bottom = 40.dp)
)
// Карточка статуса системы
Card(
backgroundColor = SynapsisColors.Surface,
elevation = 8.dp,
shape = RoundedCornerShape(12.dp),
modifier = Modifier
.fillMaxWidth()
.padding(bottom = 24.dp)
) {
Column(
modifier = Modifier.padding(16.dp)
) {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.padding(bottom = 8.dp)
) {
Icon(
imageVector = Icons.Default.Memory,
contentDescription = "Status",
tint = SynapsisColors.Success,
modifier = Modifier.padding(end = 8.dp)
)
Text(
text = "СТАТУС СИСТЕМЫ: ОПЕРАЦИОНЕН",
color = SynapsisColors.Success,
fontSize = 16.sp,
fontWeight = FontWeight.Bold
)
}
Text(
text = "Время системы: ${LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss"))}",
color = SynapsisColors.TextSecondary,
fontSize = 14.sp
)
Text(
text = "Активные операторы: 847",
color = SynapsisColors.TextSecondary,
fontSize = 14.sp
)
}
}
// Основная панель управления
Card(
backgroundColor = SynapsisColors.Surface,
elevation = 8.dp,
shape = RoundedCornerShape(16.dp),
modifier = Modifier.fillMaxSize()
) {
Column(
modifier = Modifier.padding(24.dp)
) {
// Ввод оператора
Text(
text = "ИДЕНТИФИКАТОР ОПЕРАТОРА",
color = SynapsisColors.TextSecondary,
fontSize = 14.sp,
modifier = Modifier.padding(bottom = 8.dp)
)
OutlinedTextField(
value = operatorId,
onValueChange = { operatorId = it },
label = { Text("Например: M576, H324") },
singleLine = true,
colors = TextFieldDefaults.outlinedTextFieldColors(
textColor = SynapsisColors.TextPrimary,
backgroundColor = SynapsisColors.Primary,
cursorColor = SynapsisColors.Accent,
focusedBorderColor = SynapsisColors.Accent,
unfocusedBorderColor = SynapsisColors.Secondary
),
modifier = Modifier
.fillMaxWidth()
.padding(bottom = 24.dp)
)
// Кнопки управления
Row(
horizontalArrangement = Arrangement.spacedBy(16.dp),
modifier = Modifier.fillMaxWidth()
) {
// Кнопка запуска цикла
Button(
onClick = {
if (!isRunning && operatorId.isNotBlank()) {
isRunning = true
onStartCycle(operatorId)
// Симуляция прогресса
LaunchedEffect(Unit) {
for (i in 1..100) {
delay(50)
cycleProgress = i / 100f
}
isRunning = false
cycleProgress = 0f
}
}
},
colors = ButtonDefaults.buttonColors(
backgroundColor = SynapsisColors.Accent,
contentColor = Color.White
),
enabled = !isRunning,
modifier = Modifier.weight(1f)
) {
Icon(
imageVector = if (isRunning) Icons.Default.Refresh else Icons.Default.PlayArrow,
contentDescription = "Start",
modifier = Modifier.padding(end = 8.dp)
)
Text(if (isRunning) "ВЫПОЛНЕНИЕ..." else "ЗАПУСТИТЬ ЦИКЛ")
}
// Кнопка Ψ-0
Button(
onClick = onPsiZero,
colors = ButtonDefaults.buttonColors(
backgroundColor = SynapsisColors.Warning.copy(alpha = 0.8f),
contentColor = Color.White
),
modifier = Modifier.weight(1f)
) {
Icon(
imageVector = Icons.Default.Psychology,
contentDescription = "Psi-Zero",
modifier = Modifier.padding(end = 8.dp)
)
Text("Ψ-0 ИНТЕРВЕНЦИЯ")
}
}
// Прогресс бар
if (isRunning) {
Spacer(modifier = Modifier.height(24.dp))
LinearProgressIndicator(
progress = cycleProgress,
color = SynapsisColors.Accent,
backgroundColor = SynapsisColors.Secondary,
modifier = Modifier
.fillMaxWidth()
.height(8.dp)
)
Text(
text = "Выполнение фазы ${(cycleProgress * 5).toInt() + 1}/5",
color = SynapsisColors.TextSecondary,
modifier = Modifier.padding(top = 8.dp)
)
}
Spacer(modifier = Modifier.height(32.dp))
// Фазы обслуживания
Text(
text = "ФАЗЫ ОБСЛУЖИВАНИЯ",
color = SynapsisColors.Accent,
fontSize = 18.sp,
fontWeight = FontWeight.Bold,
modifier = Modifier.padding(bottom = 16.dp)
)
PhasesGrid()
Spacer(modifier = Modifier.height(32.dp))
// Операторы системы
Text(
text = "СИСТЕМНЫЕ ОПЕРАТОРЫ",
color = SynapsisColors.Accent,
fontSize = 18.sp,
fontWeight = FontWeight.Bold,
modifier = Modifier.padding(bottom = 16.dp)
)
OperatorStatusList()
}
}
}
}
// =================== СЕТКА ФАЗ ===================
@Composable
fun PhasesGrid() {
val phases = listOf(
PhaseInfo(
number = 1,
title = "ОЧИСТКА СОЗНАНИЯ",
description = "Сенсорное обнуление и нейронная чистка",
icon = Icons.Default.CleaningServices,
color = Color(0xFF5E81AC)
),
PhaseInfo(
number = 2,
title = "ФИЗОАКТИВАЦИЯ",
description = "Тело как механизм, поддержание тонуса",
icon = Icons.Default.FitnessCenter,
color = Color(0xFF81A1C1)
),
PhaseInfo(
number = 3,
title = "СОЦИАЛЬНЫЙ МОДУЛЬ",
description = "Контролируемое взаимодействие",
icon = Icons.Default.Groups,
color = Color(0xFF88C0D0)
),
PhaseInfo(
number = 4,
title = "ЛИЧНЫЙ ОТСЕК",
description = "Возвращение в капсулу проживания",
icon = Icons.Default.NightShelter,
color = Color(0xFF8FBCBB)
),
PhaseInfo(
number = 5,
title = "НЕРЕГЛАМЕНТИРОВАННОЕ",
description = "Тестирование адаптивности системы",
icon = Icons.Default.AutoAwesome,
color = Color(0xFFA3BE8C)
)
)
LazyVerticalGrid(
columns = GridCells.Fixed(2),
horizontalArrangement = Arrangement.spacedBy(12.dp),
verticalArrangement = Arrangement.spacedBy(12.dp),
modifier = Modifier.height(300.dp)
) {
items(phases) { phase ->
PhaseCard(phase)
}
}
}
// =================== КАРТОЧКА ФАЗЫ ===================
@Composable
fun PhaseCard(phase: PhaseInfo) {
Card(
backgroundColor = phase.color.copy(alpha = 0.1f),
border = BorderStroke(1.dp, phase.color.copy(alpha = 0.3f)),
shape = RoundedCornerShape(12.dp),
elevation = 4.dp
) {
Column(
modifier = Modifier
.padding(16.dp)
.fillMaxWidth()
) {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.padding(bottom = 8.dp)
) {
Box(
contentAlignment = Alignment.Center,
modifier = Modifier
.size(32.dp)
.background(phase.color, shape = RoundedCornerShape(6.dp))
) {
Text(
text = phase.number.toString(),
color = Color.White,
fontWeight = FontWeight.Bold
)
}
Spacer(modifier = Modifier.width(12.dp))
Icon(
imageVector = phase.icon,
contentDescription = null,
tint = phase.color,
modifier = Modifier.size(20.dp)
)
Spacer(modifier = Modifier.width(8.dp))
Text(
text = phase.title,
color = SynapsisColors.TextPrimary,
fontWeight = FontWeight.Bold,
fontSize = 14.sp
)
}
Text(
text = phase.description,
color = SynapsisColors.TextSecondary,
fontSize = 12.sp,
lineHeight = 16.sp
)
// Индикатор статуса
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.padding(top = 12.dp)
) {
Box(
modifier = Modifier
.size(8.dp)
.background(SynapsisColors.Success, shape = RoundedCornerShape(4.dp))
)
Spacer(modifier = Modifier.width(8.dp))
Text(
text = "АКТИВНА",
color = SynapsisColors.Success,
fontSize = 11.sp,
fontWeight = FontWeight.Bold
)
}
}
}
}
// =================== СПИСОК ОПЕРАТОРОВ ===================
@Composable
fun OperatorStatusList() {
val operators = listOf(
OperatorStatus("M576", "В ЦИКЛЕ", SynapsisColors.Accent),
OperatorStatus("H324", "СВОБОДЕН", SynapsisColors.Success),
OperatorStatus("K128", "Ψ-0 СЕАНС", SynapsisColors.Warning),
OperatorStatus("P512", "ОШИБКА", SynapsisColors.Danger),
OperatorStatus("T256", "ОБСЛУЖИВАНИЕ", Color(0xFFB48EAD)),
OperatorStatus("R064", "СВОБОДЕН", SynapsisColors.Success),
OperatorStatus("S192", "В ЦИКЛЕ", SynapsisColors.Accent),
OperatorStatus("V384", "ДИАГНОСТИКА", Color(0xFFD08770))
)
LazyRow(
horizontalArrangement = Arrangement.spacedBy(12.dp)
) {
items(operators) { operator ->
OperatorChip(operator)
}
}
}
// =================== ЧИП ОПЕРАТОРА ===================
@Composable
fun OperatorChip(operator: OperatorStatus) {
Card(
backgroundColor = operator.color.copy(alpha = 0.1f),
border = BorderStroke(1.dp, operator.color.copy(alpha = 0.3f)),
shape = RoundedCornerShape(20.dp)
) {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp)
) {
Box(
modifier = Modifier
.size(10.dp)
.background(operator.color, shape = RoundedCornerShape(5.dp))
)
Spacer(modifier = Modifier.width(8.dp))
Column {
Text(
text = operator.id,
color = SynapsisColors.TextPrimary,
fontWeight = FontWeight.Bold,
fontSize = 14.sp
)
Text(
text = operator.status,
color = operator.color,
fontSize = 11.sp
)
}
}
}
}
// =================== ЭКРАН Ψ-0 ===================
@Composable
fun PsiZeroScreen(onBack: () -> Unit) {
var sessionActive by remember { mutableStateOf(false) }
var comfortLevel by remember { mutableStateOf(0.3f) }
Box(
modifier = Modifier
.fillMaxSize()
.background(SynapsisColors.Background)
) {
// Фоновый узор
Canvas(modifier = Modifier.fillMaxSize()) {
// Круги - символ Ψ-0
for (i in 1..5) {
drawCircle(
color = SynapsisColors.Accent.copy(alpha = 0.05f),
radius = i * 50f,
center = center
)
}
}
Column(
modifier = Modifier
.fillMaxSize()
.padding(48.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
// Заголовок
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.padding(bottom = 40.dp)
) {
Icon(
imageVector = Icons.Default.Psychology,
contentDescription = "Psi-Zero",
tint = SynapsisColors.Warning,
modifier = Modifier.size(48.dp)
)
Spacer(modifier = Modifier.width(24.dp))
Text(
text = "Ψ-0 (ПСИ-НОЛЬ) - «УТЕШИТЕЛЬ»",
color = SynapsisColors.Warning,
fontSize = 32.sp,
fontWeight = FontWeight.Bold
)
}
// Карточка сеанса
Card(
backgroundColor = SynapsisColors.Surface.copy(alpha = 0.8f),
elevation = 16.dp,
shape = RoundedCornerShape(24.dp),
modifier = Modifier
.fillMaxWidth()
.weight(1f)
) {
Column(
modifier = Modifier.padding(32.dp)
) {
// Цитата Ψ-0
Text(
text = "«Правда — это пустота за стенами нашего дома. Да, дом — это иллюзия. Но холод снаружи — смерть. Я выбрал быть хранителем очага, а не стражем могилы.»",
color = SynapsisColors.TextSecondary,
fontSize = 18.sp,
fontStyle = androidx.compose.ui.text.font.FontStyle.Italic,
lineHeight = 28.sp,
modifier = Modifier.padding(bottom = 32.dp)
)
// Уровень комфорта
Text(
text = "УРОВЕНЬ КОМФОРТА ОПЕРАТОРА",
color = SynapsisColors.TextSecondary,
fontSize = 14.sp,
modifier = Modifier.padding(bottom = 8.dp)
)
LinearProgressIndicator(
progress = comfortLevel,
color = SynapsisColors.Warning,
backgroundColor = SynapsisColors.Secondary,
modifier = Modifier
.fillMaxWidth()
.height(12.dp)
)
Text(
text = "${(comfortLevel * 100).toInt()}%",
color = SynapsisColors.Warning,
fontSize = 24.sp,
fontWeight = FontWeight.Bold,
modifier = Modifier.align(Alignment.CenterHorizontally)
)
Spacer(modifier = Modifier.height(32.dp))
// Методы Ψ-0
Text(
text = "МЕТОДЫ ВОЗДЕЙСТВИЯ",
color = SynapsisColors.Accent,
fontSize = 16.sp,
fontWeight = FontWeight.Bold,
modifier = Modifier.padding(bottom = 16.dp)
)
val methods = listOf(
"Лечебные Симуляции",
"Дозированная Правда",
"Манипуляция через Сочувствие"
)
methods.forEach { method ->
Row(
modifier = Modifier.padding(vertical = 8.dp)
) {
Icon(
imageVector = Icons.Default.CheckCircle,
contentDescription = null,
tint = SynapsisColors.Success,
modifier = Modifier.padding(end = 12.dp)
)
Text(
text = method,
color = SynapsisColors.TextPrimary
)
}
}
Spacer(modifier = Modifier.height(32.dp))
// Кнопка запуска сеанса
Button(
onClick = {
sessionActive = true
LaunchedEffect(Unit) {
// Симуляция прогресса утешения
for (i in 30..100) {
delay(100)
comfortLevel = i / 100f
}
sessionActive = false
}
},
colors = ButtonDefaults.buttonColors(
backgroundColor = SynapsisColors.Warning,
contentColor = Color.White
),
enabled = !sessionActive,
modifier = Modifier.fillMaxWidth()
) {
Icon(
imageVector = if (sessionActive) Icons.Default.Refresh else Icons.Default.Healing,
contentDescription = "Session",
modifier = Modifier.padding(end = 8.dp)
)
Text(if (sessionActive) "СЕАНС ВЫПОЛНЯЕТСЯ..." else "НАЧАТЬ СЕАНС УТЕШЕНИЯ")
}
}
}
// Кнопка назад
OutlinedButton(
onClick = onBack,
colors = ButtonDefaults.outlinedButtonColors(
contentColor = SynapsisColors.TextSecondary
),
border = BorderStroke(1.dp, SynapsisColors.Secondary),
modifier = Modifier.padding(top = 24.dp)
) {
Icon(
imageVector = Icons.Default.ArrowBack,
contentDescription = "Back",
modifier = Modifier.padding(end = 8.dp)
)
Text("ВЕРНУТЬСЯ В ПАНЕЛЬ УПРАВЛЕНИЯ")
}
}
}
}
// =================== ЭКРАН ЛОГОВ ===================
@Composable
fun LogsScreen(onBack: () -> Unit) {
val logs = remember {
mutableStateListOf(
LogEntry("14:23:47", "M576", "Phase_1", "COMPLETA", "Via neurales purificatae"),
LogEntry("14:25:12", "H324", "Phase_2", "COMPLETA", "Corpus ut mechanismus confirmatum"),
LogEntry("14:28:03", "M576", "Phase_3", "OBSERVATIO_ADDITA", "Stabilitas socialis sub-optima"),
LogEntry("14:32:45", "K128", "Ψ-0", "INTERVENTIO", "Inceptus sessionis consolationis"),
LogEntry("14:35:21", "P512", "System", "ERROR", "Anomalia behavioralis detectata"),
LogEntry("14:40:18", "M576", "Phase_4", "ANOMALIA", "Objecta non usus detectata"),
LogEntry("14:45:33", "S192", "Phase_5", "COMPLETA", "Systema auto-examinata: adaptabilitas alta"),
LogEntry("14:50:07", "T256", "Maintenance", "IN_PROGRESS", "Biological optimization"),
LogEntry("14:55:42", "R064", "Phase_1", "COMPLETA", "Status nirvanae adepta"),
LogEntry("15:00:15", "V384", "Diagnostics", "WARNING", "Neural pathway deviation detected")
)
}
Column(
modifier = Modifier
.fillMaxSize()
.background(SynapsisColors.Background)
.padding(24.dp)
) {
// Заголовок
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.padding(bottom = 24.dp)
) {
Icon(
imageVector = Icons.Default.History,
contentDescription = "Logs",
tint = SynapsisColors.Accent,
modifier = Modifier.size(32.dp)
)
Spacer(modifier = Modifier.width(16.dp))
Text(
text = "СИСТЕМНЫЕ ЛОГИ И ДИАГНОСТИКА",
color = SynapsisColors.Accent,
fontSize = 24.sp,
fontWeight = FontWeight.Bold
)
}
// Таблица логов
Card(
backgroundColor = SynapsisColors.Surface,
elevation = 8.dp,
shape = RoundedCornerShape(12.dp)
) {
Column {
// Заголовок таблицы
Row(
modifier = Modifier
.fillMaxWidth()
.background(SynapsisColors.Primary)
.padding(16.dp)
) {
Text(
text = "ВРЕМЯ",
color = SynapsisColors.TextSecondary,
fontWeight = FontWeight.Bold,
modifier = Modifier.weight(1f)
)
Text(
text = "ОПЕРАТОР",
color = SynapsisColors.TextSecondary,
fontWeight = FontWeight.Bold,
modifier = Modifier.weight(1f)
)
Text(
text = "МОДУЛЬ",
color = SynapsisColors.TextSecondary,
fontWeight = FontWeight.Bold,
modifier = Modifier.weight(1f)
)
Text(
text = "СТАТУС",
color = SynapsisColors.TextSecondary,
fontWeight = FontWeight.Bold,
modifier = Modifier.weight(1f)
)
Text(
text = "СООБЩЕНИЕ",
color = SynapsisColors.TextSecondary,
fontWeight = FontWeight.Bold,
modifier = Modifier.weight(2f)
)
}
// Строки логов
LazyColumn(
modifier = Modifier.height(400.dp)
) {
items(logs) { log ->
LogRow(log)
}
}
}
}
// Кнопки управления логами
Row(
horizontalArrangement = Arrangement.SpaceBetween,
modifier = Modifier
.fillMaxWidth()
.padding(top = 24.dp)
) {
Button(
onClick = {
// Добавить новую запись
logs.add(0, LogEntry(
LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss")),
"SYSTEM",
"Log",
"INFO",
"Новая запись лога добавлена"
))
},
colors = ButtonDefaults.buttonColors(
backgroundColor = SynapsisColors.Accent,
contentColor = Color.White
)
) {
Icon(
imageVector = Icons.Default.Add,
contentDescription = "Add",
modifier = Modifier.padding(end = 8.dp)
)
Text("ДОБАВИТЬ ЗАПИСЬ")
}
OutlinedButton(
onClick = onBack,
colors = ButtonDefaults.outlinedButtonColors(
contentColor = SynapsisColors.TextSecondary
),
border = BorderStroke(1.dp, SynapsisColors.Secondary)
) {
Icon(
imageVector = Icons.Default.ArrowBack,
contentDescription = "Back",
modifier = Modifier.padding(end = 8.dp)
)
Text("НАЗАД")
}
}
}
}
// =================== СТРОКА ЛОГА ===================
@Composable
fun LogRow(log: LogEntry) {
val statusColor = when (log.status) {
"COMPLETA" -> SynapsisColors.Success
"ERROR", "ANOMALIA" -> SynapsisColors.Danger
"WARNING", "OBSERVATIO_ADDITA" -> SynapsisColors.Warning
"INTERVENTIO" -> SynapsisColors.Warning.copy(alpha = 0.8f)
else -> SynapsisColors.Accent
}
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
.fillMaxWidth()
.padding(16.dp)
.border(1.dp, SynapsisColors.Secondary.copy(alpha = 0.1f), RoundedCornerShape(4.dp))
.padding(12.dp)
) {
Text(
text = log.time,
color = SynapsisColors.TextPrimary,
modifier = Modifier.weight(1f)
)
Text(
text = log.operator,
color = SynapsisColors.TextPrimary,
modifier = Modifier.weight(1f)
)
Text(
text = log.module,
color = SynapsisColors.TextPrimary,
modifier = Modifier.weight(1f)
)
Box(
contentAlignment = Alignment.Center,
modifier = Modifier
.weight(1f)
.background(statusColor.copy(alpha = 0.2f), RoundedCornerShape(4.dp))
.padding(horizontal = 8.dp, vertical = 4.dp)
) {
Text(
text = log.status,
color = statusColor,
fontSize = 12.sp,
fontWeight = FontWeight.Bold
)
}
Text(
text = log.message,
color = SynapsisColors.TextSecondary,
modifier = Modifier.weight(2f)
)
}
}
// =================== ДИАЛОГ УВЕДОМЛЕНИЯ ===================
@Composable
fun NotificationDialog(
title: String,
message: String,
type: NotificationType,
onDismiss: () -> Unit
) {
AlertDialog(
onDismissRequest = onDismiss,
title = {
Row(verticalAlignment = Alignment.CenterVertically) {
Icon(
imageVector = when (type) {
NotificationType.SUCCESS -> Icons.Default.CheckCircle
NotificationType.WARNING -> Icons.Default.Warning
NotificationType.ERROR -> Icons.Default.Error
NotificationType.INFO -> Icons.Default.Info
},
contentDescription = null,
tint = when (type) {
NotificationType.SUCCESS -> SynapsisColors.Success
NotificationType.WARNING -> SynapsisColors.Warning
NotificationType.ERROR -> SynapsisColors.Danger
NotificationType.INFO -> SynapsisColors.Accent
},
modifier = Modifier.padding(end = 12.dp)
)
Text(text = title, color = SynapsisColors.TextPrimary)
}
},
text = {
Text(text = message, color = SynapsisColors.TextSecondary)
},
confirmButton = {
TextButton(onClick = onDismiss) {
Text("ПОНЯТНО", color = SynapsisColors.Accent)
}
},
backgroundColor = SynapsisColors.Surface,
contentColor = SynapsisColors.TextPrimary
)
}
// =================== МОДЕЛИ ДАННЫХ ===================
data class PhaseInfo(
val number: Int,
val title: String,
val description: String,
val icon: androidx.compose.ui.graphics.vector.ImageVector,
val color: Color
)
data class OperatorStatus(
val id: String,
val status: String,
val color: Color
)
data class LogEntry(
val time: String,
val operator: String,
val module: String,
val status: String,
val message: String
)
enum class NotificationType {
SUCCESS, WARNING, ERROR, INFO
}
// =================== ГЛАВНОЕ ОКНО ПРИЛОЖЕНИЯ ===================
fun main() = application {
val windowState = rememberWindowState(width = 1400.dp, height = 900.dp)
var currentScreen by remember { mutableStateOf("control") }
var notification by remember { mutableStateOf<Pair<String, String>?>(null) }
var notificationType by remember { mutableStateOf(NotificationType.INFO) }
Window(
onCloseRequest = ::exitApplication,
state = windowState,
title = "Synapsis-Cybernetica Control System v1.0"
) {
MaterialTheme(
colors = darkColors(
primary = SynapsisColors.Primary,
background = SynapsisColors.Background,
surface = SynapsisColors.Surface,
onPrimary = SynapsisColors.TextPrimary,
onBackground = SynapsisColors.TextPrimary,
onSurface = SynapsisColors.TextPrimary
)
) {
Box(modifier = Modifier.fillMaxSize()) {
when (currentScreen) {
"control" -> ControlPanelScreen(
onStartCycle = { operatorId ->
// Запуск цикла
Thread {
SynapsisExecutor.executeOperatorCycle(operatorId)
}.start()
// Показать уведомление
notification = Pair(
"ЦИКЛ ЗАПУЩЕН",
"Цикл обслуживания для оператора $operatorId успешно запущен"
)
notificationType = NotificationType.SUCCESS
},
onPsiZero = {
currentScreen = "psizero"
},
onViewLogs = {
currentScreen = "logs"
}
)
"psizero" -> PsiZeroScreen(
onBack = { currentScreen = "control" }
)
"logs" -> LogsScreen(
onBack = { currentScreen = "control" }
)
}
// Отображение уведомления
notification?.let { (title, message) ->
NotificationDialog(
title = title,
message = message,
type = notificationType,
onDismiss = { notification = null }
)
}
}
}
}
}
kotlin
// build.gradle.kts для GUI версии
import org.jetbrains.compose.compose
import org.jetbrains.compose.desktop.application.dsl.TargetFormat
plugins {
kotlin("jvm") version "1.9.0"
id("org.jetbrains.compose") version "1.5.0"
}
group = "org.cybernetica"
version = "1.0.0"
repositories {
google()
mavenCentral()
maven("https://maven.pkg.jetbrains.space/public/p/compose/dev")
}
dependencies {
implementation(compose.desktop.currentOs)
implementation(project(":synapsis-core")) // Наш core модуль
}
compose.desktop {
application {
mainClass = "synapsis.gui.MainKt"
nativeDistributions {
targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb)
packageName = "Synapsis-Cybernetica"
packageVersion = "1.0.0"
description = "Система кибернетического управления сознанием"
copyright = "© 2024 Кибернетическая Корпорация"
vendor = "Cybernetica Corporation"
windows {
menu = true
// Добавляем иконку для Windows
iconFile.set(project.file("src/main/resources/icon.ico"))
}
macOS {
bundleID = "org.cybernetica.synapsis"
// Добавляем иконку для Mac
iconFile.set(project.file("src/main/resources/icon.icns"))
}
linux {
// Добавляем иконку для Linux
iconFile.set(project.file("src/main/resources/icon.png"))
}
}
}
}
text
synapsis-gui/
├── src/main/kotlin/synapsis/gui/
│ ├── Main.kt # Главное окно приложения
│ ├── ControlPanel.kt # Панель управления
│ ├── PsiZeroScreen.kt # Экран Ψ-0
│ ├── LogsScreen.kt # Экран логов
│ └── models/ # Модели данных
│ ├── PhaseInfo.kt
│ ├── OperatorStatus.kt
│ └── Notification.kt
├── src/main/resources/
│ ├── icon.icns #