Работа над отображением объектов, работа со стилями, работа с позиционированиме, изменение таблицы переменных

This commit is contained in:
XeRo 2026-01-14 18:08:43 +05:00
parent ada7db46cf
commit 2e8eee135e
7 changed files with 477 additions and 431 deletions

View file

@ -1,27 +1,63 @@
package ui
import "github.com/charmbracelet/lipgloss"
const (
AppMaxWidth = 110
AppMinWidth = 80
AppSidePadding = 4
ModalMaxWidth = 80
ModalMaxHeight = 30
ListWithRatio = 0.4
import (
"github.com/charmbracelet/lipgloss"
)
func AppContentWidth(screenWidth int) int {
w := screenWidth - 2*AppSidePadding
if w > AppMaxWidth {
return AppMaxWidth
const (
ApplicationMinWidth = 60
ApplicationMaxHeight = 40
ApplicationMinHeight = 20
ApplicationHorizontalOffset = 3
ApplicationVerticalOffset = 1
ApplicationContainerPadding = 4
ModalMaxWidth = 50
ModalMaxHeight = 15
ListWithRatio = 0.4
TableWithRatio = 0.8
)
// ContentSizes вычисляет размеры для контейнера внутри окна и контента внутри контейнера.
//
// Принимает 2 параметра типа int, screenWidth и screenHeight ширина и высота окна.
//
// Возвращает 4 значения типа int.
//
// containerWidth это ширина контейнера внутри окна с отступами от левого и правого краёв, и с учетом границ
//
// containerHeight это высота контейнера внутри окна с отступами от верхнего и нижнего краёв, и с учетом границ
//
// contentWidth это ширина контента внутри контейнера с отступами от левого и правого краёв контейнера
//
// contentHeight это высота контента внутри контейнера с отступами от верхнего и нижнего краёв контейнера
func ContentSizes(screenWidth, screenHeight int) (containerWidth, containerHeight, contentWidth, contentHeight int) {
containerWidth = screenWidth - 2*ApplicationHorizontalOffset
if containerWidth < ApplicationMinWidth {
//если ширина слишком маленькая ставим минимальную поддерживаемую
containerWidth = ApplicationMinWidth
}
if w < AppMinWidth {
return AppMinWidth
containerWidth = containerWidth - 2*1
//Вычитаем из ширины контейнера 2 условных единицы для границ
//Пример, окно 70, контейнер будет 64, места для контента тогда 62
containerHeight = screenHeight - 2*ApplicationVerticalOffset
if containerHeight < ApplicationMinHeight {
//если высота слишком маленькая ставим минимально поддерживаемую
containerHeight = ApplicationMinHeight
}
return w
containerHeight = containerHeight - 2*1
//Вычитаем из высоты контейнера 2 условных единицы для границ
//Пример, окно 30, контейнер будет 28, места для контента тогда 26
contentWidth = containerWidth - 2*ApplicationHorizontalOffset
//Вычитаем из ширины контейнера отступы для контента внутри
contentHeight = containerHeight - 2*ApplicationVerticalOffset
//Вычитаем из высоты контейнера отступы для контента внутри
return
}
// Используемые цвета
var (
ColorFg = lipgloss.Color("#eeeeee")
ColorBg = lipgloss.Color("#0d1117")
@ -32,34 +68,93 @@ var (
ColorPurple = lipgloss.Color("#cba6f7")
ColorGrey = lipgloss.Color("#585b70")
ColorDarkGrey = lipgloss.Color("#313244")
)
AppContainer = lipgloss.NewStyle().
Padding(2, 4).
Border(lipgloss.RoundedBorder()).
BorderForeground(ColorPurple)
HeaderStyle = lipgloss.NewStyle().
Bold(true).
Foreground(ColorPurple).
Background(ColorDarkGrey).
Padding(1, 2).
MarginBottom(1).
Align(lipgloss.Center)
FooterStyle = lipgloss.NewStyle().
Foreground(ColorGrey).
Padding(0, 2).
MarginTop(1).
Align(lipgloss.Center)
ListContainer = lipgloss.NewStyle().
Padding(1, 3).
Border(lipgloss.RoundedBorder()).
BorderForeground(ColorAccent)
var AppContainer = lipgloss.NewStyle().
Padding(ApplicationVerticalOffset, ApplicationHorizontalOffset).
Border(lipgloss.RoundedBorder()).
BorderForeground(ColorAccent)
// Стили для списка приложений
var (
ListTitleStyle = lipgloss.NewStyle().Foreground(ColorPurple).Italic(true).Bold(true)
ListSelectedStyle = lipgloss.NewStyle().Foreground(ColorError).Bold(true)
ListDescriptionStyle = lipgloss.NewStyle().Foreground(ColorAccent2).MarginTop(1)
ListDescriptionStyle = lipgloss.NewStyle().Foreground(ColorAccent2)
)
// Стили для about
var (
AboutTitle = lipgloss.NewStyle().
Foreground(ColorAccent).
Bold(true).
AlignHorizontal(lipgloss.Center)
AboutH2 = lipgloss.NewStyle().
Foreground(ColorAccent).
Bold(true)
AboutH3 = lipgloss.NewStyle().
Foreground(ColorAccent).
Bold(true)
AboutBullet = lipgloss.NewStyle().
Foreground(ColorGrey)
AboutNormal = lipgloss.NewStyle().
Foreground(ColorFg)
)
// Стили для форм и полей ввода
var (
FormFieldFocused = lipgloss.NewStyle().Foreground(ColorError).Bold(true)
FormFieldUnfocused = lipgloss.NewStyle().Foreground(ColorAccent2)
FormNextButton = lipgloss.NewStyle().Foreground(ColorPurple).Bold(true)
SelectFileDirDeniedStyle = lipgloss.NewStyle().Foreground(ColorGrey)
SelectFileDirParentStyle = lipgloss.NewStyle().Foreground(ColorPurple)
SelectFileStyle = lipgloss.NewStyle().Foreground(ColorAccent)
SelectDirStyle = lipgloss.NewStyle().Foreground(ColorAccent2)
)
// Стили для таблицы переменных Final
var (
FinalHeader = lipgloss.NewStyle().
Background(ColorDarkGrey).
Foreground(ColorPurple).
Bold(true).
Align(lipgloss.Center).
MarginBottom(1).
Padding(1, 2)
FinalFooter = lipgloss.NewStyle().
Foreground(ColorGrey).
MarginTop(1).
Padding(1, 0).
Align(lipgloss.Center)
FinalTableBorder = lipgloss.NewStyle().
Foreground(ColorPurple)
FinalTableHeader = lipgloss.NewStyle().
Foreground(ColorPurple).
Bold(true).
Align(lipgloss.Center).
Padding(0, 1)
FinalTableEvenRow = lipgloss.NewStyle().
Background(ColorDarkGrey).
Padding(0, 2)
FinalTableOddRow = lipgloss.NewStyle().
Padding(0, 2)
)
// Стили для модальных окон
var (
ModalContainer = lipgloss.NewStyle().
Border(lipgloss.DoubleBorder()).
Align(lipgloss.Center, lipgloss.Center)
//Padding(ApplicationVerticalOffset, ApplicationHorizontalOffset)
ModalBorderError = lipgloss.NewStyle().BorderForeground(ColorError)
ModalBorderWarning = lipgloss.NewStyle().BorderForeground(ColorWarning)
@ -82,84 +177,57 @@ var (
BorderForeground(ColorError).
Foreground(ColorError).
Bold(true)
FormContainer = lipgloss.NewStyle().
Padding(2, 4).
Border(lipgloss.RoundedBorder()).
BorderForeground(ColorAccent)
FormFieldFocused = lipgloss.NewStyle().Foreground(ColorError).Bold(true)
FormFieldUnfocused = lipgloss.NewStyle().Foreground(ColorAccent2)
FormNextButton = lipgloss.NewStyle().Foreground(ColorPurple).Bold(true)
TableBorder = lipgloss.NewStyle().Foreground(ColorPurple)
TableHeader = lipgloss.NewStyle().Foreground(ColorPurple).Bold(true).Align(lipgloss.Center)
TableRowEven = lipgloss.NewStyle().Foreground(ColorFg).Background(ColorDarkGrey)
TableRowOdd = lipgloss.NewStyle().Foreground(ColorFg)
TableCell = lipgloss.NewStyle().Padding(0, 2)
//ColorWhite = lipgloss.Color("#ffffff")
//ColorGrey = lipgloss.Color("#626262")
//ColorBlack = lipgloss.Color("#000000")
//ColorRed = lipgloss.Color("#FF0000")
//ColorGreen = lipgloss.Color("#00FF00")
//ColorBlue = lipgloss.Color("#0000FF")
//ColorPurple = lipgloss.Color("#6f03fc")
//ColorGreenCyan = lipgloss.Color("#11CAAA")
//
//AppContainerStyle = lipgloss.NewStyle().
// Padding(1, 3).
// Border(lipgloss.RoundedBorder()).
// BorderForeground(ColorPurple)
//
//AppHeaderStyle = lipgloss.NewStyle().
// Bold(true).
// Foreground(ColorPurple).
// Align(lipgloss.Center).
// Padding(1, 0).
// Background(ColorWhite).
// Foreground(ColorBlack)
//
//AppFooterStyle = lipgloss.NewStyle().
// Foreground(ColorGrey).
// Align(lipgloss.Center).
// Padding(0, 1)
//
//TableHeaderStyle = lipgloss.NewStyle().Foreground(ColorPurple).Bold(true).Align(lipgloss.Center)
//TableCellStyle = lipgloss.NewStyle().Padding(0, 1).Width(14)
//TableOddRowStyle = TableCellStyle.Foreground(ColorWhite).Background(ColorGrey)
//TableEvenRowStyle = TableCellStyle.Foreground(ColorWhite)
//TableBorderStyle = lipgloss.NewStyle().Foreground(ColorPurple)
//
SelectFileDirDeniedStyle = lipgloss.NewStyle().Foreground(ColorGrey)
SelectFileDirParentStyle = lipgloss.NewStyle().Foreground(ColorPurple)
SelectFileStyle = lipgloss.NewStyle().Foreground(ColorAccent)
SelectDirStyle = lipgloss.NewStyle().Foreground(ColorAccent2)
//
//SelectStyle = lipgloss.NewStyle().Foreground(ColorGreenCyan)
//InputStyle = lipgloss.NewStyle().Foreground(ColorGreenCyan)
//ComputeStyle = lipgloss.NewStyle().Foreground(ColorGrey)
//CheckboxStyle = lipgloss.NewStyle().Foreground(ColorGreenCyan)
//
//FormFocusedStyle = lipgloss.NewStyle().Foreground(ColorRed).Bold(true).
// Border(lipgloss.NormalBorder(), false, false, false, true).BorderForeground(ColorRed)
//FormUnfocusedStyle = lipgloss.NewStyle().Foreground(ColorGreenCyan)
//FormStyle = lipgloss.NewStyle().Padding(1, 2).Foreground(ColorBlack).
// Border(lipgloss.RoundedBorder()).BorderForeground(ColorRed)
//
//ListStyle = lipgloss.NewStyle().Padding(1, 3).Border(lipgloss.RoundedBorder()).BorderForeground(ColorRed)
//ListSelectedItemStyle = lipgloss.NewStyle().Foreground(ColorRed).Bold(true)
//ListTitleStyle = lipgloss.NewStyle().Foreground(ColorPurple).Italic(true)
//ListDescriptionStyle = lipgloss.NewStyle().Foreground(ColorGreenCyan).MarginTop(1)
)
func ContentWidth(screenWidth int) int {
w := screenWidth - 2*AppSidePadding
if w > AppMaxWidth {
return AppMaxWidth
}
if w < AppMinWidth {
return AppMinWidth
}
return w
}
//Старые стили
//var (
//ColorWhite = lipgloss.Color("#ffffff")
//ColorGrey = lipgloss.Color("#626262")
//ColorBlack = lipgloss.Color("#000000")
//ColorRed = lipgloss.Color("#FF0000")
//ColorGreen = lipgloss.Color("#00FF00")
//ColorBlue = lipgloss.Color("#0000FF")
//ColorPurple = lipgloss.Color("#6f03fc")
//ColorGreenCyan = lipgloss.Color("#11CAAA")
//
//AppContainerStyle = lipgloss.NewStyle().
// Padding(1, 3).
// Border(lipgloss.RoundedBorder()).
// BorderForeground(ColorPurple)
//
//AppHeaderStyle = lipgloss.NewStyle().
// Bold(true).
// Foreground(ColorPurple).
// Align(lipgloss.Center).
// Padding(1, 0).
// Background(ColorWhite).
// Foreground(ColorBlack)
//
//AppFooterStyle = lipgloss.NewStyle().
// Foreground(ColorGrey).
// Align(lipgloss.Center).
// Padding(0, 1)
//
//TableHeaderStyle = lipgloss.NewStyle().Foreground(ColorPurple).Bold(true).Align(lipgloss.Center)
//TableCellStyle = lipgloss.NewStyle().Padding(0, 1).Width(14)
//TableOddRowStyle = TableCellStyle.Foreground(ColorWhite).Background(ColorGrey)
//TableEvenRowStyle = TableCellStyle.Foreground(ColorWhite)
//TableBorderStyle = lipgloss.NewStyle().Foreground(ColorPurple)
//
//
//SelectStyle = lipgloss.NewStyle().Foreground(ColorGreenCyan)
//InputStyle = lipgloss.NewStyle().Foreground(ColorGreenCyan)
//ComputeStyle = lipgloss.NewStyle().Foreground(ColorGrey)
//CheckboxStyle = lipgloss.NewStyle().Foreground(ColorGreenCyan)
//
//FormFocusedStyle = lipgloss.NewStyle().Foreground(ColorRed).Bold(true).
// Border(lipgloss.NormalBorder(), false, false, false, true).BorderForeground(ColorRed)
//FormUnfocusedStyle = lipgloss.NewStyle().Foreground(ColorGreenCyan)
//FormStyle = lipgloss.NewStyle().Padding(1, 2).Foreground(ColorBlack).
// Border(lipgloss.RoundedBorder()).BorderForeground(ColorRed)
//
//ListStyle = lipgloss.NewStyle().Padding(1, 3).Border(lipgloss.RoundedBorder()).BorderForeground(ColorRed)
//ListSelectedItemStyle = lipgloss.NewStyle().Foreground(ColorRed).Bold(true)
//ListTitleStyle = lipgloss.NewStyle().Foreground(ColorPurple).Italic(true)
//ListDescriptionStyle = lipgloss.NewStyle().Foreground(ColorGreenCyan).MarginTop(1)
//)